[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