4 * Common Trace Format - bitfield test program
6 * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include <ctf/bitfield.h>
30 * This function is only declared to show the size of a bitfield write in
35 ctf_bitfield_write(&glob
, 12, 15, 0x12345678);
38 /* Test array size, in bytes */
44 #if defined(__i386) || defined(__x86_64)
46 static inline int fls(int x
)
51 : "=&r" (r
) : "rm" (x
), "rm" (-1));
55 #elif defined(__PPC__)
57 static __inline__
int fls(unsigned int x
)
61 asm ("cntlzw %0,%1" : "=r" (lz
) : "r" (x
));
67 static int fls(unsigned int x
)
73 if (!(x
& 0xFFFF0000U
)) {
77 if (!(x
& 0xFF000000U
)) {
81 if (!(x
& 0xF0000000U
)) {
85 if (!(x
& 0xC0000000U
)) {
89 if (!(x
& 0x80000000U
)) {
98 static void print_byte_array(const unsigned char *c
, unsigned long len
)
102 for (i
= 0; i
< len
; i
++) {
103 printf("0x%X", c
[i
]);
110 static void init_byte_array(unsigned char *c
,
116 for (i
= 0; i
< len
; i
++)
120 int run_test_unsigned(void)
122 unsigned int src
, nrbits
;
124 unsigned char c
[TEST_LEN
];
125 unsigned short s
[TEST_LEN
/sizeof(unsigned short)];
126 unsigned int i
[TEST_LEN
/sizeof(unsigned int)];
127 unsigned long l
[TEST_LEN
/sizeof(unsigned long)];
128 unsigned long long ll
[TEST_LEN
/sizeof(unsigned long long)];
134 printf("Running unsigned test with 0x%X\n", srcrand
);
139 for (s
= 0; s
< CHAR_BIT
* TEST_LEN
; s
++) {
140 for (l
= nrbits
; l
< (CHAR_BIT
* TEST_LEN
) - s
; l
++) {
141 init_byte_array(target
.c
, TEST_LEN
, 0xFF);
142 ctf_bitfield_write(target
.c
, s
, l
, src
);
143 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
144 if (readval
!= src
) {
145 printf("Error (bytewise) src %lX read %llX shift %d len %d\n",
147 print_byte_array(target
.c
, TEST_LEN
);
151 init_byte_array(target
.c
, TEST_LEN
, 0xFF);
152 ctf_bitfield_write(target
.s
, s
, l
, src
);
153 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
154 if (readval
!= src
) {
155 printf("Error (shortwise) src %lX read %llX shift %d len %d\n",
157 print_byte_array(target
.c
, TEST_LEN
);
161 init_byte_array(target
.c
, TEST_LEN
, 0xFF);
162 ctf_bitfield_write(target
.i
, s
, l
, src
);
163 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
164 if (readval
!= src
) {
165 printf("Error (intwise) src %lX read %llX shift %d len %d\n",
167 print_byte_array(target
.c
, TEST_LEN
);
171 init_byte_array(target
.c
, TEST_LEN
, 0xFF);
172 ctf_bitfield_write(target
.l
, s
, l
, src
);
173 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
174 if (readval
!= src
) {
175 printf("Error (longwise) src %lX read %llX shift %d len %d\n",
177 print_byte_array(target
.c
, TEST_LEN
);
181 init_byte_array(target
.c
, TEST_LEN
, 0xFF);
182 ctf_bitfield_write(target
.ll
, s
, l
, src
);
183 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
184 if (readval
!= src
) {
185 printf("Error (longlongwise) src %lX read %llX shift %d len %d\n",
187 print_byte_array(target
.c
, TEST_LEN
);
193 printf("Success!\n");
199 int run_test_signed(void)
204 short s
[TEST_LEN
/sizeof(short)];
205 int i
[TEST_LEN
/sizeof(int)];
206 long l
[TEST_LEN
/sizeof(long)];
207 long long ll
[TEST_LEN
/sizeof(long long)];
213 printf("Running signed test with 0x%X\n", srcrand
);
216 if (src
& 0x80000000U
)
217 nrbits
= fls(~src
) + 1; /* Find least significant bit conveying sign */
219 nrbits
= fls(src
) + 1; /* Keep sign at 0 */
221 for (s
= 0; s
< 8 * TEST_LEN
; s
++) {
222 for (l
= nrbits
; l
< (8 * TEST_LEN
) - s
; l
++) {
223 init_byte_array(target
.c
, TEST_LEN
, 0x0);
224 ctf_bitfield_write(target
.c
, s
, l
, src
);
225 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
226 if (readval
!= src
) {
227 printf("Error (bytewise) src %lX read %llX shift %d len %d\n",
229 print_byte_array(target
.c
, TEST_LEN
);
233 init_byte_array(target
.c
, TEST_LEN
, 0x0);
234 ctf_bitfield_write(target
.s
, s
, l
, src
);
235 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
236 if (readval
!= src
) {
237 printf("Error (shortwise) src %lX read %llX shift %d len %d\n",
239 print_byte_array(target
.c
, TEST_LEN
);
243 init_byte_array(target
.c
, TEST_LEN
, 0x0);
244 ctf_bitfield_write(target
.i
, s
, l
, src
);
245 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
246 if (readval
!= src
) {
247 printf("Error (intwise) src %lX read %llX shift %d len %d\n",
249 print_byte_array(target
.c
, TEST_LEN
);
253 init_byte_array(target
.c
, TEST_LEN
, 0x0);
254 ctf_bitfield_write(target
.l
, s
, l
, src
);
255 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
256 if (readval
!= src
) {
257 printf("Error (longwise) src %lX read %llX shift %d len %d\n",
259 print_byte_array(target
.c
, TEST_LEN
);
263 init_byte_array(target
.c
, TEST_LEN
, 0x0);
264 ctf_bitfield_write(target
.ll
, s
, l
, src
);
265 ctf_bitfield_read(target
.c
, s
, l
, &readval
);
266 if (readval
!= src
) {
267 printf("Error (longlongwise) src %lX read %llX shift %d len %d\n",
269 print_byte_array(target
.c
, TEST_LEN
);
275 printf("Success!\n");
289 err
|= run_test_unsigned();
291 err
|= run_test_signed();
293 err
|= run_test_unsigned();
295 err
|= run_test_unsigned();
297 err
|= run_test_signed();
298 srcrand
= (int)0x80000000U
;
299 err
|= run_test_signed();
301 for (i
= 0; i
< NR_TESTS
; i
++) {
303 err
|= run_test_unsigned();
304 err
|= run_test_signed();
309 int main(int argc
, char **argv
)
312 unsigned int shift
, len
;
319 unsigned long long ll
[1];
328 shift
= atoi(argv
[2]);
336 target
.i
[0] = 0xFFFFFFFF;
337 target
.i
[1] = 0xFFFFFFFF;
338 ctf_bitfield_write(target
.c
, shift
, len
, src
);
339 printf("bytewise\n");
340 print_byte_array(target
.c
, 8);
342 target
.i
[0] = 0xFFFFFFFF;
343 target
.i
[1] = 0xFFFFFFFF;
344 ctf_bitfield_write(target
.s
, shift
, len
, src
);
345 printf("shortwise\n");
346 print_byte_array(target
.c
, 8);
348 target
.i
[0] = 0xFFFFFFFF;
349 target
.i
[1] = 0xFFFFFFFF;
350 ctf_bitfield_write(target
.i
, shift
, len
, src
);
352 print_byte_array(target
.c
, 8);
354 target
.i
[0] = 0xFFFFFFFF;
355 target
.i
[1] = 0xFFFFFFFF;
356 ctf_bitfield_write(target
.l
, shift
, len
, src
);
357 printf("longwise\n");
358 print_byte_array(target
.c
, 8);
360 target
.i
[0] = 0xFFFFFFFF;
361 target
.i
[1] = 0xFFFFFFFF;
362 ctf_bitfield_write(target
.ll
, shift
, len
, src
);
364 print_byte_array(target
.c
, 8);
366 ctf_bitfield_read(target
.c
, shift
, len
, &readval
);
367 printf("read: %llX\n", readval
);
This page took 0.037823 seconds and 5 git commands to generate.