xref: /qemu/tests/tcg/tricore/asm/macros.h (revision fa581531ffdc94ba18da6ec0c566bece57a60a85)
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
11f271aa62SBastian Koppelmann #define DREG_RS2 %d1
12*fa581531SBastian Koppelmann #define DREG_RS3 %d2
13*fa581531SBastian Koppelmann #define DREG_CALC_RESULT %d3
14*fa581531SBastian Koppelmann #define DREG_CALC_PSW %d4
15*fa581531SBastian Koppelmann #define DREG_CORRECT_PSW %d5
162d934b59SBastian Koppelmann #define DREG_TEMP_LI %d10
172d934b59SBastian Koppelmann #define DREG_TEMP %d11
182d934b59SBastian Koppelmann #define DREG_TEST_NUM %d14
192d934b59SBastian Koppelmann #define DREG_CORRECT_RESULT %d15
202d934b59SBastian Koppelmann 
212d934b59SBastian Koppelmann #define DREG_DEV_ADDR %a15
222d934b59SBastian Koppelmann 
23d6f1593aSBastian Koppelmann #define EREG_RS1 %e6
24d6f1593aSBastian Koppelmann #define EREG_RS1_LO %d6
25d6f1593aSBastian Koppelmann #define EREG_RS1_HI %d7
26d6f1593aSBastian Koppelmann #define EREG_RS2 %e8
27d6f1593aSBastian Koppelmann #define EREG_RS2_LO %d8
28d6f1593aSBastian Koppelmann #define EREG_RS2_HI %d9
29d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT %e8
30d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_HI %d9
31d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_LO %d8
32d6f1593aSBastian Koppelmann #define EREG_CORRECT_RESULT_LO %d0
33d6f1593aSBastian Koppelmann #define EREG_CORRECT_RESULT_HI %d1
34d6f1593aSBastian Koppelmann 
352d934b59SBastian Koppelmann /* Test case wrappers */
362d934b59SBastian Koppelmann #define TEST_CASE(num, testreg, correct, code...) \
372d934b59SBastian Koppelmann test_ ## num:                                     \
382d934b59SBastian Koppelmann     code;                                         \
392d934b59SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)              \
402d934b59SBastian Koppelmann     mov DREG_TEST_NUM, num;                       \
412d934b59SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail        \
422d934b59SBastian Koppelmann 
43d6f1593aSBastian Koppelmann #define TEST_CASE_E(num, correct_lo, correct_hi, code...)  \
44d6f1593aSBastian Koppelmann test_ ## num:                                              \
45d6f1593aSBastian Koppelmann     code;                                                  \
46d6f1593aSBastian Koppelmann     mov DREG_TEST_NUM, num;                                \
47d6f1593aSBastian Koppelmann     LI(EREG_CORRECT_RESULT_LO, correct_lo)                 \
48d6f1593aSBastian Koppelmann     jne EREG_CALC_RESULT_LO, EREG_CORRECT_RESULT_LO, fail; \
49d6f1593aSBastian Koppelmann     LI(EREG_CORRECT_RESULT_HI, correct_hi)                 \
50d6f1593aSBastian Koppelmann     jne EREG_CALC_RESULT_HI, EREG_CORRECT_RESULT_HI, fail;
51d6f1593aSBastian Koppelmann 
52f271aa62SBastian Koppelmann #define TEST_CASE_PSW(num, testreg, correct, correct_psw, code...) \
53f271aa62SBastian Koppelmann test_ ## num:                                                      \
54f271aa62SBastian Koppelmann     code;                                                          \
55f271aa62SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)                               \
56f271aa62SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
57f271aa62SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail;                        \
58f271aa62SBastian Koppelmann     mfcr DREG_CALC_PSW, $psw;                                      \
59f271aa62SBastian Koppelmann     LI(DREG_CORRECT_PSW, correct_psw)                              \
60f271aa62SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
61f271aa62SBastian Koppelmann     jne DREG_CALC_PSW, DREG_CORRECT_PSW, fail;
62f271aa62SBastian Koppelmann 
632d934b59SBastian Koppelmann /* Actual test case type
642d934b59SBastian Koppelmann  * e.g inst %dX, %dY      -> TEST_D_D
652d934b59SBastian Koppelmann  *     inst %dX, %dY, %dZ -> TEST_D_DD
662d934b59SBastian Koppelmann  *     inst %eX, %dY, %dZ -> TEST_E_DD
672d934b59SBastian Koppelmann  */
682d934b59SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1)      \
692d934b59SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,  \
702d934b59SBastian Koppelmann     LI(DREG_RS1, rs1);                        \
712d934b59SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1;          \
722d934b59SBastian Koppelmann     )
732d934b59SBastian Koppelmann 
7455f037a5SBastian Koppelmann #define TEST_D_D_PSW(insn, num, result, psw, rs1)     \
7555f037a5SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \
7655f037a5SBastian Koppelmann     LI(DREG_RS1, rs1);                                \
7755f037a5SBastian Koppelmann     rstv;                                             \
7855f037a5SBastian Koppelmann     insn DREG_CORRECT_RESULT, DREG_RS1;               \
7955f037a5SBastian Koppelmann     )
8055f037a5SBastian Koppelmann 
81f271aa62SBastian Koppelmann #define TEST_D_DD_PSW(insn, num, result, psw, rs1, rs2) \
82f271aa62SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,   \
83f271aa62SBastian Koppelmann     LI(DREG_RS1, rs1);                                  \
84f271aa62SBastian Koppelmann     LI(DREG_RS2, rs2);                                  \
85f271aa62SBastian Koppelmann     rstv;                                               \
86f271aa62SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2;          \
87f271aa62SBastian Koppelmann     )
88f271aa62SBastian Koppelmann 
896ad6701cSBastian Koppelmann #define TEST_D_DDD_PSW(insn, num, result, psw, rs1, rs2, rs3) \
906ad6701cSBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,         \
916ad6701cSBastian Koppelmann     LI(DREG_RS1, rs1);                                        \
926ad6701cSBastian Koppelmann     LI(DREG_RS2, rs2);                                        \
936ad6701cSBastian Koppelmann     LI(DREG_RS3, rs3);                                        \
946ad6701cSBastian Koppelmann     rstv;                                                     \
956ad6701cSBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3;      \
966ad6701cSBastian Koppelmann     )
976ad6701cSBastian Koppelmann 
986ad6701cSBastian Koppelmann #define TEST_D_DDI_PSW(insn, num, result, psw, rs1, rs2, imm) \
996ad6701cSBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,         \
1006ad6701cSBastian Koppelmann     LI(DREG_RS1, rs1);                                        \
1016ad6701cSBastian Koppelmann     LI(DREG_RS2, rs2);                                        \
1026ad6701cSBastian Koppelmann     rstv;                                                     \
1036ad6701cSBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm;           \
1046ad6701cSBastian Koppelmann     )
1056ad6701cSBastian Koppelmann 
106*fa581531SBastian Koppelmann #define TEST_D_DIDI(insn, num, result, rs1, imm1, rs2, imm2) \
107*fa581531SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                 \
108*fa581531SBastian Koppelmann     LI(DREG_RS1, rs1);                                       \
109*fa581531SBastian Koppelmann     LI(DREG_RS2, rs1);                                       \
110*fa581531SBastian Koppelmann     rstv;                                                    \
111*fa581531SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, imm1, DREG_RS2, imm2;   \
112*fa581531SBastian Koppelmann     )
113*fa581531SBastian Koppelmann 
114d6f1593aSBastian Koppelmann #define TEST_E_ED(insn, num, res_hi, res_lo, rs1_hi, rs1_lo, rs2) \
115d6f1593aSBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                              \
116d6f1593aSBastian Koppelmann     LI(EREG_RS1_LO, rs1_lo);                                      \
117d6f1593aSBastian Koppelmann     LI(EREG_RS1_HI, rs1_hi);                                      \
118d6f1593aSBastian Koppelmann     LI(DREG_RS2, rs2);                                            \
119d6f1593aSBastian Koppelmann     insn EREG_CALC_RESULT, EREG_RS1, DREG_RS2;                    \
120d6f1593aSBastian Koppelmann     )
121f271aa62SBastian Koppelmann 
12276f7f548SBastian Koppelmann #define TEST_E_IDI(insn, num, res_hi, res_lo, imm1, rs1, imm2) \
12376f7f548SBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                           \
12476f7f548SBastian Koppelmann     LI(DREG_RS1, rs1);                                         \
12576f7f548SBastian Koppelmann     rstv;                                                      \
12676f7f548SBastian Koppelmann     insn EREG_CALC_RESULT, imm1, DREG_RS1, imm2);              \
12776f7f548SBastian Koppelmann     )
12876f7f548SBastian Koppelmann 
1292d934b59SBastian Koppelmann /* Pass/Fail handling part */
1302d934b59SBastian Koppelmann #define TEST_PASSFAIL                       \
1312d934b59SBastian Koppelmann         j pass;                             \
1322d934b59SBastian Koppelmann fail:                                       \
1332d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
1342d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
1352d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
1362d934b59SBastian Koppelmann         debug;                              \
1372d934b59SBastian Koppelmann         j fail;                             \
1382d934b59SBastian Koppelmann pass:                                       \
1392d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
1402d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
1412d934b59SBastian Koppelmann         mov DREG_TEST_NUM, 0;               \
1422d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
1432d934b59SBastian Koppelmann         debug;                              \
1442d934b59SBastian Koppelmann         j pass;
145