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