* src/SDCCcse.c (algebraicOpts): fix bug converting op from value to type
[fw/sdcc] / support / regression / tests / literalop.c
1 /* Test operandOperation() in SDCCicode.c
2
3     type: char, short, long
4  */
5 #include <testfwk.h>
6
7 typedef   signed {type} stype;
8 typedef unsigned {type} utype;
9
10 #define _{type}
11
12 #if defined(PORT_HOST) || defined(SDCC_z80) || defined(SDCC_gbz80)
13 #  define idata
14 #  define code
15 #endif
16
17 volatile char is8 = 8;
18
19 signed char  sc;
20 signed short ss;
21 signed long  sl;
22 unsigned char  uc;
23 unsigned short us;
24 unsigned long  ul;
25 volatile signed char  vsc;
26 volatile signed short vss;
27 volatile signed long  vsl;
28 volatile unsigned char  vuc;
29 volatile unsigned short vus;
30 volatile unsigned long  vul;
31 stype s;
32 volatile stype vs;
33 utype u;
34 volatile utype vu;
35
36 unsigned long t1, t2;
37
38 void
39 testOpOp(void)
40 {
41   /* mul ast */
42   ASSERT((stype) -3 * (stype) -1 == (stype)  3);
43   ASSERT((stype) -3 * (stype)  1 == (stype) -3);
44   ASSERT((stype)  3 * (stype) -1 == (stype) -3);
45
46   ASSERT((stype)  1 * (utype) 0xfffffff7 == (utype) 0xfffffff7);
47
48   ASSERT((unsigned char ) 0xfffffff8 * (unsigned char ) 0xfffffff7 == 0xef48);
49   ASSERT((unsigned short) 0xfffffff8 * (unsigned short) 0xfffffff7 == (sizeof(int) == 2 ? 0x0048 : 0xffef0048));
50   ASSERT((unsigned long ) 0xfffffff8 * (unsigned long ) 0xfffffff7 == 0x0048);
51
52   ASSERT((stype         ) 0xfffffff8 * (stype         ) 0xfffffff7 == 72);
53
54   ASSERT((signed char ) -1 * (unsigned char ) 0xfffffff7 == (sizeof(int) == 2 ? 0xff09 : 0xffffff09));
55   ASSERT((signed short) -1 * (unsigned short) 0xfffffff7 == (sizeof(int) == 2 ?     9u : 0xffff0009));
56   ASSERT((signed long ) -1 * (unsigned long ) 0xfffffff7 == 9u);
57
58   ASSERT((signed char ) -2 * (unsigned char ) 0x8004 == (sizeof(int) == 2 ? 0xfff8 : 0xfffffff8));
59   ASSERT((signed short) -2 * (unsigned short) 0x8004 == (sizeof(int) == 2 ? 0xfff8 : 0xfffefff8));
60   ASSERT((signed long ) -2 * (unsigned long ) 0x8004 == 0xfffefff8);
61
62   ASSERT(-1 * 0xfff7 == (sizeof(int) == 2 ? 9 : 0xffff0009)); // 0xfff7 is stored in 'unsigned int'
63   // but:
64   ASSERT(-1 * 65527  == -65527); // 65527 (== 0xfff7) is stored in 'signed long'
65   ASSERT(-1 * 33000  == -33000);
66
67   ASSERT(1 *  10000  * is8 == (sizeof(int) == 2 ? 14464  :  80000)); /* int      */
68   ASSERT(1 *  10000l * is8 == 80000);                                /* long     */
69   ASSERT(1 *  40000u * is8 == (sizeof(int) == 2 ? 57856u : 320000)); /* unsigned */
70   ASSERT(1 *  40000  * is8 == 320000);                               /* long     */
71   ASSERT(1 * 0x4000  * is8 == (sizeof(int) == 2 ? 0 : 0x20000));     /* unsigned */
72
73   ASSERT(-1 * 1  < 0);
74   ASSERT(-1 * 1u > 0);
75
76
77   /* mul icode */
78   s = -3;
79   ASSERT(s * (stype) -1 == (stype)  3);
80   ASSERT(s * (stype)  1 == (stype) -3);
81   s =  3;
82   ASSERT(s * (stype) -1 == (stype) -3);
83
84   s = 1;
85   ASSERT(s * (utype) 0xfffffff7 == (utype) 0xfffffff7);
86   uc = (unsigned char ) 0xfffffff8;
87   ASSERT(uc * (unsigned char ) 0xfffffff7 == 0xef48);
88   us = (unsigned short) 0xfffffff8;
89   ASSERT(us * (unsigned short) 0xfffffff7 == (sizeof(int) == 2 ? 0x0048 : 0xffef0048));
90   ul = (unsigned long ) 0xfffffff8;
91   ASSERT(ul * (unsigned long ) 0xfffffff7 == 0x0048);
92   ul = (unsigned long ) 0xfffffff8;
93
94   ASSERT((stype         ) 0xfffffff8 * (stype         ) 0xfffffff7 == 72);
95
96   ASSERT((signed char ) -1 * (unsigned char ) 0xfffffff7 == (sizeof(int) == 2 ? 0xff09 : 0xffffff09));
97   ASSERT((signed short) -1 * (unsigned short) 0xfffffff7 == (sizeof(int) == 2 ?     9u : 0xffff0009));
98   ASSERT((signed long ) -1 * (unsigned long ) 0xfffffff7 == 9u);
99
100   ASSERT((signed char ) -2 * (unsigned char ) 0x8004 == (sizeof(int) == 2 ? 0xfff8 : 0xfffffff8));
101   ASSERT((signed short) -2 * (unsigned short) 0x8004 == (sizeof(int) == 2 ? 0xfff8 : 0xfffefff8));
102   ASSERT((signed long ) -2 * (unsigned long ) 0x8004 == 0xfffefff8);
103
104
105
106   ASSERT((stype) -12 / (stype) -3 == (stype)  4);
107   ASSERT((stype) -12 / (stype)  3 == (stype) -4);
108   ASSERT((stype)  12 / (stype) -3 == (stype) -4);
109
110 //  ASSERT((stype) -12 / (utype) -3 == (stype)  4);
111 //  ASSERT((utype) -12 / (stype) -3 == (stype)  4);
112 //  ASSERT((utype) -12 / (utype) -3 == (stype)  4);
113
114
115   ASSERT(12u / 3 * 10000 == 40000);
116
117   ASSERT(-1 / 1 < 0);
118
119
120
121   ASSERT((stype) -14 % (stype) -3 == (stype) -2);
122   ASSERT((stype) -14 % (stype)  3 == (stype) -2);
123   ASSERT((stype)  14 % (stype) -3 == (stype)  2);
124
125   ASSERT(-3 % 2 < 0);
126 }