From: Joe Ramsay Date: Fri, 14 Aug 2020 07:00:03 +0000 (+0100) Subject: Arm: Fix IT-predicated MVE vcvt X-Git-Tag: binutils-2_35_1~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a79ea4cd1670023d65c5c6f49fc5f92cabb796ec;p=thirdparty%2Fbinutils-gdb.git 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 Backported from master 2020-08-04 Joe Ramsay * 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 --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 + + Backported from master + 2020-08-04 Joe Ramsay + + * 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 * 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