aboutsummaryrefslogtreecommitdiff
path: root/target/hppa/translate.c
diff options
context:
space:
mode:
authorSven Schnelle <svens@stackframe.org>2024-03-21 19:42:26 +0100
committerRichard Henderson <richard.henderson@linaro.org>2024-03-27 12:15:25 -1000
commit578b8132b2666f7168b16422ac566684918a371e (patch)
tree9c9be5283e7df08bda74f56e07b95cb1fd6074fa /target/hppa/translate.c
parent2f48ba7b94e41241e5cd19af7b37948559272734 (diff)
downloadqemu-578b8132b2666f7168b16422ac566684918a371e.zip
qemu-578b8132b2666f7168b16422ac566684918a371e.tar.gz
qemu-578b8132b2666f7168b16422ac566684918a371e.tar.bz2
target/hppa: Handle unit conditions for wide mode
Wide mode provides two more conditions, add them. Fixes: 59963d8fdf42 ("target/hppa: Pass d to do_unit_cond") Signed-off-by: Sven Schnelle <svens@stackframe.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20240321184228.611897-1-svens@stackframe.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'target/hppa/translate.c')
-rw-r--r--target/hppa/translate.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/target/hppa/translate.c b/target/hppa/translate.c
index f875d76..2cb9195 100644
--- a/target/hppa/translate.c
+++ b/target/hppa/translate.c
@@ -967,11 +967,22 @@ static DisasCond do_unit_cond(unsigned cf, bool d, TCGv_i64 res,
switch (cf >> 1) {
case 0: /* never / TR */
- case 1: /* undefined */
- case 5: /* undefined */
cond = cond_make_f();
break;
+ case 1: /* SBW / NBW */
+ if (d) {
+ tmp = tcg_temp_new_i64();
+ tcg_gen_subi_i64(tmp, res, d_repl * 0x00000001u);
+ tcg_gen_andc_i64(tmp, tmp, res);
+ tcg_gen_andi_i64(tmp, tmp, d_repl * 0x80000000u);
+ cond = cond_make_0(TCG_COND_NE, tmp);
+ } else {
+ /* undefined */
+ cond = cond_make_f();
+ }
+ break;
+
case 2: /* SBZ / NBZ */
/* See hasless(v,1) from
* https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord
@@ -996,6 +1007,16 @@ static DisasCond do_unit_cond(unsigned cf, bool d, TCGv_i64 res,
cond = cond_make_0(TCG_COND_NE, cb);
break;
+ case 5: /* SWC / NWC */
+ if (d) {
+ tcg_gen_andi_i64(cb, cb, d_repl * 0x80000000u);
+ cond = cond_make_0(TCG_COND_NE, cb);
+ } else {
+ /* undefined */
+ cond = cond_make_f();
+ }
+ break;
+
case 6: /* SBC / NBC */
tcg_gen_andi_i64(cb, cb, d_repl * 0x80808080u);
cond = cond_make_0(TCG_COND_NE, cb);