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