From 295161e09c41658841a902c57f99da54395b20dd Mon Sep 17 00:00:00 2001 From: Greg Burd Date: Sun, 23 Nov 2025 07:58:47 -0500 Subject: [PATCH v20251123] WIP ARM64/MSVC stdatomic --- doc/src/sgml/installation.sgml | 2 +- meson.build | 15 ++++++++++++++- src/include/port/spin_delay.h | 7 +++++-- src/port/pg_crc32c_armv8.c | 2 ++ src/tools/msvc_gendef.pl | 8 ++++---- 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index fe8d73e1f8c..3f8d512a906 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -3967,7 +3967,7 @@ configure ... LDFLAGS="-R /usr/sfw/lib:/opt/sfw/lib:/usr/local/lib" Special Considerations for 64-Bit Windows - PostgreSQL will only build for the x64 architecture on 64-bit Windows. + PostgreSQL will only build for the x64 and ARM64 architectures on 64-bit Windows. Mixing 32- and 64-bit versions in the same build tree is not supported. diff --git a/meson.build b/meson.build index 1a2005e75c4..18637180ab1 100644 --- a/meson.build +++ b/meson.build @@ -2158,6 +2158,11 @@ endforeach if cc.get_id() == 'msvc' + # Add ARM64 architecture flag for Windows 11 ARM64 for correct intrensics + if host_machine.system() == 'windows' and host_machine.cpu_family() == 'aarch64' + add_project_arguments('/arch:armv9.4', language: ['c', 'cpp']) + endif + cflags_warn += [ # Warnings to disable: # from /W1: @@ -2367,6 +2372,11 @@ if host_cpu == 'x86' or host_cpu == 'x86_64' else prog = ''' +#ifdef _MSC_VER +#include +#else +#include +#endif #include unsigned int crc; @@ -2450,7 +2460,10 @@ int main(void) } ''' - if cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc', + if cc.get_id() == 'msvc' + cdata.set('USE_ARMV8_CRC32C', 1) + have_optimized_crc = true + elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc', args: test_c_args) # Use ARM CRC Extension unconditionally cdata.set('USE_ARMV8_CRC32C', 1) diff --git a/src/include/port/spin_delay.h b/src/include/port/spin_delay.h index c583698af8e..f944c8362da 100644 --- a/src/include/port/spin_delay.h +++ b/src/include/port/spin_delay.h @@ -69,9 +69,12 @@ pg_spin_delay(void) /* * If using Visual C++ on Win64, inline assembly is unavailable. Use a - * _mm_pause intrinsic instead of rep nop. + * _mm_pause intrinsic instead of rep nop. For ARM64, use the __yield() + * intrinsic which emits the YIELD instruction as a hint to the processor. */ -#if defined(_WIN64) +#if defined(_M_ARM64) + __yield(); +#elif defined(_WIN64) _mm_pause(); #else /* See comment for gcc code. Same code, MASM syntax */ diff --git a/src/port/pg_crc32c_armv8.c b/src/port/pg_crc32c_armv8.c index 5ba070bb99d..6a155ddde1e 100644 --- a/src/port/pg_crc32c_armv8.c +++ b/src/port/pg_crc32c_armv8.c @@ -14,7 +14,9 @@ */ #include "c.h" +#ifndef _MSC_VER #include +#endif #include "port/pg_crc32c.h" diff --git a/src/tools/msvc_gendef.pl b/src/tools/msvc_gendef.pl index 868aad51b09..c92c94c4775 100644 --- a/src/tools/msvc_gendef.pl +++ b/src/tools/msvc_gendef.pl @@ -118,9 +118,9 @@ sub writedef { my $isdata = $def->{$f} eq 'data'; - # Strip the leading underscore for win32, but not x64 + # Strip the leading underscore for win32, but not x64 and aarch64 $f =~ s/^_// - unless ($arch eq "x86_64"); + unless ($arch eq "x86_64" || $arch eq "aarch64"); # Emit just the name if it's a function symbol, or emit the name # decorated with the DATA option for variables. @@ -141,7 +141,7 @@ sub writedef sub usage { die("Usage: msvc_gendef.pl --arch --deffile --tempdir files-or-directories\n" - . " arch: x86 | x86_64\n" + . " arch: x86 | x86_64 | aarch64\n" . " deffile: path of the generated file\n" . " tempdir: directory for temporary files\n" . " files or directories: object files or directory containing object files\n" @@ -158,7 +158,7 @@ GetOptions( 'tempdir:s' => \$tempdir,) or usage(); usage("arch: $arch") - unless ($arch eq 'x86' || $arch eq 'x86_64'); + unless ($arch eq 'x86' || $arch eq 'x86_64' || $arch eq 'aarch64'); my @files; -- 2.52.0.windows.1