rendered paste bodyIndex: jit-rules-interp.c
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-rules-interp.c,v
retrieving revision 1.25
diff -u -r1.25 jit-rules-interp.c
--- jit-rules-interp.c 14 Apr 2006 14:44:29 -0000 1.25
+++ jit-rules-interp.c 23 Aug 2006 14:16:49 -0000
@@ -1709,83 +1709,40 @@
default:
{
- /* Whatever opcodes are left are ordinary operators,
- and the interpreter's opcode is identical to the JIT's */
- if(insn->value2 && (insn->flags & JIT_INSN_DEST_IS_VALUE) != 0)
- {
- /* Generate code for a ternary operator with no real dest */
- _jit_regs_load_to_top_three
- (gen, insn->dest, insn->value1, insn->value2,
- (insn->flags & (JIT_INSN_DEST_NEXT_USE |
- JIT_INSN_DEST_LIVE)),
- (insn->flags & (JIT_INSN_VALUE1_NEXT_USE |
- JIT_INSN_VALUE1_LIVE)),
- (insn->flags & (JIT_INSN_VALUE2_NEXT_USE |
- JIT_INSN_VALUE2_LIVE)), 0);
- jit_cache_opcode(&(gen->posn), insn->opcode);
- adjust_working(gen, -3);
- }
- else if(insn->value2)
+ _jit_regs_t regs;
+ int adjustment;
+
+ _jit_regs_init(®s, insn, _JIT_REGS_STACK);
+ adjustment = 0;
+ if(insn->dest)
{
- /* Generate code for a binary operator */
- reg = _jit_regs_load_to_top_two
- (gen, insn->value1, insn->value2,
- (insn->flags & (JIT_INSN_VALUE1_NEXT_USE |
- JIT_INSN_VALUE1_LIVE)),
- (insn->flags & (JIT_INSN_VALUE2_NEXT_USE |
- JIT_INSN_VALUE2_LIVE)), 0);
- jit_cache_opcode(&(gen->posn), insn->opcode);
- adjust_working(gen, -1);
- if(insn->dest)
+ _jit_regs_init_dest(®s, insn, 0);
+ if((insn->flags & JIT_INSN_DEST_IS_VALUE) != 0)
{
- if((insn->flags & JIT_INSN_DEST_NEXT_USE) != 0)
- {
- /* Record that the destination is in "reg" */
- _jit_regs_set_value(gen, reg, insn->dest, 0);
- }
- else
- {
- /* No next use, so store to the destination */
- _jit_gen_spill_reg(gen, reg, -1, insn->dest);
- insn->dest->in_frame = 1;
- _jit_regs_free_reg(gen, reg, 1);
- }
+ --adjustment;
}
else
{
- /* This is a note, with the result left on the stack */
- _jit_regs_free_reg(gen, reg, 1);
+ ++adjustment;
}
}
- else
+ if(insn->value1)
{
- /* Generate code for a unary operator */
- reg = _jit_regs_load_to_top
- (gen, insn->value1,
- (insn->flags & (JIT_INSN_VALUE1_NEXT_USE |
- JIT_INSN_VALUE1_LIVE)), 0);
- jit_cache_opcode(&(gen->posn), insn->opcode);
- if(insn->dest)
- {
- if((insn->flags & JIT_INSN_DEST_NEXT_USE) != 0)
- {
- /* Record that the destination is in "reg" */
- _jit_regs_set_value(gen, reg, insn->dest, 0);
- }
- else
- {
- /* No next use, so store to the destination */
- _jit_gen_spill_reg(gen, reg, -1, insn->dest);
- insn->dest->in_frame = 1;
- _jit_regs_free_reg(gen, reg, 1);
- }
- }
- else
- {
- /* This is a note, with the result left on the stack */
- _jit_regs_free_reg(gen, reg, 1);
- }
+ _jit_regs_init_value1(®s, insn, 0);
+ --adjustment;
+ }
+ if(insn->value2)
+ {
+ _jit_regs_init_value2(®s, insn, 0);
+ --adjustment;
}
+
+ _jit_regs_assign(gen, ®s);
+ _jit_regs_gen(gen, ®s);
+ jit_cache_opcode(&(gen->posn), insn->opcode);
+ _jit_regs_commit(gen, ®s);
+
+ adjust_working(gen, adjustment);
}
break;
}