1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|
/** Tests covering RRC, RLC & SWAP operations
size: 8, 16, 32
andCase: 0, 1 , 2
xorLiteral: 0, 1
rotateLeft: 1, -1, 0
structVar: 0, 1
size. 32
andCase. 0
xorLiteral. 1
rotateLeft. -1, 1, 0
structVar. 0, 1
*/
#include <testfwk.h>
#ifdef __sun__
#include <inttypes.h>
#else
#include <stdint.h>
#endif
#define SIZE ({size})
#define AND_CASE ({andCase})
#define XOR_LITERAL ({xorLiteral})
#define ROTATE_LEFT ({rotateLeft})
#define STRUCT_VAR ({structVar})
#if SIZE == 8
#define TYPE uint8_t
#define TEST_VALUE 0x5B
#if AND_CASE == 2
#define AND_VALUE 0xFE
#elif AND_CASE == 1
#define AND_VALUE 0xEF
#else
#undef AND_VALUE
#endif
#endif
#if SIZE == 16
#define TYPE uint16_t
#define TEST_VALUE 0x3579
#if AND_CASE == 2
#define AND_VALUE 0xFEFF
#elif AND_CASE == 1
#define AND_VALUE 0xFFEF
#else
#undef AND_VALUE
#endif
#endif
#if SIZE == 32
#define TYPE uint32_t
#define TEST_VALUE 0x13579BDF
#if AND_CASE == 2
#define AND_VALUE 0xFEFFFEFF
#elif AND_CASE == 1
#define AND_VALUE 0xFFEFFFEF
#else
#undef AND_VALUE
#endif
#endif
#if ROTATE_LEFT == 1
#define SHIFT_R (SIZE - 1)
#define SHIFT_L 1
#elif ROTATE_LEFT == -1
#define SHIFT_R 1
#define SHIFT_L (SIZE - 1)
#elif ROTATE_LEFT == 0
#define SHIFT_R (SIZE / 2)
#define SHIFT_L (SIZE / 2)
#else
#error "UNKNOWN SHIFT CASE"
#endif
#ifdef AND_VALUE
#define AND_OPERATION & AND_VALUE
#else
#define AND_OPERATION
#endif
#define XOR_VALUE 0x24
#if XOR_LITERAL
#define rotate_test_value_xor XOR_VALUE
#else
volatile TYPE rotate_test_value_xor = XOR_VALUE;
#endif
#define ROTATE_RESULT ((TYPE)(((TEST_VALUE << SHIFT_L) | (TEST_VALUE >> SHIFT_R)) AND_OPERATION))
#define ROTATE_RESULT_XOR ((TYPE)((((TEST_VALUE ^ XOR_VALUE) << SHIFT_L) | ((TEST_VALUE ^ XOR_VALUE) >> SHIFT_R)) AND_OPERATION))
#if STRUCT_VAR
typedef struct
{
TYPE rotate_test_value1;
TYPE rotate_test_value2;
}rotate_test_struct_;
rotate_test_struct_ rotate_test_struct;
#define rotate_test_value rotate_test_struct.rotate_test_value2
#else
TYPE rotate_test_value;
#endif
TYPE rotate_test_1(TYPE value)
{
return ((value << SHIFT_L) | (value >> SHIFT_R)) AND_OPERATION;
}
TYPE rotate_test_1_xor1(TYPE value)
{
value = value ^ rotate_test_value_xor;
return ((value << SHIFT_L) | (value >> SHIFT_R)) AND_OPERATION;
}
TYPE rotate_test_1_xor2(TYPE value)
{
return (((value ^ rotate_test_value_xor) << SHIFT_L) | ((value ^ rotate_test_value_xor) >> SHIFT_R)) AND_OPERATION;
}
#if !(defined(__SDCC_pdk14) || defined (__SDCC_pdk15) && defined(__SDCC_STACK_AUTO)) // Lack of memory
TYPE rotate_test_2(TYPE value)
{
TYPE value2 = value;
return ((value2 << SHIFT_L) | (value2 >> SHIFT_R)) AND_OPERATION;
}
TYPE rotate_test_2_xor1(TYPE value)
{
TYPE value2 = value ^ rotate_test_value_xor;
return ((value2 << SHIFT_L) | (value2 >> SHIFT_R)) AND_OPERATION;
}
TYPE rotate_test_2_xor2(TYPE value)
{
TYPE value2 = value;
return (((value2 ^ rotate_test_value_xor) << SHIFT_L) | ((value2 ^ rotate_test_value_xor) >> SHIFT_R)) AND_OPERATION;
}
TYPE rotate_test_3(TYPE value)
{
volatile TYPE value2 = value;
value2 = ((value2 << SHIFT_L) | (value2 >> SHIFT_R)) AND_OPERATION;
return value2;
}
TYPE rotate_test_3_xor1(TYPE value)
{
volatile TYPE value2 = value ^ rotate_test_value_xor;
value2 = ((value2 << SHIFT_L) | (value2 >> SHIFT_R)) AND_OPERATION;
return value2;
}
TYPE rotate_test_3_xor2(TYPE value)
{
volatile TYPE value2 = value;
value2 = (((value2 ^ rotate_test_value_xor) << SHIFT_L) | ((value2 ^ rotate_test_value_xor) >> SHIFT_R)) AND_OPERATION;
return value2;
}
#ifndef __SDCC_pdk15 // Lack of memory
TYPE rotate_test_4(TYPE value)
{
rotate_test_value = value;
rotate_test_value = ((rotate_test_value << SHIFT_L) | (rotate_test_value >> SHIFT_R)) AND_OPERATION;
return rotate_test_value;
}
TYPE rotate_test_4_xor1(TYPE value)
{
rotate_test_value = value ^ rotate_test_value_xor;
rotate_test_value = ((rotate_test_value << SHIFT_L) | (rotate_test_value >> SHIFT_R)) AND_OPERATION;
return rotate_test_value;
}
TYPE rotate_test_4_xor2(TYPE value)
{
rotate_test_value = value;
rotate_test_value = (((rotate_test_value ^ rotate_test_value_xor) << SHIFT_L) | ((rotate_test_value ^ rotate_test_value_xor) >> SHIFT_R)) AND_OPERATION;
return rotate_test_value;
}
void rotate_test_load(TYPE value)
{
rotate_test_value = value;
}
TYPE rotate_test_5(TYPE value)
{
rotate_test_load (value);
rotate_test_value = ((rotate_test_value << SHIFT_L) | (rotate_test_value >> SHIFT_R)) AND_OPERATION;
return rotate_test_value;
}
TYPE rotate_test_5_xor1(TYPE value)
{
rotate_test_load (value ^ rotate_test_value_xor);
rotate_test_value = ((rotate_test_value << SHIFT_L) | (rotate_test_value >> SHIFT_R)) AND_OPERATION;
return rotate_test_value;
}
TYPE rotate_test_5_xor2(TYPE value)
{
rotate_test_load (value);
rotate_test_value = (((rotate_test_value ^ rotate_test_value_xor) << SHIFT_L) | ((rotate_test_value ^ rotate_test_value_xor) >> SHIFT_R)) AND_OPERATION;
return rotate_test_value;
}
#endif
#endif
static void
testSwaps(void)
{
#if !(defined(__SDCC_pdk14) || defined (__SDCC_pdk15) && defined(__SDCC_STACK_AUTO)) // Lack of memory
volatile TYPE t = TEST_VALUE;
TYPE u;
u = t;
ASSERT( rotate_test_1(u) == ROTATE_RESULT);
ASSERT( rotate_test_1_xor1(u) == ROTATE_RESULT_XOR);
ASSERT( rotate_test_1_xor2(u) == ROTATE_RESULT_XOR);
ASSERT( rotate_test_2(u) == ROTATE_RESULT);
ASSERT( rotate_test_2_xor1(u) == ROTATE_RESULT_XOR);
ASSERT( rotate_test_2_xor2(u) == ROTATE_RESULT_XOR);
ASSERT( rotate_test_3(u) == ROTATE_RESULT);
ASSERT( rotate_test_3_xor1(u) == ROTATE_RESULT_XOR);
ASSERT( rotate_test_3_xor2(u) == ROTATE_RESULT_XOR);
#ifndef __SDCC_pdk15 // Lack of memory
ASSERT( rotate_test_4(u) == ROTATE_RESULT);
ASSERT( rotate_test_4_xor1(u) == ROTATE_RESULT_XOR);
ASSERT( rotate_test_4_xor2(u) == ROTATE_RESULT_XOR);
ASSERT( rotate_test_5(u) == ROTATE_RESULT);
ASSERT( rotate_test_5_xor1(u) == ROTATE_RESULT_XOR);
ASSERT( rotate_test_5_xor2(u) == ROTATE_RESULT_XOR);
#endif
#endif
}
|