| #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; | 
 | } |