xref: /qemu/tests/tcg/tricore/asm/macros.h (revision 6e34f54d88184b25db4fbc4dd1665d9be1a9e21c)
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
24*6e34f54dSBastian Koppelmann #define DREG_CORRECT_RESULT_2 %d13
252d934b59SBastian Koppelmann 
266dcb9922SBastian Koppelmann #define AREG_ADDR %a0
276dcb9922SBastian Koppelmann #define AREG_CORRECT_RESULT %a3
286dcb9922SBastian Koppelmann #define MEM_BASE_ADDR 0xd0000000
296dcb9922SBastian Koppelmann 
302d934b59SBastian Koppelmann #define DREG_DEV_ADDR %a15
312d934b59SBastian Koppelmann 
32d6f1593aSBastian Koppelmann #define EREG_RS1 %e6
33d6f1593aSBastian Koppelmann #define EREG_RS1_LO %d6
34d6f1593aSBastian Koppelmann #define EREG_RS1_HI %d7
35d6f1593aSBastian Koppelmann #define EREG_RS2 %e8
36d6f1593aSBastian Koppelmann #define EREG_RS2_LO %d8
37d6f1593aSBastian Koppelmann #define EREG_RS2_HI %d9
38d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT %e8
39d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_HI %d9
40d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_LO %d8
41d6f1593aSBastian Koppelmann #define EREG_CORRECT_RESULT_LO %d0
42d6f1593aSBastian Koppelmann #define EREG_CORRECT_RESULT_HI %d1
43d6f1593aSBastian Koppelmann 
442d934b59SBastian Koppelmann /* Test case wrappers */
452d934b59SBastian Koppelmann #define TEST_CASE(num, testreg, correct, code...) \
462d934b59SBastian Koppelmann test_ ## num:                                     \
472d934b59SBastian Koppelmann     code;                                         \
482d934b59SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)              \
492d934b59SBastian Koppelmann     mov DREG_TEST_NUM, num;                       \
502d934b59SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail        \
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 
83*6e34f54dSBastian Koppelmann #define TEST_LD_SRO(insn, num, result, addr_result, ld_pattern)  \
84*6e34f54dSBastian Koppelmann test_ ## num:                                                    \
85*6e34f54dSBastian Koppelmann     LIA(AREG_ADDR, test_data)                                    \
86*6e34f54dSBastian Koppelmann     insn %d15, ld_pattern;                                       \
87*6e34f54dSBastian Koppelmann     LI(DREG_CORRECT_RESULT_2, result)                            \
88*6e34f54dSBastian Koppelmann     mov DREG_TEST_NUM, num;                                      \
89*6e34f54dSBastian Koppelmann     jne %d15, DREG_CORRECT_RESULT_2, fail;                       \
90*6e34f54dSBastian Koppelmann     mov.d DREG_CALC_RESULT, AREG_ADDR;                           \
91*6e34f54dSBastian Koppelmann     LI(DREG_CORRECT_RESULT, addr_result)                         \
92*6e34f54dSBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;
93*6e34f54dSBastian Koppelmann 
94*6e34f54dSBastian 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 
165d6f1593aSBastian Koppelmann #define TEST_E_ED(insn, num, res_hi, res_lo, rs1_hi, rs1_lo, rs2) \
166d6f1593aSBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                              \
167d6f1593aSBastian Koppelmann     LI(EREG_RS1_LO, rs1_lo);                                      \
168d6f1593aSBastian Koppelmann     LI(EREG_RS1_HI, rs1_hi);                                      \
169d6f1593aSBastian Koppelmann     LI(DREG_RS2, rs2);                                            \
170d6f1593aSBastian Koppelmann     insn EREG_CALC_RESULT, EREG_RS1, DREG_RS2;                    \
171d6f1593aSBastian Koppelmann     )
172f271aa62SBastian Koppelmann 
17376f7f548SBastian Koppelmann #define TEST_E_IDI(insn, num, res_hi, res_lo, imm1, rs1, imm2) \
17476f7f548SBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                           \
17576f7f548SBastian Koppelmann     LI(DREG_RS1, rs1);                                         \
17676f7f548SBastian Koppelmann     rstv;                                                      \
17776f7f548SBastian Koppelmann     insn EREG_CALC_RESULT, imm1, DREG_RS1, imm2);              \
17876f7f548SBastian Koppelmann     )
17976f7f548SBastian Koppelmann 
1806dcb9922SBastian Koppelmann 
1816dcb9922SBastian Koppelmann 
1822d934b59SBastian Koppelmann /* Pass/Fail handling part */
1832d934b59SBastian Koppelmann #define TEST_PASSFAIL                       \
1842d934b59SBastian Koppelmann         j pass;                             \
1852d934b59SBastian Koppelmann fail:                                       \
1862d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
1872d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
1882d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
1892d934b59SBastian Koppelmann         debug;                              \
1902d934b59SBastian Koppelmann         j fail;                             \
1912d934b59SBastian Koppelmann pass:                                       \
1922d934b59SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
1932d934b59SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
1942d934b59SBastian Koppelmann         mov DREG_TEST_NUM, 0;               \
1952d934b59SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
1962d934b59SBastian Koppelmann         debug;                              \
1972d934b59SBastian Koppelmann         j pass;
198