[PATCH] libstdc++: Implement P4012R1 while reverting P3844R2 (consteval simd broadcast)
Jonathan Wakely
jwakely@redhat.com
Tue Apr 21 13:38:29 GMT 2026
On Tue, 21 Apr 2026 at 13:34, Matthias Kretz <m.kretz@gsi.de> wrote:
>
> Jonathan Wakely [Tuesday, 21 April 2026, 11:57:27 CEST]:
> > On Mon, 20 Apr 2026 at 16:52, Matthias Kretz <MatthiasKretz@gmx.net> wrote:
> >
> >
> > > Tested on x86_64-linux-gnu (unix/-march=native and unix/-m32/-march=i686).
> > >
> > > OK for trunk?
> >
> > OK, thanks
>
> Sorry, my v2 patch for this issue got stuck in my outbox. The additional
> changes in the v2 patch are (they are needed for -ffast-math tests and even
> then it still doesn't compile because of missing 'fabs'):
Still OK for trunk then.
>
> in arithmetic.cc:
>
> @@ -259,10 +260,10 @@ struct Tests
> ADD_TEST(divide0, std::is_floating_point_v<T> && !is_iec559) {
> std::tuple{T(2), init_vec<V, 1, 2, 3, 4, 5, 6, 7>},
> [](auto& t, V x, V y) {
> - t.verify_equal_to_ulp(x / x, V(T(1)), 1);
> - t.verify_equal_to_ulp(T(3) / x, V(T(3) / T(2)), 1);
> - t.verify_equal_to_ulp(x / T(3), V(T(2) / T(3)), 1);
> - t.verify_equal_to_ulp(y / x, init_vec<V, .5, 1, 1.5, 2, 2.5, 3, 3.5>,
> 1);
> + t.verify_equal_to_ulp(x / x, V(T(1)), std::cw<1>);
> + t.verify_equal_to_ulp(T(3) / x, V(T(3) / T(2)), std::cw<1>);
> + t.verify_equal_to_ulp(x / T(3), V(T(2) / T(3)), std::cw<1>);
> + t.verify_equal_to_ulp(y / x, init_vec<V, .5, 1, 1.5, 2, 2.5, 3, 3.5>,
> std::cw<1>);
> }
> };
>
> @@ -272,18 +273,18 @@ struct Tests
> [](auto& t, V a) {
> V b = std::cw<2>;
> V ref([&](int i) { return a[i] / 2; });
> - t.verify_equal_to_ulp(a / b, ref, 1);
> + t.verify_equal_to_ulp(a / b, ref, std::cw<1>);
> a = select(a == std::cw<0>, T(1), a);
> // -freciprocal-math together with flush-to-zero makes
> // the following range restriction necessary (i.e.
> // 1/|a| must be >= min). Intel vrcpps and vrcp14ps
> // need some extra slack (use 1.1 instead of 1).
> a = select(fabs(a) >= T(1.1) / norm_min, T(1), a);
> - t.verify_equal_to_ulp(a / a, V(1), 1)("\na = ", a);
> + t.verify_equal_to_ulp(a / a, V(std::cw<1>), std::cw<1>)("\na = ", a);
> ref = V([&](int i) { return 2 / a[i]; });
> - t.verify_equal_to_ulp(b / a, ref, 1)("\na = ", a);
> - t.verify_equal_to_ulp(b /= a, ref, 1);
> - t.verify_equal_to_ulp(b, ref, 1);
> + t.verify_equal_to_ulp(b / a, ref, std::cw<1>)("\na = ", a);
> + t.verify_equal_to_ulp(b /= a, ref, std::cw<1>);
> + t.verify_equal_to_ulp(b, ref, std::cw<1>);
> }
> };
>
> --
> ──────────────────────────────────────────────────────────────────────────
> Dr. Matthias Kretz https://mattkretz.github.io
> GSI Helmholtz Center for Heavy Ion Research https://gsi.de
> std::simd
> ──────────────────────────────────────────────────────────────────────────
>
More information about the Libstdc++
mailing list