From 3063888ecfd248ebb4a9b9c61819c9b6eb07bef2 Mon Sep 17 00:00:00 2001 From: Andre Vieira Date: Thu, 16 May 2019 11:57:44 +0100 Subject: [PATCH] [PATCH 26/57][Arm][GAS] Add support for MVE instructions: vpnot and vpsel gas/ChangeLog: 2019-05-16 Andre Vieira * config/tc-arm.c (do_mve_vpsel): New encoding function. (do_mve_vpnot): Likewise. (insns): Add entries for MVE mnemonics. * testsuite/gas/arm/mve-vpnot-bad.d: New test. * testsuite/gas/arm/mve-vpnot-bad.l: New test. * testsuite/gas/arm/mve-vpnot-bad.s: New test. * testsuite/gas/arm/mve-vpsel-bad.d: New test. * testsuite/gas/arm/mve-vpsel-bad.l: New test. * testsuite/gas/arm/mve-vpsel-bad.s: New test. --- gas/ChangeLog | 12 ++++++++++++ gas/config/tc-arm.c | 30 ++++++++++++++++++++++++++++++ gas/testsuite/gas/arm/mve-vpnot-bad.d | 5 +++++ gas/testsuite/gas/arm/mve-vpnot-bad.l | 12 ++++++++++++ gas/testsuite/gas/arm/mve-vpnot-bad.s | 18 ++++++++++++++++++ gas/testsuite/gas/arm/mve-vpsel-bad.d | 5 +++++ gas/testsuite/gas/arm/mve-vpsel-bad.l | 12 ++++++++++++ gas/testsuite/gas/arm/mve-vpsel-bad.s | 19 +++++++++++++++++++ 8 files changed, 113 insertions(+) create mode 100644 gas/testsuite/gas/arm/mve-vpnot-bad.d create mode 100644 gas/testsuite/gas/arm/mve-vpnot-bad.l create mode 100644 gas/testsuite/gas/arm/mve-vpnot-bad.s create mode 100644 gas/testsuite/gas/arm/mve-vpsel-bad.d create mode 100644 gas/testsuite/gas/arm/mve-vpsel-bad.l create mode 100644 gas/testsuite/gas/arm/mve-vpsel-bad.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 8b3f9a1..188ad3b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,17 @@ 2019-05-16 Andre Vieira + * config/tc-arm.c (do_mve_vpsel): New encoding function. + (do_mve_vpnot): Likewise. + (insns): Add entries for MVE mnemonics. + * testsuite/gas/arm/mve-vpnot-bad.d: New test. + * testsuite/gas/arm/mve-vpnot-bad.l: New test. + * testsuite/gas/arm/mve-vpnot-bad.s: New test. + * testsuite/gas/arm/mve-vpsel-bad.d: New test. + * testsuite/gas/arm/mve-vpsel-bad.l: New test. + * testsuite/gas/arm/mve-vpsel-bad.s: New test. + +2019-05-16 Andre Vieira + * config/tc-arm.c (do_neon_mvn): Change to accept MVE variants. (do_neon_sat_abs_neg): Likewise. (insns): Likewise. diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index c7ff204..c2bb52a 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -15732,6 +15732,34 @@ do_mve_vmlas (void) } static void +do_mve_vpsel (void) +{ + neon_select_shape (NS_QQQ, NS_NULL); + + if (inst.cond > COND_ALWAYS) + inst.pred_insn_type = INSIDE_VPT_INSN; + else + inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN; + + inst.instruction |= HI1 (inst.operands[0].reg) << 22; + inst.instruction |= LOW4 (inst.operands[1].reg) << 16; + inst.instruction |= LOW4 (inst.operands[0].reg) << 12; + inst.instruction |= HI1 (inst.operands[1].reg) << 7; + inst.instruction |= HI1 (inst.operands[2].reg) << 5; + inst.instruction |= LOW4 (inst.operands[2].reg); + inst.is_neon = 1; +} + +static void +do_mve_vpnot (void) +{ + if (inst.cond > COND_ALWAYS) + inst.pred_insn_type = INSIDE_VPT_INSN; + else + inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN; +} + +static void do_mve_vmaxnma_vminnma (void) { enum neon_shape rs = neon_select_shape (NS_QQ, NS_NULL); @@ -24712,6 +24740,8 @@ static const struct asm_opcode insns[] = mToC("vmlas", ee011e40, 3, (RMQ, RMQ, RR), mve_vmlas), mToC("vmulh", ee010e01, 3, (RMQ, RMQ, RMQ), mve_vmulh), mToC("vrmulh", ee011e01, 3, (RMQ, RMQ, RMQ), mve_vmulh), + mToC("vpnot", fe310f4d, 0, (), mve_vpnot), + mToC("vpsel", fe310f01, 3, (RMQ, RMQ, RMQ), mve_vpsel), #undef THUMB_VARIANT #define THUMB_VARIANT & mve_fp_ext diff --git a/gas/testsuite/gas/arm/mve-vpnot-bad.d b/gas/testsuite/gas/arm/mve-vpnot-bad.d new file mode 100644 index 0000000..6aab2c4 --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vpnot-bad.d @@ -0,0 +1,5 @@ +#name: bad MVE VPNOT instructions +#as: -march=armv8.1-m.main+mve.fp +#error_output: mve-vpnot-bad.l + +.*: +file format .*arm.* diff --git a/gas/testsuite/gas/arm/mve-vpnot-bad.l b/gas/testsuite/gas/arm/mve-vpnot-bad.l new file mode 100644 index 0000000..2ba96c6 --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vpnot-bad.l @@ -0,0 +1,12 @@ +[^:]*: Assembler messages: +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Error: syntax error -- `vpnoteq' +[^:]*:13: Error: syntax error -- `vpnoteq' +[^:]*:15: Error: syntax error -- `vpnoteq' +[^:]*:16: Error: vector predicated instruction should be in VPT/VPST block -- `vpnott' +[^:]*:18: Error: instruction missing MVE vector predication code -- `vpnot' diff --git a/gas/testsuite/gas/arm/mve-vpnot-bad.s b/gas/testsuite/gas/arm/mve-vpnot-bad.s new file mode 100644 index 0000000..3588f60 --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vpnot-bad.s @@ -0,0 +1,18 @@ +.macro cond +.irp cond, eq, ne, gt, ge, lt, le +it \cond +vpnot +.endr +.endm + +.syntax unified +.thumb +cond +it eq +vpnoteq +vpnoteq +vpst +vpnoteq +vpnott +vpst +vpnot diff --git a/gas/testsuite/gas/arm/mve-vpsel-bad.d b/gas/testsuite/gas/arm/mve-vpsel-bad.d new file mode 100644 index 0000000..b8a602a --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vpsel-bad.d @@ -0,0 +1,5 @@ +#name: bad MVE VPSEL instructions +#as: -march=armv8.1-m.main+mve.fp +#error_output: mve-vpsel-bad.l + +.*: +file format .*arm.* diff --git a/gas/testsuite/gas/arm/mve-vpsel-bad.l b/gas/testsuite/gas/arm/mve-vpsel-bad.l new file mode 100644 index 0000000..d2b2890 --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vpsel-bad.l @@ -0,0 +1,12 @@ +[^:]*: Assembler messages: +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:10: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Error: syntax error -- `vpseleq.i16 q0,q1,q2' +[^:]*:13: Error: syntax error -- `vpseleq.i16 q0,q1,q2' +[^:]*:15: Error: syntax error -- `vpseleq.i16 q0,q1,q2' +[^:]*:16: Error: vector predicated instruction should be in VPT/VPST block -- `vpselt.i16 q0,q1,q2' +[^:]*:18: Error: instruction missing MVE vector predication code -- `vpsel.i16 q0,q1,q2' diff --git a/gas/testsuite/gas/arm/mve-vpsel-bad.s b/gas/testsuite/gas/arm/mve-vpsel-bad.s new file mode 100644 index 0000000..fc14fdc --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vpsel-bad.s @@ -0,0 +1,19 @@ +.macro cond +.irp cond, eq, ne, gt, ge, lt, le +it \cond +vpsel.i16 q0, q1, q2 +.endr +.endm + +.syntax unified +.thumb +cond +it eq +vpseleq.i16 q0, q1, q2 +vpseleq.i16 q0, q1, q2 +vpst +vpseleq.i16 q0, q1, q2 +vpselt.i16 q0, q1, q2 +vpst +vpsel.i16 q0, q1, q2 + -- 2.7.4