@samitouri / QOSamiQemu / commits / f1fb6fac58

target/arm: Drop oddstatus from is_ebf and bfdotadd_ebf

This argument is no longer used. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260609192110.752384-3-richard.henderson@linaro.org Message-Id: <20260517002550.321291-10-richard.henderson@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 9, 2026 at 12:20 UTC f1fb6fac581d1d079ad96ea38ab714024d98fdf4
3 files changed +29 -39
target/arm/tcg/sme_helper.c
+3 -3
@@ -1429,9 +1429,9 @@ static void do_bfmopa_w(void *vza, void *vzn, void *vzm,
1429 uint32_t desc, uint32_t negx, bool ah_neg)
1430 {
1431 intptr_t row, col, oprsz = simd_maxsz(desc);
1432 - float_status fpst, fpst_odd;
1432 + float_status fpst;
1433
1434 - if (is_ebf(env, &fpst, &fpst_odd)) {
1434 + if (is_ebf(env, &fpst)) {
1435 for (row = 0; row < oprsz; ) {
1436 uint16_t prow = pn[H2(row >> 4)];
1437 do {
@@ -1452,7 +1452,7 @@ static void do_bfmopa_w(void *vza, void *vzn, void *vzm,
1452 uint32_t m = *(uint32_t *)(vzm + H1_4(col));
1453
1454 m = f16mop_adj_pair(m, pcol, 0);
1455 - *a = bfdotadd_ebf(*a, n, m, &fpst, &fpst_odd);
1455 + *a = bfdotadd_ebf(*a, n, m, &fpst);
1456 }
1457 col += 4;
1458 pcol >>= 4;
target/arm/tcg/vec_helper.c
+22 -28
@@ -2845,7 +2845,7 @@ DO_MMLA_B(gvec_usmmla_b, do_usmmla_b)
2845 * BFloat16 Dot Product
2846 */
2847
2848 -bool is_ebf(CPUARMState *env, float_status *statusp, float_status *oddstatusp)
2848 +bool is_ebf(CPUARMState *env, float_status *statusp)
2849 {
2850 /*
2851 * For BFDOT, BFMMLA, etc, the behaviour depends on FPCR.EBF.
@@ -2865,11 +2865,7 @@ bool is_ebf(CPUARMState *env, float_status *statusp, float_status *oddstatusp)
2865 *statusp = env->vfp.fp_status[is_a64(env) ? FPST_A64 : FPST_A32];
2866 set_default_nan_mode(true, statusp);
2867
2868 - if (ebf) {
2869 - /* EBF=1 needs to do a step with round-to-odd semantics */
2870 - *oddstatusp = *statusp;
2871 - set_float_rounding_mode(float_round_to_odd, oddstatusp);
2872 - } else {
2868 + if (!ebf) {
2869 set_flush_to_zero(true, statusp);
2870 set_flush_inputs_to_zero(true, statusp);
2871 set_float_rounding_mode(float_round_to_odd_inf, statusp);
@@ -2893,8 +2889,7 @@ float32 bfdotadd(float32 sum, uint32_t e1, uint32_t e2, float_status *fpst)
2889 return t1;
2890 }
2891
2896 -float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2,
2897 - float_status *fpst, float_status *fpst_odd)
2892 +float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2, float_status *fpst)
2893 {
2894 /* Unpack two BFloat16 into two Float32, trivially. */
2895 float32 s1r = e1 << 16;
@@ -2964,11 +2959,11 @@ void HELPER(gvec_bfdot)(void *vd, void *vn, void *vm, void *va,
2959 intptr_t i, opr_sz = simd_oprsz(desc);
2960 float32 *d = vd, *a = va;
2961 uint32_t *n = vn, *m = vm;
2967 - float_status fpst, fpst_odd;
2962 + float_status fpst;
2963
2969 - if (is_ebf(env, &fpst, &fpst_odd)) {
2964 + if (is_ebf(env, &fpst)) {
2965 for (i = 0; i < opr_sz / 4; ++i) {
2971 - d[i] = bfdotadd_ebf(a[i], n[i], m[i], &fpst, &fpst_odd);
2966 + d[i] = bfdotadd_ebf(a[i], n[i], m[i], &fpst);
2967 }
2968 } else {
2969 for (i = 0; i < opr_sz / 4; ++i) {
@@ -2987,14 +2982,14 @@ void HELPER(gvec_bfdot_idx)(void *vd, void *vn, void *vm,
2982 intptr_t eltspersegment = MIN(16 / 4, elements);
2983 float32 *d = vd, *a = va;
2984 uint32_t *n = vn, *m = vm;
2990 - float_status fpst, fpst_odd;
2985 + float_status fpst;
2986
2992 - if (is_ebf(env, &fpst, &fpst_odd)) {
2987 + if (is_ebf(env, &fpst)) {
2988 for (i = 0; i < elements; i += eltspersegment) {
2989 uint32_t m_idx = m[i + H4(index)];
2990
2991 for (j = i; j < i + eltspersegment; j++) {
2997 - d[j] = bfdotadd_ebf(a[j], n[j], m_idx, &fpst, &fpst_odd);
2992 + d[j] = bfdotadd_ebf(a[j], n[j], m_idx, &fpst);
2993 }
2994 }
2995 } else {
@@ -3021,17 +3016,16 @@ void HELPER(sme2_bfvdot_idx)(void *vd, void *vn, void *vm,
3016 uint16_t *n0 = vn;
3017 uint16_t *n1 = vn + sizeof(ARMVectorReg);
3018 uint32_t *m = vm;
3024 - float_status fpst, fpst_odd;
3019 + float_status fpst;
3020
3026 - if (is_ebf(env, &fpst, &fpst_odd)) {
3021 + if (is_ebf(env, &fpst)) {
3022 for (i = 0; i < elements; i += eltspersegment) {
3023 uint32_t m_idx = m[i + H4(idx)];
3024
3025 for (j = 0; j < eltspersegment; j++) {
3026 uint32_t nn = (n0[H2(2 * (i + j) + sel)])
3027 | (n1[H2(2 * (i + j) + sel)] << 16);
3033 - d[i + H4(j)] = bfdotadd_ebf(a[i + H4(j)], nn, m_idx,
3034 - &fpst, &fpst_odd);
3028 + d[i + H4(j)] = bfdotadd_ebf(a[i + H4(j)], nn, m_idx, &fpst);
3029 }
3030 }
3031 } else {
@@ -3054,9 +3048,9 @@ void HELPER(gvec_bfmmla)(void *vd, void *vn, void *vm, void *va,
3048 intptr_t s, opr_sz = simd_oprsz(desc);
3049 float32 *d = vd, *a = va;
3050 uint32_t *n = vn, *m = vm;
3057 - float_status fpst, fpst_odd;
3051 + float_status fpst;
3052
3059 - if (is_ebf(env, &fpst, &fpst_odd)) {
3053 + if (is_ebf(env, &fpst)) {
3054 for (s = 0; s < opr_sz / 4; s += 4) {
3055 float32 sum00, sum01, sum10, sum11;
3056
@@ -3068,20 +3062,20 @@ void HELPER(gvec_bfmmla)(void *vd, void *vn, void *vm, void *va,
3062 * i j i k j k
3063 */
3064 sum00 = a[s + H4(0 + 0)];
3071 - sum00 = bfdotadd_ebf(sum00, n[s + H4(0 + 0)], m[s + H4(0 + 0)], &fpst, &fpst_odd);
3072 - sum00 = bfdotadd_ebf(sum00, n[s + H4(0 + 1)], m[s + H4(0 + 1)], &fpst, &fpst_odd);
3065 + sum00 = bfdotadd_ebf(sum00, n[s + H4(0 + 0)], m[s + H4(0 + 0)], &fpst);
3066 + sum00 = bfdotadd_ebf(sum00, n[s + H4(0 + 1)], m[s + H4(0 + 1)], &fpst);
3067
3068 sum01 = a[s + H4(0 + 1)];
3075 - sum01 = bfdotadd_ebf(sum01, n[s + H4(0 + 0)], m[s + H4(2 + 0)], &fpst, &fpst_odd);
3076 - sum01 = bfdotadd_ebf(sum01, n[s + H4(0 + 1)], m[s + H4(2 + 1)], &fpst, &fpst_odd);
3069 + sum01 = bfdotadd_ebf(sum01, n[s + H4(0 + 0)], m[s + H4(2 + 0)], &fpst);
3070 + sum01 = bfdotadd_ebf(sum01, n[s + H4(0 + 1)], m[s + H4(2 + 1)], &fpst);
3071
3072 sum10 = a[s + H4(2 + 0)];
3079 - sum10 = bfdotadd_ebf(sum10, n[s + H4(2 + 0)], m[s + H4(0 + 0)], &fpst, &fpst_odd);
3080 - sum10 = bfdotadd_ebf(sum10, n[s + H4(2 + 1)], m[s + H4(0 + 1)], &fpst, &fpst_odd);
3073 + sum10 = bfdotadd_ebf(sum10, n[s + H4(2 + 0)], m[s + H4(0 + 0)], &fpst);
3074 + sum10 = bfdotadd_ebf(sum10, n[s + H4(2 + 1)], m[s + H4(0 + 1)], &fpst);
3075
3076 sum11 = a[s + H4(2 + 1)];
3083 - sum11 = bfdotadd_ebf(sum11, n[s + H4(2 + 0)], m[s + H4(2 + 0)], &fpst, &fpst_odd);
3084 - sum11 = bfdotadd_ebf(sum11, n[s + H4(2 + 1)], m[s + H4(2 + 1)], &fpst, &fpst_odd);
3077 + sum11 = bfdotadd_ebf(sum11, n[s + H4(2 + 0)], m[s + H4(2 + 0)], &fpst);
3078 + sum11 = bfdotadd_ebf(sum11, n[s + H4(2 + 1)], m[s + H4(2 + 1)], &fpst);
3079
3080 d[s + H4(0 + 0)] = sum00;
3081 d[s + H4(0 + 1)] = sum01;
target/arm/tcg/vec_internal.h
+4 -8
@@ -271,7 +271,6 @@ float32 bfdotadd(float32 sum, uint32_t e1, uint32_t e2, float_status *fpst);
271 * @sum: addend
272 * @e1, @e2: multiplicand vectors
273 * @fpst: floating-point status to use
274 - * @fpst_odd: floating-point status to use for round-to-odd operations
274 *
275 * BFloat16 2-way dot product of @e1 & @e2, accumulating with @sum.
276 * The @e1 and @e2 operands correspond to the 32-bit source vector
@@ -280,23 +279,20 @@ float32 bfdotadd(float32 sum, uint32_t e1, uint32_t e2, float_status *fpst);
279 * Corresponds to the ARM pseudocode function BFDotAdd, specialized
280 * for the FPCR.EBF == 1 case.
281 */
283 -float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2,
284 - float_status *fpst, float_status *fpst_odd);
282 +float32 bfdotadd_ebf(float32 sum, uint32_t e1, uint32_t e2, float_status *fpst);
283
284 /**
285 * is_ebf:
286 * @env: CPU state
287 * @statusp: pointer to floating point status to fill in
290 - * @oddstatusp: pointer to floating point status to fill in for round-to-odd
288 *
289 * Determine whether a BFDotAdd operation should use FPCR.EBF = 0
293 - * or FPCR.EBF = 1 semantics. On return, has initialized *statusp
294 - * and *oddstatusp to suitable float_status arguments to use with either
295 - * bfdotadd() or bfdotadd_ebf().
290 + * or FPCR.EBF = 1 semantics. On return, has initialized *statusp as suitable
291 + * for float_status arguments to either bfdotadd() or bfdotadd_ebf().
292 * Returns true for EBF = 1, false for EBF = 0. (The caller should use this
293 * to decide whether to call bfdotadd() or bfdotadd_ebf().)
294 */
299 -bool is_ebf(CPUARMState *env, float_status *statusp, float_status *oddstatusp);
295 +bool is_ebf(CPUARMState *env, float_status *statusp);
296
297 /*
298 * Negate as for FPCR.AH=1 -- do not negate NaNs.