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