xref: /openbmc/qemu/tests/tcg/tricore/asm/macros.h (revision a3108b2d92eda76b4dbe0c95051899628e28f6ac)
18b50d564SBastian Koppelmann /* Helpers */
28b50d564SBastian Koppelmann #define LI(reg, val)           \
38b50d564SBastian Koppelmann     mov.u reg, lo:val;         \
48b50d564SBastian Koppelmann     movh DREG_TEMP_LI, up:val; \
58b50d564SBastian Koppelmann     or reg, reg, DREG_TEMP_LI; \
68b50d564SBastian Koppelmann 
78b50d564SBastian Koppelmann #define LIA(reg, val)        \
88b50d564SBastian Koppelmann     LI(DREG_TEMP, val)       \
98b50d564SBastian Koppelmann     mov.a reg, DREG_TEMP;
108b50d564SBastian Koppelmann 
118b50d564SBastian Koppelmann /* Address definitions */
128b50d564SBastian Koppelmann #define TESTDEV_ADDR 0xf0000000
138b50d564SBastian Koppelmann /* Register definitions */
148b50d564SBastian 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
258b50d564SBastian Koppelmann 
268b50d564SBastian Koppelmann #define AREG_ADDR %a0
278b50d564SBastian Koppelmann #define AREG_CORRECT_RESULT %a3
288b50d564SBastian Koppelmann 
298b50d564SBastian Koppelmann #define DREG_DEV_ADDR %a15
308b50d564SBastian 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
408b50d564SBastian Koppelmann #define EREG_CORRECT_RESULT_LO %d0
418b50d564SBastian Koppelmann #define EREG_CORRECT_RESULT_HI %d1
428b50d564SBastian Koppelmann 
438b50d564SBastian Koppelmann /* Test case wrappers */
448b50d564SBastian Koppelmann #define TEST_CASE(num, testreg, correct, code...) \
458b50d564SBastian Koppelmann test_ ## num:                                     \
468b50d564SBastian Koppelmann     code;                                         \
478b50d564SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)              \
488b50d564SBastian Koppelmann     mov DREG_TEST_NUM, num;                       \
49*76bc63d7SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail;       \
50*76bc63d7SBastian Koppelmann     mov testreg, 0
518b50d564SBastian Koppelmann 
528b50d564SBastian Koppelmann #define TEST_CASE_E(num, correct_lo, correct_hi, code...)  \
538b50d564SBastian Koppelmann test_ ## num:                                              \
548b50d564SBastian Koppelmann     code;                                                  \
558b50d564SBastian Koppelmann     mov DREG_TEST_NUM, num;                                \
568b50d564SBastian Koppelmann     LI(EREG_CORRECT_RESULT_LO, correct_lo)                 \
578b50d564SBastian Koppelmann     jne EREG_CALC_RESULT_LO, EREG_CORRECT_RESULT_LO, fail; \
588b50d564SBastian Koppelmann     LI(EREG_CORRECT_RESULT_HI, correct_hi)                 \
598b50d564SBastian Koppelmann     jne EREG_CALC_RESULT_HI, EREG_CORRECT_RESULT_HI, fail;
608b50d564SBastian Koppelmann 
618b50d564SBastian Koppelmann #define TEST_CASE_PSW(num, testreg, correct, correct_psw, code...) \
628b50d564SBastian Koppelmann test_ ## num:                                                      \
638b50d564SBastian Koppelmann     code;                                                          \
648b50d564SBastian Koppelmann     LI(DREG_CORRECT_RESULT, correct)                               \
658b50d564SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
668b50d564SBastian Koppelmann     jne testreg, DREG_CORRECT_RESULT, fail;                        \
678b50d564SBastian Koppelmann     mfcr DREG_CALC_PSW, $psw;                                      \
688b50d564SBastian Koppelmann     LI(DREG_CORRECT_PSW, correct_psw)                              \
698b50d564SBastian Koppelmann     mov DREG_TEST_NUM, num;                                        \
708b50d564SBastian Koppelmann     jne DREG_CALC_PSW, DREG_CORRECT_PSW, fail;
718b50d564SBastian Koppelmann 
728b50d564SBastian Koppelmann #define TEST_LD(insn, num, result, addr_result, ld_pattern) \
738b50d564SBastian Koppelmann test_ ## num:                                               \
748b50d564SBastian Koppelmann     LIA(AREG_ADDR, test_data)                               \
758b50d564SBastian Koppelmann     insn DREG_CALC_RESULT, ld_pattern;                      \
768b50d564SBastian Koppelmann     LI(DREG_CORRECT_RESULT, result)                         \
778b50d564SBastian Koppelmann     mov DREG_TEST_NUM, num;                                 \
788b50d564SBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;        \
798b50d564SBastian Koppelmann     mov.d DREG_CALC_RESULT, AREG_ADDR;                      \
808b50d564SBastian Koppelmann     LI(DREG_CORRECT_RESULT, addr_result)                    \
818b50d564SBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;
828b50d564SBastian Koppelmann 
838b50d564SBastian Koppelmann #define TEST_LD_SRO(insn, num, result, addr_result, ld_pattern)  \
848b50d564SBastian Koppelmann test_ ## num:                                                    \
858b50d564SBastian Koppelmann     LIA(AREG_ADDR, test_data)                                    \
868b50d564SBastian Koppelmann     insn %d15, ld_pattern;                                       \
878b50d564SBastian Koppelmann     LI(DREG_CORRECT_RESULT_2, result)                            \
888b50d564SBastian Koppelmann     mov DREG_TEST_NUM, num;                                      \
898b50d564SBastian Koppelmann     jne %d15, DREG_CORRECT_RESULT_2, fail;                       \
908b50d564SBastian Koppelmann     mov.d DREG_CALC_RESULT, AREG_ADDR;                           \
918b50d564SBastian Koppelmann     LI(DREG_CORRECT_RESULT, addr_result)                         \
928b50d564SBastian Koppelmann     jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail;
938b50d564SBastian Koppelmann 
948b50d564SBastian Koppelmann 
958b50d564SBastian Koppelmann /* Actual test case type
968b50d564SBastian Koppelmann  * e.g inst %dX, %dY      -> TEST_D_D
978b50d564SBastian Koppelmann  *     inst %dX, %dY, %dZ -> TEST_D_DD
988b50d564SBastian Koppelmann  *     inst %eX, %dY, %dZ -> TEST_E_DD
998b50d564SBastian Koppelmann  */
1008b50d564SBastian Koppelmann 
1018b50d564SBastian Koppelmann 
1028b50d564SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1)      \
1038b50d564SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,  \
1048b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                        \
1058b50d564SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1;          \
1068b50d564SBastian Koppelmann     )
1078b50d564SBastian Koppelmann 
1088b50d564SBastian Koppelmann #define TEST_D_D_PSW(insn, num, result, psw, rs1)     \
1098b50d564SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \
1108b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                                \
1118b50d564SBastian Koppelmann     rstv;                                             \
1128b50d564SBastian Koppelmann     insn DREG_CORRECT_RESULT, DREG_RS1;               \
1138b50d564SBastian Koppelmann     )
1148b50d564SBastian Koppelmann 
1158b50d564SBastian Koppelmann #define TEST_D_DDD(insn, num, result, rs1, rs2, rs3)        \
1168b50d564SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                \
1178b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                                      \
1188b50d564SBastian Koppelmann     LI(DREG_RS2, rs2);                                      \
1198b50d564SBastian Koppelmann     LI(DREG_RS3, rs3);                                      \
1208b50d564SBastian Koppelmann     rstv;                                                   \
1218b50d564SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3; \
1228b50d564SBastian Koppelmann     )
1238b50d564SBastian Koppelmann 
1248b50d564SBastian Koppelmann #define TEST_D_DD_PSW(insn, num, result, psw, rs1, rs2) \
1258b50d564SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,   \
1268b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                                  \
1278b50d564SBastian Koppelmann     LI(DREG_RS2, rs2);                                  \
1288b50d564SBastian Koppelmann     rstv;                                               \
1298b50d564SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2;          \
1308b50d564SBastian Koppelmann     )
1318b50d564SBastian Koppelmann 
1328b50d564SBastian Koppelmann #define TEST_D_DDD_PSW(insn, num, result, psw, rs1, rs2, rs3) \
1338b50d564SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,         \
1348b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                                        \
1358b50d564SBastian Koppelmann     LI(DREG_RS2, rs2);                                        \
1368b50d564SBastian Koppelmann     LI(DREG_RS3, rs3);                                        \
1378b50d564SBastian Koppelmann     rstv;                                                     \
1388b50d564SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3;      \
1398b50d564SBastian Koppelmann     )
1408b50d564SBastian Koppelmann 
1418b50d564SBastian Koppelmann #define TEST_D_DDI(insn, num, result, rs1, rs2, imm) \
1428b50d564SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,         \
1438b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                               \
1448b50d564SBastian Koppelmann     LI(DREG_RS2, rs2);                               \
1458b50d564SBastian Koppelmann     rstv;                                            \
1468b50d564SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm;  \
1478b50d564SBastian Koppelmann     )
1488b50d564SBastian Koppelmann 
1498b50d564SBastian Koppelmann #define TEST_D_DDI_PSW(insn, num, result, psw, rs1, rs2, imm) \
1508b50d564SBastian Koppelmann     TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw,         \
1518b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                                        \
1528b50d564SBastian Koppelmann     LI(DREG_RS2, rs2);                                        \
1538b50d564SBastian Koppelmann     rstv;                                                     \
1548b50d564SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm;           \
1558b50d564SBastian Koppelmann     )
1568b50d564SBastian Koppelmann 
1578b50d564SBastian Koppelmann #define TEST_D_DIDI(insn, num, result, rs1, imm1, rs2, imm2) \
1588b50d564SBastian Koppelmann     TEST_CASE(num, DREG_CALC_RESULT, result,                 \
1598b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                                       \
1608b50d564SBastian Koppelmann     LI(DREG_RS2, rs1);                                       \
1618b50d564SBastian Koppelmann     rstv;                                                    \
1628b50d564SBastian Koppelmann     insn DREG_CALC_RESULT, DREG_RS1, imm1, DREG_RS2, imm2;   \
1638b50d564SBastian Koppelmann     )
1648b50d564SBastian 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 
1898b50d564SBastian Koppelmann #define TEST_E_ED(insn, num, res_hi, res_lo, rs1_hi, rs1_lo, rs2) \
1908b50d564SBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                              \
1918b50d564SBastian Koppelmann     LI(EREG_RS1_LO, rs1_lo);                                      \
1928b50d564SBastian Koppelmann     LI(EREG_RS1_HI, rs1_hi);                                      \
1938b50d564SBastian Koppelmann     LI(DREG_RS2, rs2);                                            \
1948b50d564SBastian Koppelmann     insn EREG_CALC_RESULT, EREG_RS1, DREG_RS2;                    \
1958b50d564SBastian Koppelmann     )
1968b50d564SBastian Koppelmann 
1978b50d564SBastian Koppelmann #define TEST_E_IDI(insn, num, res_hi, res_lo, imm1, rs1, imm2) \
1988b50d564SBastian Koppelmann     TEST_CASE_E(num, res_lo, res_hi,                           \
1998b50d564SBastian Koppelmann     LI(DREG_RS1, rs1);                                         \
2008b50d564SBastian Koppelmann     rstv;                                                      \
2018b50d564SBastian Koppelmann     insn EREG_CALC_RESULT, imm1, DREG_RS1, imm2;               \
2028b50d564SBastian Koppelmann     )
2038b50d564SBastian Koppelmann 
2048b50d564SBastian Koppelmann 
2058b50d564SBastian Koppelmann 
2068b50d564SBastian Koppelmann /* Pass/Fail handling part */
2078b50d564SBastian Koppelmann #define TEST_PASSFAIL                       \
2088b50d564SBastian Koppelmann         j pass;                             \
2098b50d564SBastian Koppelmann fail:                                       \
2108b50d564SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
2118b50d564SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
2128b50d564SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
2138b50d564SBastian Koppelmann         debug;                              \
2148b50d564SBastian Koppelmann         j fail;                             \
2158b50d564SBastian Koppelmann pass:                                       \
2168b50d564SBastian Koppelmann         LI(DREG_TEMP, TESTDEV_ADDR)         \
2178b50d564SBastian Koppelmann         mov.a DREG_DEV_ADDR, DREG_TEMP;     \
2188b50d564SBastian Koppelmann         mov DREG_TEST_NUM, 0;               \
2198b50d564SBastian Koppelmann         st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\
2208b50d564SBastian Koppelmann         debug;                              \
2218b50d564SBastian Koppelmann         j pass;
222