[binutils-gdb/binutils-2_35-branch] Arm: Fix IT-predicated MVE vcvt

Tamar Christina tnfchris@sourceware.org
Fri Aug 14 07:14:20 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a79ea4cd1670023d65c5c6f49fc5f92cabb796ec

commit a79ea4cd1670023d65c5c6f49fc5f92cabb796ec
Author: Joe Ramsay <joe.ramsay@.arm.com>
Date:   Fri Aug 14 08:00:03 2020 +0100

    Arm: Fix IT-predicated MVE vcvt
    
    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.
    
    gas/ChangeLog:
    
    2020-08-13  Joe Ramsay  <joe.ramsay@arm.com>
    
            Backported from master
            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.

Diff:
---
 gas/ChangeLog                             | 13 +++++++++++++
 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 ++++
 7 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index fa480141e02..183cfe58d84 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,16 @@
+2020-08-14  Joe Ramsay  <joe.ramsay@arm.com>
+
+	Backported from master
+	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.
+
 2020-08-12  Nick Clifton  <nickc@redhat.com>
 
 	* po/ru.po: Updated Russian translation.
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index a7e0ae785b7..e0d0cbd5463 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 00000000000..110f45f28a6
--- /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 00000000000..8765ae0d691
--- /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 00000000000..e4c1b999065
--- /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 00000000000..b376a9815c1
--- /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 00000000000..a9f26068128
--- /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


More information about the Binutils-cvs mailing list