xref: /qemu/tests/tcg/tricore/asm/macros.h (revision f271aa62e9ef2e53bda1122b8ec2e119331feb89)
12d934b59SBastian Koppelmann /* Helpers */
22d934b59SBastian Koppelmann #define LI(reg, val)           \
32d934b59SBastian Koppelmann     mov.u reg, lo:val;         \
42d934b59SBastian Koppelmann     movh DREG_TEMP_LI, up:val; \
52d934b59SBastian Koppelmann     or reg, reg, DREG_TEMP_LI; \
62d934b59SBastian Koppelmann 
72d934b59SBastian Koppelmann /* Address definitions */
82d934b59SBastian Koppelmann #define TESTDEV_ADDR 0xf0000000
92d934b59SBastian Koppelmann /* Register definitions */
102d934b59SBastian Koppelmann #define DREG_RS1 %d0
11*f271aa62SBastian Koppelmann #define DREG_RS2 %d1
122d934b59SBastian Koppelmann #define DREG_CALC_RESULT %d1
13*f271aa62SBastian Koppelmann #define DREG_CALC_PSW %d2
14*f271aa62SBastian Koppelmann #define DREG_CORRECT_PSW %d3
152d934b59SBastian Koppelmann #define DREG_TEMP_LI %d10
162d934b59SBastian Koppelmann #define DREG_TEMP %d11
172d934b59SBastian Koppelmann #define DREG_TEST_NUM %d14
182d934b59SBastian Koppelmann #define DREG_CORRECT_RESULT %d15
192d934b59SBastian Koppelmann 
202d934b59SBastian Koppelmann #define DREG_DEV_ADDR %a15
212d934b59SBastian Koppelmann 
222d934b59SBastian Koppelmann /* Test case wrappers */
232d934b59SBastian Koppelmann #define TEST_CASE(num, testreg, correct, code...) \
242d934b59SBastian Koppelmann test_ ## num:                                     \
252d934b59SBastian Koppelmann     code;                                         \
262d934b59SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)              \
272d934b59SBastian Koppelmann     mov DREG_TEST_NUM, num;                       \
282d934b59SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail        \
292d934b59SBastian Koppelmann 
30*f271aa62SBastian Koppelmann #define TEST_CASE_PSW(num, testreg, correct, correct_psw, code...) \
31*f271aa62SBastian Koppelmann test_ ## num:                                                      \
32*f271aa62SBastian Koppelmann     code;                                                          \
33*f271aa62SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)                               \
34*f271aa62SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
35*f271aa62SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail;                        \
36*f271aa62SBastian Koppelmann     mfcr DREG_CALC_PSW, $psw;                                      \
37*f271aa62SBastian Koppelmann     LI(DREG_CORRECT_PSW, correct_psw)                              \
38*f271aa62SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
39*f271aa62SBastian Koppelmann     jne DREG_CALC_PSW, DREG_CORRECT_PSW, fail;
40*f271aa62SBastian Koppelmann 
412d934b59SBastian Koppelmann /* Actual test case type
422d934b59SBastian Koppelmann  * e.g inst %dX, %dY      -> TEST_D_D
432d934b59SBastian Koppelmann  *     inst %dX, %dY, %dZ -> TEST_D_DD
442d934b59SBastian Koppelmann  *     inst %eX, %dY, %dZ -> TEST_E_DD
452d934b59SBastian Koppelmann  */
462d934b59SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1)      \
472d934b59SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,  \
482d934b59SBastian Koppelmann     LI(DREG_RS1, rs1);                        \
492d934b59SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1;          \
502d934b59SBastian Koppelmann     )
512d934b59SBastian Koppelmann 
52*f271aa62SBastian Koppelmann #define TEST_D_DD_PSW(insn, num, result, psw, rs1, rs2) \
53*f271aa62SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,   \
54*f271aa62SBastian Koppelmann     LI(DREG_RS1, rs1);                                  \
55*f271aa62SBastian Koppelmann     LI(DREG_RS2, rs2);                                  \
56*f271aa62SBastian Koppelmann     rstv;                                               \
57*f271aa62SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2;          \
58*f271aa62SBastian Koppelmann     )
59*f271aa62SBastian Koppelmann 
60*f271aa62SBastian Koppelmann 
61*f271aa62SBastian Koppelmann 
622d934b59SBastian Koppelmann /* Pass/Fail handling part */
632d934b59SBastian Koppelmann #define TEST_PASSFAIL                       \
642d934b59SBastian Koppelmann         j pass;                             \
652d934b59SBastian Koppelmann fail:                                       \
662d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
672d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
682d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
692d934b59SBastian Koppelmann         debug;                              \
702d934b59SBastian Koppelmann         j fail;                             \
712d934b59SBastian Koppelmann pass:                                       \
722d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
732d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
742d934b59SBastian Koppelmann         mov DREG_TEST_NUM, 0;               \
752d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
762d934b59SBastian Koppelmann         debug;                              \
772d934b59SBastian Koppelmann         j pass;
78