[PATCH] gas: arm: Fix IT-predicated MVE vcvt
Joe Ramsay
Joe.Ramsay@arm.com
Wed Aug 5 13:51:28 GMT 2020
Hi,
This patch fixes an incorrect parsing of vcvtne for MVE. Even when it appeared
in an IT block, vcvtne would be parsed as a VPT-predicated vcvtn, instead of an
IT-predicated vcvt. This change extends the existing handling of MVE vcvt to
properly account for IT predication.
Applies cleanly to 2.34 and 2.35 branches, regression tested on arm-none-eabi.
Is this OK for trunk and backport to 2.34 and 2.35? If so please commit on my
behalf, as I don't have write access.
Thanks,
Joe
gas/ChangeLog:
2020-08-04 Joe Ramsay <joe.ramsay@.arm.com>
* config/tc-arm.c (do_neon_cvt_1): Parse vcvtne as vcvt-ne for
NS_FD shape when MVE is present
* testsuite/gas/arm/mve-vcvtne-it-bad.d: New test.
* testsuite/gas/arm/mve-vcvtne-it-bad.l: New test.
* testsuite/gas/arm/mve-vcvtne-it-bad.s: New test.
* testsuite/gas/arm/mve-vcvtne-it.d: New test.
* testsuite/gas/arm/mve-vcvtne-it.s: New test.
---
gas/config/tc-arm.c | 18 ++++++++++--------
gas/testsuite/gas/arm/mve-vcvtne-it-bad.d | 5 +++++
gas/testsuite/gas/arm/mve-vcvtne-it-bad.l | 2 ++
gas/testsuite/gas/arm/mve-vcvtne-it-bad.s | 3 +++
gas/testsuite/gas/arm/mve-vcvtne-it.d | 9 +++++++++
gas/testsuite/gas/arm/mve-vcvtne-it.s | 4 ++++
6 files changed, 33 insertions(+), 8 deletions(-)
create mode 100644 gas/testsuite/gas/arm/mve-vcvtne-it-bad.d
create mode 100644 gas/testsuite/gas/arm/mve-vcvtne-it-bad.l
create mode 100644 gas/testsuite/gas/arm/mve-vcvtne-it-bad.s
create mode 100644 gas/testsuite/gas/arm/mve-vcvtne-it.d
create mode 100644 gas/testsuite/gas/arm/mve-vcvtne-it.s
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 00fa2c7..df9d195 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -19087,6 +19087,16 @@ do_neon_cvt_1 (enum neon_cvt_mode mode)
return;
}
+ if ((rs == NS_FD || rs == NS_QQI) && mode == neon_cvt_mode_n
+ && ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
+ {
+ /* We are dealing with vcvt with the 'ne' condition. */
+ inst.cond = 0x1;
+ inst.instruction = N_MNEM_vcvt;
+ do_neon_cvt_1 (neon_cvt_mode_z);
+ return;
+ }
+
/* VFP rather than Neon conversions. */
if (flavour >= neon_cvt_flavour_first_fp)
{
@@ -19115,14 +19125,6 @@ do_neon_cvt_1 (enum neon_cvt_mode mode)
NEON_CHECK_CC | NEON_CHECK_ARCH))
return;
}
- else if (mode == neon_cvt_mode_n)
- {
- /* We are dealing with vcvt with the 'ne' condition. */
- inst.cond = 0x1;
- inst.instruction = N_MNEM_vcvt;
- do_neon_cvt_1 (neon_cvt_mode_z);
- return;
- }
/* fall through. */
case NS_DDI:
{
diff --git a/gas/testsuite/gas/arm/mve-vcvtne-it-bad.d b/gas/testsuite/gas/arm/mve-vcvtne-it-bad.d
new file mode 100644
index 0000000..110f45f
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vcvtne-it-bad.d
@@ -0,0 +1,5 @@
+# name: MVE vcvtne instruction outside of IT block
+# as: -march=armv8.1-m.main+mve.fp+fp.dp
+# error_output: mve-vcvtne-it-bad.l
+
+.*: +file format .*arm.*
diff --git a/gas/testsuite/gas/arm/mve-vcvtne-it-bad.l b/gas/testsuite/gas/arm/mve-vcvtne-it-bad.l
new file mode 100644
index 0000000..8765ae0
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vcvtne-it-bad.l
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*:3: Error: thumb conditional instruction should be in IT block -- `vcvtne.s32.f64 s13,d8'
diff --git a/gas/testsuite/gas/arm/mve-vcvtne-it-bad.s b/gas/testsuite/gas/arm/mve-vcvtne-it-bad.s
new file mode 100644
index 0000000..e4c1b99
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vcvtne-it-bad.s
@@ -0,0 +1,3 @@
+.syntax unified
+.text
+vcvtne.s32.f64 s13, d8
diff --git a/gas/testsuite/gas/arm/mve-vcvtne-it.d b/gas/testsuite/gas/arm/mve-vcvtne-it.d
new file mode 100644
index 0000000..b376a98
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vcvtne-it.d
@@ -0,0 +1,9 @@
+# name: Armv8.1-M Mainline vcvt instruction in it block (with MVE)
+# as: -march=armv8.1-m.main+mve.fp+fp.dp
+# objdump: -dr --prefix-addresses --show-raw-insn -marmv8.1-m.main
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+^[^>]*> bf18[ ]+it[ ]+ne
+^[^>]*> eefd 6bc8[ ]+vcvtne.s32.f64[ ]+s13, d8
\ No newline at end of file
diff --git a/gas/testsuite/gas/arm/mve-vcvtne-it.s b/gas/testsuite/gas/arm/mve-vcvtne-it.s
new file mode 100644
index 0000000..a9f2606
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vcvtne-it.s
@@ -0,0 +1,4 @@
+.syntax unified
+.text
+it ne
+vcvtne.s32.f64 s13, d8
--
2.7.4
More information about the Binutils
mailing list