Leo> Can you provide dummy subs for the _offs functions and put in a dummy Leo> define for the get_base_reg_no macro that returns some valid register Leo> number.
Andy> I'll try something, but it'll be nearly blind guessing -- I don't know Andy> anywhere near enough about JIT or about SPARC assembler to actually Andy> understand what I'm doing, however. Ok, here's a cargo-cult dummy it-compiles-but-can't-possibly-actually-work patch. The structure of the jit_emit.h file is hard to fathom -- it gets included multiple times by multiple files, and different implementations in the jit/*/ directories handle those multiple includes differently. By trial and error, I figured out where to put things to at least get it to build without multiple or missing definitions. The biggest bulk of this change is whitespace: I have indented the #-directives that are inside #ifdef/#endif blocks so I could understand where I was in the file. The parts relevant to this bug report are marked prominently with XXX as well as the bug number [perl #37819]. This is such a hack that I left in Leo's recent change to simply disable jit operation on sun4. To actually use this file, you have to configure with --jitcapable. diff -r -u parrot-current/jit/sun4/jit_emit.h parrot-andy/jit/sun4/jit_emit.h --- parrot-current/jit/sun4/jit_emit.h Sun Aug 28 19:15:09 2005 +++ parrot-andy/jit/sun4/jit_emit.h Tue Dec 6 09:29:25 2005 @@ -29,290 +29,290 @@ #if JIT_EMIT -#define emitm_FP emitm_i(6) -#define emitm_SP emitm_o(6) +# define emitm_FP emitm_i(6) +# define emitm_SP emitm_o(6) -#define emitm_mask(n, val) ((unsigned)(val) & ((1U << n) - 1)) +# define emitm_mask(n, val) ((unsigned)(val) & ((1U << n) - 1)) -#define emitm_hi30(val) ((unsigned)(val) >> 2) -#define emitm_hi22(val) ((unsigned)(val) >> 10) -#define emitm_lo10(val) emitm_mask(10, val) -#define emitm_simm13(val) emitm_mask(13, val) +# define emitm_hi30(val) ((unsigned)(val) >> 2) +# define emitm_hi22(val) ((unsigned)(val) >> 10) +# define emitm_lo10(val) emitm_mask(10, val) +# define emitm_simm13(val) emitm_mask(13, val) -#define emitm_opval(val) ((unsigned)(val) << 30) -#define emitm_op2val(val) ((unsigned)(val) << 22) -#define emitm_op3val(val) ((unsigned)(val) << 19) -#define emitm_rd(val) ((unsigned)(val) << 25) -#define emitm_rs1(val) ((unsigned)(val) << 14) +# define emitm_opval(val) ((unsigned)(val) << 30) +# define emitm_op2val(val) ((unsigned)(val) << 22) +# define emitm_op3val(val) ((unsigned)(val) << 19) +# define emitm_rd(val) ((unsigned)(val) << 25) +# define emitm_rs1(val) ((unsigned)(val) << 14) -#define emitm_simm13_max 4095 -#define emitm_simm13_min -4096 +# define emitm_simm13_max 4095 +# define emitm_simm13_min -4096 -#define emitm_simm13_const(val) (((val) >= emitm_simm13_min) && ((val) < emitm_simm13_max)) +# define emitm_simm13_const(val) (((val) >= emitm_simm13_min) && ((val) < emitm_simm13_max)) -#define emitm_branch_max 8388607 -#define emitm_branch_min -8388608 +# define emitm_branch_max 8388607 +# define emitm_branch_min -8388608 /* format 1 - only instruction */ -#define emitm_call_30(pc, disp30) { \ +# define emitm_call_30(pc, disp30) { \ *(unsigned *)(pc) = emitm_opval(1) | (disp30); \ pc += 4; } /* format 2a - sethi primarily */ -#define emitm_2a(pc, op, rd, op2, imm22) { \ +# define emitm_2a(pc, op, rd, op2, imm22) { \ *(unsigned *)(pc) = emitm_opval(op) | emitm_rd(rd) | emitm_op2val(op2) | \ (imm22); \ pc += 4; } /* format 2b - branches */ -#define emitm_2b(pc, a, cond, op2, disp22) { \ +# define emitm_2b(pc, a, cond, op2, disp22) { \ *(unsigned *)(pc) = emitm_opval(0) | ((unsigned)(a) << 29) | \ ((unsigned)(cond) << 25) | emitm_op2val(op2) | \ emitm_mask(22, disp22); \ pc += 4; } /* Generic fields of format 3 */ -#define emitm_fmt3(pc, op, rd, op3, rs1, low14) { \ +# define emitm_fmt3(pc, op, rd, op3, rs1, low14) { \ *(unsigned *)pc = emitm_opval(op) |emitm_rd(rd) | emitm_op3val(op3) | \ emitm_rs1(rs1) | (low14); \ pc +=4 ; } /* format 3a */ -#define emitm_3a(pc, op, rd, op3, rs1, asi, rs2) \ +# define emitm_3a(pc, op, rd, op3, rs1, asi, rs2) \ emitm_fmt3(pc, op, rd, op3, rs1, ((asi) << 5) | (rs2)) /* format 3b */ -#define emitm_3b(pc, op, rd, op3, rs1, simm13) \ +# define emitm_3b(pc, op, rd, op3, rs1, simm13) \ emitm_fmt3(pc, op, rd, op3, rs1, (1L << 13) | emitm_mask(13, (simm13))) /* format 3c */ -#define emitm_3c(pc, op, rd, op3, rs1, opf, rs2) \ +# define emitm_3c(pc, op, rd, op3, rs1, opf, rs2) \ emitm_fmt3(pc, op, rd, op3, rs1, (opf << 5) | (rs2)) /* Miscellaneous instructions */ /* sethi imm22, r[rd] */ -#define emitm_sethi(pc, imm22, rd) emitm_2a(pc, 0, rd, 04, imm22) +# define emitm_sethi(pc, imm22, rd) emitm_2a(pc, 0, rd, 04, imm22) /* NOP */ -#define emitm_nop(pc) emitm_sethi(pc, 0, 0) +# define emitm_nop(pc) emitm_sethi(pc, 0, 0) /* SAVE */ -#define emitm_save_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 074, rs1, 0, rs2) -#define emitm_save_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 074, rs1, i) +# define emitm_save_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 074, rs1, 0, rs2) +# define emitm_save_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 074, rs1, i) /* RESTORE */ -#define emitm_restore_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 075, rs1, 0, rd) -#define emitm_restore_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 075, rs1, i) +# define emitm_restore_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 075, rs1, 0, rd) +# define emitm_restore_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 075, rs1, i) /* MOV */ -#define emitm_mov_r(pc, rs, rd) emitm_or_r(pc, emitm_g(0), rs, rd) -#define emitm_mov_i(pc, i, rd) emitm_or_i(pc, emitm_g(0), i, rd) +# define emitm_mov_r(pc, rs, rd) emitm_or_r(pc, emitm_g(0), rs, rd) +# define emitm_mov_i(pc, i, rd) emitm_or_i(pc, emitm_g(0), i, rd) /* Integer Register Loads */ /* ldX[rs1 + simm13], rd */ -#define emitm_ldsb_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 011, rs1, i) -#define emitm_ldub_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 001, rs1, i) -#define emitm_ldsh_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 012, rs1, i) -#define emitm_lduh_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 002, rs1, i) -#define emitm_ld_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 000, rs1, i) -#define emitm_ldd_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 003, rs1, i) +# define emitm_ldsb_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 011, rs1, i) +# define emitm_ldub_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 001, rs1, i) +# define emitm_ldsh_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 012, rs1, i) +# define emitm_lduh_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 002, rs1, i) +# define emitm_ld_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 000, rs1, i) +# define emitm_ldd_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 003, rs1, i) /* ldX[rs1 + rs2], rd */ -#define emitm_ldsb_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 011, rs1, 0, rs2) -#define emitm_ldub_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 001, rs1, 0, rs2) -#define emitm_ldsh_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 012, rs1, 0, rs2) -#define emitm_lduh_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 002, rs1, 0, rs2) -#define emitm_ld_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 000, rs1, 0, rs2) -#define emitm_ldd_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 003, rs1, 0, rs2) +# define emitm_ldsb_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 011, rs1, 0, rs2) +# define emitm_ldub_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 001, rs1, 0, rs2) +# define emitm_ldsh_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 012, rs1, 0, rs2) +# define emitm_lduh_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 002, rs1, 0, rs2) +# define emitm_ld_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 000, rs1, 0, rs2) +# define emitm_ldd_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 003, rs1, 0, rs2) /* Integer Register Stores */ /* stX rd, [rs1 + simm13] */ -#define emitm_stb_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 005, rs1, i) -#define emitm_sth_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 006, rs1, i) -#define emitm_st_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 004, rs1, i) -#define emitm_std_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 007, rs1, i) +# define emitm_stb_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 005, rs1, i) +# define emitm_sth_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 006, rs1, i) +# define emitm_st_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 004, rs1, i) +# define emitm_std_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 007, rs1, i) /* stX rd, [rs1 + rs2] */ -#define emitm_stb_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 005, rs1, 0, rs2) -#define emitm_sth_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 006, rs1, 0, rs2) -#define emitm_st_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 004, rs1, 0, rs2) -#define emitm_std_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 007, rs1, 0, rs2) +# define emitm_stb_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 005, rs1, 0, rs2) +# define emitm_sth_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 006, rs1, 0, rs2) +# define emitm_st_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 004, rs1, 0, rs2) +# define emitm_std_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 007, rs1, 0, rs2) /* Floating Point Register Loads */ /* ldX[rs1 + simm13], freg[rd] */ -#define emitm_ldf_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 040, rs1, i) -#define emitm_lddf_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 043, rs1, i) +# define emitm_ldf_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 040, rs1, i) +# define emitm_lddf_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 043, rs1, i) -#define emitm_ldfsr_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 041, rs1, i) +# define emitm_ldfsr_i(pc, rs1, i, rd) emitm_3b(pc, 3, rd, 041, rs1, i) /* ldX[rs1 + rs2], freg[rd] */ -#define emitm_ldf_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 040, rs1, 0, rs2) -#define emitm_lddf_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 043, rs1, 0, rs2) +# define emitm_ldf_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 040, rs1, 0, rs2) +# define emitm_lddf_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 043, rs1, 0, rs2) -#define emitm_ldfsr_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 041, rs1, 0, rs2) +# define emitm_ldfsr_r(pc, rs1, rs2, rd) emitm_3a(pc, 3, rd, 041, rs1, 0, rs2) /* Floating Point Register Stores */ /* stX freg[rd], [rs1 + simm13] */ -#define emitm_stf_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 044, rs1, i) -#define emitm_stdf_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 047, rs1, i) +# define emitm_stf_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 044, rs1, i) +# define emitm_stdf_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 047, rs1, i) -#define emitm_stfsr_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 045, rs1, i) +# define emitm_stfsr_i(pc, rd, rs1, i) emitm_3b(pc, 3, rd, 045, rs1, i) /* stX freg[rd], [rs1 + rs2] */ -#define emitm_stf_r_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 044, rs1, 0, rs2) -#define emitm_stdf_r_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 047, rs1, 0, rs2) -#define emitm_stfsr_r_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 045, rs1, 0, rs2) +# define emitm_stf_r_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 044, rs1, 0, rs2) +# define emitm_stdf_r_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 047, rs1, 0, rs2) +# define emitm_stfsr_r_r(pc, rd, rs1, rs2) emitm_3a(pc, 3, rd, 045, rs1, 0, rs2) /* Logical instructions */ /* op r[rs1], r[rs2], r[rd] */ -#define emitm_logic_r(pc, op3, rs1, rs2, rd) \ +# define emitm_logic_r(pc, op3, rs1, rs2, rd) \ emitm_3a(pc, 2, rd, op3, rs1, 0, rs2) /* op r[rs1], simm13, r[rd] */ -#define emitm_logic_i(pc, op3, rs1, simm13, rd) \ +# define emitm_logic_i(pc, op3, rs1, simm13, rd) \ emitm_3b(pc, 2, rd, op3, rs1, simm13) -#define emitm_and_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 001, rs1, rs2, rd) -#define emitm_andcc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 021, rs1, rs2, rd) -#define emitm_andn_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 005, rs1, rs2, rd) -#define emitm_andncc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 025, rs1, rs2, rd) -#define emitm_and_i(pc, rs1, i, rd) emitm_logic_i(pc, 001, rs1, i, rd) -#define emitm_andcc_i(pc, rs1, i, rd) emitm_logic_i(pc, 021, rs1, i, rd) -#define emitm_andn_i(pc, rs1, i, rd) emitm_logic_i(pc, 005, rs1, i, rd) -#define emitm_andncc_i(pc, rs1, i, rd) emitm_logic_i(pc, 025, rs1, i, rd) -#define emitm_or_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 002, rs1, rs2, rd) -#define emitm_orcc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 022, rs1, rs2, rd) -#define emitm_orn_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 006, rs1, rs2, rd) -#define emitm_orncc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 026, rs1, rs2, rd) -#define emitm_or_i(pc, rs1, i, rd) emitm_logic_i(pc, 002, rs1, i, rd) -#define emitm_orcc_i(pc, rs1, i, rd) emitm_logic_i(pc, 022, rs1, i, rd) -#define emitm_orn_i(pc, rs1, i, rd) emitm_logic_i(pc, 006, rs1, i, rd) -#define emitm_orncc_i(pc, rs1, i, rd) emitm_logic_i(pc, 026, rs1, i, rd) -#define emitm_xor_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 003, rs1, rs2, rd) -#define emitm_xorcc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 023, rs1, rs2, rd) -#define emitm_xorn_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 007, rs1, rs2, rd) -#define emitm_xorncc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 027, rs1, rs2, rd) -#define emitm_xor_i(pc, rs1, i, rd) emitm_logic_i(pc, 003, rs1, i, rd) -#define emitm_xorcc_i(pc, rs1, i, rd) emitm_logic_i(pc, 023, rs1, i, rd) -#define emitm_xorn_i(pc, rs1, i, rd) emitm_logic_i(pc, 007, rs1, i, rd) -#define emitm_xorncc_i(pc, rs1, i, rd) emitm_logic_i(pc, 027, rs1, i, rd) +# define emitm_and_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 001, rs1, rs2, rd) +# define emitm_andcc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 021, rs1, rs2, rd) +# define emitm_andn_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 005, rs1, rs2, rd) +# define emitm_andncc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 025, rs1, rs2, rd) +# define emitm_and_i(pc, rs1, i, rd) emitm_logic_i(pc, 001, rs1, i, rd) +# define emitm_andcc_i(pc, rs1, i, rd) emitm_logic_i(pc, 021, rs1, i, rd) +# define emitm_andn_i(pc, rs1, i, rd) emitm_logic_i(pc, 005, rs1, i, rd) +# define emitm_andncc_i(pc, rs1, i, rd) emitm_logic_i(pc, 025, rs1, i, rd) +# define emitm_or_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 002, rs1, rs2, rd) +# define emitm_orcc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 022, rs1, rs2, rd) +# define emitm_orn_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 006, rs1, rs2, rd) +# define emitm_orncc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 026, rs1, rs2, rd) +# define emitm_or_i(pc, rs1, i, rd) emitm_logic_i(pc, 002, rs1, i, rd) +# define emitm_orcc_i(pc, rs1, i, rd) emitm_logic_i(pc, 022, rs1, i, rd) +# define emitm_orn_i(pc, rs1, i, rd) emitm_logic_i(pc, 006, rs1, i, rd) +# define emitm_orncc_i(pc, rs1, i, rd) emitm_logic_i(pc, 026, rs1, i, rd) +# define emitm_xor_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 003, rs1, rs2, rd) +# define emitm_xorcc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 023, rs1, rs2, rd) +# define emitm_xorn_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 007, rs1, rs2, rd) +# define emitm_xorncc_r(pc, rs1, rs2, rd) emitm_logic_r(pc, 027, rs1, rs2, rd) +# define emitm_xor_i(pc, rs1, i, rd) emitm_logic_i(pc, 003, rs1, i, rd) +# define emitm_xorcc_i(pc, rs1, i, rd) emitm_logic_i(pc, 023, rs1, i, rd) +# define emitm_xorn_i(pc, rs1, i, rd) emitm_logic_i(pc, 007, rs1, i, rd) +# define emitm_xorncc_i(pc, rs1, i, rd) emitm_logic_i(pc, 027, rs1, i, rd) /* Shift Left Logical */ -#define emitm_sll_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 045, rs1, 0, rs2) -#define emitm_sll_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 045, rs1, i) +# define emitm_sll_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 045, rs1, 0, rs2) +# define emitm_sll_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 045, rs1, i) /* Shift Right Logical */ -#define emitm_srl_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 046, rs1, 0, rs2) -#define emitm_srl_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 046, rs1, i) +# define emitm_srl_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 046, rs1, 0, rs2) +# define emitm_srl_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 046, rs1, i) /* Shift Right Arithmetic */ -#define emitm_sra_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 047, rs1, 0, rs2) -#define emitm_sra_i(pc, rs1, i, rd) emitm_3a(pc, 2, rd, 047, rs1, i) +# define emitm_sra_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 047, rs1, 0, rs2) +# define emitm_sra_i(pc, rs1, i, rd) emitm_3a(pc, 2, rd, 047, rs1, i) /* Arithmetic ops */ -#define emitm_add_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 0, rs1, 0, rs2) -#define emitm_addcc_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 020, rs1, 0, rs2) -#define emitm_addX_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 010, rs1, 0, rs2) -#define emitm_addXcc_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 030, rs1, 0, rs2) -#define emitm_add_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 0, rs1, i) -#define emitm_addcc_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 020, rs1, i) -#define emitm_addX_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 010, rs1, i) -#define emitm_addXcc_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 030, rs1, i) +# define emitm_add_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 0, rs1, 0, rs2) +# define emitm_addcc_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 020, rs1, 0, rs2) +# define emitm_addX_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 010, rs1, 0, rs2) +# define emitm_addXcc_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 030, rs1, 0, rs2) +# define emitm_add_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 0, rs1, i) +# define emitm_addcc_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 020, rs1, i) +# define emitm_addX_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 010, rs1, i) +# define emitm_addXcc_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 030, rs1, i) /* Arithmetic ops */ -#define emitm_sub_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 004, rs1, 0, rs2) -#define emitm_subcc_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 024, rs1, 0, rs2) -#define emitm_subX_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 014, rs1, 0, rs2) -#define emitm_subXcc_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 034, rs1, 0, rs2) -#define emitm_sub_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 004, rs1, i) -#define emitm_subcc_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 024, rs1, i) -#define emitm_subX_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 014, rs1, i) -#define emitm_subXcc_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 034, rs1, i) +# define emitm_sub_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 004, rs1, 0, rs2) +# define emitm_subcc_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 024, rs1, 0, rs2) +# define emitm_subX_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 014, rs1, 0, rs2) +# define emitm_subXcc_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 034, rs1, 0, rs2) +# define emitm_sub_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 004, rs1, i) +# define emitm_subcc_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 024, rs1, i) +# define emitm_subX_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 014, rs1, i) +# define emitm_subXcc_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 034, rs1, i) /* Floating point operations */ /* MOV */ -#define emitm_fmovs(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0001, rs) +# define emitm_fmovs(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0001, rs) /* Arithmetic operations */ -#define emitm_faddd(pc, rs1, rs2, rd) emitm_3c(pc, 2, rd, 064, rs1, 0102, rs2) -#define emitm_fsubd(pc, rs1, rs2, rd) emitm_3c(pc, 2, rd, 064, rs1, 0106, rs2) -#define emitm_fmuld(pc, rs1, rs2, rd) emitm_3c(pc, 2, rd, 064, rs1, 0112, rs2) -#define emitm_fdivd(pc, rs1, rs2, rd) emitm_3c(pc, 2, rd, 064, rs1, 0116, rs2) -#define emitm_fabss(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0011, rs) -#define emitm_fnegs(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0005, rs) +# define emitm_faddd(pc, rs1, rs2, rd) emitm_3c(pc, 2, rd, 064, rs1, 0102, rs2) +# define emitm_fsubd(pc, rs1, rs2, rd) emitm_3c(pc, 2, rd, 064, rs1, 0106, rs2) +# define emitm_fmuld(pc, rs1, rs2, rd) emitm_3c(pc, 2, rd, 064, rs1, 0112, rs2) +# define emitm_fdivd(pc, rs1, rs2, rd) emitm_3c(pc, 2, rd, 064, rs1, 0116, rs2) +# define emitm_fabss(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0011, rs) +# define emitm_fnegs(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0005, rs) -#define emitm_fsqrtd(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0052, rs) +# define emitm_fsqrtd(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0052, rs) /* Floating <-> Integer Conversion */ -#define emitm_fitod(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0310, rs) -#define emitm_fdtoi(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0322, rs) +# define emitm_fitod(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0310, rs) +# define emitm_fdtoi(pc, rs, rd) emitm_3c(pc, 2, rd, 064, 0, 0322, rs) /* Floating point tests */ -#define emitm_fcmpd(pc, rs1, rs2) emitm_3c(pc, 2, 0, 065, rs1, 0122, rs2) +# define emitm_fcmpd(pc, rs1, rs2) emitm_3c(pc, 2, 0, 065, rs1, 0122, rs2) /* Jump and Link */ -#define emitm_jumpl_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 070, rs1, 0, rs2) -#define emitm_jumpl_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 070, rs1, i) +# define emitm_jumpl_r(pc, rs1, rs2, rd) emitm_3a(pc, 2, rd, 070, rs1, 0, rs2) +# define emitm_jumpl_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 070, rs1, i) /* RET */ -#define emitm_ret(pc) emitm_jumpl_i(pc, emitm_i(7), 8, emitm_g(0)) +# define emitm_ret(pc) emitm_jumpl_i(pc, emitm_i(7), 8, emitm_g(0)) /* integer conditions */ -#define emitm_ba 010 -#define emitm_bn 000 -#define emitm_bne 011 -#define emitm_be 001 -#define emitm_bg 012 -#define emitm_ble 002 -#define emitm_bge 013 -#define emitm_bl 003 -#define emitm_bgu 014 -#define emitm_bleu 004 -#define emitm_bcc 015 -#define emitm_bcs 005 -#define emitm_bpos 016 -#define emitm_bneg 006 -#define emitm_bvc 017 -#define emitm_bvs 007 +# define emitm_ba 010 +# define emitm_bn 000 +# define emitm_bne 011 +# define emitm_be 001 +# define emitm_bg 012 +# define emitm_ble 002 +# define emitm_bge 013 +# define emitm_bl 003 +# define emitm_bgu 014 +# define emitm_bleu 004 +# define emitm_bcc 015 +# define emitm_bcs 005 +# define emitm_bpos 016 +# define emitm_bneg 006 +# define emitm_bvc 017 +# define emitm_bvs 007 /* floating-point conditions */ -#define emitm_fba 010 -#define emitm_fbn 000 -#define emitm_fbu 007 -#define emitm_fbg 006 -#define emitm_fbug 005 -#define emitm_fbl 004 -#define emitm_fbul 003 -#define emitm_fblg 002 -#define emitm_fbne 001 -#define emitm_fbe 011 -#define emitm_fbue 012 -#define emitm_fbge 013 -#define emitm_fbuge 014 -#define emitm_fble 015 -#define emitm_fbule 016 -#define emitm_fbo 017 +# define emitm_fba 010 +# define emitm_fbn 000 +# define emitm_fbu 007 +# define emitm_fbg 006 +# define emitm_fbug 005 +# define emitm_fbl 004 +# define emitm_fbul 003 +# define emitm_fblg 002 +# define emitm_fbne 001 +# define emitm_fbe 011 +# define emitm_fbue 012 +# define emitm_fbge 013 +# define emitm_fbuge 014 +# define emitm_fble 015 +# define emitm_fbule 016 +# define emitm_fbo 017 -#define emitm_icc 02 -#define emitm_fcc 06 +# define emitm_icc 02 +# define emitm_fcc 06 /* Branch on integer condition codes */ -#define emitm_bicc(pc, a, cond, disp22) emitm_2b(pc, a, cond, 02, disp22) +# define emitm_bicc(pc, a, cond, disp22) emitm_2b(pc, a, cond, 02, disp22) /* Branch on floating-point condition codes */ -#define emitm_fbfcc(pc, a, cond, disp22) emitm_2b(pc, a, cond, 06, disp22) +# define emitm_fbfcc(pc, a, cond, disp22) emitm_2b(pc, a, cond, 06, disp22) -#define jit_emit_mov_rr_i(pc, dst, src) emitm_mov_r(pc, src, dst) -#define jit_emit_mov_rr_n(pc, dst, src) { \ +# define jit_emit_mov_rr_i(pc, dst, src) emitm_mov_r(pc, src, dst) +# define jit_emit_mov_rr_n(pc, dst, src) { \ emitm_fmovs(pc, src, dst); \ emitm_fmovs(pc, (src)+1, (dst)+1); } @@ -338,37 +338,37 @@ * */ /* The register holding the interpreter pointer */ -#define Parrot_jit_intrp emitm_i(0) +# define Parrot_jit_intrp emitm_i(0) /* The register holding the address of I0 */ -#define Parrot_jit_regbase emitm_i(2) +# define Parrot_jit_regbase emitm_i(2) /* The register containing the address of the opmap */ -#define Parrot_jit_opmap emitm_i(3) +# define Parrot_jit_opmap emitm_i(3) /* These registers should be used only in .jit ops and not helper routines * in jit_emit.h */ -#define ISR1 emitm_i(4) -#define ISR2 emitm_i(5) -#define FSR1 emitm_f(0) -#define FSR2 emitm_f(2) +# define ISR1 emitm_i(4) +# define ISR2 emitm_i(5) +# define FSR1 emitm_f(0) +# define FSR2 emitm_f(2) /* This register can be used only in jit_emit.h calculations */ -#define XSR1 emitm_l(0) -#define XSR2 emitm_g(1) +# define XSR1 emitm_l(0) +# define XSR2 emitm_g(1) -#define Parrot_jit_regbase_ptr(interpreter) ®_INT(0) +# define Parrot_jit_regbase_ptr(interpreter) ®_INT(0) /* The offset of a Parrot register from the base register */ -#define Parrot_jit_regoff(a, i) (unsigned)(a) - (unsigned)(Parrot_jit_regbase_ptr(i)) +# define Parrot_jit_regoff(a, i) (unsigned)(a) - (unsigned)(Parrot_jit_regbase_ptr(i)) /* interpreter->code */ -#define jit_emit_load_coderef(pc, reg) \ +# define jit_emit_load_coderef(pc, reg) \ emitm_ld_i(jit_info->native_ptr, Parrot_jit_intrp, offsetof(Interp, code), reg); \ /* Load op_map address */ -#define jit_emit_load_op_map(pc, code) \ +# define jit_emit_load_op_map(pc, code) \ emitm_ld_i(jit_info->native_ptr, code, \ offsetof(struct PackFile_ByteCode, jit_info), XSR1); \ emitm_ld_i(jit_info->native_ptr, XSR1, \ @@ -376,7 +376,7 @@ Parrot_jit_opmap); /* Construct the starting address of the byte code (code start) */ -#define jit_emit_load_code_start(pc, code) \ +# define jit_emit_load_code_start(pc, code) \ emitm_ld_i(jit_info->native_ptr, code, offsetof(struct PackFile_Segment, data), \ XSR1); @@ -446,11 +446,11 @@ } /* Generate branch on integer condition codes */ -#define Parrot_jit_bicc(jit_info, cond, annul, disp) \ +# define Parrot_jit_bicc(jit_info, cond, annul, disp) \ Parrot_jit_branch(jit_info, emitm_icc, cond, annul, disp) /* Generate branch on floating-point condition codes */ -#define Parrot_jit_fbfcc(jit_info, cond, annul, disp) \ +# define Parrot_jit_fbfcc(jit_info, cond, annul, disp) \ Parrot_jit_branch(jit_info, emitm_fcc, cond, annul, disp) /* This function loads a value */ @@ -732,7 +732,7 @@ Parrot_jit_bytejump(jit_info, interpreter, emitm_o(0)); } -#undef Parrot_jit_restart_op +# undef Parrot_jit_restart_op void Parrot_jit_restart_op(Parrot_jit_info_t *jit_info, Interp * interpreter) { @@ -784,6 +784,36 @@ Parrot_jit_regbase, Parrot_jit_regoff(mem, interpreter), reg); } +/* XXX Hack to fix the following bug as of 05 Dec 2005: + Hack [perl #37819] Sun4 builds fail linking against jit.o + These dummy definitions blindly copied from jit/mips/jit_emit.h. + Apparently, they need to be inside a JIT_EMIT section of this + file. + See also the "Hack [perl #37819]" section near the bottom of this + file. +*/ +void +Parrot_jit_emit_mov_mr_offs(Interp * interpreter, int base, size_t offs, int reg) +{ +} + +void +Parrot_jit_emit_mov_rm_offs(Interp * interpreter, int reg, int base, size_t offs) +{ +} + +void +Parrot_jit_emit_mov_mr_n_offs(Interp * interpreter, int base, size_t offs, int reg) +{ +} + +void +Parrot_jit_emit_mov_rm_n_offs(Interp * interpreter, int reg, int base, size_t offs) +{ +} +/* XXX end blind hack for [perl #37819] --but see + additional hack section at bottom. +*/ # ifndef NO_JIT_VTABLE_OPS # undef Parrot_jit_vtable1_op @@ -1111,15 +1141,15 @@ emitm_mov_r(jit_info->native_ptr, Parrot_jit_intrp, emitm_o(0)); } -#endif /* NO_JIT_VTABLE_OPS */ +# endif /* NO_JIT_VTABLE_OPS */ -#else +#else /* JIT_EMIT */ # define REQUIRES_CONSTANT_POOL 0 # define INT_REGISTERS_TO_MAP 6 # define FLOAT_REGISTERS_TO_MAP 6 -#ifndef JIT_IMCC +# ifndef JIT_IMCC char intval_map[INT_REGISTERS_TO_MAP] = { emitm_l(1), emitm_l(2), emitm_l(3), emitm_l(4), emitm_l(5), emitm_l(6) }; @@ -1127,12 +1157,21 @@ char floatval_map[] = { emitm_f(4), emitm_f(6), emitm_f(8), emitm_f(10), emitm_f(12), emitm_f(14) }; -#endif +# endif + +# define PRESERVED_INT_REGS 6 +# define PRESERVED_FLOAT_REGS 0 -#define PRESERVED_INT_REGS 6 -#define PRESERVED_FLOAT_REGS 0 +#endif /* JIT_EMIT */ + +/* XXX Hack [perl #37819] Unlike the functions above, this one apparently + sometimes needs to be defined both in and out of the JIT_EMIT section. + However, at this point, the Parrot_jit_regbase symbol is not + defined, so we replace it with the integer 26 (which is what it + expands to anyway. +*/ +# define Parrot_jit_emit_get_base_reg_no(pc) 26 /*Parrot_jit_regbase */ -#endif #endif /* PARROT_SUN4_JIT_EMIT_H_GUARD */ /* -- Andy Dougherty [EMAIL PROTECTED]