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