0eb607f91a808f4cf007377efca0e50fc71baf35
[fw/sdcc] / support / regression / tests / shifts.c
1 /** Tests covering the shift operators.
2     disabled for pic16
3
4     sign: signed, unsigned
5     type: char, int, long
6     storage: static, 
7     attr: volatile
8
9     vals: 3
10
11     pending - 1792, 851968, 1560281088, -3, -1792, -851968, -1560000000
12 */
13 #include <testfwk.h>
14
15 void
16 test1ShiftClasses(void)
17 {
18     {attr} {storage} {sign} {type} i, result;
19
20     i = 30;
21     ASSERT(i>>3 == 3);
22     ASSERT(i<<2 == 120);
23     
24     result = i;
25     result >>= 2;
26     ASSERT(result == 7);
27
28     result = i;
29     result <<= 2;
30     ASSERT(result == 120);
31 }
32
33 void
34 test2ShiftRight(void)
35 {
36     {attr} {storage} {type} i, result;
37
38     i = -120;
39     ASSERT(i>>1 == -60);
40     ASSERT(i>>2 == -30);
41     ASSERT(i>>3 == -15);
42     ASSERT(i>>4 == -8);
43     ASSERT(i>>5 == -4);
44     ASSERT(i>>6 == -2);
45     ASSERT(i>>7 == -1);
46     ASSERT(i>>8 == -1);
47     result = i;
48     result >>= 3;
49     ASSERT(result == -15); 
50 }
51
52 void
53 test3ShiftByteMultiples(void)
54 {
55     {attr} {storage} {type} i;
56
57     i = ({type}){vals};
58     ASSERT(i>>8  == ({type})({vals} >> 8));
59     ASSERT(i>>16 == ({type})({vals} >> 16));
60     ASSERT(i>>24 == ({type})({vals} >> 24));
61
62     i = ({type}){vals};
63     ASSERT( ({type})(i<<8)  ==  ({type})({vals} << 8));;
64     ASSERT((({type}) i<<16) == (({type}) {vals} << 16));
65     ASSERT((({type}) i<<24) == (({type}) {vals} << 24));
66 }
67
68 void
69 test4ShiftOne(void)
70 {
71     {attr} {storage} {sign} {type} i;
72     {sign} {type} result;
73
74     i = ({type}){vals};
75
76     result = i >> 1;
77     ASSERT(result == ({type})(({type}){vals} >> 1));
78
79     result = i;
80     result >>= 1;
81     ASSERT(result == ({type})(({type}){vals} >> 1));
82
83     result = i << 1;
84     ASSERT(result == ({type})(({type}){vals} << 1));
85
86     result = i;
87     result <<= 1;
88     ASSERT(result == ({type})(({type}){vals} << 1));
89 }
90
91 static {type} ShiftLeftByParam ({type} count)
92 {
93     {attr} {storage} {type} i;
94     i = ({type}){vals};
95     return (i << count);
96 }
97
98 static {type} ShiftRightByParam ({type} count)
99 {
100     {attr} {storage} {type} i;
101     i = ({type}){vals};
102     return (i >> count);
103 }
104
105 void
106 testShiftByParam(void)
107 {
108     ASSERT(ShiftLeftByParam(2)  == ({type})({vals} << 2));
109     ASSERT(ShiftRightByParam(2) == ({type})({vals} >> 2));
110 }