提交 9d6fca70 编写于 作者: S Stefan Weil 提交者: Blue Swirl

tcg: Improve tcg_out_label and fix its usage for w64

tcg_out_label is always called with a third argument of pointer type
which was casted to tcg_target_long.

These casts can be avoided by changing the prototype of tcg_out_label.

There was also a cast to long. For most hosts with
sizeof(long) == sizeof(tcg_target_long) == sizeof(void *) this did not
matter, but for w64 it was wrong. This is fixed now.

Cc: Blue Swirl <blauwirbel@gmail.com>
Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: NStefan Weil <sw@weilnetz.de>
Signed-off-by: NBlue Swirl <blauwirbel@gmail.com>
上级 f7cf5d5b
...@@ -1052,7 +1052,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) ...@@ -1052,7 +1052,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc)
/* TLB Miss. */ /* TLB Miss. */
/* label1: */ /* label1: */
tcg_out_label(s, lab1, (tcg_target_long)s->code_ptr); tcg_out_label(s, lab1, s->code_ptr);
argreg = TCG_REG_R26; argreg = TCG_REG_R26;
tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrlo_reg); tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrlo_reg);
...@@ -1089,7 +1089,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) ...@@ -1089,7 +1089,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc)
} }
/* label2: */ /* label2: */
tcg_out_label(s, lab2, (tcg_target_long)s->code_ptr); tcg_out_label(s, lab2, s->code_ptr);
#else #else
tcg_out_qemu_ld_direct(s, datalo_reg, datahi_reg, addrlo_reg, tcg_out_qemu_ld_direct(s, datalo_reg, datahi_reg, addrlo_reg,
(GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_R0), opc); (GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_R0), opc);
...@@ -1171,7 +1171,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) ...@@ -1171,7 +1171,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
/* TLB Miss. */ /* TLB Miss. */
/* label1: */ /* label1: */
tcg_out_label(s, lab1, (tcg_target_long)s->code_ptr); tcg_out_label(s, lab1, s->code_ptr);
argreg = TCG_REG_R26; argreg = TCG_REG_R26;
tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrlo_reg); tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrlo_reg);
...@@ -1215,7 +1215,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) ...@@ -1215,7 +1215,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc)
tcg_out_call(s, qemu_st_helpers[opc]); tcg_out_call(s, qemu_st_helpers[opc]);
/* label2: */ /* label2: */
tcg_out_label(s, lab2, (tcg_target_long)s->code_ptr); tcg_out_label(s, lab2, s->code_ptr);
#else #else
/* There are no indexed stores, so if GUEST_BASE is set we must do the add /* There are no indexed stores, so if GUEST_BASE is set we must do the add
explicitly. Careful to avoid R20, which is used for the bswaps to follow. */ explicitly. Careful to avoid R20, which is used for the bswaps to follow. */
......
...@@ -875,7 +875,7 @@ static void tcg_out_brcond2(TCGContext *s, const TCGArg *args, ...@@ -875,7 +875,7 @@ static void tcg_out_brcond2(TCGContext *s, const TCGArg *args,
default: default:
tcg_abort(); tcg_abort();
} }
tcg_out_label(s, label_next, (tcg_target_long)s->code_ptr); tcg_out_label(s, label_next, s->code_ptr);
} }
#endif #endif
...@@ -917,10 +917,10 @@ static void tcg_out_setcond2(TCGContext *s, const TCGArg *args, ...@@ -917,10 +917,10 @@ static void tcg_out_setcond2(TCGContext *s, const TCGArg *args,
tcg_out_movi(s, TCG_TYPE_I32, args[0], 0); tcg_out_movi(s, TCG_TYPE_I32, args[0], 0);
tcg_out_jxx(s, JCC_JMP, label_over, 1); tcg_out_jxx(s, JCC_JMP, label_over, 1);
tcg_out_label(s, label_true, (tcg_target_long)s->code_ptr); tcg_out_label(s, label_true, s->code_ptr);
tcg_out_movi(s, TCG_TYPE_I32, args[0], 1); tcg_out_movi(s, TCG_TYPE_I32, args[0], 1);
tcg_out_label(s, label_over, (tcg_target_long)s->code_ptr); tcg_out_label(s, label_over, s->code_ptr);
} else { } else {
/* When the destination does not overlap one of the arguments, /* When the destination does not overlap one of the arguments,
clear the destination first, jump if cond false, and emit an clear the destination first, jump if cond false, and emit an
...@@ -934,7 +934,7 @@ static void tcg_out_setcond2(TCGContext *s, const TCGArg *args, ...@@ -934,7 +934,7 @@ static void tcg_out_setcond2(TCGContext *s, const TCGArg *args,
tcg_out_brcond2(s, new_args, const_args+1, 1); tcg_out_brcond2(s, new_args, const_args+1, 1);
tgen_arithi(s, ARITH_ADD, args[0], 1, 0); tgen_arithi(s, ARITH_ADD, args[0], 1, 0);
tcg_out_label(s, label_over, (tcg_target_long)s->code_ptr); tcg_out_label(s, label_over, s->code_ptr);
} }
} }
#endif #endif
......
...@@ -582,7 +582,7 @@ static void tcg_out_brcond2_i32(TCGContext *s, TCGCond cond, ...@@ -582,7 +582,7 @@ static void tcg_out_brcond2_i32(TCGContext *s, TCGCond cond,
} }
tcg_out_nop(s); tcg_out_nop(s);
tcg_out_label(s, label_next, (tcg_target_long)s->code_ptr); tcg_out_label(s, label_next, s->code_ptr);
} }
#endif #endif
...@@ -628,7 +628,7 @@ static void tcg_out_setcond_i32(TCGContext *s, TCGCond cond, TCGArg ret, ...@@ -628,7 +628,7 @@ static void tcg_out_setcond_i32(TCGContext *s, TCGCond cond, TCGArg ret,
tcg_out_branch_i32(s, INSN_COND(tcg_cond_to_bcond[cond], 1), t); tcg_out_branch_i32(s, INSN_COND(tcg_cond_to_bcond[cond], 1), t);
tcg_out_movi_imm13(s, ret, 1); tcg_out_movi_imm13(s, ret, 1);
tcg_out_movi_imm13(s, ret, 0); tcg_out_movi_imm13(s, ret, 0);
tcg_out_label(s, t, (tcg_target_long)s->code_ptr); tcg_out_label(s, t, s->code_ptr);
#endif #endif
return; return;
} }
...@@ -683,7 +683,7 @@ static void tcg_out_setcond2_i32(TCGContext *s, TCGCond cond, TCGArg ret, ...@@ -683,7 +683,7 @@ static void tcg_out_setcond2_i32(TCGContext *s, TCGCond cond, TCGArg ret,
tcg_out_setcond_i32(s, tcg_unsigned_cond(cond), ret, al, bl, blconst); tcg_out_setcond_i32(s, tcg_unsigned_cond(cond), ret, al, bl, blconst);
tcg_out_label(s, lab, (tcg_target_long)s->code_ptr); tcg_out_label(s, lab, s->code_ptr);
break; break;
} }
} }
......
...@@ -128,11 +128,11 @@ static void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type, ...@@ -128,11 +128,11 @@ static void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type,
} }
} }
static void tcg_out_label(TCGContext *s, int label_index, static void tcg_out_label(TCGContext *s, int label_index, void *ptr)
tcg_target_long value)
{ {
TCGLabel *l; TCGLabel *l;
TCGRelocation *r; TCGRelocation *r;
tcg_target_long value = (tcg_target_long)ptr;
l = &s->labels[label_index]; l = &s->labels[label_index];
if (l->has_value) if (l->has_value)
...@@ -2123,7 +2123,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf, ...@@ -2123,7 +2123,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
break; break;
case INDEX_op_set_label: case INDEX_op_set_label:
tcg_reg_alloc_bb_end(s, s->reserved_regs); tcg_reg_alloc_bb_end(s, s->reserved_regs);
tcg_out_label(s, args[0], (long)s->code_ptr); tcg_out_label(s, args[0], s->code_ptr);
break; break;
case INDEX_op_call: case INDEX_op_call:
dead_args = s->op_dead_args[op_index]; dead_args = s->op_dead_args[op_index];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册