diff options
Diffstat (limited to 'qemu/tests/tcg/cris/check_swap.c')
-rw-r--r-- | qemu/tests/tcg/cris/check_swap.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/qemu/tests/tcg/cris/check_swap.c b/qemu/tests/tcg/cris/check_swap.c new file mode 100644 index 000000000..f851cbcef --- /dev/null +++ b/qemu/tests/tcg/cris/check_swap.c @@ -0,0 +1,76 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +#define N 8 +#define W 4 +#define B 2 +#define R 1 + +static inline int cris_swap(const int mode, int x) +{ + switch (mode) + { + case N: asm ("swapn\t%0\n" : "+r" (x) : "0" (x)); break; + case W: asm ("swapw\t%0\n" : "+r" (x) : "0" (x)); break; + case B: asm ("swapb\t%0\n" : "+r" (x) : "0" (x)); break; + case R: asm ("swapr\t%0\n" : "+r" (x) : "0" (x)); break; + case B|R: asm ("swapbr\t%0\n" : "+r" (x) : "0" (x)); break; + case W|R: asm ("swapwr\t%0\n" : "+r" (x) : "0" (x)); break; + case W|B: asm ("swapwb\t%0\n" : "+r" (x) : "0" (x)); break; + case W|B|R: asm ("swapwbr\t%0\n" : "+r" (x) : "0" (x)); break; + case N|R: asm ("swapnr\t%0\n" : "+r" (x) : "0" (x)); break; + case N|B: asm ("swapnb\t%0\n" : "+r" (x) : "0" (x)); break; + case N|B|R: asm ("swapnbr\t%0\n" : "+r" (x) : "0" (x)); break; + case N|W: asm ("swapnw\t%0\n" : "+r" (x) : "0" (x)); break; + default: + err(); + break; + } + return x; +} + +/* Made this a macro to be able to pick up the location of the errors. */ +#define verify_swap(mode, val, expected, n, z) \ +do { \ + int r; \ + cris_tst_cc_init(); \ + r = cris_swap(mode, val); \ + cris_tst_mov_cc(n, z); \ + if (r != expected) \ + err(); \ +} while(0) + +void check_swap(void) +{ + /* Some of these numbers are borrowed from GDB's cris sim + testsuite. */ + if (cris_swap(N, 0) != 0xffffffff) + err(); + if (cris_swap(W, 0x12345678) != 0x56781234) + err(); + if (cris_swap(B, 0x12345678) != 0x34127856) + err(); + + verify_swap(R, 0x78134452, 0x1ec8224a, 0, 0); + verify_swap(B, 0x78134452, 0x13785244, 0, 0); + verify_swap(B|R, 0x78134452, 0xc81e4a22, 1, 0); + verify_swap(W, 0x78134452, 0x44527813, 0, 0); + verify_swap(W|R, 0x78134452, 0x224a1ec8, 0, 0); + verify_swap(W|B|R, 0x78134452, 0x4a22c81e, 0, 0); + verify_swap(N, 0x78134452, 0x87ecbbad, 1, 0); + verify_swap(N|R, 0x78134452, 0xe137ddb5, 1, 0); + verify_swap(N|B, 0x78134452, 0xec87adbb, 1, 0); + verify_swap(N|B|R, 0x78134452, 0x37e1b5dd, 0, 0); + verify_swap(N|W, 0x78134452, 0xbbad87ec, 1, 0); + verify_swap(N|B|R, 0xffffffff, 0, 0, 1); +} + +int main(void) +{ + check_swap(); + pass(); + return 0; +} |