AArch64: Constraint disassembler and assembler changes.
authorTamar Christina <tamar.christina@arm.com>
Wed, 3 Oct 2018 17:51:11 +0000 (18:51 +0100)
committerTamar Christina <tamar.christina@arm.com>
Wed, 3 Oct 2018 17:51:58 +0000 (18:51 +0100)
This patch wires in the new constraint verifiers into the assembler and
disassembler.  Because of this the MOVPRFX tests have to be split out from the
generic SVE tests into their own tests so warnings can be ignored.

These tests are only intended to test the encoding correctness and not the
constraints.

gas/

* testsuite/gas/aarch64/sve-movprfx.d: New test.
* testsuite/gas/aarch64/sve-movprfx.s: New test.
* testsuite/gas/aarch64/sve.d: Refactor.
* testsuite/gas/aarch64/sve.s: Refactor.
        * testsuite/gas/aarch64/sysreg-diagnostic.d: Update.

opcodes/

* aarch64-asm.c (aarch64_opcode_encode): Apply constraint verifier.
* aarch64-dis.c (print_operands): Refactor to take notes.
(print_verifier_notes): New.
(print_aarch64_insn): Apply constraint verifier.
(print_insn_aarch64_word): Update call to print_aarch64_insn.
* aarch64-opc.c (aarch64_print_operand): Remove attribute, update notes format.

gas/ChangeLog
gas/testsuite/gas/aarch64/sve-movprfx.d [new file with mode: 0644]
gas/testsuite/gas/aarch64/sve-movprfx.s [new file with mode: 0644]
gas/testsuite/gas/aarch64/sve.d
gas/testsuite/gas/aarch64/sve.s
gas/testsuite/gas/aarch64/sysreg-diagnostic.d
opcodes/ChangeLog
opcodes/aarch64-asm.c
opcodes/aarch64-dis.c
opcodes/aarch64-opc.c

