aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2023-03-30 11:09:16 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2023-03-30 11:09:16 +0100
commitfa64dc802c82d07b93ac7d3c072a9ccbb99c6c0f (patch)
tree4d259820ec59c6801bf3f6812ea3c7096e49451d /gas
parent6efa660124f481a5ba415cedd195764ea6ac09fd (diff)
downloadbinutils-fa64dc802c82d07b93ac7d3c072a9ccbb99c6c0f.zip
binutils-fa64dc802c82d07b93ac7d3c072a9ccbb99c6c0f.tar.gz
binutils-fa64dc802c82d07b93ac7d3c072a9ccbb99c6c0f.tar.bz2
aarch64: Add the SME2 UNPK instructions
This patch adds SUNPK and UUNPK, which unpack one register's worth of elements to two registers' worth, or two registers' worth to four registers' worth.
Diffstat (limited to 'gas')
-rw-r--r--gas/testsuite/gas/aarch64/sme2-29-invalid.d3
-rw-r--r--gas/testsuite/gas/aarch64/sme2-29-invalid.l39
-rw-r--r--gas/testsuite/gas/aarch64/sme2-29-invalid.s14
-rw-r--r--gas/testsuite/gas/aarch64/sme2-29-noarch.d3
-rw-r--r--gas/testsuite/gas/aarch64/sme2-29-noarch.l37
-rw-r--r--gas/testsuite/gas/aarch64/sme2-29.d45
-rw-r--r--gas/testsuite/gas/aarch64/sme2-29.s47
7 files changed, 188 insertions, 0 deletions
diff --git a/gas/testsuite/gas/aarch64/sme2-29-invalid.d b/gas/testsuite/gas/aarch64/sme2-29-invalid.d
new file mode 100644
index 0000000..ad85e2d
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-29-invalid.d
@@ -0,0 +1,3 @@
+#as: -march=armv8-a
+#source: sme2-29-invalid.s
+#error_output: sme2-29-invalid.l
diff --git a/gas/testsuite/gas/aarch64/sme2-29-invalid.l b/gas/testsuite/gas/aarch64/sme2-29-invalid.l
new file mode 100644
index 0000000..893866c
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-29-invalid.l
@@ -0,0 +1,39 @@
+[^ :]+: Assembler messages:
+[^ :]+:[0-9]+: Error: expected '{' at operand 1 -- `sunpk 0,z0\.b'
+[^ :]+:[0-9]+: Error: expected a register or register list at operand 2 -- `sunpk {z0\.h,z1\.h},0'
+[^ :]+:[0-9]+: Error: missing braces at operand 1 -- `sunpk z0\.b,z0\.b'
+[^ :]+:[0-9]+: Error: operand mismatch -- `sunpk {z0\.b,z1\.b},z0\.b'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: sunpk {z0\.h-z1\.h}, z0\.b
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: sunpk {z0\.s-z1\.s}, z0\.h
+[^ :]+:[0-9]+: Info: sunpk {z0\.d-z1\.d}, z0\.s
+[^ :]+:[0-9]+: Error: operand mismatch -- `sunpk {z0\.h,z1\.h},z0\.h'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: sunpk {z0\.h-z1\.h}, z0\.b
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: sunpk {z0\.s-z1\.s}, z0\.h
+[^ :]+:[0-9]+: Info: sunpk {z0\.d-z1\.d}, z0\.s
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `sunpk {z1\.h,z2\.h},z0\.b'
+[^ :]+:[0-9]+: Error: operand mismatch -- `sunpk {z0\.b,z2\.b},z0\.b'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: sunpk {z0\.h, z2\.h}, z0\.b
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: sunpk {z0\.s, z2\.s}, z0\.h
+[^ :]+:[0-9]+: Info: sunpk {z0\.d, z2\.d}, z0\.s
+[^ :]+:[0-9]+: Error: expected a list of 4 registers at operand 1 -- `sunpk {z1\.h-z3\.h},{z0\.b-z1\.b}'
+[^ :]+:[0-9]+: Error: expected a list of 4 registers at operand 1 -- `sunpk {z2\.h-z4\.h},{z0\.b-z1\.b}'
+[^ :]+:[0-9]+: Error: expected a list of 4 registers at operand 1 -- `sunpk {z3\.h-z5\.h},{z0\.b-z1\.b}'
+[^ :]+:[0-9]+: Error: operand mismatch -- `sunpk {z0\.s-z3\.s},z0\.b'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: sunpk {z0\.h-z3\.h}, z0\.b
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: sunpk {z0\.s-z3\.s}, z0\.h
+[^ :]+:[0-9]+: Info: sunpk {z0\.d-z3\.d}, z0\.s
+[^ :]+:[0-9]+: Error: expected an SVE vector register at operand 2 -- `sunpk {z0\.s-z3\.s},{x0\.s-x1\.s}'
+[^ :]+:[0-9]+: Error: operand mismatch -- `sunpk {z0\.s-z3\.s},{z0\.s-z3\.s}'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: sunpk {z0\.s-z3\.s}, {z0\.h-z3\.h}
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: sunpk {z0\.h-z3\.h}, {z0\.b-z3\.b}
+[^ :]+:[0-9]+: Info: sunpk {z0\.d-z3\.d}, {z0\.s-z3\.s}
diff --git a/gas/testsuite/gas/aarch64/sme2-29-invalid.s b/gas/testsuite/gas/aarch64/sme2-29-invalid.s
new file mode 100644
index 0000000..2282dd2
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-29-invalid.s
@@ -0,0 +1,14 @@
+ sunpk 0, z0.b
+ sunpk { z0.h, z1.h }, 0
+
+ sunpk z0.b, z0.b
+ sunpk { z0.b, z1.b }, z0.b
+ sunpk { z0.h, z1.h }, z0.h
+ sunpk { z1.h, z2.h }, z0.b
+ sunpk { z0.b, z2.b }, z0.b
+ sunpk { z1.h - z3.h }, { z0.b - z1.b }
+ sunpk { z2.h - z4.h }, { z0.b - z1.b }
+ sunpk { z3.h - z5.h }, { z0.b - z1.b }
+ sunpk { z0.s - z3.s }, z0.b
+ sunpk { z0.s - z3.s }, { x0.s - x1.s }
+ sunpk { z0.s - z3.s }, { z0.s - z3.s }
diff --git a/gas/testsuite/gas/aarch64/sme2-29-noarch.d b/gas/testsuite/gas/aarch64/sme2-29-noarch.d
new file mode 100644
index 0000000..73c02c5
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-29-noarch.d
@@ -0,0 +1,3 @@
+#as: -march=armv8-a+sme
+#source: sme2-29.s
+#error_output: sme2-29-noarch.l
diff --git a/gas/testsuite/gas/aarch64/sme2-29-noarch.l b/gas/testsuite/gas/aarch64/sme2-29-noarch.l
new file mode 100644
index 0000000..2777e16
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-29-noarch.l
@@ -0,0 +1,37 @@
+[^ :]+: Assembler messages:
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.h,z1\.h},z0\.b'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z30\.h,z31\.h},z0\.b'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.h,z1\.h},z31\.b'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.h-z3\.h},{z0\.b-z1\.b}'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z28\.h-z31\.h},{z0\.b-z1\.b}'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.h-z3\.h},{z30\.b-z31\.b}'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.s,z1\.s},z0\.h'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z30\.s,z31\.s},z0\.h'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.s,z1\.s},z31\.h'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.s-z3\.s},{z0\.h-z1\.h}'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z28\.s-z31\.s},{z0\.h-z1\.h}'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.s-z3\.s},{z30\.h-z31\.h}'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.d,z1\.d},z0\.s'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z30\.d,z31\.d},z0\.s'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.d,z1\.d},z31\.s'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.d-z3\.d},{z0\.s-z1\.s}'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z28\.d-z31\.d},{z0\.s-z1\.s}'
+[^ :]+:[0-9]+: Error: selected processor does not support `sunpk {z0\.d-z3\.d},{z30\.s-z31\.s}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.h,z1\.h},z0\.b'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z30\.h,z31\.h},z0\.b'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.h,z1\.h},z31\.b'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.h-z3\.h},{z0\.b-z1\.b}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z28\.h-z31\.h},{z0\.b-z1\.b}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.h-z3\.h},{z30\.b-z31\.b}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.s,z1\.s},z0\.h'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z30\.s,z31\.s},z0\.h'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.s,z1\.s},z31\.h'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.s-z3\.s},{z0\.h-z1\.h}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z28\.s-z31\.s},{z0\.h-z1\.h}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.s-z3\.s},{z30\.h-z31\.h}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.d,z1\.d},z0\.s'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z30\.d,z31\.d},z0\.s'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.d,z1\.d},z31\.s'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.d-z3\.d},{z0\.s-z1\.s}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z28\.d-z31\.d},{z0\.s-z1\.s}'
+[^ :]+:[0-9]+: Error: selected processor does not support `uunpk {z0\.d-z3\.d},{z30\.s-z31\.s}'
diff --git a/gas/testsuite/gas/aarch64/sme2-29.d b/gas/testsuite/gas/aarch64/sme2-29.d
new file mode 100644
index 0000000..235b055
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-29.d
@@ -0,0 +1,45 @@
+#as: -march=armv8-a+sme2
+#objdump: -dr
+
+[^:]+: file format .*
+
+
+[^:]+:
+
+[^:]+:
+[^:]+: c165e000 sunpk {z0\.h-z1\.h}, z0\.b
+[^:]+: c165e01e sunpk {z30\.h-z31\.h}, z0\.b
+[^:]+: c165e3e0 sunpk {z0\.h-z1\.h}, z31\.b
+[^:]+: c175e000 sunpk {z0\.h-z3\.h}, {z0\.b-z1\.b}
+[^:]+: c175e01c sunpk {z28\.h-z31\.h}, {z0\.b-z1\.b}
+[^:]+: c175e3c0 sunpk {z0\.h-z3\.h}, {z30\.b-z31\.b}
+[^:]+: c1a5e000 sunpk {z0\.s-z1\.s}, z0\.h
+[^:]+: c1a5e01e sunpk {z30\.s-z31\.s}, z0\.h
+[^:]+: c1a5e3e0 sunpk {z0\.s-z1\.s}, z31\.h
+[^:]+: c1b5e000 sunpk {z0\.s-z3\.s}, {z0\.h-z1\.h}
+[^:]+: c1b5e01c sunpk {z28\.s-z31\.s}, {z0\.h-z1\.h}
+[^:]+: c1b5e3c0 sunpk {z0\.s-z3\.s}, {z30\.h-z31\.h}
+[^:]+: c1e5e000 sunpk {z0\.d-z1\.d}, z0\.s
+[^:]+: c1e5e01e sunpk {z30\.d-z31\.d}, z0\.s
+[^:]+: c1e5e3e0 sunpk {z0\.d-z1\.d}, z31\.s
+[^:]+: c1f5e000 sunpk {z0\.d-z3\.d}, {z0\.s-z1\.s}
+[^:]+: c1f5e01c sunpk {z28\.d-z31\.d}, {z0\.s-z1\.s}
+[^:]+: c1f5e3c0 sunpk {z0\.d-z3\.d}, {z30\.s-z31\.s}
+[^:]+: c165e001 uunpk {z0\.h-z1\.h}, z0\.b
+[^:]+: c165e01f uunpk {z30\.h-z31\.h}, z0\.b
+[^:]+: c165e3e1 uunpk {z0\.h-z1\.h}, z31\.b
+[^:]+: c175e001 uunpk {z0\.h-z3\.h}, {z0\.b-z1\.b}
+[^:]+: c175e01d uunpk {z28\.h-z31\.h}, {z0\.b-z1\.b}
+[^:]+: c175e3c1 uunpk {z0\.h-z3\.h}, {z30\.b-z31\.b}
+[^:]+: c1a5e001 uunpk {z0\.s-z1\.s}, z0\.h
+[^:]+: c1a5e01f uunpk {z30\.s-z31\.s}, z0\.h
+[^:]+: c1a5e3e1 uunpk {z0\.s-z1\.s}, z31\.h
+[^:]+: c1b5e001 uunpk {z0\.s-z3\.s}, {z0\.h-z1\.h}
+[^:]+: c1b5e01d uunpk {z28\.s-z31\.s}, {z0\.h-z1\.h}
+[^:]+: c1b5e3c1 uunpk {z0\.s-z3\.s}, {z30\.h-z31\.h}
+[^:]+: c1e5e001 uunpk {z0\.d-z1\.d}, z0\.s
+[^:]+: c1e5e01f uunpk {z30\.d-z31\.d}, z0\.s
+[^:]+: c1e5e3e1 uunpk {z0\.d-z1\.d}, z31\.s
+[^:]+: c1f5e001 uunpk {z0\.d-z3\.d}, {z0\.s-z1\.s}
+[^:]+: c1f5e01d uunpk {z28\.d-z31\.d}, {z0\.s-z1\.s}
+[^:]+: c1f5e3c1 uunpk {z0\.d-z3\.d}, {z30\.s-z31\.s}
diff --git a/gas/testsuite/gas/aarch64/sme2-29.s b/gas/testsuite/gas/aarch64/sme2-29.s
new file mode 100644
index 0000000..1cf1a3f
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-29.s
@@ -0,0 +1,47 @@
+ sunpk { z0.h, z1.h }, z0.b
+ sunpk { z30.h, z31.h }, z0.b
+ sunpk { z0.h, z1.h }, z31.b
+
+ sunpk { z0.h - z3.h }, { z0.b - z1.b }
+ sunpk { z28.h - z31.h }, { z0.b - z1.b }
+ sunpk { z0.h - z3.h }, { z30.b - z31.b }
+
+ sunpk { z0.s, z1.s }, z0.h
+ sunpk { z30.s, z31.s }, z0.h
+ sunpk { z0.s, z1.s }, z31.h
+
+ sunpk { z0.s - z3.s }, { z0.h - z1.h }
+ sunpk { z28.s - z31.s }, { z0.h - z1.h }
+ sunpk { z0.s - z3.s }, { z30.h - z31.h }
+
+ sunpk { z0.d, z1.d }, z0.s
+ sunpk { z30.d, z31.d }, z0.s
+ sunpk { z0.d, z1.d }, z31.s
+
+ sunpk { z0.d - z3.d }, { z0.s - z1.s }
+ sunpk { z28.d - z31.d }, { z0.s - z1.s }
+ sunpk { z0.d - z3.d }, { z30.s - z31.s }
+
+ uunpk { z0.h, z1.h }, z0.b
+ uunpk { z30.h, z31.h }, z0.b
+ uunpk { z0.h, z1.h }, z31.b
+
+ uunpk { z0.h - z3.h }, { z0.b - z1.b }
+ uunpk { z28.h - z31.h }, { z0.b - z1.b }
+ uunpk { z0.h - z3.h }, { z30.b - z31.b }
+
+ uunpk { z0.s, z1.s }, z0.h
+ uunpk { z30.s, z31.s }, z0.h
+ uunpk { z0.s, z1.s }, z31.h
+
+ uunpk { z0.s - z3.s }, { z0.h - z1.h }
+ uunpk { z28.s - z31.s }, { z0.h - z1.h }
+ uunpk { z0.s - z3.s }, { z30.h - z31.h }
+
+ uunpk { z0.d, z1.d }, z0.s
+ uunpk { z30.d, z31.d }, z0.s
+ uunpk { z0.d, z1.d }, z31.s
+
+ uunpk { z0.d - z3.d }, { z0.s - z1.s }
+ uunpk { z28.d - z31.d }, { z0.s - z1.s }
+ uunpk { z0.d - z3.d }, { z30.s - z31.s }