aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-arm.c
diff options
context:
space:
mode:
authorAndre Vieira <andre.simoesdiasvieira@arm.com>2019-05-16 11:57:44 +0100
committerAndre Vieira <andre.simoesdiasvieira@arm.com>2019-05-16 16:36:34 +0100
commit3063888ecfd248ebb4a9b9c61819c9b6eb07bef2 (patch)
tree34bc07551c9099928a93e2c485ceb4caa6ac4240 /gas/config/tc-arm.c
parent1a186d296c88d5341d2939eb0eedf792b053f8a5 (diff)
downloadgdb-3063888ecfd248ebb4a9b9c61819c9b6eb07bef2.zip
gdb-3063888ecfd248ebb4a9b9c61819c9b6eb07bef2.tar.gz
gdb-3063888ecfd248ebb4a9b9c61819c9b6eb07bef2.tar.bz2
[PATCH 26/57][Arm][GAS] Add support for MVE instructions: vpnot and vpsel
gas/ChangeLog: 2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com> * 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.
Diffstat (limited to 'gas/config/tc-arm.c')
-rw-r--r--gas/config/tc-arm.c30
1 files changed, 30 insertions, 0 deletions
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