target-arm: fix VSHLL Neon instruction.
PATCH v2 1/1 target-arm: fix VSHLL Neon instruction.
Fix bit mask used when widening the result of shift on narrow input.
Signed-off-by Christophe Lyon <[email protected]>
--- target-arm/translate.c | 18 +++++++++++++++--- 1 files changed, 15 insertions(+), 3 deletions(-)
target-arm/translate.c +15 -3
@@ -4882,16 +4882,28 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn)/* The shift is less than the width of the source type, so we can just shift the whole register. */ tcg_gen_shli_i64 (cpu_V0, cpu_V0, shift); +/* Widen the result of shift: we need to clear +* the potential overflow bits resulting from +* left bits of the narrow input appearing as +* right bits of left the neighbour narrow +* input. */ if (size <2 || !u) {uint64_t imm64;if (size ==0 ) { imm = (0xffu >> (8 - shift)); imm |= imm <<16 ; - }else { + }else if (size ==1 ) { imm =0xffff >> (16 - shift); + }else { +/* size == 2 */ + imm =0xffffffff >> (32 - shift); + } +if (size <2 ) { + imm64 = imm | (((uint64_t )imm) <<32 ); + }else { + imm64 = imm; } - imm64 = imm | (((uint64_t )imm) <<32 ); -tcg_gen_andi_i64 (cpu_V0, cpu_V0, imm64); +tcg_gen_andi_i64 (cpu_V0, cpu_V0, ~imm64); } }neon_store_reg64 (cpu_V0, rd + pass);
Signature · 1 line
1.7.2.3
Quoted 4 lines · Christophe Lyon
Fix bit mask used when widening the result of shift on narrow input.
Signed-off-by Christophe Lyon <[email protected]>
Confirmed with random instruction testing that this patch fixes VSHLL.
Reviewed-by Peter Maydell <[email protected]>
Aurelien Jarno
AppliedQuoted 10 lines · Peter Maydell
Quoted 4 lines · Christophe Lyon
Fix bit mask used when widening the result of shift on narrow input.
Signed-off-by Christophe Lyon <[email protected]>Confirmed with random instruction testing that this patch fixes VSHLL.
Reviewed-by Peter Maydell <[email protected]>
Thanks, applied.
Signature · 2 lines
Aurelien Jarno GPG: 1024D/F1BCDB73 [email protected] http://www.aurel32.net