xref: /qemu/tests/tcg/tricore/asm/macros.h (revision 2d934b5951880ba68948e2c42060d53ceb578e06)
1*2d934b59SBastian Koppelmann /* Helpers */
2*2d934b59SBastian Koppelmann #define LI(reg, val)           \
3*2d934b59SBastian Koppelmann     mov.u reg, lo:val;         \
4*2d934b59SBastian Koppelmann     movh DREG_TEMP_LI, up:val; \
5*2d934b59SBastian Koppelmann     or reg, reg, DREG_TEMP_LI; \
6*2d934b59SBastian Koppelmann 
7*2d934b59SBastian Koppelmann /* Address definitions */
8*2d934b59SBastian Koppelmann #define TESTDEV_ADDR 0xf0000000
9*2d934b59SBastian Koppelmann /* Register definitions */
10*2d934b59SBastian Koppelmann #define DREG_RS1 %d0
11*2d934b59SBastian Koppelmann #define DREG_CALC_RESULT %d1
12*2d934b59SBastian Koppelmann #define DREG_TEMP_LI %d10
13*2d934b59SBastian Koppelmann #define DREG_TEMP %d11
14*2d934b59SBastian Koppelmann #define DREG_TEST_NUM %d14
15*2d934b59SBastian Koppelmann #define DREG_CORRECT_RESULT %d15
16*2d934b59SBastian Koppelmann 
17*2d934b59SBastian Koppelmann #define DREG_DEV_ADDR %a15
18*2d934b59SBastian Koppelmann 
19*2d934b59SBastian Koppelmann /* Test case wrappers */
20*2d934b59SBastian Koppelmann #define TEST_CASE(num, testreg, correct, code...) \
21*2d934b59SBastian Koppelmann test_ ## num:                                     \
22*2d934b59SBastian Koppelmann     code;                                         \
23*2d934b59SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)              \
24*2d934b59SBastian Koppelmann     mov DREG_TEST_NUM, num;                       \
25*2d934b59SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail        \
26*2d934b59SBastian Koppelmann 
27*2d934b59SBastian Koppelmann /* Actual test case type
28*2d934b59SBastian Koppelmann  * e.g inst %dX, %dY      -> TEST_D_D
29*2d934b59SBastian Koppelmann  *     inst %dX, %dY, %dZ -> TEST_D_DD
30*2d934b59SBastian Koppelmann  *     inst %eX, %dY, %dZ -> TEST_E_DD
31*2d934b59SBastian Koppelmann  */
32*2d934b59SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1)      \
33*2d934b59SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,  \
34*2d934b59SBastian Koppelmann     LI(DREG_RS1, rs1);                        \
35*2d934b59SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1;          \
36*2d934b59SBastian Koppelmann     )
37*2d934b59SBastian Koppelmann 
38*2d934b59SBastian Koppelmann /* Pass/Fail handling part */
39*2d934b59SBastian Koppelmann #define TEST_PASSFAIL                       \
40*2d934b59SBastian Koppelmann         j pass;                             \
41*2d934b59SBastian Koppelmann fail:                                       \
42*2d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
43*2d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
44*2d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
45*2d934b59SBastian Koppelmann         debug;                              \
46*2d934b59SBastian Koppelmann         j fail;                             \
47*2d934b59SBastian Koppelmann pass:                                       \
48*2d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
49*2d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
50*2d934b59SBastian Koppelmann         mov DREG_TEST_NUM, 0;               \
51*2d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
52*2d934b59SBastian Koppelmann         debug;                              \
53*2d934b59SBastian Koppelmann         j pass;
54