Am 09.01.2026 um 12:08 schrieb Markus Muetzel:
Am 09.01.2026 um 11:07 schrieb LIU Hao:
在 2026-1-9 15:48, Markus Muetzel 写道:
+#if !defined(_USE_MATH_DEFINES)
+#define _USE_MATH_DEFINES
+#endif
+
+#include <math.h>
Does it make sense to just `#define _USE_MATH_DEFINES` without the
`#if`? There's such a define in xaudio2.h but I think no other code
in the CRT defines that.
My thinking was that, if at some point in the future
`_USE_MATH_DEFINES` was defined in `AM_CPPFLAGS` or a user manually
added that flag (e.g., as a parameter to the `configure` script), that
would cause a compilation error that could be avoided by guarding the
definition like that.
But that point is mute in the updated patch (see below).
+float __cdecl acospif(float x)
+{
+ return acosf(x)/M_PI;
+}
Becasuse `M_PI` is a `double`, this intermediate result is calculated as
return (float) ((double) acosf(x) / M_PI);
When looking into this, I realize that the `long double` variants are
probably not correct either. Despite having 21 significant figures,
`(long double)(double) M_PI` might not yield the same value as
`3.14159265358979323846L`. (When suffixed with `L`, this is accurate
as a `long double`.) So maybe local definitions of PI are inevitable..?
Good point.
Instead of defining the value of pi in the appropriate type
repeatedly, I opted for doing that in a header that can be included in
all new compilation units. (That could be simplified if _Generic
macros from C11 were allowed.)
Does that look good to you?
Markus
Oops. Forgot to attach the patch.
From 982a57af44bf03c9da74be5b277f11d9546dc0ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Markus=20M=C3=BCtzel?= <[email protected]>
Date: Thu, 8 Jan 2026 15:28:02 +0100
Subject: [PATCH] crt: Implement trigonometric functions on half-revolutions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
C23 added trigonometric math functions that act on half-revolutions.
Implement them in C.
Reduce the input argument of `sinpi?` and `tanpi?` to the interval [-1, +1]
before passing the actual calculation on to `sin?` or `tan?`, respectively.
Reduce the input argument of `cospi?` to the interval [-2, 2] before passing
the calculation on to `cos?`.
For `acospi?`, `asinpi?`, `atanpi?`, and `atan2pi?`, pass the actual
calculation on to `acos?`, `asin?`, `atan?`, or `atan2?`, respectively,
without any domain reduction.
Signed-off-by: Markus Mützel <[email protected]>
---
mingw-w64-crt/Makefile.am | 12 +++++++++--
mingw-w64-crt/math/acospi.c | 14 +++++++++++++
mingw-w64-crt/math/acospif.c | 14 +++++++++++++
mingw-w64-crt/math/acospil.c | 14 +++++++++++++
mingw-w64-crt/math/asinpi.c | 14 +++++++++++++
mingw-w64-crt/math/asinpif.c | 14 +++++++++++++
mingw-w64-crt/math/asinpil.c | 14 +++++++++++++
mingw-w64-crt/math/atan2pi.c | 14 +++++++++++++
mingw-w64-crt/math/atan2pif.c | 14 +++++++++++++
mingw-w64-crt/math/atan2pil.c | 14 +++++++++++++
mingw-w64-crt/math/atanpi.c | 14 +++++++++++++
mingw-w64-crt/math/atanpif.c | 14 +++++++++++++
mingw-w64-crt/math/atanpil.c | 14 +++++++++++++
mingw-w64-crt/math/cospi.c | 15 ++++++++++++++
mingw-w64-crt/math/cospif.c | 15 ++++++++++++++
mingw-w64-crt/math/cospil.c | 15 ++++++++++++++
mingw-w64-crt/math/pi_const.h | 17 ++++++++++++++++
mingw-w64-crt/math/sinpi.c | 15 ++++++++++++++
mingw-w64-crt/math/sinpif.c | 15 ++++++++++++++
mingw-w64-crt/math/sinpil.c | 15 ++++++++++++++
mingw-w64-crt/math/tanpi.c | 15 ++++++++++++++
mingw-w64-crt/math/tanpif.c | 15 ++++++++++++++
mingw-w64-crt/math/tanpil.c | 15 ++++++++++++++
mingw-w64-headers/crt/math.h | 38 +++++++++++++++++++++++++++++++++++
24 files changed, 368 insertions(+), 2 deletions(-)
create mode 100644 mingw-w64-crt/math/acospi.c
create mode 100644 mingw-w64-crt/math/acospif.c
create mode 100644 mingw-w64-crt/math/acospil.c
create mode 100644 mingw-w64-crt/math/asinpi.c
create mode 100644 mingw-w64-crt/math/asinpif.c
create mode 100644 mingw-w64-crt/math/asinpil.c
create mode 100644 mingw-w64-crt/math/atan2pi.c
create mode 100644 mingw-w64-crt/math/atan2pif.c
create mode 100644 mingw-w64-crt/math/atan2pil.c
create mode 100644 mingw-w64-crt/math/atanpi.c
create mode 100644 mingw-w64-crt/math/atanpif.c
create mode 100644 mingw-w64-crt/math/atanpil.c
create mode 100644 mingw-w64-crt/math/cospi.c
create mode 100644 mingw-w64-crt/math/cospif.c
create mode 100644 mingw-w64-crt/math/cospil.c
create mode 100644 mingw-w64-crt/math/pi_const.h
create mode 100644 mingw-w64-crt/math/sinpi.c
create mode 100644 mingw-w64-crt/math/sinpif.c
create mode 100644 mingw-w64-crt/math/sinpil.c
create mode 100644 mingw-w64-crt/math/tanpi.c
create mode 100644 mingw-w64-crt/math/tanpif.c
create mode 100644 mingw-w64-crt/math/tanpil.c
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index ff032f953..164b1345a 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -1214,7 +1214,12 @@ src_libmingwex=\
gdtoa/misc.c gdtoa/qnan.c gdtoa/smisc.c gdtoa/strtodg.c
gdtoa/strtodnrp.c gdtoa/strtof.c \
gdtoa/strtopx.c gdtoa/sum.c gdtoa/ulp.c \
\
+ math/acospi.c math/acospif.c math/acospil.c \
+ math/asinpi.c math/asinpif.c math/asinpil.c \
+ math/atan2pi.c math/atan2pif.c math/atan2pil.c \
+ math/atanpi.c math/atanpif.c math/atanpil.c \
math/coshl.c \
+ math/cospi.c math/cospif.c math/cospil.c \
math/fabsl.c math/fp_consts.c math/fp_constsf.c \
math/fp_constsl.c math/fpclassify.c math/fpclassifyf.c
math/fpclassifyl.c math/frexpf.c math/frexpl.c \
math/hypotf.c math/hypotl.c math/isnan.c math/isnanf.c
math/isnanl.c \
@@ -1223,9 +1228,12 @@ src_libmingwex=\
math/powi.c math/powif.c math/powil.c \
math/signbit.c math/signbitf.c math/signbitl.c \
math/signgam.c \
- math/sinhl.c math/sqrtl.c math/tanhl.c \
+ math/sinhl.c \
+ math/sinpi.c math/sinpif.c math/sinpil.c \
+ math/sqrtl.c math/tanhl.c \
+ math/tanpi.c math/tanpif.c math/tanpil.c \
math/powi.def.h math/sqrt.def.h \
- math/cephes_mconf.h math/fp_consts.h \
+ math/cephes_mconf.h math/fp_consts.h math/pi_const.h \
\
misc/_assert.c \
misc/mingw_longjmp.S \
diff --git a/mingw-w64-crt/math/acospi.c b/mingw-w64-crt/math/acospi.c
new file mode 100644
index 000000000..b68ee2234
--- /dev/null
+++ b/mingw-w64-crt/math/acospi.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+double __cdecl acospi(double x)
+{
+ return acos(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/acospif.c b/mingw-w64-crt/math/acospif.c
new file mode 100644
index 000000000..f08724d66
--- /dev/null
+++ b/mingw-w64-crt/math/acospif.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+float __cdecl acospif(float x)
+{
+ return acosf(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/acospil.c b/mingw-w64-crt/math/acospil.c
new file mode 100644
index 000000000..a13ee024c
--- /dev/null
+++ b/mingw-w64-crt/math/acospil.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+long double __cdecl acospil(long double x)
+{
+ return acosl(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/asinpi.c b/mingw-w64-crt/math/asinpi.c
new file mode 100644
index 000000000..747f63353
--- /dev/null
+++ b/mingw-w64-crt/math/asinpi.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+double __cdecl asinpi(double x)
+{
+ return asin(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/asinpif.c b/mingw-w64-crt/math/asinpif.c
new file mode 100644
index 000000000..d3b4fe119
--- /dev/null
+++ b/mingw-w64-crt/math/asinpif.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+float __cdecl asinpif(float x)
+{
+ return asinf(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/asinpil.c b/mingw-w64-crt/math/asinpil.c
new file mode 100644
index 000000000..718f5d21a
--- /dev/null
+++ b/mingw-w64-crt/math/asinpil.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+long double __cdecl asinpil(long double x)
+{
+ return asinl(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/atan2pi.c b/mingw-w64-crt/math/atan2pi.c
new file mode 100644
index 000000000..34c12c635
--- /dev/null
+++ b/mingw-w64-crt/math/atan2pi.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+double __cdecl atan2pi(double x, double y)
+{
+ return atan2(x, y) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/atan2pif.c b/mingw-w64-crt/math/atan2pif.c
new file mode 100644
index 000000000..6e2e46516
--- /dev/null
+++ b/mingw-w64-crt/math/atan2pif.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+float __cdecl atan2pif(float x, float y)
+{
+ return atan2f(x, y) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/atan2pil.c b/mingw-w64-crt/math/atan2pil.c
new file mode 100644
index 000000000..aba2105bc
--- /dev/null
+++ b/mingw-w64-crt/math/atan2pil.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+long double __cdecl atan2pil(long double x, long double y)
+{
+ return atan2l(x, y) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/atanpi.c b/mingw-w64-crt/math/atanpi.c
new file mode 100644
index 000000000..ae68e1ffb
--- /dev/null
+++ b/mingw-w64-crt/math/atanpi.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+double __cdecl atanpi(double x)
+{
+ return atan(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/atanpif.c b/mingw-w64-crt/math/atanpif.c
new file mode 100644
index 000000000..af9e3b646
--- /dev/null
+++ b/mingw-w64-crt/math/atanpif.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+float __cdecl atanpif(float x)
+{
+ return atanf(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/atanpil.c b/mingw-w64-crt/math/atanpil.c
new file mode 100644
index 000000000..830df9bba
--- /dev/null
+++ b/mingw-w64-crt/math/atanpil.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+long double __cdecl atanpil(long double x)
+{
+ return atanl(x) / __pi_type(x);
+}
diff --git a/mingw-w64-crt/math/cospi.c b/mingw-w64-crt/math/cospi.c
new file mode 100644
index 000000000..e8b86f5c9
--- /dev/null
+++ b/mingw-w64-crt/math/cospi.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+double __cdecl cospi(double x)
+{
+ x = fmod(x, 2.0);
+ return cos(x * __pi_type(x));
+}
diff --git a/mingw-w64-crt/math/cospif.c b/mingw-w64-crt/math/cospif.c
new file mode 100644
index 000000000..b1c8212a1
--- /dev/null
+++ b/mingw-w64-crt/math/cospif.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+float __cdecl cospif(float x)
+{
+ x = fmodf(x, 2.0F);
+ return cosf(x * __pi_type(x));
+}
diff --git a/mingw-w64-crt/math/cospil.c b/mingw-w64-crt/math/cospil.c
new file mode 100644
index 000000000..91e29586d
--- /dev/null
+++ b/mingw-w64-crt/math/cospil.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+long double __cdecl cospil(long double x)
+{
+ x = fmodl(x, 2.0L);
+ return cosl(x * __pi_type(x));
+}
diff --git a/mingw-w64-crt/math/pi_const.h b/mingw-w64-crt/math/pi_const.h
new file mode 100644
index 000000000..2accd70ce
--- /dev/null
+++ b/mingw-w64-crt/math/pi_const.h
@@ -0,0 +1,17 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#define __pi_type(x) \
+__builtin_choose_expr ( \
+ __builtin_types_compatible_p (__typeof__ (x), float), \
+ 3.14159265F, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (__typeof__ (x), double), \
+ 3.14159265358979323846, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (__typeof__ (x), long double), \
+ 3.1415926535897932384626433832795029L, \
+ (__builtin_trap(),0))))
diff --git a/mingw-w64-crt/math/sinpi.c b/mingw-w64-crt/math/sinpi.c
new file mode 100644
index 000000000..4f9eda4b6
--- /dev/null
+++ b/mingw-w64-crt/math/sinpi.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+double __cdecl sinpi(double x)
+{
+ x = remainder(x, 2.0);
+ return sin(x * __pi_type(x));
+}
diff --git a/mingw-w64-crt/math/sinpif.c b/mingw-w64-crt/math/sinpif.c
new file mode 100644
index 000000000..07110d1a4
--- /dev/null
+++ b/mingw-w64-crt/math/sinpif.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+float __cdecl sinpif(float x)
+{
+ x = remainderf(x, 2.0F);
+ return sinf(x * __pi_type(x));
+}
diff --git a/mingw-w64-crt/math/sinpil.c b/mingw-w64-crt/math/sinpil.c
new file mode 100644
index 000000000..4fe7d9e1c
--- /dev/null
+++ b/mingw-w64-crt/math/sinpil.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+long double __cdecl sinpil(long double x)
+{
+ x = remainderl(x, 2.0L);
+ return sinl(x * __pi_type(x));
+}
diff --git a/mingw-w64-crt/math/tanpi.c b/mingw-w64-crt/math/tanpi.c
new file mode 100644
index 000000000..405f704c6
--- /dev/null
+++ b/mingw-w64-crt/math/tanpi.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+double __cdecl tanpi(double x)
+{
+ x = remainder(x, 2.0);
+ return tan(x * __pi_type(x));
+}
diff --git a/mingw-w64-crt/math/tanpif.c b/mingw-w64-crt/math/tanpif.c
new file mode 100644
index 000000000..f11aac540
--- /dev/null
+++ b/mingw-w64-crt/math/tanpif.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+float __cdecl tanpif(float x)
+{
+ x = remainderf(x, 2.0F);
+ return tanf(x * __pi_type(x));
+}
diff --git a/mingw-w64-crt/math/tanpil.c b/mingw-w64-crt/math/tanpil.c
new file mode 100644
index 000000000..059fabc6f
--- /dev/null
+++ b/mingw-w64-crt/math/tanpil.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+#include "pi_const.h"
+
+long double __cdecl tanpil(long double x)
+{
+ x = remainderl(x, 2.0L);
+ return tanl(x * __pi_type(x));
+}
diff --git a/mingw-w64-headers/crt/math.h b/mingw-w64-headers/crt/math.h
index b5ddf940b..a597e57a5 100644
--- a/mingw-w64-headers/crt/math.h
+++ b/mingw-w64-headers/crt/math.h
@@ -698,6 +698,44 @@ __mingw_choose_expr (
\
#endif
extern long double __cdecl tanhl(long double);
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) \
+ || defined(_CRTBLD)
+/* 7.12.4.8 */
+ double __cdecl acospi(double _X);
+ float __cdecl acospif(float _X);
+ long double __cdecl acospil(long double _X);
+
+/* 7.12.4.9 */
+ double __cdecl asinpi(double _X);
+ float __cdecl asinpif(float _X);
+ long double __cdecl asinpil(long double _X);
+
+/* 7.12.4.10 */
+ double __cdecl atanpi(double _X);
+ float __cdecl atanpif(float _X);
+ long double __cdecl atanpil(long double _X);
+
+/* 7.12.4.11 */
+ double __cdecl atan2pi(double _X, double _Y);
+ float __cdecl atan2pif(float _X, float _Y);
+ long double __cdecl atan2pil(long double _X, long double _Y);
+
+/* 7.12.4.12 */
+ double __cdecl cospi(double _X);
+ float __cdecl cospif(float _X);
+ long double __cdecl cospil(long double _X);
+
+/* 7.12.4.13 */
+ double __cdecl sinpi(double _X);
+ float __cdecl sinpif(float _X);
+ long double __cdecl sinpil(long double _X);
+
+/* 7.12.4.14 */
+ double __cdecl tanpi(double _X);
+ float __cdecl tanpif(float _X);
+ long double __cdecl tanpil(long double _X);
+#endif
+
/* Inverse hyperbolic trig functions */
/* 7.12.5.1 */
extern double __cdecl acosh (double);
--
2.51.0.windows.2
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public