]>
Commit | Line | Data |
---|---|---|
dd43edf4 TS |
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 | ||
4a6648f4 | 12 | static inline int cris_swap(const int mode, int x) |
dd43edf4 TS |
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 B|R: asm ("swapbr\t%0\n" : "+r" (x) : "0" (x)); break; | |
21 | case W|R: asm ("swapwr\t%0\n" : "+r" (x) : "0" (x)); break; | |
22 | case W|B: asm ("swapwb\t%0\n" : "+r" (x) : "0" (x)); break; | |
23 | case W|B|R: asm ("swapwbr\t%0\n" : "+r" (x) : "0" (x)); break; | |
24 | case N|R: asm ("swapnr\t%0\n" : "+r" (x) : "0" (x)); break; | |
25 | case N|B: asm ("swapnb\t%0\n" : "+r" (x) : "0" (x)); break; | |
26 | case N|B|R: asm ("swapnbr\t%0\n" : "+r" (x) : "0" (x)); break; | |
27 | case N|W: 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(); \ | |
46411f86 | 44 | } while(0) |
dd43edf4 TS |
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(B|R, 0x78134452, 0xc81e4a22, 1, 0); | |
60 | verify_swap(W, 0x78134452, 0x44527813, 0, 0); | |
61 | verify_swap(W|R, 0x78134452, 0x224a1ec8, 0, 0); | |
62 | verify_swap(W|B|R, 0x78134452, 0x4a22c81e, 0, 0); | |
63 | verify_swap(N, 0x78134452, 0x87ecbbad, 1, 0); | |
64 | verify_swap(N|R, 0x78134452, 0xe137ddb5, 1, 0); | |
65 | verify_swap(N|B, 0x78134452, 0xec87adbb, 1, 0); | |
66 | verify_swap(N|B|R, 0x78134452, 0x37e1b5dd, 0, 0); | |
67 | verify_swap(N|W, 0x78134452, 0xbbad87ec, 1, 0); | |
68 | verify_swap(N|B|R, 0xffffffff, 0, 0, 1); | |
69 | } | |
70 | ||
71 | int main(void) | |
72 | { | |
73 | check_swap(); | |
74 | pass(); | |
bd3a8454 | 75 | return 0; |
dd43edf4 | 76 | } |