1*2d934b59SBastian Koppelmann /* Helpers */ 2*2d934b59SBastian Koppelmann #define LI(reg, val) \ 3*2d934b59SBastian Koppelmann mov.u reg, lo:val; \ 4*2d934b59SBastian Koppelmann movh DREG_TEMP_LI, up:val; \ 5*2d934b59SBastian Koppelmann or reg, reg, DREG_TEMP_LI; \ 6*2d934b59SBastian Koppelmann 7*2d934b59SBastian Koppelmann /* Address definitions */ 8*2d934b59SBastian Koppelmann #define TESTDEV_ADDR 0xf0000000 9*2d934b59SBastian Koppelmann /* Register definitions */ 10*2d934b59SBastian Koppelmann #define DREG_RS1 %d0 11*2d934b59SBastian Koppelmann #define DREG_CALC_RESULT %d1 12*2d934b59SBastian Koppelmann #define DREG_TEMP_LI %d10 13*2d934b59SBastian Koppelmann #define DREG_TEMP %d11 14*2d934b59SBastian Koppelmann #define DREG_TEST_NUM %d14 15*2d934b59SBastian Koppelmann #define DREG_CORRECT_RESULT %d15 16*2d934b59SBastian Koppelmann 17*2d934b59SBastian Koppelmann #define DREG_DEV_ADDR %a15 18*2d934b59SBastian Koppelmann 19*2d934b59SBastian Koppelmann /* Test case wrappers */ 20*2d934b59SBastian Koppelmann #define TEST_CASE(num, testreg, correct, code...) \ 21*2d934b59SBastian Koppelmann test_ ## num: \ 22*2d934b59SBastian Koppelmann code; \ 23*2d934b59SBastian Koppelmann LI(DREG_CORRECT_RESULT, correct) \ 24*2d934b59SBastian Koppelmann mov DREG_TEST_NUM, num; \ 25*2d934b59SBastian Koppelmann jne testreg, DREG_CORRECT_RESULT, fail \ 26*2d934b59SBastian Koppelmann 27*2d934b59SBastian Koppelmann /* Actual test case type 28*2d934b59SBastian Koppelmann * e.g inst %dX, %dY -> TEST_D_D 29*2d934b59SBastian Koppelmann * inst %dX, %dY, %dZ -> TEST_D_DD 30*2d934b59SBastian Koppelmann * inst %eX, %dY, %dZ -> TEST_E_DD 31*2d934b59SBastian Koppelmann */ 32*2d934b59SBastian Koppelmann #define TEST_D_D(insn, num, result, rs1) \ 33*2d934b59SBastian Koppelmann TEST_CASE(num, DREG_CALC_RESULT, result, \ 34*2d934b59SBastian Koppelmann LI(DREG_RS1, rs1); \ 35*2d934b59SBastian Koppelmann insn DREG_CALC_RESULT, DREG_RS1; \ 36*2d934b59SBastian Koppelmann ) 37*2d934b59SBastian Koppelmann 38*2d934b59SBastian Koppelmann /* Pass/Fail handling part */ 39*2d934b59SBastian Koppelmann #define TEST_PASSFAIL \ 40*2d934b59SBastian Koppelmann j pass; \ 41*2d934b59SBastian Koppelmann fail: \ 42*2d934b59SBastian Koppelmann LI(DREG_TEMP, TESTDEV_ADDR) \ 43*2d934b59SBastian Koppelmann mov.a DREG_DEV_ADDR, DREG_TEMP; \ 44*2d934b59SBastian Koppelmann st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\ 45*2d934b59SBastian Koppelmann debug; \ 46*2d934b59SBastian Koppelmann j fail; \ 47*2d934b59SBastian Koppelmann pass: \ 48*2d934b59SBastian Koppelmann LI(DREG_TEMP, TESTDEV_ADDR) \ 49*2d934b59SBastian Koppelmann mov.a DREG_DEV_ADDR, DREG_TEMP; \ 50*2d934b59SBastian Koppelmann mov DREG_TEST_NUM, 0; \ 51*2d934b59SBastian Koppelmann st.w [DREG_DEV_ADDR], DREG_TEST_NUM;\ 52*2d934b59SBastian Koppelmann debug; \ 53*2d934b59SBastian Koppelmann j pass; 54