@samitouri / QOSamiQemu / commits / e167be7970

target/arm: Implement F1CVTL, F1CVTL2, F2CVTL, F2CVTL2 for AdvSIMD

Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260609192110.752384-12-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 9, 2026 at 12:20 UTC e167be7970b774bea2ca8da9872d05f1e9ea2018
4 files changed +37
target/arm/tcg/a64.decode
+3
@@ -1921,6 +1921,9 @@ URSQRTE_v 0.10 1110 101 00001 11001 0 ..... ..... @qrr_s
1921
1922 FCVTL_v 0.00 1110 0.1 00001 01111 0 ..... ..... @qrr_sd
1923
1924 +F1CVTL 0.10 1110 001 00001 01111 0 ..... ..... @qrr_h
1925 +F2CVTL 0.10 1110 011 00001 01111 0 ..... ..... @qrr_h
1926 +
1927 BF1CVTL 0.10 1110 101 00001 01111 0 ..... ..... @qrr_h
1928 BF2CVTL 0.10 1110 111 00001 01111 0 ..... ..... @qrr_h
1929
target/arm/tcg/fp8_helper.c
+29
@@ -103,6 +103,14 @@ static bfloat16 fcvt_fp8_to_b16(uint8_t x, fp8_input_fn *f8fmt,
103 return bfloat16_round_pack_canonical(&p, s);
104 }
105
106 +static float16 fcvt_fp8_to_f16(uint8_t x, fp8_input_fn *f8fmt,
107 + int scale, float_status *s)
108 +{
109 + FloatParts64 p = f8fmt(x, s);
110 + p = parts64_scalbn(&p, scale, s);
111 + return float16_round_pack_canonical(&p, s);
112 +}
113 +
114 void HELPER(advsimd_bfcvtl)(void *vd, void *vn, CPUARMState *env, uint32_t desc)
115 {
116 FP8Context ctx = fp8_src_start(env, desc, 0x3f);
@@ -123,6 +131,27 @@ void HELPER(advsimd_bfcvtl)(void *vd, void *vn, CPUARMState *env, uint32_t desc)
131 clear_tail(vd, 16, simd_maxsz(desc));
132 }
133
134 +void HELPER(advsimd_fcvtl_hb)(void *vd, void *vn,
135 + CPUARMState *env, uint32_t desc)
136 +{
137 + FP8Context ctx = fp8_src_start(env, desc, 0xf);
138 + fp8_input_fn *input_fmt = fp8_input_fmt[ctx.f8fmt];
139 + uint8_t *n = vn, scratch[16];
140 + float16 *d = vd;
141 +
142 + if (vd == vn) {
143 + n = memcpy(scratch, vn, 16);
144 + }
145 + n += ctx.high * 8;
146 +
147 + for (size_t i = 0; i < 8; ++i) {
148 + d[H2(i)] = fcvt_fp8_to_f16(n[H1(i)], input_fmt, ctx.scale, &ctx.stat);
149 + }
150 +
151 + fp8_cvt_finish(env, &ctx);
152 + clear_tail(vd, 16, simd_maxsz(desc));
153 +}
154 +
155 void HELPER(sve2_bfcvt)(void *vd, void *vn, CPUARMState *env, uint32_t desc)
156 {
157 FP8Context ctx = fp8_src_start(env, desc, 0x3f);
target/arm/tcg/helper-fp8-defs.h
+2
@@ -7,3 +7,5 @@ DEF_HELPER_FLAGS_4(advsimd_bfcvtl, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
7 DEF_HELPER_FLAGS_4(sve2_bfcvt, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
8 DEF_HELPER_FLAGS_4(sme2_bfcvt_hb, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
9 DEF_HELPER_FLAGS_4(sme2_bfcvtl_hb, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
10 +
11 +DEF_HELPER_FLAGS_4(advsimd_fcvtl_hb, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
target/arm/tcg/translate-a64.c
+3
@@ -10740,6 +10740,9 @@ static bool do_f8cvt(DisasContext *s, arg_qrr_e *a,
10740 return true;
10741 }
10742
10743 +TRANS_FEAT(F1CVTL, aa64_f8cvt, do_f8cvt, a, gen_helper_advsimd_fcvtl_hb, false)
10744 +TRANS_FEAT(F2CVTL, aa64_f8cvt, do_f8cvt, a, gen_helper_advsimd_fcvtl_hb, true)
10745 +
10746 TRANS_FEAT(BF1CVTL, aa64_f8cvt, do_f8cvt, a, gen_helper_advsimd_bfcvtl, false)
10747 TRANS_FEAT(BF2CVTL, aa64_f8cvt, do_f8cvt, a, gen_helper_advsimd_bfcvtl, true)
10748