xref: /qemu/tests/tcg/tricore/asm/macros.h (revision 76bc63d7eda821e0a82e0ba0a5ad1ad5c52c8d5f)
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
158c3cf3f2SBastian Koppelmann #define DREG_RS2 %d2
168c3cf3f2SBastian Koppelmann #define DREG_RS3 %d4
178c3cf3f2SBastian Koppelmann #define DREG_CALC_RESULT %d5
188c3cf3f2SBastian Koppelmann #define DREG_CALC_PSW %d6
198c3cf3f2SBastian Koppelmann #define DREG_CORRECT_PSW %d7
208c3cf3f2SBastian Koppelmann #define DREG_TEMP_LI %d13
218c3cf3f2SBastian Koppelmann #define DREG_TEMP %d14
228c3cf3f2SBastian Koppelmann #define DREG_TEST_NUM %d8
238c3cf3f2SBastian Koppelmann #define DREG_CORRECT_RESULT %d9
248c3cf3f2SBastian Koppelmann #define DREG_CORRECT_RESULT_2 %d10
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 
318c3cf3f2SBastian Koppelmann #define EREG_RS1 %e0
328c3cf3f2SBastian Koppelmann #define EREG_RS1_LO %d0
338c3cf3f2SBastian Koppelmann #define EREG_RS1_HI %d1
348c3cf3f2SBastian Koppelmann #define EREG_RS2 %e2
358c3cf3f2SBastian Koppelmann #define EREG_RS2_LO %d2
368c3cf3f2SBastian Koppelmann #define EREG_RS2_HI %d3
378c3cf3f2SBastian Koppelmann #define EREG_CALC_RESULT %e6
388c3cf3f2SBastian Koppelmann #define EREG_CALC_RESULT_LO %d6
398c3cf3f2SBastian Koppelmann #define EREG_CALC_RESULT_HI %d7
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;                       \
49*76bc63d7SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail;       \
50*76bc63d7SBastian Koppelmann     mov testreg, 0
512d934b59SBastian Koppelmann 
52d6f1593aSBastian Koppelmann #define TEST_CASE_E(num, correct_lo, correct_hi, code...)  \
53d6f1593aSBastian Koppelmann test_ ## num:                                              \
54d6f1593aSBastian Koppelmann     code;                                                  \
55d6f1593aSBastian Koppelmann     mov DREG_TEST_NUM, num;                                \
56d6f1593aSBastian Koppelmann     LI(EREG_CORRECT_RESULT_LO, correct_lo)                 \
57d6f1593aSBastian Koppelmann     jne EREG_CALC_RESULT_LO, EREG_CORRECT_RESULT_LO, fail; \
58d6f1593aSBastian Koppelmann     LI(EREG_CORRECT_RESULT_HI, correct_hi)                 \
59d6f1593aSBastian Koppelmann     jne EREG_CALC_RESULT_HI, EREG_CORRECT_RESULT_HI, fail;
60d6f1593aSBastian Koppelmann 
61f271aa62SBastian Koppelmann #define TEST_CASE_PSW(num, testreg, correct, correct_psw, code...) \
62f271aa62SBastian Koppelmann test_ ## num:                                                      \
63f271aa62SBastian Koppelmann     code;                                                          \
64f271aa62SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)                               \
65f271aa62SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
66f271aa62SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail;                        \
67f271aa62SBastian Koppelmann     mfcr DREG_CALC_PSW, $psw;                                      \
68f271aa62SBastian Koppelmann     LI(DREG_CORRECT_PSW, correct_psw)                              \
69f271aa62SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
70f271aa62SBastian Koppelmann     jne DREG_CALC_PSW, DREG_CORRECT_PSW, fail;
71f271aa62SBastian Koppelmann 
726dcb9922SBastian Koppelmann #define TEST_LD(insn, num, result, addr_result, ld_pattern) \
736dcb9922SBastian Koppelmann test_ ## num:                                               \
746dcb9922SBastian Koppelmann     LIA(AREG_ADDR, test_data)                               \
756dcb9922SBastian Koppelmann     insn DREG_CALC_RESULT, ld_pattern;                      \
766dcb9922SBastian Koppelmann     LI(DREG_CORRECT_RESULT, result)                         \
776dcb9922SBastian Koppelmann     mov DREG_TEST_NUM, num;                                 \
786dcb9922SBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;        \
796dcb9922SBastian Koppelmann     mov.d DREG_CALC_RESULT, AREG_ADDR;                      \
806dcb9922SBastian Koppelmann     LI(DREG_CORRECT_RESULT, addr_result)                    \
816dcb9922SBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;
826dcb9922SBastian Koppelmann 
836e34f54dSBastian Koppelmann #define TEST_LD_SRO(insn, num, result, addr_result, ld_pattern)  \
846e34f54dSBastian Koppelmann test_ ## num:                                                    \
856e34f54dSBastian Koppelmann     LIA(AREG_ADDR, test_data)                                    \
866e34f54dSBastian Koppelmann     insn %d15, ld_pattern;                                       \
876e34f54dSBastian Koppelmann     LI(DREG_CORRECT_RESULT_2, result)                            \
886e34f54dSBastian Koppelmann     mov DREG_TEST_NUM, num;                                      \
896e34f54dSBastian Koppelmann     jne %d15, DREG_CORRECT_RESULT_2, fail;                       \
906e34f54dSBastian Koppelmann     mov.d DREG_CALC_RESULT, AREG_ADDR;                           \
916e34f54dSBastian Koppelmann     LI(DREG_CORRECT_RESULT, addr_result)                         \
926e34f54dSBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;
936e34f54dSBastian Koppelmann 
946e34f54dSBastian Koppelmann 
952d934b59SBastian Koppelmann /* Actual test case type
962d934b59SBastian Koppelmann  * e.g inst %dX, %dY      -> TEST_D_D
972d934b59SBastian Koppelmann  *     inst %dX, %dY, %dZ -> TEST_D_DD
982d934b59SBastian Koppelmann  *     inst %eX, %dY, %dZ -> TEST_E_DD
992d934b59SBastian Koppelmann  */
1006dcb9922SBastian Koppelmann 
1016dcb9922SBastian Koppelmann 
1022d934b59SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1)      \
1032d934b59SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,  \
1042d934b59SBastian Koppelmann     LI(DREG_RS1, rs1);                        \
1052d934b59SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1;          \
1062d934b59SBastian Koppelmann     )
1072d934b59SBastian Koppelmann 
10855f037a5SBastian Koppelmann #define TEST_D_D_PSW(insn, num, result, psw, rs1)     \
10955f037a5SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \
11055f037a5SBastian Koppelmann     LI(DREG_RS1, rs1);                                \
11155f037a5SBastian Koppelmann     rstv;                                             \
11255f037a5SBastian Koppelmann     insn DREG_CORRECT_RESULT, DREG_RS1;               \
11355f037a5SBastian Koppelmann     )
11455f037a5SBastian Koppelmann 
1157ebe4cb3SBastian Koppelmann #define TEST_D_DDD(insn, num, result, rs1, rs2, rs3)        \
1167ebe4cb3SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                \
1177ebe4cb3SBastian Koppelmann     LI(DREG_RS1, rs1);                                      \
1187ebe4cb3SBastian Koppelmann     LI(DREG_RS2, rs2);                                      \
1197ebe4cb3SBastian Koppelmann     LI(DREG_RS3, rs3);                                      \
1207ebe4cb3SBastian Koppelmann     rstv;                                                   \
1217ebe4cb3SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3; \
1227ebe4cb3SBastian Koppelmann     )
1237ebe4cb3SBastian Koppelmann 
124f271aa62SBastian Koppelmann #define TEST_D_DD_PSW(insn, num, result, psw, rs1, rs2) \
125f271aa62SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,   \
126f271aa62SBastian Koppelmann     LI(DREG_RS1, rs1);                                  \
127f271aa62SBastian Koppelmann     LI(DREG_RS2, rs2);                                  \
128f271aa62SBastian Koppelmann     rstv;                                               \
129f271aa62SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2;          \
130f271aa62SBastian Koppelmann     )
131f271aa62SBastian Koppelmann 
1326ad6701cSBastian Koppelmann #define TEST_D_DDD_PSW(insn, num, result, psw, rs1, rs2, rs3) \
1336ad6701cSBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,         \
1346ad6701cSBastian Koppelmann     LI(DREG_RS1, rs1);                                        \
1356ad6701cSBastian Koppelmann     LI(DREG_RS2, rs2);                                        \
1366ad6701cSBastian Koppelmann     LI(DREG_RS3, rs3);                                        \
1376ad6701cSBastian Koppelmann     rstv;                                                     \
1386ad6701cSBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3;      \
1396ad6701cSBastian Koppelmann     )
1406ad6701cSBastian Koppelmann 
14170447df9SBastian Koppelmann #define TEST_D_DDI(insn, num, result, rs1, rs2, imm) \
14270447df9SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,         \
14370447df9SBastian Koppelmann     LI(DREG_RS1, rs1);                               \
14470447df9SBastian Koppelmann     LI(DREG_RS2, rs2);                               \
14570447df9SBastian Koppelmann     rstv;                                            \
14670447df9SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm;  \
14770447df9SBastian Koppelmann     )
14870447df9SBastian Koppelmann 
1496ad6701cSBastian Koppelmann #define TEST_D_DDI_PSW(insn, num, result, psw, rs1, rs2, imm) \
1506ad6701cSBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,         \
1516ad6701cSBastian Koppelmann     LI(DREG_RS1, rs1);                                        \
1526ad6701cSBastian Koppelmann     LI(DREG_RS2, rs2);                                        \
1536ad6701cSBastian Koppelmann     rstv;                                                     \
1546ad6701cSBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm;           \
1556ad6701cSBastian Koppelmann     )
1566ad6701cSBastian Koppelmann 
157fa581531SBastian Koppelmann #define TEST_D_DIDI(insn, num, result, rs1, imm1, rs2, imm2) \
158fa581531SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                 \
159fa581531SBastian Koppelmann     LI(DREG_RS1, rs1);                                       \
160fa581531SBastian Koppelmann     LI(DREG_RS2, rs1);                                       \
161fa581531SBastian Koppelmann     rstv;                                                    \
162fa581531SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, imm1, DREG_RS2, imm2;   \
163fa581531SBastian Koppelmann     )
164fa581531SBastian Koppelmann 
16523fa6f56SBastian Koppelmann #define TEST_D_DDII(insn, num, result, rs1, rs2, imm1, imm2) \
16623fa6f56SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                 \
16723fa6f56SBastian Koppelmann     LI(DREG_RS1, rs1);                                       \
16823fa6f56SBastian Koppelmann     LI(DREG_RS2, rs2);                                       \
16923fa6f56SBastian Koppelmann     rstv;                                                    \
17023fa6f56SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm1, imm2;   \
17123fa6f56SBastian Koppelmann     )
17223fa6f56SBastian Koppelmann 
173222ff2d3SBastian Koppelmann #define TEST_D_DIE(insn, num, result, rs1, imm1, rs2_lo, rs2_hi)\
174222ff2d3SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                    \
175222ff2d3SBastian Koppelmann     LI(DREG_RS1, rs1);                                          \
176222ff2d3SBastian Koppelmann     LI(EREG_RS2_LO, rs2_lo);                                    \
177222ff2d3SBastian Koppelmann     LI(EREG_RS2_HI, rs2_hi);                                    \
178222ff2d3SBastian Koppelmann     rstv;                                                       \
179222ff2d3SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, imm1, EREG_RS2;            \
180222ff2d3SBastian Koppelmann     )
181222ff2d3SBastian Koppelmann 
18223fa6f56SBastian Koppelmann #define TEST_D_DIII(insn, num, result, rs1, imm1, imm2, imm3)\
18323fa6f56SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                 \
18423fa6f56SBastian Koppelmann     LI(DREG_RS1, rs1);                                       \
18523fa6f56SBastian Koppelmann     rstv;                                                    \
18623fa6f56SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, imm1, imm2, imm3;       \
18723fa6f56SBastian Koppelmann     )
18823fa6f56SBastian Koppelmann 
189d6f1593aSBastian Koppelmann #define TEST_E_ED(insn, num, res_hi, res_lo, rs1_hi, rs1_lo, rs2) \
190d6f1593aSBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                              \
191d6f1593aSBastian Koppelmann     LI(EREG_RS1_LO, rs1_lo);                                      \
192d6f1593aSBastian Koppelmann     LI(EREG_RS1_HI, rs1_hi);                                      \
193d6f1593aSBastian Koppelmann     LI(DREG_RS2, rs2);                                            \
194d6f1593aSBastian Koppelmann     insn EREG_CALC_RESULT, EREG_RS1, DREG_RS2;                    \
195d6f1593aSBastian Koppelmann     )
196f271aa62SBastian Koppelmann 
19776f7f548SBastian Koppelmann #define TEST_E_IDI(insn, num, res_hi, res_lo, imm1, rs1, imm2) \
19876f7f548SBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                           \
19976f7f548SBastian Koppelmann     LI(DREG_RS1, rs1);                                         \
20076f7f548SBastian Koppelmann     rstv;                                                      \
2013c471b07SBastian Koppelmann     insn EREG_CALC_RESULT, imm1, DREG_RS1, imm2;               \
20276f7f548SBastian Koppelmann     )
20376f7f548SBastian Koppelmann 
2046dcb9922SBastian Koppelmann 
2056dcb9922SBastian Koppelmann 
2062d934b59SBastian Koppelmann /* Pass/Fail handling part */
2072d934b59SBastian Koppelmann #define TEST_PASSFAIL                       \
2082d934b59SBastian Koppelmann         j pass;                             \
2092d934b59SBastian Koppelmann fail:                                       \
2102d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
2112d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
2122d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
2132d934b59SBastian Koppelmann         debug;                              \
2142d934b59SBastian Koppelmann         j fail;                             \
2152d934b59SBastian Koppelmann pass:                                       \
2162d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
2172d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
2182d934b59SBastian Koppelmann         mov DREG_TEST_NUM, 0;               \
2192d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
2202d934b59SBastian Koppelmann         debug;                              \
2212d934b59SBastian Koppelmann         j pass;
222