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 246e34f54dSBastian Koppelmann #define DREG_CORRECT_RESULT_2 %d13 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 31d6f1593aSBastian Koppelmann #define EREG_RS1 %e6 32d6f1593aSBastian Koppelmann #define EREG_RS1_LO %d6 33d6f1593aSBastian Koppelmann #define EREG_RS1_HI %d7 34d6f1593aSBastian Koppelmann #define EREG_RS2 %e8 35d6f1593aSBastian Koppelmann #define EREG_RS2_LO %d8 36d6f1593aSBastian Koppelmann #define EREG_RS2_HI %d9 37d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT %e8 38d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_HI %d9 39d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_LO %d8 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; \ 492d934b59SBastian Koppelmann jne testreg, DREG_CORRECT_RESULT, fail \ 502d934b59SBastian Koppelmann 51d6f1593aSBastian Koppelmann #define TEST_CASE_E(num, correct_lo, correct_hi, code...) \ 52d6f1593aSBastian Koppelmann test_ ## num: \ 53d6f1593aSBastian Koppelmann code; \ 54d6f1593aSBastian Koppelmann mov DREG_TEST_NUM, num; \ 55d6f1593aSBastian Koppelmann LI(EREG_CORRECT_RESULT_LO, correct_lo) \ 56d6f1593aSBastian Koppelmann jne EREG_CALC_RESULT_LO, EREG_CORRECT_RESULT_LO, fail; \ 57d6f1593aSBastian Koppelmann LI(EREG_CORRECT_RESULT_HI, correct_hi) \ 58d6f1593aSBastian Koppelmann jne EREG_CALC_RESULT_HI, EREG_CORRECT_RESULT_HI, fail; 59d6f1593aSBastian Koppelmann 60f271aa62SBastian Koppelmann #define TEST_CASE_PSW(num, testreg, correct, correct_psw, code...) \ 61f271aa62SBastian Koppelmann test_ ## num: \ 62f271aa62SBastian Koppelmann code; \ 63f271aa62SBastian Koppelmann LI(DREG_CORRECT_RESULT, correct) \ 64f271aa62SBastian Koppelmann mov DREG_TEST_NUM, num; \ 65f271aa62SBastian Koppelmann jne testreg, DREG_CORRECT_RESULT, fail; \ 66f271aa62SBastian Koppelmann mfcr DREG_CALC_PSW, $psw; \ 67f271aa62SBastian Koppelmann LI(DREG_CORRECT_PSW, correct_psw) \ 68f271aa62SBastian Koppelmann mov DREG_TEST_NUM, num; \ 69f271aa62SBastian Koppelmann jne DREG_CALC_PSW, DREG_CORRECT_PSW, fail; 70f271aa62SBastian Koppelmann 716dcb9922SBastian Koppelmann #define TEST_LD(insn, num, result, addr_result, ld_pattern) \ 726dcb9922SBastian Koppelmann test_ ## num: \ 736dcb9922SBastian Koppelmann LIA(AREG_ADDR, test_data) \ 746dcb9922SBastian Koppelmann insn DREG_CALC_RESULT, ld_pattern; \ 756dcb9922SBastian Koppelmann LI(DREG_CORRECT_RESULT, result) \ 766dcb9922SBastian Koppelmann mov DREG_TEST_NUM, num; \ 776dcb9922SBastian Koppelmann jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail; \ 786dcb9922SBastian Koppelmann mov.d DREG_CALC_RESULT, AREG_ADDR; \ 796dcb9922SBastian Koppelmann LI(DREG_CORRECT_RESULT, addr_result) \ 806dcb9922SBastian Koppelmann jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail; 816dcb9922SBastian Koppelmann 826e34f54dSBastian Koppelmann #define TEST_LD_SRO(insn, num, result, addr_result, ld_pattern) \ 836e34f54dSBastian Koppelmann test_ ## num: \ 846e34f54dSBastian Koppelmann LIA(AREG_ADDR, test_data) \ 856e34f54dSBastian Koppelmann insn %d15, ld_pattern; \ 866e34f54dSBastian Koppelmann LI(DREG_CORRECT_RESULT_2, result) \ 876e34f54dSBastian Koppelmann mov DREG_TEST_NUM, num; \ 886e34f54dSBastian Koppelmann jne %d15, DREG_CORRECT_RESULT_2, fail; \ 896e34f54dSBastian Koppelmann mov.d DREG_CALC_RESULT, AREG_ADDR; \ 906e34f54dSBastian Koppelmann LI(DREG_CORRECT_RESULT, addr_result) \ 916e34f54dSBastian Koppelmann jne DREG_CALC_RESULT, DREG_CORRECT_RESULT, fail; 926e34f54dSBastian Koppelmann 936e34f54dSBastian Koppelmann 942d934b59SBastian Koppelmann /* Actual test case type 952d934b59SBastian Koppelmann * e.g inst %dX, %dY -> TEST_D_D 962d934b59SBastian Koppelmann * inst %dX, %dY, %dZ -> TEST_D_DD 972d934b59SBastian Koppelmann * inst %eX, %dY, %dZ -> TEST_E_DD 982d934b59SBastian Koppelmann */ 996dcb9922SBastian Koppelmann 1006dcb9922SBastian Koppelmann 1012d934b59SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1) \ 1022d934b59SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 1032d934b59SBastian Koppelmann LI(DREG_RS1, rs1); \ 1042d934b59SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1; \ 1052d934b59SBastian Koppelmann ) 1062d934b59SBastian Koppelmann 10755f037a5SBastian Koppelmann #define TEST_D_D_PSW(insn, num, result, psw, rs1) \ 10855f037a5SBastian Koppelmann TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \ 10955f037a5SBastian Koppelmann LI(DREG_RS1, rs1); \ 11055f037a5SBastian Koppelmann rstv; \ 11155f037a5SBastian Koppelmann insn DREG_CORRECT_RESULT, DREG_RS1; \ 11255f037a5SBastian Koppelmann ) 11355f037a5SBastian Koppelmann 1147ebe4cb3SBastian Koppelmann #define TEST_D_DDD(insn, num, result, rs1, rs2, rs3) \ 1157ebe4cb3SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 1167ebe4cb3SBastian Koppelmann LI(DREG_RS1, rs1); \ 1177ebe4cb3SBastian Koppelmann LI(DREG_RS2, rs2); \ 1187ebe4cb3SBastian Koppelmann LI(DREG_RS3, rs3); \ 1197ebe4cb3SBastian Koppelmann rstv; \ 1207ebe4cb3SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3; \ 1217ebe4cb3SBastian Koppelmann ) 1227ebe4cb3SBastian Koppelmann 123f271aa62SBastian Koppelmann #define TEST_D_DD_PSW(insn, num, result, psw, rs1, rs2) \ 124f271aa62SBastian Koppelmann TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \ 125f271aa62SBastian Koppelmann LI(DREG_RS1, rs1); \ 126f271aa62SBastian Koppelmann LI(DREG_RS2, rs2); \ 127f271aa62SBastian Koppelmann rstv; \ 128f271aa62SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2; \ 129f271aa62SBastian Koppelmann ) 130f271aa62SBastian Koppelmann 1316ad6701cSBastian Koppelmann #define TEST_D_DDD_PSW(insn, num, result, psw, rs1, rs2, rs3) \ 1326ad6701cSBastian Koppelmann TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \ 1336ad6701cSBastian Koppelmann LI(DREG_RS1, rs1); \ 1346ad6701cSBastian Koppelmann LI(DREG_RS2, rs2); \ 1356ad6701cSBastian Koppelmann LI(DREG_RS3, rs3); \ 1366ad6701cSBastian Koppelmann rstv; \ 1376ad6701cSBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3; \ 1386ad6701cSBastian Koppelmann ) 1396ad6701cSBastian Koppelmann 14070447df9SBastian Koppelmann #define TEST_D_DDI(insn, num, result, rs1, rs2, imm) \ 14170447df9SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 14270447df9SBastian Koppelmann LI(DREG_RS1, rs1); \ 14370447df9SBastian Koppelmann LI(DREG_RS2, rs2); \ 14470447df9SBastian Koppelmann rstv; \ 14570447df9SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm; \ 14670447df9SBastian Koppelmann ) 14770447df9SBastian Koppelmann 1486ad6701cSBastian Koppelmann #define TEST_D_DDI_PSW(insn, num, result, psw, rs1, rs2, imm) \ 1496ad6701cSBastian Koppelmann TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \ 1506ad6701cSBastian Koppelmann LI(DREG_RS1, rs1); \ 1516ad6701cSBastian Koppelmann LI(DREG_RS2, rs2); \ 1526ad6701cSBastian Koppelmann rstv; \ 1536ad6701cSBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm; \ 1546ad6701cSBastian Koppelmann ) 1556ad6701cSBastian Koppelmann 156fa581531SBastian Koppelmann #define TEST_D_DIDI(insn, num, result, rs1, imm1, rs2, imm2) \ 157fa581531SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 158fa581531SBastian Koppelmann LI(DREG_RS1, rs1); \ 159fa581531SBastian Koppelmann LI(DREG_RS2, rs1); \ 160fa581531SBastian Koppelmann rstv; \ 161fa581531SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, imm1, DREG_RS2, imm2; \ 162fa581531SBastian Koppelmann ) 163fa581531SBastian Koppelmann 164*23fa6f56SBastian Koppelmann #define TEST_D_DDII(insn, num, result, rs1, rs2, imm1, imm2) \ 165*23fa6f56SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 166*23fa6f56SBastian Koppelmann LI(DREG_RS1, rs1); \ 167*23fa6f56SBastian Koppelmann LI(DREG_RS2, rs2); \ 168*23fa6f56SBastian Koppelmann rstv; \ 169*23fa6f56SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm1, imm2; \ 170*23fa6f56SBastian Koppelmann ) 171*23fa6f56SBastian Koppelmann 172*23fa6f56SBastian Koppelmann #define TEST_D_DIII(insn, num, result, rs1, imm1, imm2, imm3)\ 173*23fa6f56SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 174*23fa6f56SBastian Koppelmann LI(DREG_RS1, rs1); \ 175*23fa6f56SBastian Koppelmann rstv; \ 176*23fa6f56SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, imm1, imm2, imm3; \ 177*23fa6f56SBastian Koppelmann ) 178*23fa6f56SBastian Koppelmann 179d6f1593aSBastian Koppelmann #define TEST_E_ED(insn, num, res_hi, res_lo, rs1_hi, rs1_lo, rs2) \ 180d6f1593aSBastian Koppelmann TEST_CASE_E(num, res_lo, res_hi, \ 181d6f1593aSBastian Koppelmann LI(EREG_RS1_LO, rs1_lo); \ 182d6f1593aSBastian Koppelmann LI(EREG_RS1_HI, rs1_hi); \ 183d6f1593aSBastian Koppelmann LI(DREG_RS2, rs2); \ 184d6f1593aSBastian Koppelmann insn EREG_CALC_RESULT, EREG_RS1, DREG_RS2; \ 185d6f1593aSBastian Koppelmann ) 186f271aa62SBastian Koppelmann 18776f7f548SBastian Koppelmann #define TEST_E_IDI(insn, num, res_hi, res_lo, imm1, rs1, imm2) \ 18876f7f548SBastian Koppelmann TEST_CASE_E(num, res_lo, res_hi, \ 18976f7f548SBastian Koppelmann LI(DREG_RS1, rs1); \ 19076f7f548SBastian Koppelmann rstv; \ 1913c471b07SBastian Koppelmann insn EREG_CALC_RESULT, imm1, DREG_RS1, imm2; \ 19276f7f548SBastian Koppelmann ) 19376f7f548SBastian Koppelmann 1946dcb9922SBastian Koppelmann 1956dcb9922SBastian Koppelmann 1962d934b59SBastian Koppelmann /* Pass/Fail handling part */ 1972d934b59SBastian Koppelmann #define TEST_PASSFAIL \ 1982d934b59SBastian Koppelmann j pass; \ 1992d934b59SBastian Koppelmann fail: \ 2002d934b59SBastian Koppelmann LI(DREG_TEMP, TESTDEV_ADDR) \ 2012d934b59SBastian Koppelmann mov.a DREG_DEV_ADDR, DREG_TEMP; \ 2022d934b59SBastian Koppelmann st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\ 2032d934b59SBastian Koppelmann debug; \ 2042d934b59SBastian Koppelmann j fail; \ 2052d934b59SBastian Koppelmann pass: \ 2062d934b59SBastian Koppelmann LI(DREG_TEMP, TESTDEV_ADDR) \ 2072d934b59SBastian Koppelmann mov.a DREG_DEV_ADDR, DREG_TEMP; \ 2082d934b59SBastian Koppelmann mov DREG_TEST_NUM, 0; \ 2092d934b59SBastian Koppelmann st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\ 2102d934b59SBastian Koppelmann debug; \ 2112d934b59SBastian Koppelmann j pass; 212