xref: /qemu/tests/tcg/cris/libc/crisutils.h (revision d4f6e58f)
1 #ifndef CRISUTILS_H
2 #define CRISUTILS_H 1
3 
4 static char *tst_cc_loc = NULL;
5 
6 #define cris_tst_cc_init() \
7 do { tst_cc_loc = "test_cc failed at " CURRENT_LOCATION; } while(0)
8 
9 /* We need a real symbol to signal error.  */
_err(void)10 void _err(void) {
11 	if (!tst_cc_loc)
12 		tst_cc_loc = "tst_cc_failed\n";
13 	_fail(tst_cc_loc);
14 }
15 
cris_tst_cc_n1(void)16 static always_inline void cris_tst_cc_n1(void)
17 {
18 	asm volatile ("bpl _err\n"
19 		      "nop\n");
20 }
cris_tst_cc_n0(void)21 static always_inline void cris_tst_cc_n0(void)
22 {
23 	asm volatile ("bmi _err\n"
24 		      "nop\n");
25 }
26 
cris_tst_cc_z1(void)27 static always_inline void cris_tst_cc_z1(void)
28 {
29 	asm volatile ("bne _err\n"
30 		      "nop\n");
31 }
cris_tst_cc_z0(void)32 static always_inline void cris_tst_cc_z0(void)
33 {
34 	asm volatile ("beq _err\n"
35 		      "nop\n");
36 }
cris_tst_cc_v1(void)37 static always_inline void cris_tst_cc_v1(void)
38 {
39 	asm volatile ("bvc _err\n"
40 		      "nop\n");
41 }
cris_tst_cc_v0(void)42 static always_inline void cris_tst_cc_v0(void)
43 {
44 	asm volatile ("bvs _err\n"
45 		      "nop\n");
46 }
47 
cris_tst_cc_c1(void)48 static always_inline void cris_tst_cc_c1(void)
49 {
50 	asm volatile ("bcc _err\n"
51 		      "nop\n");
52 }
cris_tst_cc_c0(void)53 static always_inline void cris_tst_cc_c0(void)
54 {
55 	asm volatile ("bcs _err\n"
56 		      "nop\n");
57 }
58 
cris_tst_mov_cc(int n,int z)59 static always_inline void cris_tst_mov_cc(int n, int z)
60 {
61 	if (n) cris_tst_cc_n1(); else cris_tst_cc_n0();
62 	if (z) cris_tst_cc_z1(); else cris_tst_cc_z0();
63 	asm volatile ("" : : "g" (_err));
64 }
65 
cris_tst_cc(const int n,const int z,const int v,const int c)66 static always_inline void cris_tst_cc(const int n, const int z,
67 			       const int v, const int c)
68 {
69 	if (n) cris_tst_cc_n1(); else cris_tst_cc_n0();
70 	if (z) cris_tst_cc_z1(); else cris_tst_cc_z0();
71 	if (v) cris_tst_cc_v1(); else cris_tst_cc_v0();
72 	if (c) cris_tst_cc_c1(); else cris_tst_cc_c0();
73 	asm volatile ("" : : "g" (_err));
74 }
75 
76 #endif
77