+2006-01-14 Aleksey Demakov <ademakov@gmail.com>
+
+ * tools/gen-sel-parser.y: spilling a register which is the first
+ part of a register pair spill the other part too.
+
+ * jit/jit-reg-alloc.c (free_register_for_value):
+ * jit/jit-rules-x86.sel: if a register is the second part of a
+ register pair do not consider it free.
+
2006-01-13 Aleksey Demakov <ademakov@gmail.com>
* jit/jit-insn.c: fix all descriptors of intrinsic functions that
else if(!need_pair)
{
if(gen->contents[reg].num_values == 0 &&
- !(gen->contents[reg].used_for_temp))
+ !(gen->contents[reg].used_for_temp) &&
+ !(gen->contents[reg].is_long_end))
{
return reg;
}
if(regi != reg && regi != reg2)
{
if(gen->contents[regi].num_values == 0 &&
- gen->contents[regi].used_for_temp == 0)
+ !gen->contents[regi].used_for_temp &&
+ !gen->contents[reg].is_long_end)
{
reg3 = regi;
break;
}
}
if(gen->contents[reg3].num_values > 0 ||
- gen->contents[reg3].used_for_temp)
+ gen->contents[regi].used_for_temp ||
+ gen->contents[reg].is_long_end)
{
save_reg3 = 1;
}
if(regi != reg && regi != reg2)
{
if(gen->contents[regi].num_values == 0 &&
- gen->contents[regi].used_for_temp == 0)
+ !gen->contents[regi].used_for_temp &&
+ !gen->contents[reg].is_long_end)
{
reg3 = regi;
break;
}
}
if(gen->contents[reg3].num_values > 0 ||
- gen->contents[reg3].used_for_temp)
+ gen->contents[regi].used_for_temp ||
+ gen->contents[reg].is_long_end)
{
save_reg3 = 1;
}
printf("\t}\n");
printf("\telse\n");
printf("\t{\n");
- printf("\t\t_jit_gen_spill_reg(gen, reg, -1, insn->dest);\n");
+ printf("\t\tint other_reg;\n");
+ printf("\t\tif(gen->contents[reg].is_long_start)\n");
+ printf("\t\t{\n");
+ printf("\t\t\tother_reg = _jit_reg_info[reg].other_reg;\n");
+ printf("\t\t}\n");
+ printf("\t\telse\n");
+ printf("\t\t{\n");
+ printf("\t\t\tother_reg = -1;\n");
+ printf("\t\t}\n");
+ printf("\t\t_jit_gen_spill_reg(gen, reg, other_reg, insn->dest);\n");
printf("\t\tif(insn->dest->has_global_register)\n");
printf("\t\t\tinsn->dest->in_global_register = 1;\n");
printf("\t\telse\n");