xref: /qemu/tests/tcg/tricore/asm/macros.h (revision 23fa6f56b33f8fddf86ba4d027fb7d3081440cd9)
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 
76dcb9922SBastian Koppelmann #define LIA(reg, val)        \
86dcb9922SBastian Koppelmann     LI(DREG_TEMP, val)       \
96dcb9922SBastian Koppelmann     mov.a reg, DREG_TEMP;
106dcb9922SBastian Koppelmann 
112d934b59SBastian Koppelmann /* Address definitions */
122d934b59SBastian Koppelmann #define TESTDEV_ADDR 0xf0000000
132d934b59SBastian Koppelmann /* Register definitions */
142d934b59SBastian Koppelmann #define DREG_RS1 %d0
15f271aa62SBastian Koppelmann #define DREG_RS2 %d1
16fa581531SBastian Koppelmann #define DREG_RS3 %d2
17fa581531SBastian Koppelmann #define DREG_CALC_RESULT %d3
18fa581531SBastian Koppelmann #define DREG_CALC_PSW %d4
19fa581531SBastian Koppelmann #define DREG_CORRECT_PSW %d5
202d934b59SBastian Koppelmann #define DREG_TEMP_LI %d10
212d934b59SBastian Koppelmann #define DREG_TEMP %d11
222d934b59SBastian Koppelmann #define DREG_TEST_NUM %d14
232d934b59SBastian Koppelmann #define DREG_CORRECT_RESULT %d15
246e34f54dSBastian Koppelmann #define DREG_CORRECT_RESULT_2 %d13
252d934b59SBastian Koppelmann 
266dcb9922SBastian Koppelmann #define AREG_ADDR %a0
276dcb9922SBastian Koppelmann #define AREG_CORRECT_RESULT %a3
286dcb9922SBastian Koppelmann 
292d934b59SBastian Koppelmann #define DREG_DEV_ADDR %a15
302d934b59SBastian Koppelmann 
31d6f1593aSBastian Koppelmann #define EREG_RS1 %e6
32d6f1593aSBastian Koppelmann #define EREG_RS1_LO %d6
33d6f1593aSBastian Koppelmann #define EREG_RS1_HI %d7
34d6f1593aSBastian Koppelmann #define EREG_RS2 %e8
35d6f1593aSBastian Koppelmann #define EREG_RS2_LO %d8
36d6f1593aSBastian Koppelmann #define EREG_RS2_HI %d9
37d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT %e8
38d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_HI %d9
39d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_LO %d8
40d6f1593aSBastian Koppelmann #define EREG_CORRECT_RESULT_LO %d0
41d6f1593aSBastian Koppelmann #define EREG_CORRECT_RESULT_HI %d1
42d6f1593aSBastian Koppelmann 
432d934b59SBastian Koppelmann /* Test case wrappers */
442d934b59SBastian Koppelmann #define TEST_CASE(num, testreg, correct, code...) \
452d934b59SBastian Koppelmann test_ ## num:                                     \
462d934b59SBastian Koppelmann     code;                                         \
472d934b59SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)              \
482d934b59SBastian Koppelmann     mov DREG_TEST_NUM, num;                       \
492d934b59SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail        \
502d934b59SBastian Koppelmann 
51d6f1593aSBastian Koppelmann #define TEST_CASE_E(num, correct_lo, correct_hi, code...)  \
52d6f1593aSBastian Koppelmann test_ ## num:                                              \
53d6f1593aSBastian Koppelmann     code;                                                  \
54d6f1593aSBastian Koppelmann     mov DREG_TEST_NUM, num;                                \
55d6f1593aSBastian Koppelmann     LI(EREG_CORRECT_RESULT_LO, correct_lo)                 \
56d6f1593aSBastian Koppelmann     jne EREG_CALC_RESULT_LO, EREG_CORRECT_RESULT_LO, fail; \
57d6f1593aSBastian Koppelmann     LI(EREG_CORRECT_RESULT_HI, correct_hi)                 \
58d6f1593aSBastian Koppelmann     jne EREG_CALC_RESULT_HI, EREG_CORRECT_RESULT_HI, fail;
59d6f1593aSBastian Koppelmann 
60f271aa62SBastian Koppelmann #define TEST_CASE_PSW(num, testreg, correct, correct_psw, code...) \
61f271aa62SBastian Koppelmann test_ ## num:                                                      \
62f271aa62SBastian Koppelmann     code;                                                          \
63f271aa62SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)                               \
64f271aa62SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
65f271aa62SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail;                        \
66f271aa62SBastian Koppelmann     mfcr DREG_CALC_PSW, $psw;                                      \
67f271aa62SBastian Koppelmann     LI(DREG_CORRECT_PSW, correct_psw)                              \
68f271aa62SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
69f271aa62SBastian Koppelmann     jne DREG_CALC_PSW, DREG_CORRECT_PSW, fail;
70f271aa62SBastian Koppelmann 
716dcb9922SBastian Koppelmann #define TEST_LD(insn, num, result, addr_result, ld_pattern) \
726dcb9922SBastian Koppelmann test_ ## num:                                               \
736dcb9922SBastian Koppelmann     LIA(AREG_ADDR, test_data)                               \
746dcb9922SBastian Koppelmann     insn DREG_CALC_RESULT, ld_pattern;                      \
756dcb9922SBastian Koppelmann     LI(DREG_CORRECT_RESULT, result)                         \
766dcb9922SBastian Koppelmann     mov DREG_TEST_NUM, num;                                 \
776dcb9922SBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;        \
786dcb9922SBastian Koppelmann     mov.d DREG_CALC_RESULT, AREG_ADDR;                      \
796dcb9922SBastian Koppelmann     LI(DREG_CORRECT_RESULT, addr_result)                    \
806dcb9922SBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;
816dcb9922SBastian Koppelmann 
826e34f54dSBastian Koppelmann #define TEST_LD_SRO(insn, num, result, addr_result, ld_pattern)  \
836e34f54dSBastian Koppelmann test_ ## num:                                                    \
846e34f54dSBastian Koppelmann     LIA(AREG_ADDR, test_data)                                    \
856e34f54dSBastian Koppelmann     insn %d15, ld_pattern;                                       \
866e34f54dSBastian Koppelmann     LI(DREG_CORRECT_RESULT_2, result)                            \
876e34f54dSBastian Koppelmann     mov DREG_TEST_NUM, num;                                      \
886e34f54dSBastian Koppelmann     jne %d15, DREG_CORRECT_RESULT_2, fail;                       \
896e34f54dSBastian Koppelmann     mov.d DREG_CALC_RESULT, AREG_ADDR;                           \
906e34f54dSBastian Koppelmann     LI(DREG_CORRECT_RESULT, addr_result)                         \
916e34f54dSBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;
926e34f54dSBastian Koppelmann 
936e34f54dSBastian Koppelmann 
942d934b59SBastian Koppelmann /* Actual test case type
952d934b59SBastian Koppelmann  * e.g inst %dX, %dY      -> TEST_D_D
962d934b59SBastian Koppelmann  *     inst %dX, %dY, %dZ -> TEST_D_DD
972d934b59SBastian Koppelmann  *     inst %eX, %dY, %dZ -> TEST_E_DD
982d934b59SBastian Koppelmann  */
996dcb9922SBastian Koppelmann 
1006dcb9922SBastian Koppelmann 
1012d934b59SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1)      \
1022d934b59SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,  \
1032d934b59SBastian Koppelmann     LI(DREG_RS1, rs1);                        \
1042d934b59SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1;          \
1052d934b59SBastian Koppelmann     )
1062d934b59SBastian Koppelmann 
10755f037a5SBastian Koppelmann #define TEST_D_D_PSW(insn, num, result, psw, rs1)     \
10855f037a5SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \
10955f037a5SBastian Koppelmann     LI(DREG_RS1, rs1);                                \
11055f037a5SBastian Koppelmann     rstv;                                             \
11155f037a5SBastian Koppelmann     insn DREG_CORRECT_RESULT, DREG_RS1;               \
11255f037a5SBastian Koppelmann     )
11355f037a5SBastian Koppelmann 
1147ebe4cb3SBastian Koppelmann #define TEST_D_DDD(insn, num, result, rs1, rs2, rs3)        \
1157ebe4cb3SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                \
1167ebe4cb3SBastian Koppelmann     LI(DREG_RS1, rs1);                                      \
1177ebe4cb3SBastian Koppelmann     LI(DREG_RS2, rs2);                                      \
1187ebe4cb3SBastian Koppelmann     LI(DREG_RS3, rs3);                                      \
1197ebe4cb3SBastian Koppelmann     rstv;                                                   \
1207ebe4cb3SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3; \
1217ebe4cb3SBastian Koppelmann     )
1227ebe4cb3SBastian Koppelmann 
123f271aa62SBastian Koppelmann #define TEST_D_DD_PSW(insn, num, result, psw, rs1, rs2) \
124f271aa62SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,   \
125f271aa62SBastian Koppelmann     LI(DREG_RS1, rs1);                                  \
126f271aa62SBastian Koppelmann     LI(DREG_RS2, rs2);                                  \
127f271aa62SBastian Koppelmann     rstv;                                               \
128f271aa62SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2;          \
129f271aa62SBastian Koppelmann     )
130f271aa62SBastian Koppelmann 
1316ad6701cSBastian Koppelmann #define TEST_D_DDD_PSW(insn, num, result, psw, rs1, rs2, rs3) \
1326ad6701cSBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,         \
1336ad6701cSBastian Koppelmann     LI(DREG_RS1, rs1);                                        \
1346ad6701cSBastian Koppelmann     LI(DREG_RS2, rs2);                                        \
1356ad6701cSBastian Koppelmann     LI(DREG_RS3, rs3);                                        \
1366ad6701cSBastian Koppelmann     rstv;                                                     \
1376ad6701cSBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3;      \
1386ad6701cSBastian Koppelmann     )
1396ad6701cSBastian Koppelmann 
14070447df9SBastian Koppelmann #define TEST_D_DDI(insn, num, result, rs1, rs2, imm) \
14170447df9SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,         \
14270447df9SBastian Koppelmann     LI(DREG_RS1, rs1);                               \
14370447df9SBastian Koppelmann     LI(DREG_RS2, rs2);                               \
14470447df9SBastian Koppelmann     rstv;                                            \
14570447df9SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm;  \
14670447df9SBastian Koppelmann     )
14770447df9SBastian Koppelmann 
1486ad6701cSBastian Koppelmann #define TEST_D_DDI_PSW(insn, num, result, psw, rs1, rs2, imm) \
1496ad6701cSBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,         \
1506ad6701cSBastian Koppelmann     LI(DREG_RS1, rs1);                                        \
1516ad6701cSBastian Koppelmann     LI(DREG_RS2, rs2);                                        \
1526ad6701cSBastian Koppelmann     rstv;                                                     \
1536ad6701cSBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm;           \
1546ad6701cSBastian Koppelmann     )
1556ad6701cSBastian Koppelmann 
156fa581531SBastian Koppelmann #define TEST_D_DIDI(insn, num, result, rs1, imm1, rs2, imm2) \
157fa581531SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                 \
158fa581531SBastian Koppelmann     LI(DREG_RS1, rs1);                                       \
159fa581531SBastian Koppelmann     LI(DREG_RS2, rs1);                                       \
160fa581531SBastian Koppelmann     rstv;                                                    \
161fa581531SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, imm1, DREG_RS2, imm2;   \
162fa581531SBastian Koppelmann     )
163fa581531SBastian Koppelmann 
164*23fa6f56SBastian Koppelmann #define TEST_D_DDII(insn, num, result, rs1, rs2, imm1, imm2) \
165*23fa6f56SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                 \
166*23fa6f56SBastian Koppelmann     LI(DREG_RS1, rs1);                                       \
167*23fa6f56SBastian Koppelmann     LI(DREG_RS2, rs2);                                       \
168*23fa6f56SBastian Koppelmann     rstv;                                                    \
169*23fa6f56SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm1, imm2;   \
170*23fa6f56SBastian Koppelmann     )
171*23fa6f56SBastian Koppelmann 
172*23fa6f56SBastian Koppelmann #define TEST_D_DIII(insn, num, result, rs1, imm1, imm2, imm3)\
173*23fa6f56SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                 \
174*23fa6f56SBastian Koppelmann     LI(DREG_RS1, rs1);                                       \
175*23fa6f56SBastian Koppelmann     rstv;                                                    \
176*23fa6f56SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, imm1, imm2, imm3;       \
177*23fa6f56SBastian Koppelmann     )
178*23fa6f56SBastian Koppelmann 
179d6f1593aSBastian Koppelmann #define TEST_E_ED(insn, num, res_hi, res_lo, rs1_hi, rs1_lo, rs2) \
180d6f1593aSBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                              \
181d6f1593aSBastian Koppelmann     LI(EREG_RS1_LO, rs1_lo);                                      \
182d6f1593aSBastian Koppelmann     LI(EREG_RS1_HI, rs1_hi);                                      \
183d6f1593aSBastian Koppelmann     LI(DREG_RS2, rs2);                                            \
184d6f1593aSBastian Koppelmann     insn EREG_CALC_RESULT, EREG_RS1, DREG_RS2;                    \
185d6f1593aSBastian Koppelmann     )
186f271aa62SBastian Koppelmann 
18776f7f548SBastian Koppelmann #define TEST_E_IDI(insn, num, res_hi, res_lo, imm1, rs1, imm2) \
18876f7f548SBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                           \
18976f7f548SBastian Koppelmann     LI(DREG_RS1, rs1);                                         \
19076f7f548SBastian Koppelmann     rstv;                                                      \
1913c471b07SBastian Koppelmann     insn EREG_CALC_RESULT, imm1, DREG_RS1, imm2;               \
19276f7f548SBastian Koppelmann     )
19376f7f548SBastian Koppelmann 
1946dcb9922SBastian Koppelmann 
1956dcb9922SBastian Koppelmann 
1962d934b59SBastian Koppelmann /* Pass/Fail handling part */
1972d934b59SBastian Koppelmann #define TEST_PASSFAIL                       \
1982d934b59SBastian Koppelmann         j pass;                             \
1992d934b59SBastian Koppelmann fail:                                       \
2002d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
2012d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
2022d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
2032d934b59SBastian Koppelmann         debug;                              \
2042d934b59SBastian Koppelmann         j fail;                             \
2052d934b59SBastian Koppelmann pass:                                       \
2062d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
2072d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
2082d934b59SBastian Koppelmann         mov DREG_TEST_NUM, 0;               \
2092d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
2102d934b59SBastian Koppelmann         debug;                              \
2112d934b59SBastian Koppelmann         j pass;
212