gas, arm: PR25660L Fix vadd/vsub with lt and le condition codes for MVE
As explained in the PR, the addition of MVE makes the parser strip 't' and 'e' as suffixes when MVE is enabled. This leads to vadd and vsub in it blocks with lt and le conditions to be initially parsed as vaddl and vsubl. This means the operand parsing for these must allow for the same operands as the scalar vadd and vsub. I had forgotten to do this and this patch remedies that oversight. gas/ChangeLog: 2020-03-13 Andre Vieira <andre.simoesdiasvieira@arm.com> PR 25660 * config/tc-arm.c (operand_parse_code): Add OP_RNSDMQR and OP_oRNSDMQ. (parse_operands): Handle new operand codes. (do_neon_dyadic_long): Make shape check accept the scalar variants. (asm_opcode_insns): Fix operand codes for vaddl and vsubl. * testsuite/gas/arm/mve-vaddsub-it.s: New test. * testsuite/gas/arm/mve-vaddsub-it.d: New test. * testsuite/gas/arm/mve-vaddsub-it-bad.s: New test. * testsuite/gas/arm/mve-vaddsub-it-bad.l: New test. * testsuite/gas/arm/mve-vaddsub-it-bad.d: New test. * testsuite/gas/arm/nomve-vaddsub-it.d: New test.
This commit is contained in:
parent
015ec493d8
commit
66d1f7cc12
@ -1,3 +1,17 @@
|
||||
2020-03-13 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||
|
||||
PR 25660
|
||||
* config/tc-arm.c (operand_parse_code): Add OP_RNSDMQR and OP_oRNSDMQ.
|
||||
(parse_operands): Handle new operand codes.
|
||||
(do_neon_dyadic_long): Make shape check accept the scalar variants.
|
||||
(asm_opcode_insns): Fix operand codes for vaddl and vsubl.
|
||||
* testsuite/gas/arm/mve-vaddsub-it.s: New test.
|
||||
* testsuite/gas/arm/mve-vaddsub-it.d: New test.
|
||||
* testsuite/gas/arm/mve-vaddsub-it-bad.s: New test.
|
||||
* testsuite/gas/arm/mve-vaddsub-it-bad.l: New test.
|
||||
* testsuite/gas/arm/mve-vaddsub-it-bad.d: New test.
|
||||
* testsuite/gas/arm/nomve-vaddsub-it.d: New test.
|
||||
|
||||
2020-03-11 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* NEWS: Mention x86 assembler options for CVE-2020-0551.
|
||||
|
@ -7072,6 +7072,8 @@ enum operand_parse_code
|
||||
OP_RNDMQ, /* Neon double precision (0..31) or MVE vector register. */
|
||||
OP_RNDMQR, /* Neon double precision (0..31), MVE vector or ARM register.
|
||||
*/
|
||||
OP_RNSDMQR, /* Neon single or double precision, MVE vector or ARM register.
|
||||
*/
|
||||
OP_RNQ, /* Neon quad precision register */
|
||||
OP_RNQMQ, /* Neon quad or MVE vector register. */
|
||||
OP_RVSD, /* VFP single or double precision register */
|
||||
@ -7225,6 +7227,8 @@ enum operand_parse_code
|
||||
OP_oRNSDQ, /* Optional single, double or quad precision vector register */
|
||||
OP_oRNSDQMQ, /* Optional single, double or quad register or MVE vector
|
||||
register. */
|
||||
OP_oRNSDMQ, /* Optional single, double register or MVE vector
|
||||
register. */
|
||||
OP_oSHll, /* LSL immediate */
|
||||
OP_oSHar, /* ASR immediate */
|
||||
OP_oSHllar, /* LSL or ASR immediate */
|
||||
@ -7421,6 +7425,10 @@ parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
|
||||
case OP_RVS: po_reg_or_fail (REG_TYPE_VFS); break;
|
||||
case OP_RVD: po_reg_or_fail (REG_TYPE_VFD); break;
|
||||
case OP_oRND:
|
||||
case OP_RNSDMQR:
|
||||
po_reg_or_goto (REG_TYPE_VFS, try_rndmqr);
|
||||
break;
|
||||
try_rndmqr:
|
||||
case OP_RNDMQR:
|
||||
po_reg_or_goto (REG_TYPE_RN, try_rndmq);
|
||||
break;
|
||||
@ -7486,6 +7494,7 @@ parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
|
||||
case OP_RVSD_COND:
|
||||
po_reg_or_goto (REG_TYPE_VFSD, try_cond);
|
||||
break;
|
||||
case OP_oRNSDMQ:
|
||||
case OP_RNSDMQ:
|
||||
po_reg_or_goto (REG_TYPE_NSD, try_mq2);
|
||||
break;
|
||||
@ -19599,7 +19608,7 @@ neon_mixed_length (struct neon_type_el et, unsigned size)
|
||||
static void
|
||||
do_neon_dyadic_long (void)
|
||||
{
|
||||
enum neon_shape rs = neon_select_shape (NS_QDD, NS_QQQ, NS_QQR, NS_NULL);
|
||||
enum neon_shape rs = neon_select_shape (NS_QDD, NS_HHH, NS_FFF, NS_DDD, NS_NULL);
|
||||
if (rs == NS_QDD)
|
||||
{
|
||||
if (vfp_or_neon_is_neon (NEON_CHECK_ARCH | NEON_CHECK_CC) == FAIL)
|
||||
@ -26542,8 +26551,8 @@ static const struct asm_opcode insns[] =
|
||||
#define ARM_VARIANT & fpu_neon_ext_v1
|
||||
mnUF(vabd, _vabd, 3, (RNDQMQ, oRNDQMQ, RNDQMQ), neon_dyadic_if_su),
|
||||
mnUF(vabdl, _vabdl, 3, (RNQMQ, RNDMQ, RNDMQ), neon_dyadic_long),
|
||||
mnUF(vaddl, _vaddl, 3, (RNQMQ, RNDMQ, RNDMQR), neon_dyadic_long),
|
||||
mnUF(vsubl, _vsubl, 3, (RNQMQ, RNDMQ, RNDMQR), neon_dyadic_long),
|
||||
mnUF(vaddl, _vaddl, 3, (RNSDQMQ, oRNSDMQ, RNSDMQR), neon_dyadic_long),
|
||||
mnUF(vsubl, _vsubl, 3, (RNSDQMQ, oRNSDMQ, RNSDMQR), neon_dyadic_long),
|
||||
mnUF(vand, _vand, 3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
|
||||
mnUF(vbic, _vbic, 3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
|
||||
mnUF(vorr, _vorr, 3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
|
||||
|
6
gas/testsuite/gas/arm/mve-vaddsub-it-bad.d
Normal file
6
gas/testsuite/gas/arm/mve-vaddsub-it-bad.d
Normal file
@ -0,0 +1,6 @@
|
||||
#name: Bad MVE vadd/vsub instructions in IT blocks
|
||||
#as: -march=armv8.1-m.main+mve.fp
|
||||
#error_output: mve-vaddsub-it-bad.l
|
||||
|
||||
.*: +file format .*arm.*
|
||||
|
7
gas/testsuite/gas/arm/mve-vaddsub-it-bad.l
Normal file
7
gas/testsuite/gas/arm/mve-vaddsub-it-bad.l
Normal file
@ -0,0 +1,7 @@
|
||||
[^:]*: Assembler messages:
|
||||
[^:]*:4: Warning: ARMv8.2 scalar fp16 instruction cannot be conditional, the behaviour is UNPREDICTABLE
|
||||
[^:]*:5: Warning: ARMv8.2 scalar fp16 instruction cannot be conditional, the behaviour is UNPREDICTABLE
|
||||
[^:]*:7: Warning: ARMv8.2 scalar fp16 instruction cannot be conditional, the behaviour is UNPREDICTABLE
|
||||
[^:]*:8: Warning: ARMv8.2 scalar fp16 instruction cannot be conditional, the behaviour is UNPREDICTABLE
|
||||
[^:]*:10: Error: selected FPU does not support instruction -- `vaddl.s8 q0,d1,d2'
|
||||
[^:]*:11: Error: selected FPU does not support instruction -- `vsubl.s8 q0,d1,d2'
|
11
gas/testsuite/gas/arm/mve-vaddsub-it-bad.s
Normal file
11
gas/testsuite/gas/arm/mve-vaddsub-it-bad.s
Normal file
@ -0,0 +1,11 @@
|
||||
.syntax unified
|
||||
.text
|
||||
itt le
|
||||
vaddle.f16 s3, s5, s7
|
||||
vsuble.f16 s7, s4, s6
|
||||
itt lt
|
||||
vaddlt.f16 s0, s5, s7
|
||||
vsublt.f16 s7, s4, s6
|
||||
|
||||
vaddl.s8 q0, d1, d2
|
||||
vsubl.s8 q0, d1, d2
|
23
gas/testsuite/gas/arm/mve-vaddsub-it.d
Normal file
23
gas/testsuite/gas/arm/mve-vaddsub-it.d
Normal file
@ -0,0 +1,23 @@
|
||||
# name: Armv8.1-M Mainline vadd/vsub instructions in it blocks (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:
|
||||
[^>]*> bfdc itt le
|
||||
[^>]*> ee72 1aa3 vaddle.f32 s3, s5, s7
|
||||
[^>]*> ee34 7b06 vaddle.f64 d7, d4, d6
|
||||
[^>]*> bfbc itt lt
|
||||
[^>]*> ee72 1aa3 vaddlt.f32 s3, s5, s7
|
||||
[^>]*> ee34 7b06 vaddlt.f64 d7, d4, d6
|
||||
[^>]*> bfdc itt le
|
||||
[^>]*> ee72 1ae3 vsuble.f32 s3, s5, s7
|
||||
[^>]*> ee34 7b46 vsuble.f64 d7, d4, d6
|
||||
[^>]*> bfbc itt lt
|
||||
[^>]*> ee72 1ae3 vsublt.f32 s3, s5, s7
|
||||
[^>]*> ee34 7b46 vsublt.f64 d7, d4, d6
|
||||
[^>]*> bfdc itt le
|
||||
[^>]*> ee30 0a06 vaddle.f32 s0, s0, s12
|
||||
[^>]*> ee30 0b41 vsuble.f64 d0, d0, d1
|
||||
#...
|
17
gas/testsuite/gas/arm/mve-vaddsub-it.s
Normal file
17
gas/testsuite/gas/arm/mve-vaddsub-it.s
Normal file
@ -0,0 +1,17 @@
|
||||
.syntax unified
|
||||
.text
|
||||
itt le
|
||||
vaddle.f32 s3, s5, s7
|
||||
vaddle.f64 d7, d4, d6
|
||||
itt lt
|
||||
vaddlt.f32 s3, s5, s7
|
||||
vaddlt.f64 d7, d4, d6
|
||||
itt le
|
||||
vsuble.f32 s3, s5, s7
|
||||
vsuble.f64 d7, d4, d6
|
||||
itt lt
|
||||
vsublt.f32 s3, s5, s7
|
||||
vsublt.f64 d7, d4, d6
|
||||
itt le
|
||||
vaddle.f32 s0, s12
|
||||
vsuble.f64 d0, d1
|
24
gas/testsuite/gas/arm/nomve-vaddsub-it.d
Normal file
24
gas/testsuite/gas/arm/nomve-vaddsub-it.d
Normal file
@ -0,0 +1,24 @@
|
||||
# name: Armv8.1-M Mainline vadd/vsub instructions in it blocks (without MVE)
|
||||
# as: -march=armv8.1-m.main+fp.dp
|
||||
# source: mve-vaddsub-it.s
|
||||
# objdump: -dr --prefix-addresses --show-raw-insn -marmv8.1-m.main
|
||||
|
||||
.*: +file format .*arm.*
|
||||
|
||||
Disassembly of section .text:
|
||||
[^>]*> bfdc itt le
|
||||
[^>]*> ee72 1aa3 vaddle.f32 s3, s5, s7
|
||||
[^>]*> ee34 7b06 vaddle.f64 d7, d4, d6
|
||||
[^>]*> bfbc itt lt
|
||||
[^>]*> ee72 1aa3 vaddlt.f32 s3, s5, s7
|
||||
[^>]*> ee34 7b06 vaddlt.f64 d7, d4, d6
|
||||
[^>]*> bfdc itt le
|
||||
[^>]*> ee72 1ae3 vsuble.f32 s3, s5, s7
|
||||
[^>]*> ee34 7b46 vsuble.f64 d7, d4, d6
|
||||
[^>]*> bfbc itt lt
|
||||
[^>]*> ee72 1ae3 vsublt.f32 s3, s5, s7
|
||||
[^>]*> ee34 7b46 vsublt.f64 d7, d4, d6
|
||||
[^>]*> bfdc itt le
|
||||
[^>]*> ee30 0a06 vaddle.f32 s0, s0, s12
|
||||
[^>]*> ee30 0b41 vsuble.f64 d0, d0, d1
|
||||
#...
|
Loading…
Reference in New Issue
Block a user