root / tests / tcg / cris / check_swap.c @ c09015dd
History  View  Annotate  Download (2.4 kB)
1 
#include <stdio.h> 

2 
#include <stdlib.h> 
3 
#include <stdint.h> 
4 
#include "sys.h" 
5 
#include "crisutils.h" 
6  
7 
#define N 8 
8 
#define W 4 
9 
#define B 2 
10 
#define R 1 
11  
12 
static inline int cris_swap(const int mode, int x) 
13 
{ 
14 
switch (mode)

15 
{ 
16 
case N: asm ("swapn\t%0\n" : "+r" (x) : "0" (x)); break; 
17 
case W: asm ("swapw\t%0\n" : "+r" (x) : "0" (x)); break; 
18 
case B: asm ("swapb\t%0\n" : "+r" (x) : "0" (x)); break; 
19 
case R: asm ("swapr\t%0\n" : "+r" (x) : "0" (x)); break; 
20 
case BR: asm ("swapbr\t%0\n" : "+r" (x) : "0" (x)); break; 
21 
case WR: asm ("swapwr\t%0\n" : "+r" (x) : "0" (x)); break; 
22 
case WB: asm ("swapwb\t%0\n" : "+r" (x) : "0" (x)); break; 
23 
case WBR: asm ("swapwbr\t%0\n" : "+r" (x) : "0" (x)); break; 
24 
case NR: asm ("swapnr\t%0\n" : "+r" (x) : "0" (x)); break; 
25 
case NB: asm ("swapnb\t%0\n" : "+r" (x) : "0" (x)); break; 
26 
case NBR: asm ("swapnbr\t%0\n" : "+r" (x) : "0" (x)); break; 
27 
case NW: asm ("swapnw\t%0\n" : "+r" (x) : "0" (x)); break; 
28 
default:

29 
err(); 
30 
break;

31 
} 
32 
return x;

33 
} 
34  
35 
/* Made this a macro to be able to pick up the location of the errors. */

36 
#define verify_swap(mode, val, expected, n, z) \

37 
do { \

38 
int r; \

39 
cris_tst_cc_init(); \ 
40 
r = cris_swap(mode, val); \ 
41 
cris_tst_mov_cc(n, z); \ 
42 
if (r != expected) \

43 
err(); \ 
44 
} while(0) 
45  
46 
void check_swap(void) 
47 
{ 
48 
/* Some of these numbers are borrowed from GDB's cris sim

49 
testsuite. */

50 
if (cris_swap(N, 0) != 0xffffffff) 
51 
err(); 
52 
if (cris_swap(W, 0x12345678) != 0x56781234) 
53 
err(); 
54 
if (cris_swap(B, 0x12345678) != 0x34127856) 
55 
err(); 
56  
57 
verify_swap(R, 0x78134452, 0x1ec8224a, 0, 0); 
58 
verify_swap(B, 0x78134452, 0x13785244, 0, 0); 
59 
verify_swap(BR, 0x78134452, 0xc81e4a22, 1, 0); 
60 
verify_swap(W, 0x78134452, 0x44527813, 0, 0); 
61 
verify_swap(WR, 0x78134452, 0x224a1ec8, 0, 0); 
62 
verify_swap(WBR, 0x78134452, 0x4a22c81e, 0, 0); 
63 
verify_swap(N, 0x78134452, 0x87ecbbad, 1, 0); 
64 
verify_swap(NR, 0x78134452, 0xe137ddb5, 1, 0); 
65 
verify_swap(NB, 0x78134452, 0xec87adbb, 1, 0); 
66 
verify_swap(NBR, 0x78134452, 0x37e1b5dd, 0, 0); 
67 
verify_swap(NW, 0x78134452, 0xbbad87ec, 1, 0); 
68 
verify_swap(NBR, 0xffffffff, 0, 0, 1); 
69 
} 
70  
71 
int main(void) 
72 
{ 
73 
check_swap(); 
74 
pass(); 
75 
return 0; 
76 
} 