index 56609f4d315fd954fa4cbfc04908e27f236747d1..aa684f7063ce9533b5112a4c0b5be1009a862310 100644 (file)
@@ -1,3 +1,11 @@
+2018-10-03  Tamar Christina  <tamar.christina@arm.com>
+
+       * testsuite/gas/aarch64/sve-movprfx.d: New test.
+       * testsuite/gas/aarch64/sve-movprfx.s: New test.
+       * testsuite/gas/aarch64/sve.d: Refactor.
+       * testsuite/gas/aarch64/sve.s: Refactor.
+       * testsuite/gas/aarch64/sysreg-diagnostic.d: Update.
+
 2018-10-03  Tamar Christina  <tamar.christina@arm.com>
 
        * config/tc-aarch64.c (force_automatic_sequence_close,
diff --git a/gas/testsuite/gas/aarch64/sve-movprfx.d b/gas/testsuite/gas/aarch64/sve-movprfx.d
new file mode 100644 (file)
index 0000000..a589b72
--- /dev/null
@@ -0,0 +1,130 @@
+#as: -march=armv8-a+sve -I$srcdir/$subdir -W
+#objdump: -dr -M no-notes
+
+.* file format .*
+
+Disassembly of section .*:
+
+0+ <.*>:
+[^:]+: 0420bc00        movprfx z0, z0
+[^:]+: 0420bc00        movprfx z0, z0
+[^:]+: 0420bc01        movprfx z1, z0
+[^:]+: 0420bc01        movprfx z1, z0
+[^:]+: 0420bc1f        movprfx z31, z0
+[^:]+: 0420bc1f        movprfx z31, z0
+[^:]+: 0420bc40        movprfx z0, z2
+[^:]+: 0420bc40        movprfx z0, z2
+[^:]+: 0420bfe0        movprfx z0, z31
+[^:]+: 0420bfe0        movprfx z0, z31
+[^:]+: 04102000        movprfx z0.b, p0/z, z0.b
+[^:]+: 04102000        movprfx z0.b, p0/z, z0.b
+[^:]+: 04102001        movprfx z1.b, p0/z, z0.b
+[^:]+: 04102001        movprfx z1.b, p0/z, z0.b
+[^:]+: 0410201f        movprfx z31.b, p0/z, z0.b
+[^:]+: 0410201f        movprfx z31.b, p0/z, z0.b
+[^:]+: 04102800        movprfx z0.b, p2/z, z0.b
+[^:]+: 04102800        movprfx z0.b, p2/z, z0.b
+[^:]+: 04103c00        movprfx z0.b, p7/z, z0.b
+[^:]+: 04103c00        movprfx z0.b, p7/z, z0.b
+[^:]+: 04102060        movprfx z0.b, p0/z, z3.b
+[^:]+: 04102060        movprfx z0.b, p0/z, z3.b
+[^:]+: 041023e0        movprfx z0.b, p0/z, z31.b
+[^:]+: 041023e0        movprfx z0.b, p0/z, z31.b
+[^:]+: 04112000        movprfx z0.b, p0/m, z0.b
+[^:]+: 04112000        movprfx z0.b, p0/m, z0.b
+[^:]+: 04112001        movprfx z1.b, p0/m, z0.b
+[^:]+: 04112001        movprfx z1.b, p0/m, z0.b
+[^:]+: 0411201f        movprfx z31.b, p0/m, z0.b
+[^:]+: 0411201f        movprfx z31.b, p0/m, z0.b
+[^:]+: 04112800        movprfx z0.b, p2/m, z0.b
+[^:]+: 04112800        movprfx z0.b, p2/m, z0.b
+[^:]+: 04113c00        movprfx z0.b, p7/m, z0.b
+[^:]+: 04113c00        movprfx z0.b, p7/m, z0.b
+[^:]+: 04112060        movprfx z0.b, p0/m, z3.b
+[^:]+: 04112060        movprfx z0.b, p0/m, z3.b
+[^:]+: 041123e0        movprfx z0.b, p0/m, z31.b
+[^:]+: 041123e0        movprfx z0.b, p0/m, z31.b
+[^:]+: 04502000        movprfx z0.h, p0/z, z0.h
+[^:]+: 04502000        movprfx z0.h, p0/z, z0.h
+[^:]+: 04502001        movprfx z1.h, p0/z, z0.h
+[^:]+: 04502001        movprfx z1.h, p0/z, z0.h
+[^:]+: 0450201f        movprfx z31.h, p0/z, z0.h
+[^:]+: 0450201f        movprfx z31.h, p0/z, z0.h
+[^:]+: 04502800        movprfx z0.h, p2/z, z0.h
+[^:]+: 04502800        movprfx z0.h, p2/z, z0.h
+[^:]+: 04503c00        movprfx z0.h, p7/z, z0.h
+[^:]+: 04503c00        movprfx z0.h, p7/z, z0.h
+[^:]+: 04502060        movprfx z0.h, p0/z, z3.h
+[^:]+: 04502060        movprfx z0.h, p0/z, z3.h
+[^:]+: 045023e0        movprfx z0.h, p0/z, z31.h
+[^:]+: 045023e0        movprfx z0.h, p0/z, z31.h
+[^:]+: 04512000        movprfx z0.h, p0/m, z0.h
+[^:]+: 04512000        movprfx z0.h, p0/m, z0.h
+[^:]+: 04512001        movprfx z1.h, p0/m, z0.h
+[^:]+: 04512001        movprfx z1.h, p0/m, z0.h
+[^:]+: 0451201f        movprfx z31.h, p0/m, z0.h
+[^:]+: 0451201f        movprfx z31.h, p0/m, z0.h
+[^:]+: 04512800        movprfx z0.h, p2/m, z0.h
+[^:]+: 04512800        movprfx z0.h, p2/m, z0.h
+[^:]+: 04513c00        movprfx z0.h, p7/m, z0.h
+[^:]+: 04513c00        movprfx z0.h, p7/m, z0.h
+[^:]+: 04512060        movprfx z0.h, p0/m, z3.h
+[^:]+: 04512060        movprfx z0.h, p0/m, z3.h
+[^:]+: 045123e0        movprfx z0.h, p0/m, z31.h
+[^:]+: 045123e0        movprfx z0.h, p0/m, z31.h
+[^:]+: 04902000        movprfx z0.s, p0/z, z0.s
+[^:]+: 04902000        movprfx z0.s, p0/z, z0.s
+[^:]+: 04902001        movprfx z1.s, p0/z, z0.s
+[^:]+: 04902001        movprfx z1.s, p0/z, z0.s
+[^:]+: 0490201f        movprfx z31.s, p0/z, z0.s
+[^:]+: 0490201f        movprfx z31.s, p0/z, z0.s
+[^:]+: 04902800        movprfx z0.s, p2/z, z0.s
+[^:]+: 04902800        movprfx z0.s, p2/z, z0.s
+[^:]+: 04903c00        movprfx z0.s, p7/z, z0.s
+[^:]+: 04903c00        movprfx z0.s, p7/z, z0.s
+[^:]+: 04902060        movprfx z0.s, p0/z, z3.s
+[^:]+: 04902060        movprfx z0.s, p0/z, z3.s
+[^:]+: 049023e0        movprfx z0.s, p0/z, z31.s
+[^:]+: 049023e0        movprfx z0.s, p0/z, z31.s
+[^:]+: 04912000        movprfx z0.s, p0/m, z0.s
+[^:]+: 04912000        movprfx z0.s, p0/m, z0.s
+[^:]+: 04912001        movprfx z1.s, p0/m, z0.s
+[^:]+: 04912001        movprfx z1.s, p0/m, z0.s
+[^:]+: 0491201f        movprfx z31.s, p0/m, z0.s
+[^:]+: 0491201f        movprfx z31.s, p0/m, z0.s
+[^:]+: 04912800        movprfx z0.s, p2/m, z0.s
+[^:]+: 04912800        movprfx z0.s, p2/m, z0.s
+[^:]+: 04913c00        movprfx z0.s, p7/m, z0.s
+[^:]+: 04913c00        movprfx z0.s, p7/m, z0.s
+[^:]+: 04912060        movprfx z0.s, p0/m, z3.s
+[^:]+: 04912060        movprfx z0.s, p0/m, z3.s
+[^:]+: 049123e0        movprfx z0.s, p0/m, z31.s
+[^:]+: 049123e0        movprfx z0.s, p0/m, z31.s
+[^:]+: 04d02000        movprfx z0.d, p0/z, z0.d
+[^:]+: 04d02000        movprfx z0.d, p0/z, z0.d
+[^:]+: 04d02001        movprfx z1.d, p0/z, z0.d
+[^:]+: 04d02001        movprfx z1.d, p0/z, z0.d
+[^:]+: 04d0201f        movprfx z31.d, p0/z, z0.d
+[^:]+: 04d0201f        movprfx z31.d, p0/z, z0.d
+[^:]+: 04d02800        movprfx z0.d, p2/z, z0.d
+[^:]+: 04d02800        movprfx z0.d, p2/z, z0.d
+[^:]+: 04d03c00        movprfx z0.d, p7/z, z0.d
+[^:]+: 04d03c00        movprfx z0.d, p7/z, z0.d
+[^:]+: 04d02060        movprfx z0.d, p0/z, z3.d
+[^:]+: 04d02060        movprfx z0.d, p0/z, z3.d
+[^:]+: 04d023e0        movprfx z0.d, p0/z, z31.d
+[^:]+: 04d023e0        movprfx z0.d, p0/z, z31.d
+[^:]+: 04d12000        movprfx z0.d, p0/m, z0.d
+[^:]+: 04d12000        movprfx z0.d, p0/m, z0.d
+[^:]+: 04d12001        movprfx z1.d, p0/m, z0.d
+[^:]+: 04d12001        movprfx z1.d, p0/m, z0.d
+[^:]+: 04d1201f        movprfx z31.d, p0/m, z0.d
+[^:]+: 04d1201f        movprfx z31.d, p0/m, z0.d
+[^:]+: 04d12800        movprfx z0.d, p2/m, z0.d
+[^:]+: 04d12800        movprfx z0.d, p2/m, z0.d
+[^:]+: 04d13c00        movprfx z0.d, p7/m, z0.d
+[^:]+: 04d13c00        movprfx z0.d, p7/m, z0.d
+[^:]+: 04d12060        movprfx z0.d, p0/m, z3.d
+[^:]+: 04d12060        movprfx z0.d, p0/m, z3.d
+[^:]+: 04d123e0        movprfx z0.d, p0/m, z31.d
+[^:]+: 04d123e0        movprfx z0.d, p0/m, z31.d
diff --git a/gas/testsuite/gas/aarch64/sve-movprfx.s b/gas/testsuite/gas/aarch64/sve-movprfx.s
new file mode 100644 (file)
index 0000000..35be73c
--- /dev/null
@@ -0,0 +1,122 @@
+       movprfx   z0, z0
+       MOVPRFX   Z0, Z0
+       movprfx   z1, z0
+       MOVPRFX   Z1, Z0
+       movprfx   z31, z0
+       MOVPRFX   Z31, Z0
+       movprfx   z0, z2
+       MOVPRFX   Z0, Z2
+       movprfx   z0, z31
+       MOVPRFX   Z0, Z31
+       movprfx   z0.b, p0/z, z0.b
+       MOVPRFX   Z0.B, P0/Z, Z0.B
+       movprfx   z1.b, p0/z, z0.b
+       MOVPRFX   Z1.B, P0/Z, Z0.B
+       movprfx   z31.b, p0/z, z0.b
+       MOVPRFX   Z31.B, P0/Z, Z0.B
+       movprfx   z0.b, p2/z, z0.b
+       MOVPRFX   Z0.B, P2/Z, Z0.B
+       movprfx   z0.b, p7/z, z0.b
+       MOVPRFX   Z0.B, P7/Z, Z0.B
+       movprfx   z0.b, p0/z, z3.b
+       MOVPRFX   Z0.B, P0/Z, Z3.B
+       movprfx   z0.b, p0/z, z31.b
+       MOVPRFX   Z0.B, P0/Z, Z31.B
+       movprfx   z0.b, p0/m, z0.b
+       MOVPRFX   Z0.B, P0/M, Z0.B
+       movprfx   z1.b, p0/m, z0.b
+       MOVPRFX   Z1.B, P0/M, Z0.B
+       movprfx   z31.b, p0/m, z0.b
+       MOVPRFX   Z31.B, P0/M, Z0.B
+       movprfx   z0.b, p2/m, z0.b
+       MOVPRFX   Z0.B, P2/M, Z0.B
+       movprfx   z0.b, p7/m, z0.b
+       MOVPRFX   Z0.B, P7/M, Z0.B
+       movprfx   z0.b, p0/m, z3.b
+       MOVPRFX   Z0.B, P0/M, Z3.B
+       movprfx   z0.b, p0/m, z31.b
+       MOVPRFX   Z0.B, P0/M, Z31.B
+       movprfx   z0.h, p0/z, z0.h
+       MOVPRFX   Z0.H, P0/Z, Z0.H
+       movprfx   z1.h, p0/z, z0.h
+       MOVPRFX   Z1.H, P0/Z, Z0.H
+       movprfx   z31.h, p0/z, z0.h
+       MOVPRFX   Z31.H, P0/Z, Z0.H
+       movprfx   z0.h, p2/z, z0.h
+       MOVPRFX   Z0.H, P2/Z, Z0.H
+       movprfx   z0.h, p7/z, z0.h
+       MOVPRFX   Z0.H, P7/Z, Z0.H
+       movprfx   z0.h, p0/z, z3.h
+       MOVPRFX   Z0.H, P0/Z, Z3.H
+       movprfx   z0.h, p0/z, z31.h
+       MOVPRFX   Z0.H, P0/Z, Z31.H
+       movprfx   z0.h, p0/m, z0.h
+       MOVPRFX   Z0.H, P0/M, Z0.H
+       movprfx   z1.h, p0/m, z0.h
+       MOVPRFX   Z1.H, P0/M, Z0.H
+       movprfx   z31.h, p0/m, z0.h
+       MOVPRFX   Z31.H, P0/M, Z0.H
+       movprfx   z0.h, p2/m, z0.h
+       MOVPRFX   Z0.H, P2/M, Z0.H
+       movprfx   z0.h, p7/m, z0.h
+       MOVPRFX   Z0.H, P7/M, Z0.H
+       movprfx   z0.h, p0/m, z3.h
+       MOVPRFX   Z0.H, P0/M, Z3.H
+       movprfx   z0.h, p0/m, z31.h
+       MOVPRFX   Z0.H, P0/M, Z31.H
+       movprfx   z0.s, p0/z, z0.s
+       MOVPRFX   Z0.S, P0/Z, Z0.S
+       movprfx   z1.s, p0/z, z0.s
+       MOVPRFX   Z1.S, P0/Z, Z0.S
+       movprfx   z31.s, p0/z, z0.s
+       MOVPRFX   Z31.S, P0/Z, Z0.S
+       movprfx   z0.s, p2/z, z0.s
+       MOVPRFX   Z0.S, P2/Z, Z0.S
+       movprfx   z0.s, p7/z, z0.s
+       MOVPRFX   Z0.S, P7/Z, Z0.S
+       movprfx   z0.s, p0/z, z3.s
+       MOVPRFX   Z0.S, P0/Z, Z3.S
+       movprfx   z0.s, p0/z, z31.s
+       MOVPRFX   Z0.S, P0/Z, Z31.S
+       movprfx   z0.s, p0/m, z0.s
+       MOVPRFX   Z0.S, P0/M, Z0.S
+       movprfx   z1.s, p0/m, z0.s
+       MOVPRFX   Z1.S, P0/M, Z0.S
+       movprfx   z31.s, p0/m, z0.s
+       MOVPRFX   Z31.S, P0/M, Z0.S
+       movprfx   z0.s, p2/m, z0.s
+       MOVPRFX   Z0.S, P2/M, Z0.S
+       movprfx   z0.s, p7/m, z0.s
+       MOVPRFX   Z0.S, P7/M, Z0.S
+       movprfx   z0.s, p0/m, z3.s
+       MOVPRFX   Z0.S, P0/M, Z3.S
+       movprfx   z0.s, p0/m, z31.s
+       MOVPRFX   Z0.S, P0/M, Z31.S
+       movprfx   z0.d, p0/z, z0.d
+       MOVPRFX   Z0.D, P0/Z, Z0.D
+       movprfx   z1.d, p0/z, z0.d
+       MOVPRFX   Z1.D, P0/Z, Z0.D
+       movprfx   z31.d, p0/z, z0.d
+       MOVPRFX   Z31.D, P0/Z, Z0.D
+       movprfx   z0.d, p2/z, z0.d
+       MOVPRFX   Z0.D, P2/Z, Z0.D
+       movprfx   z0.d, p7/z, z0.d
+       MOVPRFX   Z0.D, P7/Z, Z0.D
+       movprfx   z0.d, p0/z, z3.d
+       MOVPRFX   Z0.D, P0/Z, Z3.D
+       movprfx   z0.d, p0/z, z31.d
+       MOVPRFX   Z0.D, P0/Z, Z31.D
+       movprfx   z0.d, p0/m, z0.d
+       MOVPRFX   Z0.D, P0/M, Z0.D
+       movprfx   z1.d, p0/m, z0.d
+       MOVPRFX   Z1.D, P0/M, Z0.D
+       movprfx   z31.d, p0/m, z0.d
+       MOVPRFX   Z31.D, P0/M, Z0.D
+       movprfx   z0.d, p2/m, z0.d
+       MOVPRFX   Z0.D, P2/M, Z0.D
+       movprfx   z0.d, p7/m, z0.d
+       MOVPRFX   Z0.D, P7/M, Z0.D
+       movprfx   z0.d, p0/m, z3.d
+       MOVPRFX   Z0.D, P0/M, Z3.D
+       movprfx   z0.d, p0/m, z31.d
+       MOVPRFX   Z0.D, P0/M, Z31.D
index ff65f4ef4c80e173c73cbfd45498ba4cb62f2d00..5d6d7562646f083fc5aa107eed3138bd8588b8f6 100644 (file)
@@ -23128,128 +23128,6 @@ Disassembly of section .*:
 [^:]+: 04c46000        mls     z0.d, p0/m, z0.d, z4.d
 [^:]+: 04df6000        mls     z0.d, p0/m, z0.d, z31.d
 [^:]+: 04df6000        mls     z0.d, p0/m, z0.d, z31.d
-[^:]+: 0420bc00        movprfx z0, z0
-[^:]+: 0420bc00        movprfx z0, z0
-[^:]+: 0420bc01        movprfx z1, z0
-[^:]+: 0420bc01        movprfx z1, z0
-[^:]+: 0420bc1f        movprfx z31, z0
-[^:]+: 0420bc1f        movprfx z31, z0
-[^:]+: 0420bc40        movprfx z0, z2
-[^:]+: 0420bc40        movprfx z0, z2
-[^:]+: 0420bfe0        movprfx z0, z31
-[^:]+: 0420bfe0        movprfx z0, z31
-[^:]+: 04102000        movprfx z0.b, p0/z, z0.b
-[^:]+: 04102000        movprfx z0.b, p0/z, z0.b
-[^:]+: 04102001        movprfx z1.b, p0/z, z0.b
-[^:]+: 04102001        movprfx z1.b, p0/z, z0.b
-[^:]+: 0410201f        movprfx z31.b, p0/z, z0.b
-[^:]+: 0410201f        movprfx z31.b, p0/z, z0.b
-[^:]+: 04102800        movprfx z0.b, p2/z, z0.b
-[^:]+: 04102800        movprfx z0.b, p2/z, z0.b
-[^:]+: 04103c00        movprfx z0.b, p7/z, z0.b
-[^:]+: 04103c00        movprfx z0.b, p7/z, z0.b
-[^:]+: 04102060        movprfx z0.b, p0/z, z3.b
-[^:]+: 04102060        movprfx z0.b, p0/z, z3.b
-[^:]+: 041023e0        movprfx z0.b, p0/z, z31.b
-[^:]+: 041023e0        movprfx z0.b, p0/z, z31.b
-[^:]+: 04112000        movprfx z0.b, p0/m, z0.b
-[^:]+: 04112000        movprfx z0.b, p0/m, z0.b
-[^:]+: 04112001        movprfx z1.b, p0/m, z0.b
-[^:]+: 04112001        movprfx z1.b, p0/m, z0.b
-[^:]+: 0411201f        movprfx z31.b, p0/m, z0.b
-[^:]+: 0411201f        movprfx z31.b, p0/m, z0.b
-[^:]+: 04112800        movprfx z0.b, p2/m, z0.b
-[^:]+: 04112800        movprfx z0.b, p2/m, z0.b
-[^:]+: 04113c00        movprfx z0.b, p7/m, z0.b
-[^:]+: 04113c00        movprfx z0.b, p7/m, z0.b
-[^:]+: 04112060        movprfx z0.b, p0/m, z3.b
-[^:]+: 04112060        movprfx z0.b, p0/m, z3.b
-[^:]+: 041123e0        movprfx z0.b, p0/m, z31.b
-[^:]+: 041123e0        movprfx z0.b, p0/m, z31.b
-[^:]+: 04502000        movprfx z0.h, p0/z, z0.h
-[^:]+: 04502000        movprfx z0.h, p0/z, z0.h
-[^:]+: 04502001        movprfx z1.h, p0/z, z0.h
-[^:]+: 04502001        movprfx z1.h, p0/z, z0.h
-[^:]+: 0450201f        movprfx z31.h, p0/z, z0.h
-[^:]+: 0450201f        movprfx z31.h, p0/z, z0.h
-[^:]+: 04502800        movprfx z0.h, p2/z, z0.h
-[^:]+: 04502800        movprfx z0.h, p2/z, z0.h
-[^:]+: 04503c00        movprfx z0.h, p7/z, z0.h
-[^:]+: 04503c00        movprfx z0.h, p7/z, z0.h
-[^:]+: 04502060        movprfx z0.h, p0/z, z3.h
-[^:]+: 04502060        movprfx z0.h, p0/z, z3.h
-[^:]+: 045023e0        movprfx z0.h, p0/z, z31.h
-[^:]+: 045023e0        movprfx z0.h, p0/z, z31.h
-[^:]+: 04512000        movprfx z0.h, p0/m, z0.h
-[^:]+: 04512000        movprfx z0.h, p0/m, z0.h
-[^:]+: 04512001        movprfx z1.h, p0/m, z0.h
-[^:]+: 04512001        movprfx z1.h, p0/m, z0.h
-[^:]+: 0451201f        movprfx z31.h, p0/m, z0.h
-[^:]+: 0451201f        movprfx z31.h, p0/m, z0.h
-[^:]+: 04512800        movprfx z0.h, p2/m, z0.h
-[^:]+: 04512800        movprfx z0.h, p2/m, z0.h
-[^:]+: 04513c00        movprfx z0.h, p7/m, z0.h
-[^:]+: 04513c00        movprfx z0.h, p7/m, z0.h
-[^:]+: 04512060        movprfx z0.h, p0/m, z3.h
-[^:]+: 04512060        movprfx z0.h, p0/m, z3.h
-[^:]+: 045123e0        movprfx z0.h, p0/m, z31.h
-[^:]+: 045123e0        movprfx z0.h, p0/m, z31.h
-[^:]+: 04902000        movprfx z0.s, p0/z, z0.s
-[^:]+: 04902000        movprfx z0.s, p0/z, z0.s
-[^:]+: 04902001        movprfx z1.s, p0/z, z0.s
-[^:]+: 04902001        movprfx z1.s, p0/z, z0.s
-[^:]+: 0490201f        movprfx z31.s, p0/z, z0.s
-[^:]+: 0490201f        movprfx z31.s, p0/z, z0.s
-[^:]+: 04902800        movprfx z0.s, p2/z, z0.s
-[^:]+: 04902800        movprfx z0.s, p2/z, z0.s
-[^:]+: 04903c00        movprfx z0.s, p7/z, z0.s
-[^:]+: 04903c00        movprfx z0.s, p7/z, z0.s
-[^:]+: 04902060        movprfx z0.s, p0/z, z3.s
-[^:]+: 04902060        movprfx z0.s, p0/z, z3.s
-[^:]+: 049023e0        movprfx z0.s, p0/z, z31.s
-[^:]+: 049023e0        movprfx z0.s, p0/z, z31.s
-[^:]+: 04912000        movprfx z0.s, p0/m, z0.s
-[^:]+: 04912000        movprfx z0.s, p0/m, z0.s
-[^:]+: 04912001        movprfx z1.s, p0/m, z0.s
-[^:]+: 04912001        movprfx z1.s, p0/m, z0.s
-[^:]+: 0491201f        movprfx z31.s, p0/m, z0.s
-[^:]+: 0491201f        movprfx z31.s, p0/m, z0.s
-[^:]+: 04912800        movprfx z0.s, p2/m, z0.s
-[^:]+: 04912800        movprfx z0.s, p2/m, z0.s
-[^:]+: 04913c00        movprfx z0.s, p7/m, z0.s
-[^:]+: 04913c00        movprfx z0.s, p7/m, z0.s
-[^:]+: 04912060        movprfx z0.s, p0/m, z3.s
-[^:]+: 04912060        movprfx z0.s, p0/m, z3.s
-[^:]+: 049123e0        movprfx z0.s, p0/m, z31.s
-[^:]+: 049123e0        movprfx z0.s, p0/m, z31.s
-[^:]+: 04d02000        movprfx z0.d, p0/z, z0.d
-[^:]+: 04d02000        movprfx z0.d, p0/z, z0.d
-[^:]+: 04d02001        movprfx z1.d, p0/z, z0.d
-[^:]+: 04d02001        movprfx z1.d, p0/z, z0.d
-[^:]+: 04d0201f        movprfx z31.d, p0/z, z0.d
-[^:]+: 04d0201f        movprfx z31.d, p0/z, z0.d
-[^:]+: 04d02800        movprfx z0.d, p2/z, z0.d
-[^:]+: 04d02800        movprfx z0.d, p2/z, z0.d
-[^:]+: 04d03c00        movprfx z0.d, p7/z, z0.d
-[^:]+: 04d03c00        movprfx z0.d, p7/z, z0.d
-[^:]+: 04d02060        movprfx z0.d, p0/z, z3.d
-[^:]+: 04d02060        movprfx z0.d, p0/z, z3.d
-[^:]+: 04d023e0        movprfx z0.d, p0/z, z31.d
-[^:]+: 04d023e0        movprfx z0.d, p0/z, z31.d
-[^:]+: 04d12000        movprfx z0.d, p0/m, z0.d
-[^:]+: 04d12000        movprfx z0.d, p0/m, z0.d
-[^:]+: 04d12001        movprfx z1.d, p0/m, z0.d
-[^:]+: 04d12001        movprfx z1.d, p0/m, z0.d
-[^:]+: 04d1201f        movprfx z31.d, p0/m, z0.d
-[^:]+: 04d1201f        movprfx z31.d, p0/m, z0.d
-[^:]+: 04d12800        movprfx z0.d, p2/m, z0.d
-[^:]+: 04d12800        movprfx z0.d, p2/m, z0.d
-[^:]+: 04d13c00        movprfx z0.d, p7/m, z0.d
-[^:]+: 04d13c00        movprfx z0.d, p7/m, z0.d
-[^:]+: 04d12060        movprfx z0.d, p0/m, z3.d
-[^:]+: 04d12060        movprfx z0.d, p0/m, z3.d
-[^:]+: 04d123e0        movprfx z0.d, p0/m, z31.d
-[^:]+: 04d123e0        movprfx z0.d, p0/m, z31.d
 [^:]+: 040+e000        msb     z0.b, p0/m, z0.b, z0.b
 [^:]+: 040+e000        msb     z0.b, p0/m, z0.b, z0.b
 [^:]+: 040+e001        msb     z1.b, p0/m, z0.b, z0.b
index 3dbf486f4c756f86b58531eaf460b6aefcbec18d..f3ca5e886733d00e07c963d737d50d51d6754e21 100644 (file)
        MLS       Z0.D, P0/M, Z0.D, Z4.D
        mls       z0.d, p0/m, z0.d, z31.d
        MLS       Z0.D, P0/M, Z0.D, Z31.D
-       movprfx   z0, z0
-       MOVPRFX   Z0, Z0
-       movprfx   z1, z0
-       MOVPRFX   Z1, Z0
-       movprfx   z31, z0
-       MOVPRFX   Z31, Z0
-       movprfx   z0, z2
-       MOVPRFX   Z0, Z2
-       movprfx   z0, z31
-       MOVPRFX   Z0, Z31
-       movprfx   z0.b, p0/z, z0.b
-       MOVPRFX   Z0.B, P0/Z, Z0.B
-       movprfx   z1.b, p0/z, z0.b
-       MOVPRFX   Z1.B, P0/Z, Z0.B
-       movprfx   z31.b, p0/z, z0.b
-       MOVPRFX   Z31.B, P0/Z, Z0.B
-       movprfx   z0.b, p2/z, z0.b
-       MOVPRFX   Z0.B, P2/Z, Z0.B
-       movprfx   z0.b, p7/z, z0.b
-       MOVPRFX   Z0.B, P7/Z, Z0.B
-       movprfx   z0.b, p0/z, z3.b
-       MOVPRFX   Z0.B, P0/Z, Z3.B
-       movprfx   z0.b, p0/z, z31.b
-       MOVPRFX   Z0.B, P0/Z, Z31.B
-       movprfx   z0.b, p0/m, z0.b
-       MOVPRFX   Z0.B, P0/M, Z0.B
-       movprfx   z1.b, p0/m, z0.b
-       MOVPRFX   Z1.B, P0/M, Z0.B
-       movprfx   z31.b, p0/m, z0.b
-       MOVPRFX   Z31.B, P0/M, Z0.B
-       movprfx   z0.b, p2/m, z0.b
-       MOVPRFX   Z0.B, P2/M, Z0.B
-       movprfx   z0.b, p7/m, z0.b
-       MOVPRFX   Z0.B, P7/M, Z0.B
-       movprfx   z0.b, p0/m, z3.b
-       MOVPRFX   Z0.B, P0/M, Z3.B
-       movprfx   z0.b, p0/m, z31.b
-       MOVPRFX   Z0.B, P0/M, Z31.B
-       movprfx   z0.h, p0/z, z0.h
-       MOVPRFX   Z0.H, P0/Z, Z0.H
-       movprfx   z1.h, p0/z, z0.h
-       MOVPRFX   Z1.H, P0/Z, Z0.H
-       movprfx   z31.h, p0/z, z0.h
-       MOVPRFX   Z31.H, P0/Z, Z0.H
-       movprfx   z0.h, p2/z, z0.h
-       MOVPRFX   Z0.H, P2/Z, Z0.H
-       movprfx   z0.h, p7/z, z0.h
-       MOVPRFX   Z0.H, P7/Z, Z0.H
-       movprfx   z0.h, p0/z, z3.h
-       MOVPRFX   Z0.H, P0/Z, Z3.H
-       movprfx   z0.h, p0/z, z31.h
-       MOVPRFX   Z0.H, P0/Z, Z31.H
-       movprfx   z0.h, p0/m, z0.h
-       MOVPRFX   Z0.H, P0/M, Z0.H
-       movprfx   z1.h, p0/m, z0.h
-       MOVPRFX   Z1.H, P0/M, Z0.H
-       movprfx   z31.h, p0/m, z0.h
-       MOVPRFX   Z31.H, P0/M, Z0.H
-       movprfx   z0.h, p2/m, z0.h
-       MOVPRFX   Z0.H, P2/M, Z0.H
-       movprfx   z0.h, p7/m, z0.h
-       MOVPRFX   Z0.H, P7/M, Z0.H
-       movprfx   z0.h, p0/m, z3.h
-       MOVPRFX   Z0.H, P0/M, Z3.H
-       movprfx   z0.h, p0/m, z31.h
-       MOVPRFX   Z0.H, P0/M, Z31.H
-       movprfx   z0.s, p0/z, z0.s
-       MOVPRFX   Z0.S, P0/Z, Z0.S
-       movprfx   z1.s, p0/z, z0.s
-       MOVPRFX   Z1.S, P0/Z, Z0.S
-       movprfx   z31.s, p0/z, z0.s
-       MOVPRFX   Z31.S, P0/Z, Z0.S
-       movprfx   z0.s, p2/z, z0.s
-       MOVPRFX   Z0.S, P2/Z, Z0.S
-       movprfx   z0.s, p7/z, z0.s
-       MOVPRFX   Z0.S, P7/Z, Z0.S
-       movprfx   z0.s, p0/z, z3.s
-       MOVPRFX   Z0.S, P0/Z, Z3.S
-       movprfx   z0.s, p0/z, z31.s
-       MOVPRFX   Z0.S, P0/Z, Z31.S
-       movprfx   z0.s, p0/m, z0.s
-       MOVPRFX   Z0.S, P0/M, Z0.S
-       movprfx   z1.s, p0/m, z0.s
-       MOVPRFX   Z1.S, P0/M, Z0.S
-       movprfx   z31.s, p0/m, z0.s
-       MOVPRFX   Z31.S, P0/M, Z0.S
-       movprfx   z0.s, p2/m, z0.s
-       MOVPRFX   Z0.S, P2/M, Z0.S
-       movprfx   z0.s, p7/m, z0.s
-       MOVPRFX   Z0.S, P7/M, Z0.S
-       movprfx   z0.s, p0/m, z3.s
-       MOVPRFX   Z0.S, P0/M, Z3.S
-       movprfx   z0.s, p0/m, z31.s
-       MOVPRFX   Z0.S, P0/M, Z31.S
-       movprfx   z0.d, p0/z, z0.d
-       MOVPRFX   Z0.D, P0/Z, Z0.D
-       movprfx   z1.d, p0/z, z0.d
-       MOVPRFX   Z1.D, P0/Z, Z0.D
-       movprfx   z31.d, p0/z, z0.d
-       MOVPRFX   Z31.D, P0/Z, Z0.D
-       movprfx   z0.d, p2/z, z0.d
-       MOVPRFX   Z0.D, P2/Z, Z0.D
-       movprfx   z0.d, p7/z, z0.d
-       MOVPRFX   Z0.D, P7/Z, Z0.D
-       movprfx   z0.d, p0/z, z3.d
-       MOVPRFX   Z0.D, P0/Z, Z3.D
-       movprfx   z0.d, p0/z, z31.d
-       MOVPRFX   Z0.D, P0/Z, Z31.D
-       movprfx   z0.d, p0/m, z0.d
-       MOVPRFX   Z0.D, P0/M, Z0.D
-       movprfx   z1.d, p0/m, z0.d
-       MOVPRFX   Z1.D, P0/M, Z0.D
-       movprfx   z31.d, p0/m, z0.d
-       MOVPRFX   Z31.D, P0/M, Z0.D
-       movprfx   z0.d, p2/m, z0.d
-       MOVPRFX   Z0.D, P2/M, Z0.D
-       movprfx   z0.d, p7/m, z0.d
-       MOVPRFX   Z0.D, P7/M, Z0.D
-       movprfx   z0.d, p0/m, z3.d
-       MOVPRFX   Z0.D, P0/M, Z3.D
-       movprfx   z0.d, p0/m, z31.d
-       MOVPRFX   Z0.D, P0/M, Z31.D
        msb       z0.b, p0/m, z0.b, z0.b
        MSB       Z0.B, P0/M, Z0.B, Z0.B
        msb       z1.b, p0/m, z0.b, z0.b
index 8389473e906ce73499591ea5407bbb2508d9f6a4..fb39db20d2b90521b9351ed15b492be54f3094a6 100644 (file)
@@ -11,4 +11,4 @@ Disassembly of section \.text:
 .*:    d5130503        msr     dbgdtrtx_el0, x3
 .*:    d5330503        mrs     x3, dbgdtrrx_el0
 .*:    d5330503        mrs     x3, dbgdtrrx_el0
-.*:    d5180003        msr     midr_el1, x3    ; note: writing to a read-only register\.
+.*:    d5180003        msr     midr_el1, x3  // note: writing to a read-only register
index 2600d6cd300fbb9cb6644fbeef021713dd18ffe9..36c5af2739975842d5527c1ddc2634e71d513f3e 100644 (file)
@@ -1,3 +1,12 @@
+2018-10-03  Tamar Christina  <tamar.christina@arm.com>
+
+       * aarch64-asm.c (aarch64_opcode_encode): Apply constraint verifier.
+       * aarch64-dis.c (print_operands): Refactor to take notes.
+       (print_verifier_notes): New.
+       (print_aarch64_insn): Apply constraint verifier.
+       (print_insn_aarch64_word): Update call to print_aarch64_insn.
+       * aarch64-opc.c (aarch64_print_operand): Remove attribute, update notes format.
+
 2018-10-03  Tamar Christina  <tamar.christina@arm.com>
 
        * aarch64-opc.c (init_insn_block): New.
index 35704cde1feaa61be39e4b702d689a51a1884272..b865d50d01ad8d1a5deb718289d6b3261b464f2d 100644 (file)
@@ -1949,7 +1949,7 @@ aarch64_opcode_encode (const aarch64_opcode *opcode,
                       const aarch64_inst *inst_ori, aarch64_insn *code,
                       aarch64_opnd_qualifier_t *qlf_seq,
                       aarch64_operand_error *mismatch_detail,
-                      aarch64_instr_sequence* insn_sequence ATTRIBUTE_UNUSED)
+                      aarch64_instr_sequence* insn_sequence)
 {
   int i;
   const aarch64_opcode *aliased;
@@ -2036,6 +2036,38 @@ aarch64_opcode_encode (const aarch64_opcode *opcode,
      variant.  */
   aarch64_encode_variant_using_iclass (inst);
 
+  /* Run a verifier if the instruction has one set.  */
+  if (opcode->verifier)
+    {
+      enum err_type result = opcode->verifier (inst, *code, 0, TRUE,
+                                              mismatch_detail, insn_sequence);
+      switch (result)
+       {
+       case ERR_UND:
+       case ERR_UNP:
+       case ERR_NYI:
+         return FALSE;
+       default:
+         break;
+       }
+    }
+
+  /* Always run constrain verifiers, this is needed because constrains need to
+     maintain a global state.  Regardless if the instruction has the flag set
+     or not.  */
+  enum err_type result = verify_constraints (inst, *code, 0, TRUE,
+                                            mismatch_detail, insn_sequence);
+  switch (result)
+    {
+    case ERR_UND:
+    case ERR_UNP:
+    case ERR_NYI:
+      return FALSE;
+    default:
+      break;
+    }
+
+
 encoding_exit:
   DEBUG_TRACE ("exit with %s", opcode->name);
 
index 373ddae8a126c7551388f12da356a326261b5032..c9bd4ae2616228c291923cc22da18f9721d53058 100644 (file)
@@ -45,7 +45,7 @@ static int no_aliases = 0;    /* If set disassemble as most general inst.  */
                                  output as comments.  */
 
 /* Currently active instruction sequence.  */
-static aarch64_instr_sequence insn_sequence ATTRIBUTE_UNUSED;
+static aarch64_instr_sequence insn_sequence;
 
 static void
 set_default_aarch64_dis_options (struct disassemble_info *info ATTRIBUTE_UNUSED)
@@ -2983,10 +2983,11 @@ aarch64_decode_insn (aarch64_insn insn, aarch64_inst *inst,
 
 static void
 print_operands (bfd_vma pc, const aarch64_opcode *opcode,
-               const aarch64_opnd_info *opnds, struct disassemble_info *info)
+               const aarch64_opnd_info *opnds, struct disassemble_info *info,
+               bfd_boolean *has_notes)
 {
-  int i, pcrel_p, num_printed;
   char *notes = NULL;
+  int i, pcrel_p, num_printed;
   for (i = 0, num_printed = 0; i < AARCH64_MAX_OPND_NUM; ++i)
     {
       char str[128];
@@ -3016,7 +3017,10 @@ print_operands (bfd_vma pc, const aarch64_opcode *opcode,
     }
 
     if (notes && !no_notes)
-      (*info->fprintf_func) (info->stream, "\t; note: %s", notes);
+      {
+       *has_notes = TRUE;
+       (*info->fprintf_func) (info->stream, "  // note: %s", notes);
+      }
 }
 
 /* Set NAME to a copy of INST's mnemonic with the "." suffix removed.  */
@@ -3074,15 +3078,63 @@ print_comment (const aarch64_inst *inst, struct disassemble_info *info)
     }
 }
 
+/* Build notes from verifiers into a string for printing.  */
+
+static void
+print_verifier_notes (aarch64_operand_error *detail,
+                     struct disassemble_info *info)
+{
+  if (no_notes)
+    return;
+
+  /* The output of the verifier cannot be a fatal error, otherwise the assembly
+     would not have succeeded.  We can safely ignore these.  */
+  assert (detail->non_fatal);
+  assert (detail->error);
+
+  /* If there are multiple verifier messages, concat them up to 1k.  */
+  (*info->fprintf_func) (info->stream, "  // note: %s", detail->error);
+  if (detail->index >= 0)
+     (*info->fprintf_func) (info->stream, " at operand %d", detail->index + 1);
+}
+
 /* Print the instruction according to *INST.  */
 
 static void
 print_aarch64_insn (bfd_vma pc, const aarch64_inst *inst,
-                   struct disassemble_info *info)
+                   const aarch64_insn code,
+                   struct disassemble_info *info,
+                   aarch64_operand_error *mismatch_details)
 {
+  bfd_boolean has_notes = FALSE;
+
   print_mnemonic_name (inst, info);
-  print_operands (pc, inst->opcode, inst->operands, info);
+  print_operands (pc, inst->opcode, inst->operands, info, &has_notes);
   print_comment (inst, info);
+
+  /* We've already printed a note, not enough space to print more so exit.
+     Usually notes shouldn't overlap so it shouldn't happen that we have a note
+     from a register and instruction at the same time.  */
+  if (has_notes)
+    return;
+
+  /* Always run constraint verifiers, this is needed because constraints need to
+     maintain a global state regardless of whether the instruction has the flag
+     set or not.  */
+  enum err_type result = verify_constraints (inst, code, pc, FALSE,
+                                            mismatch_details, &insn_sequence);
+  switch (result)
+    {
+    case ERR_UND:
+    case ERR_UNP:
+    case ERR_NYI:
+      assert (0);
+    case ERR_VFI:
+      print_verifier_notes (mismatch_details, info);
+      break;
+    default:
+      break;
+    }
 }
 
 /* Entry-point of the instruction disassembler and printer.  */
