On 07/01/2026 11:17, Corinna Vinschen wrote:
Hi Thirumalai,
On Jan 5 12:40, Thirumalai Nagalingam wrote:
Hello Everyone,
This patch adds AArch64-specific inline asm implementations of __ntohl()
and __ntohs() in `winsup/cygwin/include/machine/_endian.h`.
For AArch64 targets, the patch uses the REV and REV16 instructions
to perform byte swapping, with explicit zero-extension for 16-bit
values to ensure correct register semantics.
Comments and reviews are welcome.
Thanks & regards
Thirumalai Nagalingam
<[email protected]<mailto:[email protected]>>
In-lined patch:
diff --git a/winsup/cygwin/include/machine/_endian.h
b/winsup/cygwin/include/machine/_endian.h
index dbd4429b8..129cba66b 100644
--- a/winsup/cygwin/include/machine/_endian.h
+++ b/winsup/cygwin/include/machine/_endian.h
@@ -26,16 +26,26 @@ _ELIDABLE_INLINE __uint16_t __ntohs(__uint16_t);
_ELIDABLE_INLINE __uint32_t
__ntohl(__uint32_t _x)
{
+#if defined(__x86_64__)
__asm__("bswap %0" : "=r" (_x) : "0" (_x));
+#elif defined(__aarch64__)
+ __asm__("rev %w0, %w0" : "=r" (_x) : "0" (_x));
+#endif
For a bit of future proofing, maybe this should end with
#else
#error unknown architecture
rather than ploughing on to silently return the unmodified x?
(That's probably an observation which applies generally to aarch64
patches :))
Also, to be hypercorrect (that is, I do not expect anyone to do anything
about this): since big-endian ARM is a thing (although not for Windows)
is there a more tightly scoped define we might use here?