mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 08:43:55 -06:00
target/hppa: Implement HSHLADD, HSHRADD
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
151f309b98
commit
3bbb8e4832
4 changed files with 76 additions and 2 deletions
|
@ -17,6 +17,8 @@ DEF_HELPER_FLAGS_1(ldc_check, TCG_CALL_NO_RWG, void, tl)
|
||||||
DEF_HELPER_FLAGS_2(hadd_ss, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(hadd_ss, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
DEF_HELPER_FLAGS_2(hadd_us, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(hadd_us, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
DEF_HELPER_FLAGS_2(havg, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(havg, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
|
DEF_HELPER_FLAGS_3(hshladd, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
|
||||||
|
DEF_HELPER_FLAGS_3(hshradd, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
|
||||||
DEF_HELPER_FLAGS_2(hsub_ss, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(hsub_ss, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
DEF_HELPER_FLAGS_2(hsub_us, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(hsub_us, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@
|
||||||
&rrr t r1 r2
|
&rrr t r1 r2
|
||||||
&rrr_cf t r1 r2 cf
|
&rrr_cf t r1 r2 cf
|
||||||
&rrr_cf_d t r1 r2 cf d
|
&rrr_cf_d t r1 r2 cf d
|
||||||
|
&rrr_sh t r1 r2 sh
|
||||||
&rrr_cf_d_sh t r1 r2 cf d sh
|
&rrr_cf_d_sh t r1 r2 cf d sh
|
||||||
&rri t r i
|
&rri t r i
|
||||||
&rri_cf t r i cf
|
&rri_cf t r i cf
|
||||||
|
@ -86,6 +87,7 @@
|
||||||
@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 ...... d:1 t:5 &rrr_cf_d
|
||||||
|
@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 d:1 t:5 &rrr_cf_d_sh
|
||||||
@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 ...... d:1 t:5 &rrr_cf_d_sh 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
|
||||||
|
@ -187,14 +189,20 @@ dcor_i 000010 ..... 00000 .... 101111 . ..... @rr_cf_d
|
||||||
add 000010 ..... ..... .... 0110.. . ..... @rrr_cf_d_sh
|
add 000010 ..... ..... .... 0110.. . ..... @rrr_cf_d_sh
|
||||||
add_l 000010 ..... ..... .... 1010.. . ..... @rrr_cf_d_sh
|
add_l 000010 ..... ..... .... 1010.. . ..... @rrr_cf_d_sh
|
||||||
add_tsv 000010 ..... ..... .... 1110.. . ..... @rrr_cf_d_sh
|
add_tsv 000010 ..... ..... .... 1110.. . ..... @rrr_cf_d_sh
|
||||||
add_c 000010 ..... ..... .... 011100 . ..... @rrr_cf_d_sh0
|
{
|
||||||
|
add_c 000010 ..... ..... .... 011100 . ..... @rrr_cf_d_sh0
|
||||||
|
hshladd 000010 ..... ..... 0000 0111.. 0 ..... @rrr_sh
|
||||||
|
}
|
||||||
add_c_tsv 000010 ..... ..... .... 111100 . ..... @rrr_cf_d_sh0
|
add_c_tsv 000010 ..... ..... .... 111100 . ..... @rrr_cf_d_sh0
|
||||||
|
|
||||||
sub 000010 ..... ..... .... 010000 . ..... @rrr_cf_d
|
sub 000010 ..... ..... .... 010000 . ..... @rrr_cf_d
|
||||||
sub_tsv 000010 ..... ..... .... 110000 . ..... @rrr_cf_d
|
sub_tsv 000010 ..... ..... .... 110000 . ..... @rrr_cf_d
|
||||||
sub_tc 000010 ..... ..... .... 010011 . ..... @rrr_cf_d
|
sub_tc 000010 ..... ..... .... 010011 . ..... @rrr_cf_d
|
||||||
sub_tsv_tc 000010 ..... ..... .... 110011 . ..... @rrr_cf_d
|
sub_tsv_tc 000010 ..... ..... .... 110011 . ..... @rrr_cf_d
|
||||||
sub_b 000010 ..... ..... .... 010100 . ..... @rrr_cf_d
|
{
|
||||||
|
sub_b 000010 ..... ..... .... 010100 . ..... @rrr_cf_d
|
||||||
|
hshradd 000010 ..... ..... 0000 0101.. 0 ..... @rrr_sh
|
||||||
|
}
|
||||||
sub_b_tsv 000010 ..... ..... .... 110100 . ..... @rrr_cf_d
|
sub_b_tsv 000010 ..... ..... .... 110100 . ..... @rrr_cf_d
|
||||||
|
|
||||||
ldil 001000 t:5 ..................... i=%assemble_21
|
ldil 001000 t:5 ..................... i=%assemble_21
|
||||||
|
|
|
@ -455,3 +455,35 @@ uint64_t HELPER(hsub_us)(uint64_t r1, uint64_t r2)
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t HELPER(hshladd)(uint64_t r1, uint64_t r2, uint32_t sh)
|
||||||
|
{
|
||||||
|
uint64_t ret = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 64; i += 16) {
|
||||||
|
int f1 = sextract64(r1, i, 16);
|
||||||
|
int f2 = sextract64(r2, i, 16);
|
||||||
|
int fr = (f1 << sh) + f2;
|
||||||
|
|
||||||
|
fr = MIN(fr, INT16_MAX);
|
||||||
|
fr = MAX(fr, INT16_MIN);
|
||||||
|
ret = deposit64(ret, i, 16, fr);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t HELPER(hshradd)(uint64_t r1, uint64_t r2, uint32_t sh)
|
||||||
|
{
|
||||||
|
uint64_t ret = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 64; i += 16) {
|
||||||
|
int f1 = sextract64(r1, i, 16);
|
||||||
|
int f2 = sextract64(r2, i, 16);
|
||||||
|
int fr = (f1 >> sh) + f2;
|
||||||
|
|
||||||
|
fr = MIN(fr, INT16_MAX);
|
||||||
|
fr = MAX(fr, INT16_MIN);
|
||||||
|
ret = deposit64(ret, i, 16, fr);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -2809,6 +2809,28 @@ static bool do_multimedia_sh(DisasContext *ctx, arg_rri *a,
|
||||||
return nullify_end(ctx);
|
return nullify_end(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool do_multimedia_shadd(DisasContext *ctx, arg_rrr_sh *a,
|
||||||
|
void (*fn)(TCGv_i64, TCGv_i64,
|
||||||
|
TCGv_i64, TCGv_i32))
|
||||||
|
{
|
||||||
|
TCGv_i64 r1, r2, dest;
|
||||||
|
|
||||||
|
if (!ctx->is_pa20) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
nullify_over(ctx);
|
||||||
|
|
||||||
|
r1 = load_gpr(ctx, a->r1);
|
||||||
|
r2 = load_gpr(ctx, a->r2);
|
||||||
|
dest = dest_gpr(ctx, a->t);
|
||||||
|
|
||||||
|
fn(dest, r1, r2, tcg_constant_i32(a->sh));
|
||||||
|
save_gpr(ctx, a->t, dest);
|
||||||
|
|
||||||
|
return nullify_end(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
static bool trans_hadd(DisasContext *ctx, arg_rrr *a)
|
static bool trans_hadd(DisasContext *ctx, arg_rrr *a)
|
||||||
{
|
{
|
||||||
return do_multimedia(ctx, a, tcg_gen_vec_add16_i64);
|
return do_multimedia(ctx, a, tcg_gen_vec_add16_i64);
|
||||||
|
@ -2844,6 +2866,16 @@ static bool trans_hshr_u(DisasContext *ctx, arg_rri *a)
|
||||||
return do_multimedia_sh(ctx, a, tcg_gen_vec_shr16i_i64);
|
return do_multimedia_sh(ctx, a, tcg_gen_vec_shr16i_i64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool trans_hshladd(DisasContext *ctx, arg_rrr_sh *a)
|
||||||
|
{
|
||||||
|
return do_multimedia_shadd(ctx, a, gen_helper_hshladd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool trans_hshradd(DisasContext *ctx, arg_rrr_sh *a)
|
||||||
|
{
|
||||||
|
return do_multimedia_shadd(ctx, a, gen_helper_hshradd);
|
||||||
|
}
|
||||||
|
|
||||||
static bool trans_hsub(DisasContext *ctx, arg_rrr *a)
|
static bool trans_hsub(DisasContext *ctx, arg_rrr *a)
|
||||||
{
|
{
|
||||||
return do_multimedia(ctx, a, tcg_gen_vec_sub16_i64);
|
return do_multimedia(ctx, a, tcg_gen_vec_sub16_i64);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue