target/hppa: fix overwriting source reg in addb
authorSven Schnelle <svens@stackframe.org>
Mon, 11 Mar 2019 19:15:52 +0000 (20:15 +0100)
committerRichard Henderson <richard.henderson@linaro.org>
Tue, 12 Mar 2019 16:13:43 +0000 (09:13 -0700)
When one of the source registers is the same as the destination register,
the source register gets overwritten with the destionation value before
do_add_sv() is called, which leads to unexpection condition matches.

Signed-off-by: Sven Schnelle <svens@stackframe.org>
Message-Id: <20190311191602.25796-2-svens@stackframe.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
target/hppa/translate.c

index 6c815e05c2617711ecea05d308037d4df3b0e909..c4815d7e1ad55a5155d64155529a35c83a761d1c 100644 (file)
@@ -3031,7 +3031,7 @@ static bool do_addb(DisasContext *ctx, unsigned r, TCGv_reg in1,
     DisasCond cond;
 
     in2 = load_gpr(ctx, r);
-    dest = dest_gpr(ctx, r);
+    dest = tcg_temp_new();
     sv = NULL;
     cb_msb = NULL;
 
@@ -3047,6 +3047,8 @@ static bool do_addb(DisasContext *ctx, unsigned r, TCGv_reg in1,
     }
 
     cond = do_cond(c * 2 + f, dest, cb_msb, sv);
+    save_gpr(ctx, r, dest);
+    tcg_temp_free(dest);
     return do_cbranch(ctx, disp, n, &cond);
 }