qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

check_swap.c (2426B)


      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 always_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 /* 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(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();
     75 	return 0;
     76 }