[PATCH] arm: Add missing vcvt for FP16

Andre Vieira andre.simoesdiasvieira@arm.com
Fri Sep 11 08:48:01 GMT 2026


Hi,

Add missing VCVT (between floating-point and fixed-point, 
floating-point) for FP16, see 
https://support.arm.com/documentation/ddi0597/2026-03/SIMD-FP-Instructions/VCVT--between-floating-point-and-fixed-point--floating-point---Convert-between-floating-point-and-fixed-point-

This was implemented in the same way the other FP16 instructions were 
added, by mapping them to existing FPv3 Half Precision instructions.

These new instructions are guarded in the same way as the other 
Armv8.2-A and Armv8.1-m.main FP16 instructions, the flavour to encoding 
mapping in the 'BSN' field of the CVT_FLAVOUR_VAR list is only used in 
do_vfp_nsyn_cvt.  The newly mapped flavours are guarded against in that 
function, to prevent them being used with different set of operands 
other than the 'HHI' combination.

Tested on:
* arm-linux-gnueabi{,hf}
* arm-netbsdelf
* arm-none-eabi
* arm-{,wince-}pe
* arm-uclinuxddpiceabi
* arm-vxworks
* armeb-linux-gnueabihf
* armeb-none-eabi
* armv8l-linux-gnueabihf

     gas/

             * config/tc-arm.c (NEON_ENC_TAB): Add NS_HHI entry.
             (CVT_FLAVOUR_VAR): Map f16<->[us]16 flavours to legacy FP16 
instruction
             encoding.
             (do_vfp_nsyn_cvt): Check for use of NS_HHI with the 
flavours mapped in
             this patch in CVT_FLAVOUR_VAR, and check for correctness of 
immediate
             operand.
             (do_neon_cvt_1): Accept NS_HHI.

     opcodes/

             * arm-dis.c (coprocessor_opcodes): Add opcode entries for 
added VCVT
             variants.

     gas/testsuite/

             * gas/arm/armv8-2-fp16-scalar-ext.d: Check added VCVT 
variants.
             * gas/arm/armv8-2-fp16-scalar-thumb-ext.d: Likewise.
             * gas/arm/armv8-2-fp16-scalar-thumb.d: Likewise.
             * gas/arm/armv8-2-fp16-scalar.d: Likewise.
             * gas/arm/armv8-2-fp16-scalar.s: Likewise.
             * gas/arm/armv8.1-m.main-hp.d: Likewise.
-------------- next part --------------
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index c02d3101cc16d9bef50dde2485d3671af8a2ed7d..ac351bfc8df59a16e6ababc34c418d5333481b9c 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -14672,6 +14672,7 @@ NEON_ENC_TAB
 /* Used for MVE tail predicated loop instructions.  */\
   X(2, (R, R), QUAD),			\
 /* Half float shape supported so far.  */\
+  X (3, (H, H, I), HALF),		\
   X (2, (H, D), MIXED),			\
   X (2, (D, H), MIXED),			\
   X (2, (H, F), MIXED),			\
@@ -18634,10 +18635,10 @@ do_neon_shll (void)
   CVT_VAR (f32_s32, N_F32, N_S32, whole_reg,   "fsltos", "fsitos", NULL)      \
   CVT_VAR (f32_u32, N_F32, N_U32, whole_reg,   "fultos", "fuitos", NULL)      \
   /* Half-precision conversions.  */					      \
