aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-arm.c4
-rw-r--r--gas/testsuite/gas/arm/mve-vmov-3.d169
-rw-r--r--gas/testsuite/gas/arm/mve-vmov-3.s160
-rw-r--r--gas/testsuite/gas/arm/mve-vmov-bad-2.l2
-rw-r--r--opcodes/ChangeLog9
-rw-r--r--opcodes/arm-dis.c7
7 files changed, 354 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 329c288..e12b93c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2021-05-17 Alex Coplan <alex.coplan@arm.com>
+
+ * config/tc-arm.c (do_mve_mov): Only reject vmov if we're moving
+ into the same GPR twice.
+ * testsuite/gas/arm/mve-vmov-bad-2.l: Tweak error message.
+ * testsuite/gas/arm/mve-vmov-3.d: New test.
+ * testsuite/gas/arm/mve-vmov-3.s: New test.
+
2021-05-12 Alan Modra <amodra@gmail.com>
* testsuite/gas/elf/dwarf-5-file0.d: Update.
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 4888c08..9229dd0 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -20013,8 +20013,8 @@ do_mve_mov (int toQ)
constraint (inst.operands[Q0].reg != inst.operands[Q1].reg + 2,
_("Index one must be [2,3] and index two must be two less than"
" index one."));
- constraint (inst.operands[Rt].reg == inst.operands[Rt2].reg,
- _("General purpose registers may not be the same"));
+ constraint (!toQ && inst.operands[Rt].reg == inst.operands[Rt2].reg,
+ _("Destination registers may not be the same"));
constraint (inst.operands[Rt].reg == REG_SP
|| inst.operands[Rt2].reg == REG_SP,
BAD_SP);
diff --git a/gas/testsuite/gas/arm/mve-vmov-3.d b/gas/testsuite/gas/arm/mve-vmov-3.d
new file mode 100644
index 0000000..5355b4a
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vmov-3.d
@@ -0,0 +1,169 @@
+# name: MVE vmov (between two 32-bit vector lanes and two GPRs)
+# as: -march=armv8.1-m.main+mve
+# objdump: -dr -marmv8.1-m.main
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+0+ <.*>:
+.*: ec01 2f00 vmov r0, r1, q1\[2\], q1\[0\]
+.*: ec01 4f00 vmov r0, r1, q2\[2\], q2\[0\]
+.*: ec01 6f00 vmov r0, r1, q3\[2\], q3\[0\]
+.*: ec01 8f00 vmov r0, r1, q4\[2\], q4\[0\]
+.*: ec01 af00 vmov r0, r1, q5\[2\], q5\[0\]
+.*: ec01 cf00 vmov r0, r1, q6\[2\], q6\[0\]
+.*: ec01 ef00 vmov r0, r1, q7\[2\], q7\[0\]
+.*: ec00 0f01 vmov r1, r0, q0\[2\], q0\[0\]
+.*: ec00 0f02 vmov r2, r0, q0\[2\], q0\[0\]
+.*: ec00 0f03 vmov r3, r0, q0\[2\], q0\[0\]
+.*: ec00 0f04 vmov r4, r0, q0\[2\], q0\[0\]
+.*: ec00 0f05 vmov r5, r0, q0\[2\], q0\[0\]
+.*: ec00 0f06 vmov r6, r0, q0\[2\], q0\[0\]
+.*: ec00 0f07 vmov r7, r0, q0\[2\], q0\[0\]
+.*: ec00 0f08 vmov r8, r0, q0\[2\], q0\[0\]
+.*: ec00 0f09 vmov r9, r0, q0\[2\], q0\[0\]
+.*: ec00 0f0a vmov sl, r0, q0\[2\], q0\[0\]
+.*: ec00 0f0b vmov fp, r0, q0\[2\], q0\[0\]
+.*: ec00 0f0c vmov ip, r0, q0\[2\], q0\[0\]
+.*: ec00 0f0e vmov lr, r0, q0\[2\], q0\[0\]
+.*: ec01 0f00 vmov r0, r1, q0\[2\], q0\[0\]
+.*: ec02 0f00 vmov r0, r2, q0\[2\], q0\[0\]
+.*: ec03 0f00 vmov r0, r3, q0\[2\], q0\[0\]
+.*: ec04 0f00 vmov r0, r4, q0\[2\], q0\[0\]
+.*: ec05 0f00 vmov r0, r5, q0\[2\], q0\[0\]
+.*: ec06 0f00 vmov r0, r6, q0\[2\], q0\[0\]
+.*: ec07 0f00 vmov r0, r7, q0\[2\], q0\[0\]
+.*: ec08 0f00 vmov r0, r8, q0\[2\], q0\[0\]
+.*: ec09 0f00 vmov r0, r9, q0\[2\], q0\[0\]
+.*: ec0a 0f00 vmov r0, sl, q0\[2\], q0\[0\]
+.*: ec0b 0f00 vmov r0, fp, q0\[2\], q0\[0\]
+.*: ec0c 0f00 vmov r0, ip, q0\[2\], q0\[0\]
+.*: ec0e 0f00 vmov r0, lr, q0\[2\], q0\[0\]
+.*: ec01 2f10 vmov r0, r1, q1\[3\], q1\[1\]
+.*: ec01 4f10 vmov r0, r1, q2\[3\], q2\[1\]
+.*: ec01 6f10 vmov r0, r1, q3\[3\], q3\[1\]
+.*: ec01 8f10 vmov r0, r1, q4\[3\], q4\[1\]
+.*: ec01 af10 vmov r0, r1, q5\[3\], q5\[1\]
+.*: ec01 cf10 vmov r0, r1, q6\[3\], q6\[1\]
+.*: ec01 ef10 vmov r0, r1, q7\[3\], q7\[1\]
+.*: ec00 0f11 vmov r1, r0, q0\[3\], q0\[1\]
+.*: ec00 0f12 vmov r2, r0, q0\[3\], q0\[1\]
+.*: ec00 0f13 vmov r3, r0, q0\[3\], q0\[1\]
+.*: ec00 0f14 vmov r4, r0, q0\[3\], q0\[1\]
+.*: ec00 0f15 vmov r5, r0, q0\[3\], q0\[1\]
+.*: ec00 0f16 vmov r6, r0, q0\[3\], q0\[1\]
+.*: ec00 0f17 vmov r7, r0, q0\[3\], q0\[1\]
+.*: ec00 0f18 vmov r8, r0, q0\[3\], q0\[1\]
+.*: ec00 0f19 vmov r9, r0, q0\[3\], q0\[1\]
+.*: ec00 0f1a vmov sl, r0, q0\[3\], q0\[1\]
+.*: ec00 0f1b vmov fp, r0, q0\[3\], q0\[1\]
+.*: ec00 0f1c vmov ip, r0, q0\[3\], q0\[1\]
+.*: ec00 0f1e vmov lr, r0, q0\[3\], q0\[1\]
+.*: ec01 0f10 vmov r0, r1, q0\[3\], q0\[1\]
+.*: ec02 0f10 vmov r0, r2, q0\[3\], q0\[1\]
+.*: ec03 0f10 vmov r0, r3, q0\[3\], q0\[1\]
+.*: ec04 0f10 vmov r0, r4, q0\[3\], q0\[1\]
+.*: ec05 0f10 vmov r0, r5, q0\[3\], q0\[1\]
+.*: ec06 0f10 vmov r0, r6, q0\[3\], q0\[1\]
+.*: ec07 0f10 vmov r0, r7, q0\[3\], q0\[1\]
+.*: ec08 0f10 vmov r0, r8, q0\[3\], q0\[1\]
+.*: ec09 0f10 vmov r0, r9, q0\[3\], q0\[1\]
+.*: ec0a 0f10 vmov r0, sl, q0\[3\], q0\[1\]
+.*: ec0b 0f10 vmov r0, fp, q0\[3\], q0\[1\]
+.*: ec0c 0f10 vmov r0, ip, q0\[3\], q0\[1\]
+.*: ec0e 0f10 vmov r0, lr, q0\[3\], q0\[1\]
+.*: ec11 2f00 vmov q1\[2\], q1\[0\], r0, r1
+.*: ec11 4f00 vmov q2\[2\], q2\[0\], r0, r1
+.*: ec11 6f00 vmov q3\[2\], q3\[0\], r0, r1
+.*: ec11 8f00 vmov q4\[2\], q4\[0\], r0, r1
+.*: ec11 af00 vmov q5\[2\], q5\[0\], r0, r1
+.*: ec11 cf00 vmov q6\[2\], q6\[0\], r0, r1
+.*: ec11 ef00 vmov q7\[2\], q7\[0\], r0, r1
+.*: ec10 0f00 vmov q0\[2\], q0\[0\], r0, r0
+.*: ec10 0f01 vmov q0\[2\], q0\[0\], r1, r0
+.*: ec10 0f02 vmov q0\[2\], q0\[0\], r2, r0
+.*: ec10 0f03 vmov q0\[2\], q0\[0\], r3, r0
+.*: ec10 0f04 vmov q0\[2\], q0\[0\], r4, r0
+.*: ec10 0f05 vmov q0\[2\], q0\[0\], r5, r0
+.*: ec10 0f06 vmov q0\[2\], q0\[0\], r6, r0
+.*: ec10 0f07 vmov q0\[2\], q0\[0\], r7, r0
+.*: ec10 0f08 vmov q0\[2\], q0\[0\], r8, r0
+.*: ec10 0f09 vmov q0\[2\], q0\[0\], r9, r0
+.*: ec10 0f0a vmov q0\[2\], q0\[0\], sl, r0
+.*: ec10 0f0b vmov q0\[2\], q0\[0\], fp, r0
+.*: ec10 0f0c vmov q0\[2\], q0\[0\], ip, r0
+.*: ec10 0f0e vmov q0\[2\], q0\[0\], lr, r0
+.*: ec11 0f00 vmov q0\[2\], q0\[0\], r0, r1
+.*: ec12 0f00 vmov q0\[2\], q0\[0\], r0, r2
+.*: ec13 0f00 vmov q0\[2\], q0\[0\], r0, r3
+.*: ec14 0f00 vmov q0\[2\], q0\[0\], r0, r4
+.*: ec15 0f00 vmov q0\[2\], q0\[0\], r0, r5
+.*: ec16 0f00 vmov q0\[2\], q0\[0\], r0, r6
+.*: ec17 0f00 vmov q0\[2\], q0\[0\], r0, r7
+.*: ec18 0f00 vmov q0\[2\], q0\[0\], r0, r8
+.*: ec19 0f00 vmov q0\[2\], q0\[0\], r0, r9
+.*: ec1a 0f00 vmov q0\[2\], q0\[0\], r0, sl
+.*: ec1b 0f00 vmov q0\[2\], q0\[0\], r0, fp
+.*: ec1c 0f00 vmov q0\[2\], q0\[0\], r0, ip
+.*: ec1e 0f00 vmov q0\[2\], q0\[0\], r0, lr
+.*: ec11 0f01 vmov q0\[2\], q0\[0\], r1, r1
+.*: ec12 0f02 vmov q0\[2\], q0\[0\], r2, r2
+.*: ec13 0f03 vmov q0\[2\], q0\[0\], r3, r3
+.*: ec14 0f04 vmov q0\[2\], q0\[0\], r4, r4
+.*: ec15 0f05 vmov q0\[2\], q0\[0\], r5, r5
+.*: ec16 0f06 vmov q0\[2\], q0\[0\], r6, r6
+.*: ec17 0f07 vmov q0\[2\], q0\[0\], r7, r7
+.*: ec18 0f08 vmov q0\[2\], q0\[0\], r8, r8
+.*: ec19 0f09 vmov q0\[2\], q0\[0\], r9, r9
+.*: ec1a 0f0a vmov q0\[2\], q0\[0\], sl, sl
+.*: ec1b 0f0b vmov q0\[2\], q0\[0\], fp, fp
+.*: ec1c 0f0c vmov q0\[2\], q0\[0\], ip, ip
+.*: ec1e 0f0e vmov q0\[2\], q0\[0\], lr, lr
+.*: ec11 2f10 vmov q1\[3\], q1\[1\], r0, r1
+.*: ec11 4f10 vmov q2\[3\], q2\[1\], r0, r1
+.*: ec11 6f10 vmov q3\[3\], q3\[1\], r0, r1
+.*: ec11 8f10 vmov q4\[3\], q4\[1\], r0, r1
+.*: ec11 af10 vmov q5\[3\], q5\[1\], r0, r1
+.*: ec11 cf10 vmov q6\[3\], q6\[1\], r0, r1
+.*: ec11 ef10 vmov q7\[3\], q7\[1\], r0, r1
+.*: ec10 0f10 vmov q0\[3\], q0\[1\], r0, r0
+.*: ec10 0f11 vmov q0\[3\], q0\[1\], r1, r0
+.*: ec10 0f12 vmov q0\[3\], q0\[1\], r2, r0
+.*: ec10 0f13 vmov q0\[3\], q0\[1\], r3, r0
+.*: ec10 0f14 vmov q0\[3\], q0\[1\], r4, r0
+.*: ec10 0f15 vmov q0\[3\], q0\[1\], r5, r0
+.*: ec10 0f16 vmov q0\[3\], q0\[1\], r6, r0
+.*: ec10 0f17 vmov q0\[3\], q0\[1\], r7, r0
+.*: ec10 0f18 vmov q0\[3\], q0\[1\], r8, r0
+.*: ec10 0f19 vmov q0\[3\], q0\[1\], r9, r0
+.*: ec10 0f1a vmov q0\[3\], q0\[1\], sl, r0
+.*: ec10 0f1b vmov q0\[3\], q0\[1\], fp, r0
+.*: ec10 0f1c vmov q0\[3\], q0\[1\], ip, r0
+.*: ec10 0f1e vmov q0\[3\], q0\[1\], lr, r0
+.*: ec11 0f10 vmov q0\[3\], q0\[1\], r0, r1
+.*: ec12 0f10 vmov q0\[3\], q0\[1\], r0, r2
+.*: ec13 0f10 vmov q0\[3\], q0\[1\], r0, r3
+.*: ec14 0f10 vmov q0\[3\], q0\[1\], r0, r4
+.*: ec15 0f10 vmov q0\[3\], q0\[1\], r0, r5
+.*: ec16 0f10 vmov q0\[3\], q0\[1\], r0, r6
+.*: ec17 0f10 vmov q0\[3\], q0\[1\], r0, r7
+.*: ec18 0f10 vmov q0\[3\], q0\[1\], r0, r8
+.*: ec19 0f10 vmov q0\[3\], q0\[1\], r0, r9
+.*: ec1a 0f10 vmov q0\[3\], q0\[1\], r0, sl
+.*: ec1b 0f10 vmov q0\[3\], q0\[1\], r0, fp
+.*: ec1c 0f10 vmov q0\[3\], q0\[1\], r0, ip
+.*: ec1e 0f10 vmov q0\[3\], q0\[1\], r0, lr
+.*: ec11 0f11 vmov q0\[3\], q0\[1\], r1, r1
+.*: ec12 0f12 vmov q0\[3\], q0\[1\], r2, r2
+.*: ec13 0f13 vmov q0\[3\], q0\[1\], r3, r3
+.*: ec14 0f14 vmov q0\[3\], q0\[1\], r4, r4
+.*: ec15 0f15 vmov q0\[3\], q0\[1\], r5, r5
+.*: ec16 0f16 vmov q0\[3\], q0\[1\], r6, r6
+.*: ec17 0f17 vmov q0\[3\], q0\[1\], r7, r7
+.*: ec18 0f18 vmov q0\[3\], q0\[1\], r8, r8
+.*: ec19 0f19 vmov q0\[3\], q0\[1\], r9, r9
+.*: ec1a 0f1a vmov q0\[3\], q0\[1\], sl, sl
+.*: ec1b 0f1b vmov q0\[3\], q0\[1\], fp, fp
+.*: ec1c 0f1c vmov q0\[3\], q0\[1\], ip, ip
+.*: ec1e 0f1e vmov q0\[3\], q0\[1\], lr, lr
diff --git a/gas/testsuite/gas/arm/mve-vmov-3.s b/gas/testsuite/gas/arm/mve-vmov-3.s
new file mode 100644
index 0000000..caf0957
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vmov-3.s
@@ -0,0 +1,160 @@
+vmov r0, r1, q1[2], q1[0]
+vmov r0, r1, q2[2], q2[0]
+vmov r0, r1, q3[2], q3[0]
+vmov r0, r1, q4[2], q4[0]
+vmov r0, r1, q5[2], q5[0]
+vmov r0, r1, q6[2], q6[0]
+vmov r0, r1, q7[2], q7[0]
+vmov r1, r0, q0[2], q0[0]
+vmov r2, r0, q0[2], q0[0]
+vmov r3, r0, q0[2], q0[0]
+vmov r4, r0, q0[2], q0[0]
+vmov r5, r0, q0[2], q0[0]
+vmov r6, r0, q0[2], q0[0]
+vmov r7, r0, q0[2], q0[0]
+vmov r8, r0, q0[2], q0[0]
+vmov r9, r0, q0[2], q0[0]
+vmov sl, r0, q0[2], q0[0]
+vmov fp, r0, q0[2], q0[0]
+vmov ip, r0, q0[2], q0[0]
+vmov lr, r0, q0[2], q0[0]
+vmov r0, r1, q0[2], q0[0]
+vmov r0, r2, q0[2], q0[0]
+vmov r0, r3, q0[2], q0[0]
+vmov r0, r4, q0[2], q0[0]
+vmov r0, r5, q0[2], q0[0]
+vmov r0, r6, q0[2], q0[0]
+vmov r0, r7, q0[2], q0[0]
+vmov r0, r8, q0[2], q0[0]
+vmov r0, r9, q0[2], q0[0]
+vmov r0, sl, q0[2], q0[0]
+vmov r0, fp, q0[2], q0[0]
+vmov r0, ip, q0[2], q0[0]
+vmov r0, lr, q0[2], q0[0]
+vmov r0, r1, q1[3], q1[1]
+vmov r0, r1, q2[3], q2[1]
+vmov r0, r1, q3[3], q3[1]
+vmov r0, r1, q4[3], q4[1]
+vmov r0, r1, q5[3], q5[1]
+vmov r0, r1, q6[3], q6[1]
+vmov r0, r1, q7[3], q7[1]
+vmov r1, r0, q0[3], q0[1]
+vmov r2, r0, q0[3], q0[1]
+vmov r3, r0, q0[3], q0[1]
+vmov r4, r0, q0[3], q0[1]
+vmov r5, r0, q0[3], q0[1]
+vmov r6, r0, q0[3], q0[1]
+vmov r7, r0, q0[3], q0[1]
+vmov r8, r0, q0[3], q0[1]
+vmov r9, r0, q0[3], q0[1]
+vmov sl, r0, q0[3], q0[1]
+vmov fp, r0, q0[3], q0[1]
+vmov ip, r0, q0[3], q0[1]
+vmov lr, r0, q0[3], q0[1]
+vmov r0, r1, q0[3], q0[1]
+vmov r0, r2, q0[3], q0[1]
+vmov r0, r3, q0[3], q0[1]
+vmov r0, r4, q0[3], q0[1]
+vmov r0, r5, q0[3], q0[1]
+vmov r0, r6, q0[3], q0[1]
+vmov r0, r7, q0[3], q0[1]
+vmov r0, r8, q0[3], q0[1]
+vmov r0, r9, q0[3], q0[1]
+vmov r0, sl, q0[3], q0[1]
+vmov r0, fp, q0[3], q0[1]
+vmov r0, ip, q0[3], q0[1]
+vmov r0, lr, q0[3], q0[1]
+vmov q1[2], q1[0], r0, r1
+vmov q2[2], q2[0], r0, r1
+vmov q3[2], q3[0], r0, r1
+vmov q4[2], q4[0], r0, r1
+vmov q5[2], q5[0], r0, r1
+vmov q6[2], q6[0], r0, r1
+vmov q7[2], q7[0], r0, r1
+vmov q0[2], q0[0], r0, r0
+vmov q0[2], q0[0], r1, r0
+vmov q0[2], q0[0], r2, r0
+vmov q0[2], q0[0], r3, r0
+vmov q0[2], q0[0], r4, r0
+vmov q0[2], q0[0], r5, r0
+vmov q0[2], q0[0], r6, r0
+vmov q0[2], q0[0], r7, r0
+vmov q0[2], q0[0], r8, r0
+vmov q0[2], q0[0], r9, r0
+vmov q0[2], q0[0], sl, r0
+vmov q0[2], q0[0], fp, r0
+vmov q0[2], q0[0], ip, r0
+vmov q0[2], q0[0], lr, r0
+vmov q0[2], q0[0], r0, r1
+vmov q0[2], q0[0], r0, r2
+vmov q0[2], q0[0], r0, r3
+vmov q0[2], q0[0], r0, r4
+vmov q0[2], q0[0], r0, r5
+vmov q0[2], q0[0], r0, r6
+vmov q0[2], q0[0], r0, r7
+vmov q0[2], q0[0], r0, r8
+vmov q0[2], q0[0], r0, r9
+vmov q0[2], q0[0], r0, sl
+vmov q0[2], q0[0], r0, fp
+vmov q0[2], q0[0], r0, ip
+vmov q0[2], q0[0], r0, lr
+vmov q0[2], q0[0], r1, r1
+vmov q0[2], q0[0], r2, r2
+vmov q0[2], q0[0], r3, r3
+vmov q0[2], q0[0], r4, r4
+vmov q0[2], q0[0], r5, r5
+vmov q0[2], q0[0], r6, r6
+vmov q0[2], q0[0], r7, r7
+vmov q0[2], q0[0], r8, r8
+vmov q0[2], q0[0], r9, r9
+vmov q0[2], q0[0], sl, sl
+vmov q0[2], q0[0], fp, fp
+vmov q0[2], q0[0], ip, ip
+vmov q0[2], q0[0], lr, lr
+vmov q1[3], q1[1], r0, r1
+vmov q2[3], q2[1], r0, r1
+vmov q3[3], q3[1], r0, r1
+vmov q4[3], q4[1], r0, r1
+vmov q5[3], q5[1], r0, r1
+vmov q6[3], q6[1], r0, r1
+vmov q7[3], q7[1], r0, r1
+vmov q0[3], q0[1], r0, r0
+vmov q0[3], q0[1], r1, r0
+vmov q0[3], q0[1], r2, r0
+vmov q0[3], q0[1], r3, r0
+vmov q0[3], q0[1], r4, r0
+vmov q0[3], q0[1], r5, r0
+vmov q0[3], q0[1], r6, r0
+vmov q0[3], q0[1], r7, r0
+vmov q0[3], q0[1], r8, r0
+vmov q0[3], q0[1], r9, r0
+vmov q0[3], q0[1], sl, r0
+vmov q0[3], q0[1], fp, r0
+vmov q0[3], q0[1], ip, r0
+vmov q0[3], q0[1], lr, r0
+vmov q0[3], q0[1], r0, r1
+vmov q0[3], q0[1], r0, r2
+vmov q0[3], q0[1], r0, r3
+vmov q0[3], q0[1], r0, r4
+vmov q0[3], q0[1], r0, r5
+vmov q0[3], q0[1], r0, r6
+vmov q0[3], q0[1], r0, r7
+vmov q0[3], q0[1], r0, r8
+vmov q0[3], q0[1], r0, r9
+vmov q0[3], q0[1], r0, sl
+vmov q0[3], q0[1], r0, fp
+vmov q0[3], q0[1], r0, ip
+vmov q0[3], q0[1], r0, lr
+vmov q0[3], q0[1], r1, r1
+vmov q0[3], q0[1], r2, r2
+vmov q0[3], q0[1], r3, r3
+vmov q0[3], q0[1], r4, r4
+vmov q0[3], q0[1], r5, r5
+vmov q0[3], q0[1], r6, r6
+vmov q0[3], q0[1], r7, r7
+vmov q0[3], q0[1], r8, r8
+vmov q0[3], q0[1], r9, r9
+vmov q0[3], q0[1], sl, sl
+vmov q0[3], q0[1], fp, fp
+vmov q0[3], q0[1], ip, ip
+vmov q0[3], q0[1], lr, lr
diff --git a/gas/testsuite/gas/arm/mve-vmov-bad-2.l b/gas/testsuite/gas/arm/mve-vmov-bad-2.l
index 2f4bdc8..7c9226c 100644
--- a/gas/testsuite/gas/arm/mve-vmov-bad-2.l
+++ b/gas/testsuite/gas/arm/mve-vmov-bad-2.l
@@ -1,5 +1,5 @@
[^:]*: Assembler messages:
-[^:]*:3: Error: General purpose registers may not be the same -- `vmov r0,r0,q0\[2\],q0\[0\]'
+[^:]*:3: Error: Destination registers may not be the same -- `vmov r0,r0,q0\[2\],q0\[0\]'
[^:]*:4: Error: r13 not allowed here -- `vmov sp,r0,q0\[2\],q0\[0\]'
[^:]*:5: Error: r13 not allowed here -- `vmov r0,sp,q0\[2\],q0\[0\]'
[^:]*:6: Error: r15 not allowed here -- `vmov pc,r0,q0\[2\],q0\[0\]'
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 6a4bd6f..d506b71 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,12 @@
+2021-05-17 Alex Coplan <alex.coplan@arm.com>
+
+ * arm-dis.c (mve_opcodes): Fix disassembly of
+ MVE_VMOV2_GP_TO_VEC_LANE when idx == 1.
+ (is_mve_encoding_conflict): MVE vector loads should not match
+ when P = W = 0.
+ (is_mve_unpredictable): It's not unpredictable to use the same
+ source register twice (for MVE_VMOV2_GP_TO_VEC_LANE).
+
2021-05-11 Nick Clifton <nickc@redhat.com>
PR 27840
diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c
index 4130919..92cd098 100644
--- a/opcodes/arm-dis.c
+++ b/opcodes/arm-dis.c
@@ -2954,7 +2954,7 @@ static const struct mopcode32 mve_opcodes[] =
{ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE),
MVE_VMOV2_GP_TO_VEC_LANE,
0xec100f10, 0xffb01ff0,
- "vmov%c\t%13-15,22Q[2], %13-15,22Q[0], %0-3r, %16-19r"},
+ "vmov%c\t%13-15,22Q[3], %13-15,22Q[1], %0-3r, %16-19r"},
/* Vector VMOV Vector lane to gpr. */
{ARM_FEATURE_CORE_HIGH (ARM_EXT2_MVE_FP),
@@ -5722,6 +5722,9 @@ is_mve_encoding_conflict (unsigned long given,
else
return false;
+ case MVE_VLDRB_T1:
+ case MVE_VLDRH_T2:
+ case MVE_VLDRW_T7:
case MVE_VSTRB_T5:
case MVE_VSTRH_T6:
case MVE_VSTRW_T7:
@@ -6656,7 +6659,7 @@ is_mve_unpredictable (unsigned long given, enum mve_instructions matched_insn,
*unpredictable_code = UNPRED_R15;
return true;
}
- else if (rt == rt2)
+ else if (rt == rt2 && matched_insn != MVE_VMOV2_GP_TO_VEC_LANE)
{
*unpredictable_code = UNPRED_GP_REGS_EQUAL;
return true;