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>
This commit is contained in:
parent
2f48ba7b94
commit
578b8132b2
@ -967,11 +967,22 @@ static DisasCond do_unit_cond(unsigned cf, bool d, TCGv_i64 res,
|
|||||||
|
|
||||||
switch (cf >> 1) {
|
switch (cf >> 1) {
|
||||||
case 0: /* never / TR */
|
case 0: /* never / TR */
|
||||||
case 1: /* undefined */
|
|
||||||
case 5: /* undefined */
|
|
||||||
cond = cond_make_f();
|
cond = cond_make_f();
|
||||||
break;
|
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 */
|
case 2: /* SBZ / NBZ */
|
||||||
/* See hasless(v,1) from
|
/* See hasless(v,1) from
|
||||||
* https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord
|
* 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);
|
cond = cond_make_0(TCG_COND_NE, cb);
|
||||||
break;
|
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 */
|
case 6: /* SBC / NBC */
|
||||||
tcg_gen_andi_i64(cb, cb, d_repl * 0x80808080u);
|
tcg_gen_andi_i64(cb, cb, d_repl * 0x80808080u);
|
||||||
cond = cond_make_0(TCG_COND_NE, cb);
|
cond = cond_make_0(TCG_COND_NE, cb);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user