These two patches add jit support for is<compare> style ops (isgt, isge, isle, islt, iseq, isne) on integers for the sun/sparc platform.
The jitted code follows this "pattern": cmp %r2, %r3 b<c>,a next mov 1, %r1 mov 0, %r1 next: .. <c> defining the branch condition. Thanks, Stéphane On Sun, Sep 26, 2004 at 02:40:29AM -0700, Leopold Toetsch wrote: > The integer and number variants of these opcodes could need JIT support.
Index: jit/sun4/core.jit =================================================================== RCS file: /cvs/public/parrot/jit/sun4/core.jit,v retrieving revision 1.7 diff -u -r1.7 core.jit --- jit/sun4/core.jit 25 Sep 2004 14:44:22 -0000 1.7 +++ jit/sun4/core.jit 2 Oct 2004 10:53:54 -0000 @@ -197,11 +197,11 @@ jit_emit_store_i(jit_info, interpreter, 1, arg1); } } - + Parrot_inc_i { Parrot_incdec_i s/<op>/add/ } - + Parrot_dec_i { Parrot_incdec_i s/<op>/sub/ } @@ -701,6 +701,132 @@ Parrot_cmp_ix_ix_ic s/<a>/bge/ } +TEMPLATE Parrot_iscmp_ix_ix_ix { + if(MAP[2] && MAP[3]){ + emitm_subcc_r(NATIVECODE, MAP[2], MAP[3], emitm_g(0)); + } + else if (MAP[2]) { + jit_emit_load_i(jit_info, interpreter, 3, ISR2); + emitm_subcc_r(NATIVECODE, MAP[2], ISR2, emitm_g(0)); + } + else if (MAP[3]) { + jit_emit_load_i(jit_info, interpreter, 2, ISR1); + emitm_subcc_r(NATIVECODE, ISR1, MAP[3], emitm_g(0)); + } + else { + jit_emit_load_i(jit_info, interpreter, 2, ISR1); + jit_emit_load_i(jit_info, interpreter, 3, ISR2); + emitm_subcc_r(NATIVECODE, ISR1, ISR2, emitm_g(0)); + } + + emitm_bicc(NATIVECODE, 1, emitm_<a>, 3); + + if(MAP[1]){ + emitm_mov_i(NATIVECODE, 1, MAP[1]); + emitm_or_r(NATIVECODE, emitm_g(0), emitm_g(0), MAP[1]); + } else { + emitm_bicc(NATIVECODE, 1, emitm_<a>, 3); + jit_emit_store_i(jit_info, interpreter, 1, 1); + jit_emit_store_i(jit_info, interpreter, 1, 0); + } +} + +Parrot_isgt_i_i_i { + Parrot_iscmp_ix_ix_ix s/<a>/bg/ +} + +Parrot_isgt_i_ic_i { + Parrot_iscmp_ix_ix_ix s/<a>/bg/ +} + +Parrot_isgt_i_i_ic { + Parrot_iscmp_ix_ix_ix s/<a>/bg/ +} + +Parrot_isgt_i_ic_ic { + Parrot_iscmp_ix_ix_ix s/<a>/bg/ +} + +Parrot_isge_i_i_i { + Parrot_iscmp_ix_ix_ix s/<a>/bge/ +} + +Parrot_isge_i_ic_i { + Parrot_iscmp_ix_ix_ix s/<a>/bge/ +} + +Parrot_isge_i_i_ic { + Parrot_iscmp_ix_ix_ix s/<a>/bge/ +} + +Parrot_isge_i_ic_ic { + Parrot_iscmp_ix_ix_ix s/<a>/bge/ +} + +Parrot_isle_i_i_i { + Parrot_iscmp_ix_ix_ix s/<a>/ble/ +} + +Parrot_isle_i_ic_i { + Parrot_iscmp_ix_ix_ix s/<a>/ble/ +} + +Parrot_isle_i_i_ic { + Parrot_iscmp_ix_ix_ix s/<a>/ble/ +} + +Parrot_isle_i_ic_ic { + Parrot_iscmp_ix_ix_ix s/<a>/ble/ +} + +Parrot_islt_i_i_i { + Parrot_iscmp_ix_ix_ix s/<a>/bl/ +} + +Parrot_islt_i_ic_i { + Parrot_iscmp_ix_ix_ix s/<a>/bl/ +} + +Parrot_islt_i_i_ic { + Parrot_iscmp_ix_ix_ix s/<a>/bl/ +} + +Parrot_islt_i_ic_ic { + Parrot_iscmp_ix_ix_ix s/<a>/bl/ +} + +Parrot_iseq_i_i_i { + Parrot_iscmp_ix_ix_ix s/<a>/be/ +} + +Parrot_iseq_i_ic_i { + Parrot_iscmp_ix_ix_ix s/<a>/be/ +} + +Parrot_iseq_i_i_ic { + Parrot_iscmp_ix_ix_ix s/<a>/be/ +} + +Parrot_iseq_i_ic_ic { + Parrot_iscmp_ix_ix_ix s/<a>/be/ +} + +Parrot_isne_i_i_i { + Parrot_iscmp_ix_ix_ix s/<a>/bne/ +} + +Parrot_isne_i_ic_i { + Parrot_iscmp_ix_ix_ix s/<a>/bne/ +} + +Parrot_isne_i_i_ic { + Parrot_iscmp_ix_ix_ix s/<a>/bne/ +} + +Parrot_isne_i_ic_ic { + Parrot_iscmp_ix_ix_ix s/<a>/bne/ +} + /* * Local variables: * c-indentation-style: bsd
Index: jit/sun4/jit_emit.h =================================================================== RCS file: /cvs/public/parrot/jit/sun4/jit_emit.h,v retrieving revision 1.28 diff -u -r1.28 jit_emit.h --- jit/sun4/jit_emit.h 25 Sep 2004 14:44:22 -0000 1.28 +++ jit/sun4/jit_emit.h 2 Oct 2004 10:54:20 -0000 @@ -77,7 +77,7 @@ emitm_rs1(rs1) | (low14); \ pc +=4 ; } -/* format 3b */ +/* format 3a */ #define emitm_3a(pc, op, rd, op3, rs1, asi, rs2) \ emitm_fmt3(pc, op, rd, op3, rs1, ((asi) << 5) | (rs2)) @@ -107,7 +107,8 @@ #define emitm_restore_i(pc, rs1, i, rd) emitm_3b(pc, 2, rd, 075, rs1, i) /* MOV */ -#define emitm_mov(pc, rs, rd) emitm_or_r(pc, emitm_g(0), rs, 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 */ @@ -283,7 +284,7 @@ /* Branch */ #define emitm_bicc(pc, a, cond, disp22) emitm_2b(pc, a, cond, 02, disp22) -#define jit_emit_mov_rr_i(pc, dst, src) emitm_mov(pc, src, dst) +#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); } @@ -671,7 +672,7 @@ (void (*)(void))interpreter->op_func_table[*(jit_info->cur_op)]; emitm_call_30(jit_info->native_ptr, 0); - emitm_mov(jit_info->native_ptr, Parrot_jit_intrp, emitm_o(1)); + emitm_mov_r(jit_info->native_ptr, Parrot_jit_intrp, emitm_o(1)); } void Parrot_jit_cpcf_op(Parrot_jit_info_t *jit_info,