-  CVT_VAR (s16_f16, N_S16, N_F16 | N_KEY, whole_reg, NULL, NULL, NULL)	      \
-  CVT_VAR (u16_f16, N_U16, N_F16 | N_KEY, whole_reg, NULL, NULL, NULL)	      \
-  CVT_VAR (f16_s16, N_F16 | N_KEY, N_S16, whole_reg, NULL, NULL, NULL)	      \
-  CVT_VAR (f16_u16, N_F16 | N_KEY, N_U16, whole_reg, NULL, NULL, NULL)	      \
+  CVT_VAR (s16_f16, N_S16, N_F16 | N_KEY, whole_reg, "ftoshs",  NULL, NULL)   \
+  CVT_VAR (u16_f16, N_U16, N_F16 | N_KEY, whole_reg, "ftouhs", NULL, NULL)    \
+  CVT_VAR (f16_s16, N_F16 | N_KEY, N_S16, whole_reg, "fshtos", NULL, NULL)    \
+  CVT_VAR (f16_u16, N_F16 | N_KEY, N_U16, whole_reg, "fuhtos", NULL, NULL)    \
   CVT_VAR (f32_f16, N_F32, N_F16, whole_reg,   NULL,     NULL,     NULL)      \
   CVT_VAR (f16_f32, N_F16, N_F32, whole_reg,   NULL,     NULL,     NULL)      \
   /* New VCVT instructions introduced by ARMv8.2 fp16 extension.	      \
@@ -18723,7 +18724,7 @@ do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
   const char *opname = 0;
 
   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI
-      || rs == NS_FHI || rs == NS_HFI)
+      || rs == NS_FHI || rs == NS_HFI || rs == NS_HHI)
     {
       /* Conversions with immediate bitshift.  */
       const char *enc[] =
@@ -18741,6 +18742,16 @@ do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
 		      _("operands 0 and 1 must be the same register"));
 	  inst.operands[1] = inst.operands[2];
 	  memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
+	  if (rs == NS_HHI)
+	    {
+	      constraint (!(flavour == neon_cvt_flavour_f16_s16
+			    || flavour == neon_cvt_flavour_s16_f16
+			    || flavour == neon_cvt_flavour_f16_u16
+			    || flavour == neon_cvt_flavour_u16_f16),
+			 _("invalid suffix"));
+	      constraint (inst.operands[2].imm < 0 || inst.operands[2].imm > 16,
+			  _("immediate value out of range"));
+	    }
 	}
     }
   else
@@ -18753,6 +18764,11 @@ do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
 	  NULL
 #undef CVT_VAR
 	};
+	constraint ((flavour == neon_cvt_flavour_f16_s16
+		     || flavour == neon_cvt_flavour_s16_f16
+		     || flavour == neon_cvt_flavour_f16_u16
+		     || flavour == neon_cvt_flavour_u16_f16),
+		   _("invalid suffix"));
 
       if (flavour < (int) ARRAY_SIZE (enc))
 	opname = enc[flavour];
@@ -18764,8 +18780,12 @@ do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
   /* ARMv8.2 fp16 VCVT instruction.  */
   if (flavour == neon_cvt_flavour_s32_f16
       || flavour == neon_cvt_flavour_u32_f16
+      || flavour == neon_cvt_flavour_s16_f16
+      || flavour == neon_cvt_flavour_u16_f16
       || flavour == neon_cvt_flavour_f16_u32
-      || flavour == neon_cvt_flavour_f16_s32)
+      || flavour == neon_cvt_flavour_f16_s32
+      || flavour == neon_cvt_flavour_f16_s16
+      || flavour == neon_cvt_flavour_f16_u16)
     do_scalar_fp16_v82_encode ();
 }
 
