* support/regression/tests/bitvars.c,
[fw/sdcc] / support / regression / tests / rotate.c
1 /** Tests covering rotate operations
2     size: 8,16,32
3     msb: 0,1
4 */
5 #include <testfwk.h>
6
7 #define SIZE ({size})
8 #define MSB ({msb})
9
10 #if SIZE == 8
11 #  define TYPE unsigned char
12 #  if MSB
13 #    define TEST_VECT 0xa4
14 #  else
15 #    define TEST_VECT 0x53
16 #  endif
17 #endif
18
19 #if SIZE == 16
20 #  define TYPE unsigned int
21 #  if MSB
22 #    define TEST_VECT 0xa8ce
23 #  else
24 #    define TEST_VECT 0x5357
25 #  endif
26 #endif
27
28 #if SIZE == 32
29 // long is 64 bits on GCC 2.95.4 on alpha and I don't know how to detect alpha...
30 #  if defined (__GNUC__) && (__GNUC__ < 3)
31 #    define TYPE unsigned int
32 #  else
33 #    define TYPE unsigned long
34 #  endif
35 #  if MSB
36 #    define TEST_VECT 0xa8c5a5c6
37 #  else
38 #    define TEST_VECT 0x55357553
39 #  endif
40 #endif
41
42 #if !defined __ds390
43 TYPE rol1(TYPE s){ return (s<<1) | (s>>(SIZE-1)); }
44 TYPE rol2(TYPE s){ return (s<<2) | (s>>(SIZE-2)); }
45 TYPE rol3(TYPE s){ return (s<<3) | (s>>(SIZE-3)); }
46 TYPE rol4(TYPE s){ return (s<<4) | (s>>(SIZE-4)); }
47 TYPE rol5(TYPE s){ return (s<<5) | (s>>(SIZE-5)); }
48 TYPE rol6(TYPE s){ return (s<<6) | (s>>(SIZE-6)); }
49 TYPE rol7(TYPE s){ return (s<<7) | (s>>(SIZE-7)); }
50 #endif
51
52 #if SIZE >=16 && !defined __ds390
53 TYPE rol8 (TYPE s){ return (s<<8 ) | (s>>(SIZE-8 )); }
54 TYPE rol9 (TYPE s){ return (s<<9 ) | (s>>(SIZE-9 )); }
55 TYPE rol10(TYPE s){ return (s<<10) | (s>>(SIZE-10)); }
56 TYPE rol11(TYPE s){ return (s<<11) | (s>>(SIZE-11)); }
57 TYPE rol12(TYPE s){ return (s<<12) | (s>>(SIZE-12)); }
58 TYPE rol13(TYPE s){ return (s<<13) | (s>>(SIZE-13)); }
59 TYPE rol14(TYPE s){ return (s<<14) | (s>>(SIZE-14)); }
60 TYPE rol15(TYPE s){ return (s<<15) | (s>>(SIZE-15)); }
61 #endif
62
63 #if SIZE >=32
64 TYPE rol16(TYPE s){ return (s<<16) | (s>>(SIZE-16)); }
65 TYPE rol17(TYPE s){ return (s<<17) | (s>>(SIZE-17)); }
66
67 TYPE rol23(TYPE s){ return (s<<23) | (s>>(SIZE-23)); }
68 TYPE rol24(TYPE s){ return (s<<24) | (s>>(SIZE-24)); }
69 TYPE rol25(TYPE s){ return (s<<25) | (s>>(SIZE-25)); }
70
71 TYPE rol30(TYPE s){ return (s<<30) | (s>>(SIZE-30)); }
72 TYPE rol31(TYPE s){ return (s<<31) | (s>>(SIZE-31)); }
73 #endif
74
75 static void
76 testRol(void)
77 {
78     volatile TYPE t = TEST_VECT;
79     TYPE u;
80
81     u = t;
82 #if !defined __ds390
83     ASSERT( rol1(u) == (TYPE)((TEST_VECT<<1) | (TEST_VECT>>(SIZE-1))) );
84     ASSERT( rol2(u) == (TYPE)((TEST_VECT<<2) | (TEST_VECT>>(SIZE-2))) );
85     ASSERT( rol3(u) == (TYPE)((TEST_VECT<<3) | (TEST_VECT>>(SIZE-3))) );
86     ASSERT( rol4(u) == (TYPE)((TEST_VECT<<4) | (TEST_VECT>>(SIZE-4))) );
87     ASSERT( rol5(u) == (TYPE)((TEST_VECT<<5) | (TEST_VECT>>(SIZE-5))) );
88     ASSERT( rol6(u) == (TYPE)((TEST_VECT<<6) | (TEST_VECT>>(SIZE-6))) );
89     ASSERT( rol7(u) == (TYPE)((TEST_VECT<<7) | (TEST_VECT>>(SIZE-7))) );
90 #endif
91
92 #if SIZE >=16 && !defined __ds390
93     ASSERT( rol8 (u) == (TYPE)((TEST_VECT<<8 ) | (TEST_VECT>>(SIZE-8 ))) );
94     ASSERT( rol9 (u) == (TYPE)((TEST_VECT<<9 ) | (TEST_VECT>>(SIZE-9 ))) );
95     ASSERT( rol10(u) == (TYPE)((TEST_VECT<<10) | (TEST_VECT>>(SIZE-10))) );
96     ASSERT( rol11(u) == (TYPE)((TEST_VECT<<11) | (TEST_VECT>>(SIZE-11))) );
97     ASSERT( rol12(u) == (TYPE)((TEST_VECT<<12) | (TEST_VECT>>(SIZE-12))) );
98     ASSERT( rol13(u) == (TYPE)((TEST_VECT<<13) | (TEST_VECT>>(SIZE-13))) );
99     ASSERT( rol14(u) == (TYPE)((TEST_VECT<<14) | (TEST_VECT>>(SIZE-14))) );
100     ASSERT( rol15(u) == (TYPE)((TEST_VECT<<15) | (TEST_VECT>>(SIZE-15))) );
101 #endif
102
103 #if SIZE >=32
104     ASSERT( rol16(u) == (TYPE)((TEST_VECT<<16) | (TEST_VECT>>(SIZE-16))) );
105     ASSERT( rol17(u) == (TYPE)((TEST_VECT<<17) | (TEST_VECT>>(SIZE-17))) );
106
107     ASSERT( rol23(u) == (TYPE)((TEST_VECT<<23) | (TEST_VECT>>(SIZE-23))) );
108     ASSERT( rol24(u) == (TYPE)((TEST_VECT<<24) | (TEST_VECT>>(SIZE-24))) );
109     ASSERT( rol25(u) == (TYPE)((TEST_VECT<<25) | (TEST_VECT>>(SIZE-25))) );
110
111     ASSERT( rol30(u) == (TYPE)((TEST_VECT<<30) | (TEST_VECT>>(SIZE-30))) );
112     ASSERT( rol31(u) == (TYPE)((TEST_VECT<<31) | (TEST_VECT>>(SIZE-31))) );
113 #endif
114 }
115