target/hppa: Squash d for pa1.x during decode
The cond_need_ext predicate was created while we still had a 32-bit compilation mode. It now makes more sense to treat D as an absolute indicator of a 64-bit operation. Tested-by: Helge Deller <deller@gmx.de> Reviewed-by: Helge Deller <deller@gmx.de> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
46bb3d467c
commit
82d0c831ce
@ -57,6 +57,9 @@
|
|||||||
%neg_to_m 0:1 !function=neg_to_m
|
%neg_to_m 0:1 !function=neg_to_m
|
||||||
%a_to_m 2:1 !function=neg_to_m
|
%a_to_m 2:1 !function=neg_to_m
|
||||||
%cmpbid_c 13:2 !function=cmpbid_c
|
%cmpbid_c 13:2 !function=cmpbid_c
|
||||||
|
%d_5 5:1 !function=pa20_d
|
||||||
|
%d_11 11:1 !function=pa20_d
|
||||||
|
%d_13 13:1 !function=pa20_d
|
||||||
|
|
||||||
####
|
####
|
||||||
# Argument set definitions
|
# Argument set definitions
|
||||||
@ -84,15 +87,16 @@
|
|||||||
# Format definitions
|
# Format definitions
|
||||||
####
|
####
|
||||||
|
|
||||||
@rr_cf_d ...... r:5 ..... cf:4 ...... d:1 t:5 &rr_cf_d
|
@rr_cf_d ...... r:5 ..... cf:4 ...... . t:5 &rr_cf_d d=%d_5
|
||||||
@rrr ...... r2:5 r1:5 .... ....... t:5 &rrr
|
@rrr ...... r2:5 r1:5 .... ....... t:5 &rrr
|
||||||
@rrr_cf ...... r2:5 r1:5 cf:4 ....... t:5 &rrr_cf
|
@rrr_cf ...... r2:5 r1:5 cf:4 ....... t:5 &rrr_cf
|
||||||
@rrr_cf_d ...... r2:5 r1:5 cf:4 ...... d:1 t:5 &rrr_cf_d
|
@rrr_cf_d ...... r2:5 r1:5 cf:4 ...... . t:5 &rrr_cf_d d=%d_5
|
||||||
@rrr_sh ...... r2:5 r1:5 ........ sh:2 . t:5 &rrr_sh
|
@rrr_sh ...... r2:5 r1:5 ........ sh:2 . t:5 &rrr_sh
|
||||||
@rrr_cf_d_sh ...... r2:5 r1:5 cf:4 .... sh:2 d:1 t:5 &rrr_cf_d_sh
|
@rrr_cf_d_sh ...... r2:5 r1:5 cf:4 .... sh:2 . t:5 &rrr_cf_d_sh d=%d_5
|
||||||
@rrr_cf_d_sh0 ...... r2:5 r1:5 cf:4 ...... d:1 t:5 &rrr_cf_d_sh sh=0
|
@rrr_cf_d_sh0 ...... r2:5 r1:5 cf:4 ...... . t:5 &rrr_cf_d_sh d=%d_5 sh=0
|
||||||
@rri_cf ...... r:5 t:5 cf:4 . ........... &rri_cf i=%lowsign_11
|
@rri_cf ...... r:5 t:5 cf:4 . ........... &rri_cf i=%lowsign_11
|
||||||
@rri_cf_d ...... r:5 t:5 cf:4 d:1 ........... &rri_cf_d i=%lowsign_11
|
@rri_cf_d ...... r:5 t:5 cf:4 . ........... \
|
||||||
|
&rri_cf_d d=%d_11 i=%lowsign_11
|
||||||
|
|
||||||
@rrb_cf ...... r2:5 r1:5 c:3 ........... n:1 . \
|
@rrb_cf ...... r2:5 r1:5 c:3 ........... n:1 . \
|
||||||
&rrb_c_f disp=%assemble_12
|
&rrb_c_f disp=%assemble_12
|
||||||
@ -368,8 +372,10 @@ fmpysub_d 100110 ..... ..... ..... ..... 1 ..... @mpyadd
|
|||||||
# Conditional Branches
|
# Conditional Branches
|
||||||
####
|
####
|
||||||
|
|
||||||
bb_sar 110000 00000 r:5 c:1 1 d:1 ........... n:1 . disp=%assemble_12
|
bb_sar 110000 00000 r:5 c:1 1 . ........... n:1 . \
|
||||||
bb_imm 110001 p:5 r:5 c:1 1 d:1 ........... n:1 . disp=%assemble_12
|
disp=%assemble_12 d=%d_13
|
||||||
|
bb_imm 110001 p:5 r:5 c:1 1 . ........... n:1 . \
|
||||||
|
disp=%assemble_12 d=%d_13
|
||||||
|
|
||||||
movb 110010 ..... ..... ... ........... . . @rrb_cf f=0
|
movb 110010 ..... ..... ... ........... . . @rrb_cf f=0
|
||||||
movbi 110011 ..... ..... ... ........... . . @rib_cf f=0
|
movbi 110011 ..... ..... ... ........... . . @rib_cf f=0
|
||||||
|
@ -200,6 +200,14 @@ static int cmpbid_c(DisasContext *ctx, int val)
|
|||||||
return val ? val : 4; /* 0 == "*<<" */
|
return val ? val : 4; /* 0 == "*<<" */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In many places pa1.x did not decode the bit that later became
|
||||||
|
* the pa2.0 D bit. Suppress D unless the cpu is pa2.0.
|
||||||
|
*/
|
||||||
|
static int pa20_d(DisasContext *ctx, int val)
|
||||||
|
{
|
||||||
|
return ctx->is_pa20 & val;
|
||||||
|
}
|
||||||
|
|
||||||
/* Include the auto-generated decoder. */
|
/* Include the auto-generated decoder. */
|
||||||
#include "decode-insns.c.inc"
|
#include "decode-insns.c.inc"
|
||||||
@ -693,12 +701,6 @@ static bool cond_need_cb(int c)
|
|||||||
return c == 4 || c == 5;
|
return c == 4 || c == 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Need extensions from TCGv_i32 to TCGv_i64. */
|
|
||||||
static bool cond_need_ext(DisasContext *ctx, bool d)
|
|
||||||
{
|
|
||||||
return !(ctx->is_pa20 && d);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compute conditional for arithmetic. See Page 5-3, Table 5-1, of
|
* Compute conditional for arithmetic. See Page 5-3, Table 5-1, of
|
||||||
* the Parisc 1.1 Architecture Reference Manual for details.
|
* the Parisc 1.1 Architecture Reference Manual for details.
|
||||||
@ -715,7 +717,7 @@ static DisasCond do_cond(DisasContext *ctx, unsigned cf, bool d,
|
|||||||
cond = cond_make_f();
|
cond = cond_make_f();
|
||||||
break;
|
break;
|
||||||
case 1: /* = / <> (Z / !Z) */
|
case 1: /* = / <> (Z / !Z) */
|
||||||
if (cond_need_ext(ctx, d)) {
|
if (!d) {
|
||||||
tmp = tcg_temp_new_i64();
|
tmp = tcg_temp_new_i64();
|
||||||
tcg_gen_ext32u_i64(tmp, res);
|
tcg_gen_ext32u_i64(tmp, res);
|
||||||
res = tmp;
|
res = tmp;
|
||||||
@ -725,7 +727,7 @@ static DisasCond do_cond(DisasContext *ctx, unsigned cf, bool d,
|
|||||||
case 2: /* < / >= (N ^ V / !(N ^ V) */
|
case 2: /* < / >= (N ^ V / !(N ^ V) */
|
||||||
tmp = tcg_temp_new_i64();
|
tmp = tcg_temp_new_i64();
|
||||||
tcg_gen_xor_i64(tmp, res, sv);
|
tcg_gen_xor_i64(tmp, res, sv);
|
||||||
if (cond_need_ext(ctx, d)) {
|
if (!d) {
|
||||||
tcg_gen_ext32s_i64(tmp, tmp);
|
tcg_gen_ext32s_i64(tmp, tmp);
|
||||||
}
|
}
|
||||||
cond = cond_make_0_tmp(TCG_COND_LT, tmp);
|
cond = cond_make_0_tmp(TCG_COND_LT, tmp);
|
||||||
@ -742,7 +744,7 @@ static DisasCond do_cond(DisasContext *ctx, unsigned cf, bool d,
|
|||||||
*/
|
*/
|
||||||
tmp = tcg_temp_new_i64();
|
tmp = tcg_temp_new_i64();
|
||||||
tcg_gen_eqv_i64(tmp, res, sv);
|
tcg_gen_eqv_i64(tmp, res, sv);
|
||||||
if (cond_need_ext(ctx, d)) {
|
if (!d) {
|
||||||
tcg_gen_sextract_i64(tmp, tmp, 31, 1);
|
tcg_gen_sextract_i64(tmp, tmp, 31, 1);
|
||||||
tcg_gen_and_i64(tmp, tmp, res);
|
tcg_gen_and_i64(tmp, tmp, res);
|
||||||
tcg_gen_ext32u_i64(tmp, tmp);
|
tcg_gen_ext32u_i64(tmp, tmp);
|
||||||
@ -760,13 +762,13 @@ static DisasCond do_cond(DisasContext *ctx, unsigned cf, bool d,
|
|||||||
tmp = tcg_temp_new_i64();
|
tmp = tcg_temp_new_i64();
|
||||||
tcg_gen_neg_i64(tmp, cb_msb);
|
tcg_gen_neg_i64(tmp, cb_msb);
|
||||||
tcg_gen_and_i64(tmp, tmp, res);
|
tcg_gen_and_i64(tmp, tmp, res);
|
||||||
if (cond_need_ext(ctx, d)) {
|
if (!d) {
|
||||||
tcg_gen_ext32u_i64(tmp, tmp);
|
tcg_gen_ext32u_i64(tmp, tmp);
|
||||||
}
|
}
|
||||||
cond = cond_make_0_tmp(TCG_COND_EQ, tmp);
|
cond = cond_make_0_tmp(TCG_COND_EQ, tmp);
|
||||||
break;
|
break;
|
||||||
case 6: /* SV / NSV (V / !V) */
|
case 6: /* SV / NSV (V / !V) */
|
||||||
if (cond_need_ext(ctx, d)) {
|
if (!d) {
|
||||||
tmp = tcg_temp_new_i64();
|
tmp = tcg_temp_new_i64();
|
||||||
tcg_gen_ext32s_i64(tmp, sv);
|
tcg_gen_ext32s_i64(tmp, sv);
|
||||||
sv = tmp;
|
sv = tmp;
|
||||||
@ -827,7 +829,7 @@ static DisasCond do_sub_cond(DisasContext *ctx, unsigned cf, bool d,
|
|||||||
if (cf & 1) {
|
if (cf & 1) {
|
||||||
tc = tcg_invert_cond(tc);
|
tc = tcg_invert_cond(tc);
|
||||||
}
|
}
|
||||||
if (cond_need_ext(ctx, d)) {
|
if (!d) {
|
||||||
TCGv_i64 t1 = tcg_temp_new_i64();
|
TCGv_i64 t1 = tcg_temp_new_i64();
|
||||||
TCGv_i64 t2 = tcg_temp_new_i64();
|
TCGv_i64 t2 = tcg_temp_new_i64();
|
||||||
|
|
||||||
@ -904,7 +906,7 @@ static DisasCond do_log_cond(DisasContext *ctx, unsigned cf, bool d,
|
|||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cond_need_ext(ctx, d)) {
|
if (!d) {
|
||||||
TCGv_i64 tmp = tcg_temp_new_i64();
|
TCGv_i64 tmp = tcg_temp_new_i64();
|
||||||
|
|
||||||
if (ext_uns) {
|
if (ext_uns) {
|
||||||
@ -979,7 +981,7 @@ static DisasCond do_unit_zero_cond(unsigned cf, bool d, TCGv_i64 res)
|
|||||||
static TCGv_i64 get_carry(DisasContext *ctx, bool d,
|
static TCGv_i64 get_carry(DisasContext *ctx, bool d,
|
||||||
TCGv_i64 cb, TCGv_i64 cb_msb)
|
TCGv_i64 cb, TCGv_i64 cb_msb)
|
||||||
{
|
{
|
||||||
if (cond_need_ext(ctx, d)) {
|
if (!d) {
|
||||||
TCGv_i64 t = tcg_temp_new_i64();
|
TCGv_i64 t = tcg_temp_new_i64();
|
||||||
tcg_gen_extract_i64(t, cb, 32, 1);
|
tcg_gen_extract_i64(t, cb, 32, 1);
|
||||||
return t;
|
return t;
|
||||||
@ -3448,12 +3450,12 @@ static bool trans_bb_sar(DisasContext *ctx, arg_bb_sar *a)
|
|||||||
|
|
||||||
tmp = tcg_temp_new_i64();
|
tmp = tcg_temp_new_i64();
|
||||||
tcg_r = load_gpr(ctx, a->r);
|
tcg_r = load_gpr(ctx, a->r);
|
||||||
if (cond_need_ext(ctx, a->d)) {
|
if (a->d) {
|
||||||
|
tcg_gen_shl_i64(tmp, tcg_r, cpu_sar);
|
||||||
|
} else {
|
||||||
/* Force shift into [32,63] */
|
/* Force shift into [32,63] */
|
||||||
tcg_gen_ori_i64(tmp, cpu_sar, 32);
|
tcg_gen_ori_i64(tmp, cpu_sar, 32);
|
||||||
tcg_gen_shl_i64(tmp, tcg_r, tmp);
|
tcg_gen_shl_i64(tmp, tcg_r, tmp);
|
||||||
} else {
|
|
||||||
tcg_gen_shl_i64(tmp, tcg_r, cpu_sar);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cond = cond_make_0_tmp(a->c ? TCG_COND_GE : TCG_COND_LT, tmp);
|
cond = cond_make_0_tmp(a->c ? TCG_COND_GE : TCG_COND_LT, tmp);
|
||||||
@ -3470,7 +3472,7 @@ static bool trans_bb_imm(DisasContext *ctx, arg_bb_imm *a)
|
|||||||
|
|
||||||
tmp = tcg_temp_new_i64();
|
tmp = tcg_temp_new_i64();
|
||||||
tcg_r = load_gpr(ctx, a->r);
|
tcg_r = load_gpr(ctx, a->r);
|
||||||
p = a->p | (cond_need_ext(ctx, a->d) ? 32 : 0);
|
p = a->p | (a->d ? 0 : 32);
|
||||||
tcg_gen_shli_i64(tmp, tcg_r, p);
|
tcg_gen_shli_i64(tmp, tcg_r, p);
|
||||||
|
|
||||||
cond = cond_make_0(a->c ? TCG_COND_GE : TCG_COND_LT, tmp);
|
cond = cond_make_0(a->c ? TCG_COND_GE : TCG_COND_LT, tmp);
|
||||||
|
Loading…
Reference in New Issue
Block a user