symbian-qemu-0.9.1-12/qemu-symbian-svp/tests/cris/check_swap.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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 extern 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 }