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
12static 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 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
36#define verify_swap(mode, val, expected, n, z) \
37do { \
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
46void check_swap(void)
47{
48
49
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
71int main(void)
72{
73 check_swap();
74 pass();
75 return 0;
76}
77