[PATCH][ARM][GAS]: Support to MVE VCTP instruction.

Srinath Parvathaneni Srinath.Parvathaneni@arm.com
Mon Sep 9 09:36:00 GMT 2019


Hello,

This patch adds support for MVE VCTP instruction in assembler.

For more details about the above mentioned instructions please refer to latest arm architecture reference manual [1].

[1] https://developer.arm.com/architectures/cpu-architecture/m-profile/docs/ddi0553/latest/armv81-m-architecture-reference-manual

Bootstrapped on arm-none-linux-gnueabihf and regression tested on arm-none-eabi with no regressions.

Ok for master?

Thanks,
Srinath.

gas ChangeLog:

2019-09-09  Srinath Parvathaneni  <srinath.parvathaneni@arm.com>

	* config/tc-arm.c (M_MNEM_vctp): Add new Mnemonic.
	(do_mve_vctp): Add function to encode VCTP instruction.
	* testsuite/gas/arm/mve-vctp-bad.d: New test.
	* testsuite/gas/arm/mve-vctp-bad.l: Likewise.
	* testsuite/gas/arm/mve-vctp-bad.s: Likewise.
	* testsuite/gas/arm/mve-vctp.d: Likewise.
	* testsuite/gas/arm/mve-vctp.s: Likewise.


###############     Attachment also inlined for ease of reply    ###############


diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 9273bb57836b62d066ab3efbd70c02231bcb1a97..32a15f65ec852bae54184ab29447f17ab84d8fec 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -14424,6 +14424,7 @@ do_mve_scalar_shift (void)
 #define M_MNEM_vmlsdavax  0xeef01e21
 #define M_MNEM_vmullt	0xee011e00
 #define M_MNEM_vmullb	0xee010e00
+#define M_MNEM_vctp	0xf000e801
 #define M_MNEM_vst20	0xfc801e00
 #define M_MNEM_vst21	0xfc801e20
 #define M_MNEM_vst40	0xfc801e01
@@ -15793,6 +15794,45 @@ mve_get_vcmp_vpt_cond (struct neon_type_el et)
   abort ();
 }
 
