Commit 007ac6faed12abdd4113e2460ba4464aacb7f4dd
1 parent
585c88d5
target-mips: fix call to check_*() functions
check_*() functions may in fine call generate_exception(), which ends by a call to tcg_gen_exit_tb(). As a consequence, we have to make sure that no TCG temp variables are crossing a check_*() function. Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7127 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
24 additions
and
12 deletions
target-mips/translate.c
| ... | ... | @@ -6382,10 +6382,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, |
| 6382 | 6382 | TCGv_i32 fp0 = tcg_temp_new_i32(); |
| 6383 | 6383 | TCGv_i32 fp1 = tcg_temp_new_i32(); |
| 6384 | 6384 | |
| 6385 | + if (ctx->opcode & (1 << 6)) { | |
| 6386 | + check_cop1x(ctx); | |
| 6387 | + } | |
| 6388 | + | |
| 6385 | 6389 | gen_load_fpr32(fp0, fs); |
| 6386 | 6390 | gen_load_fpr32(fp1, ft); |
| 6387 | 6391 | if (ctx->opcode & (1 << 6)) { |
| 6388 | - check_cop1x(ctx); | |
| 6389 | 6392 | gen_cmpabs_s(func-48, fp0, fp1, cc); |
| 6390 | 6393 | opn = condnames_abs[func-48]; |
| 6391 | 6394 | } else { |
| ... | ... | @@ -6744,16 +6747,17 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, |
| 6744 | 6747 | { |
| 6745 | 6748 | TCGv_i64 fp0 = tcg_temp_new_i64(); |
| 6746 | 6749 | TCGv_i64 fp1 = tcg_temp_new_i64(); |
| 6750 | + if (ctx->opcode & (1 << 6)) { | |
| 6751 | + check_cop1x(ctx); | |
| 6752 | + } | |
| 6753 | + check_cp1_registers(ctx, fs | ft); | |
| 6747 | 6754 | |
| 6748 | 6755 | gen_load_fpr64(ctx, fp0, fs); |
| 6749 | 6756 | gen_load_fpr64(ctx, fp1, ft); |
| 6750 | 6757 | if (ctx->opcode & (1 << 6)) { |
| 6751 | - check_cop1x(ctx); | |
| 6752 | - check_cp1_registers(ctx, fs | ft); | |
| 6753 | 6758 | gen_cmpabs_d(func-48, fp0, fp1, cc); |
| 6754 | 6759 | opn = condnames_abs[func-48]; |
| 6755 | 6760 | } else { |
| 6756 | - check_cp1_registers(ctx, fs | ft); | |
| 6757 | 6761 | gen_cmp_d(func-48, fp0, fp1, cc); |
| 6758 | 6762 | opn = condnames[func-48]; |
| 6759 | 6763 | } |
| ... | ... | @@ -7222,6 +7226,22 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 7222 | 7226 | int store = 0; |
| 7223 | 7227 | TCGv t0 = tcg_temp_new(); |
| 7224 | 7228 | |
| 7229 | + switch (opc) { | |
| 7230 | + case OPC_LWXC1: | |
| 7231 | + case OPC_SWXC1: | |
| 7232 | + check_cop1x(ctx); | |
| 7233 | + break; | |
| 7234 | + case OPC_LDXC1: | |
| 7235 | + case OPC_SDXC1: | |
| 7236 | + check_cop1x(ctx); | |
| 7237 | + check_cp1_registers(ctx, fd); | |
| 7238 | + break; | |
| 7239 | + case OPC_LUXC1: | |
| 7240 | + case OPC_SUXC1: | |
| 7241 | + check_cp1_64bitmode(ctx); | |
| 7242 | + break; | |
| 7243 | + } | |
| 7244 | + | |
| 7225 | 7245 | if (base == 0) { |
| 7226 | 7246 | gen_load_gpr(t0, index); |
| 7227 | 7247 | } else if (index == 0) { |
| ... | ... | @@ -7235,7 +7255,6 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 7235 | 7255 | save_cpu_state(ctx, 0); |
| 7236 | 7256 | switch (opc) { |
| 7237 | 7257 | case OPC_LWXC1: |
| 7238 | - check_cop1x(ctx); | |
| 7239 | 7258 | { |
| 7240 | 7259 | TCGv_i32 fp0 = tcg_temp_new_i32(); |
| 7241 | 7260 | |
| ... | ... | @@ -7247,8 +7266,6 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 7247 | 7266 | opn = "lwxc1"; |
| 7248 | 7267 | break; |
| 7249 | 7268 | case OPC_LDXC1: |
| 7250 | - check_cop1x(ctx); | |
| 7251 | - check_cp1_registers(ctx, fd); | |
| 7252 | 7269 | { |
| 7253 | 7270 | TCGv_i64 fp0 = tcg_temp_new_i64(); |
| 7254 | 7271 | |
| ... | ... | @@ -7259,7 +7276,6 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 7259 | 7276 | opn = "ldxc1"; |
| 7260 | 7277 | break; |
| 7261 | 7278 | case OPC_LUXC1: |
| 7262 | - check_cp1_64bitmode(ctx); | |
| 7263 | 7279 | tcg_gen_andi_tl(t0, t0, ~0x7); |
| 7264 | 7280 | { |
| 7265 | 7281 | TCGv_i64 fp0 = tcg_temp_new_i64(); |
| ... | ... | @@ -7271,7 +7287,6 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 7271 | 7287 | opn = "luxc1"; |
| 7272 | 7288 | break; |
| 7273 | 7289 | case OPC_SWXC1: |
| 7274 | - check_cop1x(ctx); | |
| 7275 | 7290 | { |
| 7276 | 7291 | TCGv_i32 fp0 = tcg_temp_new_i32(); |
| 7277 | 7292 | TCGv t1 = tcg_temp_new(); |
| ... | ... | @@ -7286,8 +7301,6 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 7286 | 7301 | store = 1; |
| 7287 | 7302 | break; |
| 7288 | 7303 | case OPC_SDXC1: |
| 7289 | - check_cop1x(ctx); | |
| 7290 | - check_cp1_registers(ctx, fs); | |
| 7291 | 7304 | { |
| 7292 | 7305 | TCGv_i64 fp0 = tcg_temp_new_i64(); |
| 7293 | 7306 | |
| ... | ... | @@ -7299,7 +7312,6 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 7299 | 7312 | store = 1; |
| 7300 | 7313 | break; |
| 7301 | 7314 | case OPC_SUXC1: |
| 7302 | - check_cp1_64bitmode(ctx); | |
| 7303 | 7315 | tcg_gen_andi_tl(t0, t0, ~0x7); |
| 7304 | 7316 | { |
| 7305 | 7317 | TCGv_i64 fp0 = tcg_temp_new_i64(); | ... | ... |