target-arm: fix VQMOVUN Neon instruction.
PATCH 1/1 target-arm: fix VQMOVUN Neon instruction.
Create and use neon_unarrow_sat* helpers.
Signed-off-by Christophe Lyon <[email protected]>
--- target-arm/helpers.h | 3 ++ target-arm/neon_helper.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++ target-arm/translate.c | 28 ++++++++++++++++---- 3 files changed, 88 insertions(+), 6 deletions(-)
target-arm/helpers.h +3 -0
@@ -299,10 +299,13 @@ DEF_HELPER_3(neon_qrdmulh_s32, i32, env, i32, i32) DEF_HELPER_1(neon_narrow_u8, i32, i64) DEF_HELPER_1(neon_narrow_u16, i32, i64) +DEF_HELPER_2(neon_unarrow_sat8, i32, env, i64) DEF_HELPER_2(neon_narrow_sat_u8, i32, env, i64) DEF_HELPER_2(neon_narrow_sat_s8, i32, env, i64) +DEF_HELPER_2(neon_unarrow_sat16, i32, env, i64) DEF_HELPER_2(neon_narrow_sat_u16, i32, env, i64) DEF_HELPER_2(neon_narrow_sat_s16, i32, env, i64) +DEF_HELPER_2(neon_unarrow_sat32, i32, env, i64) DEF_HELPER_2(neon_narrow_sat_u32, i32, env, i64) DEF_HELPER_2(neon_narrow_sat_s32, i32, env, i64)DEF_HELPER_1 (neon_narrow_high_u8, i32, i64)
target-arm/neon_helper.c +63 -0
81 lines not on this page · raw message
target-arm/translate.c +22 -6
@@ -4065,6 +4065,16 @@ static inline void gen_neon_narrow_satu(int size, TCGv dest, TCGv_i64 src) } } +static inline void gen_neon_unarrow_sats (int size,TCGv dest,TCGv_i64 src) +{ +switch (size) { +case 0 :gen_helper_neon_unarrow_sat8 (dest, cpu_env, src);break ; +case 1 :gen_helper_neon_unarrow_sat16 (dest, cpu_env, src);break ; +case 2 :gen_helper_neon_unarrow_sat32 (dest, cpu_env, src);break ; +default :abort (); + } +} +static inline void gen_neon_shift_narrow (int size,TCGv var,TCGv shift,int q,int u) {
@@ -5485,12 +5495,18 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn)for (pass =0 ; pass <2 ; pass++) {neon_load_reg64 (cpu_V0, rm + pass); tmp =new_tmp (); -if (op ==36 && q ==0 ) { -gen_neon_narrow (size, tmp, cpu_V0); - }else if (q) { -gen_neon_narrow_satu (size, tmp, cpu_V0); - }else { -gen_neon_narrow_sats (size, tmp, cpu_V0); +if (op ==36 ) { +if (q) {/* VQMOVUN */ +gen_neon_unarrow_sats (size, tmp, cpu_V0); + }else {/* VMOVN */ +gen_neon_narrow (size, tmp, cpu_V0); + } + }else {/* VQMOVN */ +if (q) { +gen_neon_narrow_satu (size, tmp, cpu_V0); + }else { +gen_neon_narrow_sats (size, tmp, cpu_V0); + } }if (pass ==0 ) { tmp2 = tmp;
Signature · 1 line
1.7.2.3
Quoted 4 lines · Christophe Lyon
Create and use neon_unarrow_sat* helpers.
Signed-off-by Christophe Lyon <[email protected]>
This is OK code-wise, but since it has come from the meego tree it ought to have Juha's sign-off rather than yours. Also the commit message was another of the terse placeholder ones I put in when I was splitting up a huge meego patch into subsections and isn't really (IMHO) descriptive enough for upstream.
I've corrected this in the patchset I've just sent (which includes a fix for another bug which is needed for the VQMOV(U)N/VMOVN set to pass random input testing.)
thanks
-- PMM