@@ -3139,7 +3191,7 @@ print_insn_aarch64_word (bfd_vma pc,
       break;
     case ERR_OK:
       user_friendly_fixup (&inst);
-      print_aarch64_insn (pc, &inst, info);
+      print_aarch64_insn (pc, &inst, word, info, errors);
       break;
     default:
       abort ();
index c28cac436990690b6cd94166140fc48ea3e6cf3b..3f62e2a9fc41c9dc9b0031a387bada35d7287115 100644 (file)
@@ -3052,7 +3052,7 @@ void
 aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
                       const aarch64_opcode *opcode,
                       const aarch64_opnd_info *opnds, int idx, int *pcrel_p,
-                      bfd_vma *address, char** notes ATTRIBUTE_UNUSED)
+                      bfd_vma *address, char** notes)
 {
   unsigned int i, num_conds;
   const char *name = NULL;
@@ -3600,9 +3600,9 @@ aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
                 F_REG_READ is there, that means we were looking for a write
                 register.  See aarch64_ext_sysreg.  */
              if (aarch64_sys_regs[i].flags & F_REG_WRITE)
-               *notes = _("reading from a write-only register.");
+               *notes = _("reading from a write-only register");
              else if (aarch64_sys_regs[i].flags & F_REG_READ)
-               *notes = _("writing to a read-only register.");
+               *notes = _("writing to a read-only register");
            }
        }