[binutils-gdb] arm: Add missing vcvt for FP16

Andre Simoes Dias Vieira avieira@sourceware.org
Fri Sep 11 11:58:37 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0855b93cfb911a4feab76a31bb1914982b3e6979

commit 0855b93cfb911a4feab76a31bb1914982b3e6979
Author: Andre Vieira <andre.simoesdiasvieira@arm.com>
Date:   Fri Sep 11 12:48:52 2026 +0100

    arm: Add missing vcvt for FP16
    
    Add missing VCVT (between floating-point and fixed-point, floating- point) for
    FP16.
    
    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.
    
    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.

Diff:
---
 gas/config/tc-arm.c                                | 34 +++++++++++++++-----
 gas/testsuite/gas/arm/armv8-2-fp16-scalar-ext.d    | 36 ++++++++++++++++++++++
 .../gas/arm/armv8-2-fp16-scalar-thumb-ext.d        | 36 ++++++++++++++++++++++
 gas/testsuite/gas/arm/armv8-2-fp16-scalar-thumb.d  | 36 ++++++++++++++++++++++
 gas/testsuite/gas/arm/armv8-2-fp16-scalar.d        | 36 ++++++++++++++++++++++
 gas/testsuite/gas/arm/armv8-2-fp16-scalar.s        | 15 +++++++++
 gas/testsuite/gas/arm/armv8.1-m.main-hp.d          | 36 ++++++++++++++++++++++
 opcodes/arm-dis.c                                  |  4 +++
 8 files changed, 226 insertions(+), 7 deletions(-)

diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index c02d3101cc1..ac351bfc8df 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 df506eb61e4..31730c7f7ba 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 665dc4cbfbd..f581bc4c7e0 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 b41893373fa..e0403acd82a 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 3111ee4bc25..4c818f8aa8d 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 fbb788607fb..096545e504d 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 41ebb842f1d..aa045eed6b8 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 ef4d3835d95..872d9f1f5ec 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-cvs mailing list