summaryrefslogtreecommitdiffstats
path: root/target/arm
diff options
context:
space:
mode:
authorPeter Maydell2022-03-03 12:37:41 +0100
committerPeter Maydell2022-03-07 14:16:49 +0100
commit41c5a0f791ef4d9377ec5b952931a1c75df7a815 (patch)
tree4aacdf2a56ec2a318e0963811db08bea34699273 /target/arm
parenttarget/arm/translate-neon: UNDEF if VLD1/VST1 stride bits are non-zero (diff)
downloadqemu-41c5a0f791ef4d9377ec5b952931a1c75df7a815.tar.gz
qemu-41c5a0f791ef4d9377ec5b952931a1c75df7a815.tar.xz
qemu-41c5a0f791ef4d9377ec5b952931a1c75df7a815.zip
target/arm/translate-neon: Simplify align field check for VLD3
For VLD3 (single 3-element structure to one lane), there is no alignment specification and the alignment bits in the instruction must be zero. This is bit [4] for the size=0 and size=1 cases, and bits [5:4] for the size=2 case. We do this check correctly in VLDST_single(), but we write it a bit oddly: in the 'case 3' code we check for bit 0 of a->align (bit [4] of the insn), and then we fall through to the 'case 2' code which checks bit 1 of a->align (bit [5] of the insn) in the size 2 case. Replace this with just checking "is a->align non-zero" for VLD3, which lets us drop the fall-through and put the cases in this switch in numerical order. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Tested-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220303113741.2156877-3-peter.maydell@linaro.org
Diffstat (limited to 'target/arm')
-rw-r--r--target/arm/translate-neon.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/target/arm/translate-neon.c b/target/arm/translate-neon.c
index 072fdc1e6e..384604c009 100644
--- a/target/arm/translate-neon.c
+++ b/target/arm/translate-neon.c
@@ -665,16 +665,16 @@ static bool trans_VLDST_single(DisasContext *s, arg_VLDST_single *a)
return false;
}
break;
- case 3:
- if ((a->align & 1) != 0) {
- return false;
- }
- /* fall through */
case 2:
if (a->size == 2 && (a->align & 2) != 0) {
return false;
}
break;
+ case 3:
+ if (a->align != 0) {
+ return false;
+ }
+ break;
case 4:
if (a->size == 2 && a->align == 3) {
return false;