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 72d934b59SBastian Koppelmann /* Address definitions */ 82d934b59SBastian Koppelmann #define TESTDEV_ADDR 0xf0000000 92d934b59SBastian Koppelmann /* Register definitions */ 102d934b59SBastian Koppelmann #define DREG_RS1 %d0 11f271aa62SBastian Koppelmann #define DREG_RS2 %d1 12*fa581531SBastian Koppelmann #define DREG_RS3 %d2 13*fa581531SBastian Koppelmann #define DREG_CALC_RESULT %d3 14*fa581531SBastian Koppelmann #define DREG_CALC_PSW %d4 15*fa581531SBastian Koppelmann #define DREG_CORRECT_PSW %d5 162d934b59SBastian Koppelmann #define DREG_TEMP_LI %d10 172d934b59SBastian Koppelmann #define DREG_TEMP %d11 182d934b59SBastian Koppelmann #define DREG_TEST_NUM %d14 192d934b59SBastian Koppelmann #define DREG_CORRECT_RESULT %d15 202d934b59SBastian Koppelmann 212d934b59SBastian Koppelmann #define DREG_DEV_ADDR %a15 222d934b59SBastian Koppelmann 23d6f1593aSBastian Koppelmann #define EREG_RS1 %e6 24d6f1593aSBastian Koppelmann #define EREG_RS1_LO %d6 25d6f1593aSBastian Koppelmann #define EREG_RS1_HI %d7 26d6f1593aSBastian Koppelmann #define EREG_RS2 %e8 27d6f1593aSBastian Koppelmann #define EREG_RS2_LO %d8 28d6f1593aSBastian Koppelmann #define EREG_RS2_HI %d9 29d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT %e8 30d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_HI %d9 31d6f1593aSBastian Koppelmann #define EREG_CALC_RESULT_LO %d8 32d6f1593aSBastian Koppelmann #define EREG_CORRECT_RESULT_LO %d0 33d6f1593aSBastian Koppelmann #define EREG_CORRECT_RESULT_HI %d1 34d6f1593aSBastian Koppelmann 352d934b59SBastian Koppelmann /* Test case wrappers */ 362d934b59SBastian Koppelmann #define TEST_CASE(num, testreg, correct, code...) \ 372d934b59SBastian Koppelmann test_ ## num: \ 382d934b59SBastian Koppelmann code; \ 392d934b59SBastian Koppelmann LI(DREG_CORRECT_RESULT, correct) \ 402d934b59SBastian Koppelmann mov DREG_TEST_NUM, num; \ 412d934b59SBastian Koppelmann jne testreg, DREG_CORRECT_RESULT, fail \ 422d934b59SBastian Koppelmann 43d6f1593aSBastian Koppelmann #define TEST_CASE_E(num, correct_lo, correct_hi, code...) \ 44d6f1593aSBastian Koppelmann test_ ## num: \ 45d6f1593aSBastian Koppelmann code; \ 46d6f1593aSBastian Koppelmann mov DREG_TEST_NUM, num; \ 47d6f1593aSBastian Koppelmann LI(EREG_CORRECT_RESULT_LO, correct_lo) \ 48d6f1593aSBastian Koppelmann jne EREG_CALC_RESULT_LO, EREG_CORRECT_RESULT_LO, fail; \ 49d6f1593aSBastian Koppelmann LI(EREG_CORRECT_RESULT_HI, correct_hi) \ 50d6f1593aSBastian Koppelmann jne EREG_CALC_RESULT_HI, EREG_CORRECT_RESULT_HI, fail; 51d6f1593aSBastian Koppelmann 52f271aa62SBastian Koppelmann #define TEST_CASE_PSW(num, testreg, correct, correct_psw, code...) \ 53f271aa62SBastian Koppelmann test_ ## num: \ 54f271aa62SBastian Koppelmann code; \ 55f271aa62SBastian Koppelmann LI(DREG_CORRECT_RESULT, correct) \ 56f271aa62SBastian Koppelmann mov DREG_TEST_NUM, num; \ 57f271aa62SBastian Koppelmann jne testreg, DREG_CORRECT_RESULT, fail; \ 58f271aa62SBastian Koppelmann mfcr DREG_CALC_PSW, $psw; \ 59f271aa62SBastian Koppelmann LI(DREG_CORRECT_PSW, correct_psw) \ 60f271aa62SBastian Koppelmann mov DREG_TEST_NUM, num; \ 61f271aa62SBastian Koppelmann jne DREG_CALC_PSW, DREG_CORRECT_PSW, fail; 62f271aa62SBastian Koppelmann 632d934b59SBastian Koppelmann /* Actual test case type 642d934b59SBastian Koppelmann * e.g inst %dX, %dY -> TEST_D_D 652d934b59SBastian Koppelmann * inst %dX, %dY, %dZ -> TEST_D_DD 662d934b59SBastian Koppelmann * inst %eX, %dY, %dZ -> TEST_E_DD 672d934b59SBastian Koppelmann */ 682d934b59SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1) \ 692d934b59SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 702d934b59SBastian Koppelmann LI(DREG_RS1, rs1); \ 712d934b59SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1; \ 722d934b59SBastian Koppelmann ) 732d934b59SBastian Koppelmann 7455f037a5SBastian Koppelmann #define TEST_D_D_PSW(insn, num, result, psw, rs1) \ 7555f037a5SBastian Koppelmann TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \ 7655f037a5SBastian Koppelmann LI(DREG_RS1, rs1); \ 7755f037a5SBastian Koppelmann rstv; \ 7855f037a5SBastian Koppelmann insn DREG_CORRECT_RESULT, DREG_RS1; \ 7955f037a5SBastian Koppelmann ) 8055f037a5SBastian Koppelmann 81f271aa62SBastian Koppelmann #define TEST_D_DD_PSW(insn, num, result, psw, rs1, rs2) \ 82f271aa62SBastian Koppelmann TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \ 83f271aa62SBastian Koppelmann LI(DREG_RS1, rs1); \ 84f271aa62SBastian Koppelmann LI(DREG_RS2, rs2); \ 85f271aa62SBastian Koppelmann rstv; \ 86f271aa62SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2; \ 87f271aa62SBastian Koppelmann ) 88f271aa62SBastian Koppelmann 896ad6701cSBastian Koppelmann #define TEST_D_DDD_PSW(insn, num, result, psw, rs1, rs2, rs3) \ 906ad6701cSBastian Koppelmann TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \ 916ad6701cSBastian Koppelmann LI(DREG_RS1, rs1); \ 926ad6701cSBastian Koppelmann LI(DREG_RS2, rs2); \ 936ad6701cSBastian Koppelmann LI(DREG_RS3, rs3); \ 946ad6701cSBastian Koppelmann rstv; \ 956ad6701cSBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, DREG_RS3; \ 966ad6701cSBastian Koppelmann ) 976ad6701cSBastian Koppelmann 986ad6701cSBastian Koppelmann #define TEST_D_DDI_PSW(insn, num, result, psw, rs1, rs2, imm) \ 996ad6701cSBastian Koppelmann TEST_CASE_PSW(num, DREG_CALC_RESULT, result, psw, \ 1006ad6701cSBastian Koppelmann LI(DREG_RS1, rs1); \ 1016ad6701cSBastian Koppelmann LI(DREG_RS2, rs2); \ 1026ad6701cSBastian Koppelmann rstv; \ 1036ad6701cSBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm; \ 1046ad6701cSBastian Koppelmann ) 1056ad6701cSBastian Koppelmann 106*fa581531SBastian Koppelmann #define TEST_D_DIDI(insn, num, result, rs1, imm1, rs2, imm2) \ 107*fa581531SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 108*fa581531SBastian Koppelmann LI(DREG_RS1, rs1); \ 109*fa581531SBastian Koppelmann LI(DREG_RS2, rs1); \ 110*fa581531SBastian Koppelmann rstv; \ 111*fa581531SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1, imm1, DREG_RS2, imm2; \ 112*fa581531SBastian Koppelmann ) 113*fa581531SBastian Koppelmann 114d6f1593aSBastian Koppelmann #define TEST_E_ED(insn, num, res_hi, res_lo, rs1_hi, rs1_lo, rs2) \ 115d6f1593aSBastian Koppelmann TEST_CASE_E(num, res_lo, res_hi, \ 116d6f1593aSBastian Koppelmann LI(EREG_RS1_LO, rs1_lo); \ 117d6f1593aSBastian Koppelmann LI(EREG_RS1_HI, rs1_hi); \ 118d6f1593aSBastian Koppelmann LI(DREG_RS2, rs2); \ 119d6f1593aSBastian Koppelmann insn EREG_CALC_RESULT, EREG_RS1, DREG_RS2; \ 120d6f1593aSBastian Koppelmann ) 121f271aa62SBastian Koppelmann 12276f7f548SBastian Koppelmann #define TEST_E_IDI(insn, num, res_hi, res_lo, imm1, rs1, imm2) \ 12376f7f548SBastian Koppelmann TEST_CASE_E(num, res_lo, res_hi, \ 12476f7f548SBastian Koppelmann LI(DREG_RS1, rs1); \ 12576f7f548SBastian Koppelmann rstv; \ 12676f7f548SBastian Koppelmann insn EREG_CALC_RESULT, imm1, DREG_RS1, imm2); \ 12776f7f548SBastian Koppelmann ) 12876f7f548SBastian Koppelmann 1292d934b59SBastian Koppelmann /* Pass/Fail handling part */ 1302d934b59SBastian Koppelmann #define TEST_PASSFAIL \ 1312d934b59SBastian Koppelmann j pass; \ 1322d934b59SBastian Koppelmann fail: \ 1332d934b59SBastian Koppelmann LI(DREG_TEMP, TESTDEV_ADDR) \ 1342d934b59SBastian Koppelmann mov.a DREG_DEV_ADDR, DREG_TEMP; \ 1352d934b59SBastian Koppelmann st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\ 1362d934b59SBastian Koppelmann debug; \ 1372d934b59SBastian Koppelmann j fail; \ 1382d934b59SBastian Koppelmann pass: \ 1392d934b59SBastian Koppelmann LI(DREG_TEMP, TESTDEV_ADDR) \ 1402d934b59SBastian Koppelmann mov.a DREG_DEV_ADDR, DREG_TEMP; \ 1412d934b59SBastian Koppelmann mov DREG_TEST_NUM, 0; \ 1422d934b59SBastian Koppelmann st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\ 1432d934b59SBastian Koppelmann debug; \ 1442d934b59SBastian Koppelmann j pass; 145