@@ -18865,7 +18885,7 @@ do_vfp_nsyn_cvt_fpv8 (enum neon_cvt_flavour flavour,
 static void
 do_neon_cvt_1 (enum neon_cvt_mode mode)
 {
-  enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
+  enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_HHI, NS_DD, NS_QQ,
 					  NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ,
 					  NS_FH, NS_HF, NS_FHI, NS_HFI,
 					  NS_NULL);
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d
index df506eb61e46d2ad23c99f14ef9046a60c559b08..31730c7f7ba33ca1b1af9ac70df6025fb95f5eb8 100644
--- a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d
@@ -73,3 +73,39 @@ Disassembly of section .text:
   f0:	eef619e5 	vrintz.f16	s3, s11
   f4:	fef02ae4 	vins.f16	s5, s9
   f8:	fef02a64 	vmovx.f16	s5, s9
+  fc:	eeba0948 	vcvt.f16.s16	s0, s0, #0
+ 100:	eebb0948 	vcvt.f16.u16	s0, s0, #0
+ 104:	eebe0948 	vcvt.s16.f16	s0, s0, #0
+ 108:	eebf0948 	vcvt.u16.f16	s0, s0, #0
+ 10c:	eeba0946 	vcvt.f16.s16	s0, s0, #4
+ 110:	eebb0946 	vcvt.f16.u16	s0, s0, #4
+ 114:	eebe0946 	vcvt.s16.f16	s0, s0, #4
+ 118:	eebf0946 	vcvt.u16.f16	s0, s0, #4
+ 11c:	eeba0940 	vcvt.f16.s16	s0, s0, #16
+ 120:	eebb0940 	vcvt.f16.u16	s0, s0, #16
+ 124:	eebe0940 	vcvt.s16.f16	s0, s0, #16
+ 128:	eebf0940 	vcvt.u16.f16	s0, s0, #16
+ 12c:	eefa2948 	vcvt.f16.s16	s5, s5, #0
+ 130:	eefb2948 	vcvt.f16.u16	s5, s5, #0
+ 134:	eefe2948 	vcvt.s16.f16	s5, s5, #0
+ 138:	eeff2948 	vcvt.u16.f16	s5, s5, #0
+ 13c:	eeba3946 	vcvt.f16.s16	s6, s6, #4
+ 140:	eebb3946 	vcvt.f16.u16	s6, s6, #4
+ 144:	eebe3946 	vcvt.s16.f16	s6, s6, #4
+ 148:	eebf3946 	vcvt.u16.f16	s6, s6, #4
+ 14c:	eefa3940 	vcvt.f16.s16	s7, s7, #16
+ 150:	eefb3940 	vcvt.f16.u16	s7, s7, #16
+ 154:	eefe3940 	vcvt.s16.f16	s7, s7, #16
+ 158:	eeff3940 	vcvt.u16.f16	s7, s7, #16
+ 15c:	eefa7948 	vcvt.f16.s16	s15, s15, #0
+ 160:	eefb7948 	vcvt.f16.u16	s15, s15, #0
+ 164:	eefe7948 	vcvt.s16.f16	s15, s15, #0
+ 168:	eeff7948 	vcvt.u16.f16	s15, s15, #0
+ 16c:	eefa7946 	vcvt.f16.s16	s15, s15, #4
+ 170:	eefb7946 	vcvt.f16.u16	s15, s15, #4
+ 174:	eefe7946 	vcvt.s16.f16	s15, s15, #4
+ 178:	eeff7946 	vcvt.u16.f16	s15, s15, #4
+ 17c:	eefa7940 	vcvt.f16.s16	s15, s15, #16
+ 180:	eefb7940 	vcvt.f16.u16	s15, s15, #16
+ 184:	eefe7940 	vcvt.s16.f16	s15, s15, #16
+ 188:	eeff7940 	vcvt.u16.f16	s15, s15, #16
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d
index 665dc4cbfbded12c5bb72088da98cddb3c76f1d0..f581bc4c7e0f8b812fbc9a64cc69d64700ee507e 100644
--- a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb-ext.d
@@ -73,3 +73,39 @@ Disassembly of section .text:
   f0:	eef6 19e5 	vrintz.f16	s3, s11
   f4:	fef0 2ae4 	vins.f16	s5, s9
   f8:	fef0 2a64 	vmovx.f16	s5, s9
+  fc:	eeba 0948 	vcvt.f16.s16	s0, s0, #0
+ 100:	eebb 0948 	vcvt.f16.u16	s0, s0, #0
+ 104:	eebe 0948 	vcvt.s16.f16	s0, s0, #0
+ 108:	eebf 0948 	vcvt.u16.f16	s0, s0, #0
+ 10c:	eeba 0946 	vcvt.f16.s16	s0, s0, #4
+ 110:	eebb 0946 	vcvt.f16.u16	s0, s0, #4
+ 114:	eebe 0946 	vcvt.s16.f16	s0, s0, #4
+ 118:	eebf 0946 	vcvt.u16.f16	s0, s0, #4
+ 11c:	eeba 0940 	vcvt.f16.s16	s0, s0, #16
+ 120:	eebb 0940 	vcvt.f16.u16	s0, s0, #16
+ 124:	eebe 0940 	vcvt.s16.f16	s0, s0, #16
+ 128:	eebf 0940 	vcvt.u16.f16	s0, s0, #16
+ 12c:	eefa 2948 	vcvt.f16.s16	s5, s5, #0
+ 130:	eefb 2948 	vcvt.f16.u16	s5, s5, #0
+ 134:	eefe 2948 	vcvt.s16.f16	s5, s5, #0
+ 138:	eeff 2948 	vcvt.u16.f16	s5, s5, #0
+ 13c:	eeba 3946 	vcvt.f16.s16	s6, s6, #4
+ 140:	eebb 3946 	vcvt.f16.u16	s6, s6, #4
+ 144:	eebe 3946 	vcvt.s16.f16	s6, s6, #4
+ 148:	eebf 3946 	vcvt.u16.f16	s6, s6, #4
+ 14c:	eefa 3940 	vcvt.f16.s16	s7, s7, #16
+ 150:	eefb 3940 	vcvt.f16.u16	s7, s7, #16
+ 154:	eefe 3940 	vcvt.s16.f16	s7, s7, #16
+ 158:	eeff 3940 	vcvt.u16.f16	s7, s7, #16
+ 15c:	eefa 7948 	vcvt.f16.s16	s15, s15, #0
+ 160:	eefb 7948 	vcvt.f16.u16	s15, s15, #0
+ 164:	eefe 7948 	vcvt.s16.f16	s15, s15, #0
+ 168:	eeff 7948 	vcvt.u16.f16	s15, s15, #0
+ 16c:	eefa 7946 	vcvt.f16.s16	s15, s15, #4
+ 170:	eefb 7946 	vcvt.f16.u16	s15, s15, #4
+ 174:	eefe 7946 	vcvt.s16.f16	s15, s15, #4
+ 178:	eeff 7946 	vcvt.u16.f16	s15, s15, #4
+ 17c:	eefa 7940 	vcvt.f16.s16	s15, s15, #16
+ 180:	eefb 7940 	vcvt.f16.u16	s15, s15, #16
+ 184:	eefe 7940 	vcvt.s16.f16	s15, s15, #16
+ 188:	eeff 7940 	vcvt.u16.f16	s15, s15, #16
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb.d b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb.d
index b41893373fab86ffe130f14d0582f5128c706253..e0403acd82a7be23cd704af7f3940c86ed31c8f7 100644
--- a/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb.d
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb.d
@@ -73,3 +73,39 @@ Disassembly of section .text:
   f0:	eef6 19e5 	vrintz.f16	s3, s11
   f4:	fef0 2ae4 	vins.f16	s5, s9
   f8:	fef0 2a64 	vmovx.f16	s5, s9
+  fc:	eeba 0948 	vcvt.f16.s16	s0, s0, #0
+ 100:	eebb 0948 	vcvt.f16.u16	s0, s0, #0
+ 104:	eebe 0948 	vcvt.s16.f16	s0, s0, #0
+ 108:	eebf 0948 	vcvt.u16.f16	s0, s0, #0
+ 10c:	eeba 0946 	vcvt.f16.s16	s0, s0, #4
+ 110:	eebb 0946 	vcvt.f16.u16	s0, s0, #4
+ 114:	eebe 0946 	vcvt.s16.f16	s0, s0, #4
+ 118:	eebf 0946 	vcvt.u16.f16	s0, s0, #4
+ 11c:	eeba 0940 	vcvt.f16.s16	s0, s0, #16
+ 120:	eebb 0940 	vcvt.f16.u16	s0, s0, #16
+ 124:	eebe 0940 	vcvt.s16.f16	s0, s0, #16
+ 128:	eebf 0940 	vcvt.u16.f16	s0, s0, #16
+ 12c:	eefa 2948 	vcvt.f16.s16	s5, s5, #0
+ 130:	eefb 2948 	vcvt.f16.u16	s5, s5, #0
+ 134:	eefe 2948 	vcvt.s16.f16	s5, s5, #0
+ 138:	eeff 2948 	vcvt.u16.f16	s5, s5, #0
+ 13c:	eeba 3946 	vcvt.f16.s16	s6, s6, #4
+ 140:	eebb 3946 	vcvt.f16.u16	s6, s6, #4
+ 144:	eebe 3946 	vcvt.s16.f16	s6, s6, #4
+ 148:	eebf 3946 	vcvt.u16.f16	s6, s6, #4
+ 14c:	eefa 3940 	vcvt.f16.s16	s7, s7, #16
+ 150:	eefb 3940 	vcvt.f16.u16	s7, s7, #16
+ 154:	eefe 3940 	vcvt.s16.f16	s7, s7, #16
+ 158:	eeff 3940 	vcvt.u16.f16	s7, s7, #16
+ 15c:	eefa 7948 	vcvt.f16.s16	s15, s15, #0
+ 160:	eefb 7948 	vcvt.f16.u16	s15, s15, #0
+ 164:	eefe 7948 	vcvt.s16.f16	s15, s15, #0
+ 168:	eeff 7948 	vcvt.u16.f16	s15, s15, #0
+ 16c:	eefa 7946 	vcvt.f16.s16	s15, s15, #4
+ 170:	eefb 7946 	vcvt.f16.u16	s15, s15, #4
+ 174:	eefe 7946 	vcvt.s16.f16	s15, s15, #4
+ 178:	eeff 7946 	vcvt.u16.f16	s15, s15, #4
+ 17c:	eefa 7940 	vcvt.f16.s16	s15, s15, #16
+ 180:	eefb 7940 	vcvt.f16.u16	s15, s15, #16
+ 184:	eefe 7940 	vcvt.s16.f16	s15, s15, #16
+ 188:	eeff 7940 	vcvt.u16.f16	s15, s15, #16
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-scalar.d b/gas/testsuite/gas/arm/armv8-2-fp16-scalar.d
index 3111ee4bc25880de6a7cb0a728691220ffc15f86..4c818f8aa8d4422f80905c70a6bc81b5b94837de 100644
--- a/gas/testsuite/gas/arm/armv8-2-fp16-scalar.d
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-scalar.d
@@ -73,3 +73,39 @@ Disassembly of section .text:
   f0:	eef619e5 	vrintz.f16	s3, s11
   f4:	fef02ae4 	vins.f16	s5, s9
   f8:	fef02a64 	vmovx.f16	s5, s9
+  fc:	eeba0948 	vcvt.f16.s16	s0, s0, #0
+ 100:	eebb0948 	vcvt.f16.u16	s0, s0, #0
+ 104:	eebe0948 	vcvt.s16.f16	s0, s0, #0
+ 108:	eebf0948 	vcvt.u16.f16	s0, s0, #0
+ 10c:	eeba0946 	vcvt.f16.s16	s0, s0, #4
+ 110:	eebb0946 	vcvt.f16.u16	s0, s0, #4
+ 114:	eebe0946 	vcvt.s16.f16	s0, s0, #4
+ 118:	eebf0946 	vcvt.u16.f16	s0, s0, #4
+ 11c:	eeba0940 	vcvt.f16.s16	s0, s0, #16
+ 120:	eebb0940 	vcvt.f16.u16	s0, s0, #16
+ 124:	eebe0940 	vcvt.s16.f16	s0, s0, #16
+ 128:	eebf0940 	vcvt.u16.f16	s0, s0, #16
+ 12c:	eefa2948 	vcvt.f16.s16	s5, s5, #0
+ 130:	eefb2948 	vcvt.f16.u16	s5, s5, #0
+ 134:	eefe2948 	vcvt.s16.f16	s5, s5, #0
+ 138:	eeff2948 	vcvt.u16.f16	s5, s5, #0
+ 13c:	eeba3946 	vcvt.f16.s16	s6, s6, #4
+ 140:	eebb3946 	vcvt.f16.u16	s6, s6, #4
+ 144:	eebe3946 	vcvt.s16.f16	s6, s6, #4
+ 148:	eebf3946 	vcvt.u16.f16	s6, s6, #4
+ 14c:	eefa3940 	vcvt.f16.s16	s7, s7, #16
+ 150:	eefb3940 	vcvt.f16.u16	s7, s7, #16
+ 154:	eefe3940 	vcvt.s16.f16	s7, s7, #16
+ 158:	eeff3940 	vcvt.u16.f16	s7, s7, #16
+ 15c:	eefa7948 	vcvt.f16.s16	s15, s15, #0
+ 160:	eefb7948 	vcvt.f16.u16	s15, s15, #0
+ 164:	eefe7948 	vcvt.s16.f16	s15, s15, #0
+ 168:	eeff7948 	vcvt.u16.f16	s15, s15, #0
+ 16c:	eefa7946 	vcvt.f16.s16	s15, s15, #4
+ 170:	eefb7946 	vcvt.f16.u16	s15, s15, #4
+ 174:	eefe7946 	vcvt.s16.f16	s15, s15, #4
+ 178:	eeff7946 	vcvt.u16.f16	s15, s15, #4
+ 17c:	eefa7940 	vcvt.f16.s16	s15, s15, #16
+ 180:	eefb7940 	vcvt.f16.u16	s15, s15, #16
+ 184:	eefe7940 	vcvt.s16.f16	s15, s15, #16
+ 188:	eeff7940 	vcvt.u16.f16	s15, s15, #16
diff --git a/gas/testsuite/gas/arm/armv8-2-fp16-scalar.s b/gas/testsuite/gas/arm/armv8-2-fp16-scalar.s
index fbb788607fb29ffc907ccfe44d95072f851cffe1..096545e504d7b4e11ddc8bc349c53eb56dc0f16b 100644
--- a/gas/testsuite/gas/arm/armv8-2-fp16-scalar.s
+++ b/gas/testsuite/gas/arm/armv8-2-fp16-scalar.s
@@ -58,6 +58,12 @@
 	.endr
 	.endm
 
+	.macro f16_ssi_cvt_imm16 reg0, reg1, imm
+	.irp op, vcvt.f16.s16, vcvt.f16.u16, vcvt.s16.f16, vcvt.u16.f16
+		\op s\reg0, s\reg1, \imm
+	.endr
+	.endm
+
 	.text
 
 	vmov.f16 s0, r1
@@ -84,3 +90,12 @@
 	f16_ss_cvt_amnpr 5, 10
 	f16_ss_vrint 3, 11
 	f16_ss_mov 5, 9
+	f16_ssi_cvt_imm16 0, 0, #0
+	f16_ssi_cvt_imm16 0, 0, #4
+	f16_ssi_cvt_imm16 0, 0, #16
+	f16_ssi_cvt_imm16 5, 5, #0
+	f16_ssi_cvt_imm16 6, 6, #4
+	f16_ssi_cvt_imm16 7, 7, #16
+	f16_ssi_cvt_imm16 15, 15, #0
+	f16_ssi_cvt_imm16 15, 15, #4
+	f16_ssi_cvt_imm16 15, 15, #16
diff --git a/gas/testsuite/gas/arm/armv8.1-m.main-hp.d b/gas/testsuite/gas/arm/armv8.1-m.main-hp.d
index 41ebb842f1d1f1266b27bb2d8e85b35adf9672fa..aa045eed6b84a24ddd62b7729e4867919b4ddde4 100644
--- a/gas/testsuite/gas/arm/armv8.1-m.main-hp.d
+++ b/gas/testsuite/gas/arm/armv8.1-m.main-hp.d
@@ -73,3 +73,39 @@ Disassembly of section .text:
   f0:	eef6 19e5 	vrintz.f16	s3, s11
   f4:	fef0 2ae4 	vins.f16	s5, s9
   f8:	fef0 2a64 	vmovx.f16	s5, s9
+  fc:	eeba 0948 	vcvt.f16.s16	s0, s0, #0
+ 100:	eebb 0948 	vcvt.f16.u16	s0, s0, #0
+ 104:	eebe 0948 	vcvt.s16.f16	s0, s0, #0
+ 108:	eebf 0948 	vcvt.u16.f16	s0, s0, #0
+ 10c:	eeba 0946 	vcvt.f16.s16	s0, s0, #4
+ 110:	eebb 0946 	vcvt.f16.u16	s0, s0, #4
+ 114:	eebe 0946 	vcvt.s16.f16	s0, s0, #4
+ 118:	eebf 0946 	vcvt.u16.f16	s0, s0, #4
+ 11c:	eeba 0940 	vcvt.f16.s16	s0, s0, #16
+ 120:	eebb 0940 	vcvt.f16.u16	s0, s0, #16
+ 124:	eebe 0940 	vcvt.s16.f16	s0, s0, #16
+ 128:	eebf 0940 	vcvt.u16.f16	s0, s0, #16
+ 12c:	eefa 2948 	vcvt.f16.s16	s5, s5, #0
+ 130:	eefb 2948 	vcvt.f16.u16	s5, s5, #0
+ 134:	eefe 2948 	vcvt.s16.f16	s5, s5, #0
+ 138:	eeff 2948 	vcvt.u16.f16	s5, s5, #0
+ 13c:	eeba 3946 	vcvt.f16.s16	s6, s6, #4
+ 140:	eebb 3946 	vcvt.f16.u16	s6, s6, #4
+ 144:	eebe 3946 	vcvt.s16.f16	s6, s6, #4
+ 148:	eebf 3946 	vcvt.u16.f16	s6, s6, #4
+ 14c:	eefa 3940 	vcvt.f16.s16	s7, s7, #16
+ 150:	eefb 3940 	vcvt.f16.u16	s7, s7, #16
+ 154:	eefe 3940 	vcvt.s16.f16	s7, s7, #16
+ 158:	eeff 3940 	vcvt.u16.f16	s7, s7, #16
+ 15c:	eefa 7948 	vcvt.f16.s16	s15, s15, #0
+ 160:	eefb 7948 	vcvt.f16.u16	s15, s15, #0
+ 164:	eefe 7948 	vcvt.s16.f16	s15, s15, #0
+ 168:	eeff 7948 	vcvt.u16.f16	s15, s15, #0
+ 16c:	eefa 7946 	vcvt.f16.s16	s15, s15, #4
+ 170:	eefb 7946 	vcvt.f16.u16	s15, s15, #4
+ 174:	eefe 7946 	vcvt.s16.f16	s15, s15, #4
+ 178:	eeff 7946 	vcvt.u16.f16	s15, s15, #4
+ 17c:	eefa 7940 	vcvt.f16.s16	s15, s15, #16
+ 180:	eefb 7940 	vcvt.f16.u16	s15, s15, #16
+ 184:	eefe 7940 	vcvt.s16.f16	s15, s15, #16
+ 188:	eeff 7940 	vcvt.u16.f16	s15, s15, #16
diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c
index ef4d3835d95e5b2be29b92951a63dff2fb6c075b..872d9f1f5ec831da8bd351bbe0944fb9dc2869d8 100644
--- a/opcodes/arm-dis.c
+++ b/opcodes/arm-dis.c
@@ -885,6 +885,8 @@ static const struct sopcode32 coprocessor_opcodes[] =
     0x0eb40a40, 0x0fbf0f50, "vcmp%7'e%c.f32\t%y1, %y0"},
   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
     0x0eb40b40, 0x0fbf0f50, "vcmp%7'e%c.f64\t%z1, %z0"},
+  {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+    0x0eba0940, 0x0fbe0f50, "vcvt%c.f16.%16?us%7?31%7?26\t%y1, %y1, %{I:#%5,0-3k%}"},
   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
     0x0eba0a40, 0x0fbe0f50, "vcvt%c.f32.%16?us%7?31%7?26\t%y1, %y1, %{I:#%5,0-3k%}"},
   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),
@@ -893,6 +895,8 @@ static const struct sopcode32 coprocessor_opcodes[] =
     0x0ebc0a40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f32\t%y1, %y0"},
   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V1),
     0x0ebc0b40, 0x0fbe0f50, "vcvt%7`r%c.%16?su32.f64\t%y1, %z0"},
+  {ANY, ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST | ARM_EXT2_V8_2A),
+    0x0ebe0940, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f16\t%y1, %y1, %{I:#%5,0-3k%}"},
   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD),
     0x0ebe0a40, 0x0fbe0f50, "vcvt%c.%16?us%7?31%7?26.f32\t%y1, %y1, %{I:#%5,0-3k%}"},
   {ANY, ARM_FEATURE_COPROC (FPU_VFP_EXT_V3),


More information about the Binutils mailing list