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