+/* For VCTP (create vector tail predicate) in MVE.  */
+static void
+do_mve_vctp (void)
+{
+  int dt = 0;
+  unsigned size = 0x0;
+
+  if (inst.cond > COND_ALWAYS)
+    inst.pred_insn_type = INSIDE_VPT_INSN;
+  else
+    inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
+
+  /* This is a typical MVE instruction which has no type but have size 8, 16,
+     32 and 64.  For instructions with no type, inst.vectype.el[j].type is set
+     to NT_untyped and size is updated in inst.vectype.el[j].size.  */
+  if ((inst.operands[0].present) && (inst.vectype.el[0].type == NT_untyped))
+    dt = inst.vectype.el[0].size;
+
+  /* Setting this does not indicate an actual NEON instruction, but only
+     indicates that the mnemonic accepts neon-style type suffixes.  */
+  inst.is_neon = 1;
+
+  switch (dt)
+    {
+      case 8:
+	break;
+      case 16:
+	size = 0x1; break;
+      case 32:
+	size = 0x2; break;
+      case 64:
+	size = 0x3; break;
+      default:
+	first_error (_("Type is not allowed for this instruction"));
+    }
+  inst.instruction |= size << 20;
+  inst.instruction |= inst.operands[0].reg << 16;
+}
+
 static void
 do_mve_vpt (void)
 {
@@ -25494,6 +25534,7 @@ static const struct asm_opcode insns[] =
 
  /* MVE and MVE FP only.  */
  mToC("vhcadd",	ee000f00,   4, (RMQ, RMQ, RMQ, EXPi),		  mve_vhcadd),
+ mCEF(vctp,	_vctp,      1, (RRnpc),				  mve_vctp),
  mCEF(vadc,	_vadc,      3, (RMQ, RMQ, RMQ),			  mve_vadc),
  mCEF(vadci,	_vadci,     3, (RMQ, RMQ, RMQ),			  mve_vadc),
  mToC("vsbc",	fe300f00,   3, (RMQ, RMQ, RMQ),			  mve_vsbc),
diff --git a/gas/testsuite/gas/arm/mve-vctp-bad.d b/gas/testsuite/gas/arm/mve-vctp-bad.d
new file mode 100644
index 0000000000000000000000000000000000000000..b85f9f2f4b7c722a6118828136a7680133c4f21a
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vctp-bad.d
@@ -0,0 +1,4 @@
+#name: Invalid MVE vctp instruction
+#source: mve-vctp-bad.s
+#as: -march=armv8.1-m.main+mve.fp -mfloat-abi=hard
+#error_output: mve-vctp-bad.l
diff --git a/gas/testsuite/gas/arm/mve-vctp-bad.l b/gas/testsuite/gas/arm/mve-vctp-bad.l
new file mode 100644
index 0000000000000000000000000000000000000000..70e99ddcc21c973a2317f6783b58ec085ff2e385
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vctp-bad.l
@@ -0,0 +1,36 @@
+[^:]*: Assembler messages:
+[^:]*:8: Error: Type is not allowed for this instruction -- `vctp.s8 r13'
+[^:]*:8: Error: Type is not allowed for this instruction -- `vctp.u16 r13'
+[^:]*:8: Error: Type is not allowed for this instruction -- `vctp.f32 r13'
+[^:]*:8: Error: r15 not allowed here -- `vctp.8 r15'
+[^:]*:8: Error: r15 not allowed here -- `vctp.16 r15'
+[^:]*:8: Error: r15 not allowed here -- `vctp.32 r15'
+[^:]*:8: Error: r15 not allowed here -- `vctp.64 r15'
+[^:]*:8: Error: r15 not allowed here -- `vctp.s8 r15'
+[^:]*:8: Error: r15 not allowed here -- `vctp.u16 r15'
+[^:]*:8: Error: r15 not allowed here -- `vctp.f32 r15'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.8 r0'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.16 r0'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.32 r0'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.64 r0'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.f32 r0'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.8 r1'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.16 r1'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.32 r1'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.64 r1'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.f32 r1'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.8 r2'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.16 r2'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.32 r2'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.64 r2'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.f32 r2'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.8 r4'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.16 r4'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.32 r4'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.64 r4'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.f32 r4'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.8 r8'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.16 r8'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.32 r8'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.64 r8'
+[^:]*:14: Error: vector predicated instruction should be in VPT/VPST block -- `vctpt.f32 r8'
diff --git a/gas/testsuite/gas/arm/mve-vctp-bad.s b/gas/testsuite/gas/arm/mve-vctp-bad.s
new file mode 100644
index 0000000000000000000000000000000000000000..217d75d3bf1a0a4a6fed66965bd5e63604a02b5b
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vctp-bad.s
@@ -0,0 +1,14 @@
+.syntax unified
+.thumb
+
+.irp op1, r13, r15
+.irp op2 8, 16, 32, 64, s8, u16, f32
+vctp.\op2 \op1
+.endr
+.endr
+
+.irp op1, r0, r1, r2, r4, r8
+.irp op2 8, 16, 32, 64, f32
+vctpt.\op2 \op1
+.endr
+.endr
diff --git a/gas/testsuite/gas/arm/mve-vctp.d b/gas/testsuite/gas/arm/mve-vctp.d
new file mode 100644
index 0000000000000000000000000000000000000000..e9ec13876ec600eb9a96a1095358db8b7a245ba4
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vctp.d
@@ -0,0 +1,67 @@
+# name: MVE vctp instructions
+# as: -march=armv8.1-m.main+mve
+# objdump: -dr --prefix-addresses --show-raw-insn -marmv8.1-m.main
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+[^>]*> f000 e801 	vctp.8	r0
+[^>]*> f010 e801 	vctp.16	r0
+[^>]*> f020 e801 	vctp.32	r0
+[^>]*> f030 e801 	vctp.64	r0
+[^>]*> f001 e801 	vctp.8	r1
+[^>]*> f011 e801 	vctp.16	r1
+[^>]*> f021 e801 	vctp.32	r1
+[^>]*> f031 e801 	vctp.64	r1
+[^>]*> f002 e801 	vctp.8	r2
+[^>]*> f012 e801 	vctp.16	r2
+[^>]*> f022 e801 	vctp.32	r2
+[^>]*> f032 e801 	vctp.64	r2
+[^>]*> f004 e801 	vctp.8	r4
+[^>]*> f014 e801 	vctp.16	r4
+[^>]*> f024 e801 	vctp.32	r4
+[^>]*> f034 e801 	vctp.64	r4
+[^>]*> f008 e801 	vctp.8	r8
+[^>]*> f018 e801 	vctp.16	r8
+[^>]*> f028 e801 	vctp.32	r8
+[^>]*> f038 e801 	vctp.64	r8
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f000 e801 	vctpt.8	r0
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f010 e801 	vctpt.16	r0
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f020 e801 	vctpt.32	r0
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f030 e801 	vctpt.64	r0
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f001 e801 	vctpt.8	r1
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f011 e801 	vctpt.16	r1
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f021 e801 	vctpt.32	r1
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f031 e801 	vctpt.64	r1
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f002 e801 	vctpt.8	r2
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f012 e801 	vctpt.16	r2
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f022 e801 	vctpt.32	r2
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f032 e801 	vctpt.64	r2
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f004 e801 	vctpt.8	r4
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f014 e801 	vctpt.16	r4
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f024 e801 	vctpt.32	r4
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f034 e801 	vctpt.64	r4
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f008 e801 	vctpt.8	r8
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f018 e801 	vctpt.16	r8
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f028 e801 	vctpt.32	r8
+[^>]*> fe71 0f4d 	vpst
+[^>]*> f038 e801 	vctpt.64	r8
diff --git a/gas/testsuite/gas/arm/mve-vctp.s b/gas/testsuite/gas/arm/mve-vctp.s
new file mode 100644
index 0000000000000000000000000000000000000000..b00ca5ad01a7e4ecbbb357ac9c5b56ee16690c02
--- /dev/null
+++ b/gas/testsuite/gas/arm/mve-vctp.s
@@ -0,0 +1,15 @@
+.syntax unified
+.thumb
+
+.irp op1, r0, r1, r2, r4, r8
+.irp op2 8, 16, 32, 64
+vctp.\op2 \op1
+.endr
+.endr
+
+.irp op1, r0, r1, r2, r4, r8
+.irp op2 8, 16, 32, 64
+vpst
+vctpt.\op2 \op1
+.endr
+.endr

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: rb11746.patch.patch
URL: <https://sourceware.org/pipermail/binutils/attachments/20190909/87170658/attachment.ksh>


More information about the Binutils mailing list