xref: /qemu/tests/tcg/cris/libc/crisutils.h (revision 4477035e)
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.  */
10 void _err(void) {
11 	if (!tst_cc_loc)
12 		tst_cc_loc = "tst_cc_failed\n";
13 	_fail(tst_cc_loc);
14 }
15 
16 static always_inline void cris_tst_cc_n1(void)
17 {
18 	asm volatile ("bpl _err\n"
19 		      "nop\n");
20 }
21 static always_inline void cris_tst_cc_n0(void)
22 {
23 	asm volatile ("bmi _err\n"
24 		      "nop\n");
25 }
26 
27 static always_inline void cris_tst_cc_z1(void)
28 {
29 	asm volatile ("bne _err\n"
30 		      "nop\n");
31 }
32 static always_inline void cris_tst_cc_z0(void)
33 {
34 	asm volatile ("beq _err\n"
35 		      "nop\n");
36 }
37 static always_inline void cris_tst_cc_v1(void)
38 {
39 	asm volatile ("bvc _err\n"
40 		      "nop\n");
41 }
42 static always_inline void cris_tst_cc_v0(void)
43 {
44 	asm volatile ("bvs _err\n"
45 		      "nop\n");
46 }
47 
48 static always_inline void cris_tst_cc_c1(void)
49 {
50 	asm volatile ("bcc _err\n"
51 		      "nop\n");
52 }
53 static always_inline void cris_tst_cc_c0(void)
54 {
55 	asm volatile ("bcs _err\n"
56 		      "nop\n");
57 }
58 
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 
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