* jit/jit-rules-arm.c (_jit_gen_spill_reg): spill properly to
global registers for ARM.
+ * jit/jit-reg-alloc.c, jit/jit-rules-arm.c, jit/jit-rules-arm.sel,
+ jit/jit-rules-x86.sel: minor register assignment bugs.
+
2004-06-08 Miroslaw Dobrzanski-Neumann <mne@mosaic-ag.com>
* jit/jit-alloc.c: fix ROUND_END_PTR so that it adds the size
candidates[index]->global_reg = (short)reg;
jit_reg_set_used(gen->touched, reg);
jit_reg_set_used(gen->permanent, reg);
+ --reg;
}
#endif
size = jit_type_get_size(jit_value_get_type(args[num_args]));
size = ROUND_STACK(size) / sizeof(void *);
word_regs -= size;
- if(!jit_insn_outgoing_reg(func, args[num_args], (int)size))
+ if(!jit_insn_outgoing_reg(func, args[num_args], (int)word_regs))
{
return 0;
}
/* Allocate space for the local variable frame. Subtract off
the space for the registers that we just saved. The pc, lr,
and fp registers are always saved, so account for them too */
- frame_size = func->builder->frame_size - (saved + 3);
+ frame_size = func->builder->frame_size - (saved + 3 * sizeof(void *));
if(frame_size > 0)
{
arm_alu_reg_imm(inst, ARM_SUB, ARM_SP, ARM_SP, frame_size);
inst = jump_to_epilog(gen, inst, block);
}
-JIT_OP_RETURN_INT: unary_note
+JIT_OP_RETURN_INT: unary_branch
[reg] -> {
int cpu_reg = $1;
if(cpu_reg != ARM_R0)
inst = jump_to_epilog(gen, inst, block);
}
-JIT_OP_RETURN_INT: unary_note
+JIT_OP_RETURN_INT: unary_branch
[reg] -> {
int cpu_reg = $1;
if(cpu_reg != X86_EAX)
inst = jump_to_epilog(gen, inst, block);
}
-JIT_OP_RETURN_FLOAT32: unary_note, stack, only
+JIT_OP_RETURN_FLOAT32: unary_branch, stack, only
[freg] -> {
inst = jump_to_epilog(gen, inst, block);
}
-JIT_OP_RETURN_FLOAT64: unary_note, stack, only
+JIT_OP_RETURN_FLOAT64: unary_branch, stack, only
[freg] -> {
inst = jump_to_epilog(gen, inst, block);
}
-JIT_OP_RETURN_NFLOAT: unary_note, stack, only
+JIT_OP_RETURN_NFLOAT: unary_branch, stack, only
[freg] -> {
inst = jump_to_epilog(gen, inst, block);
}