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
        return _x;
 }

 _ELIDABLE_INLINE __uint16_t
 __ntohs(__uint16_t _x)
 {
+#if defined(__x86_64__)
        __asm__("xchgb %b0,%h0"         /* swap bytes           */
                : "=Q" (_x)
                :  "0" (_x));
+#elif defined(__aarch64__)
+       __asm__("uxth %w0, %w0\n\t"
+               "rev16 %w0, %w0"
+               : "+r" (_x));
+#endif
        return _x;
 }

Attachment: Cygwin-_endian.h-Add-AArch64-implementations-for-nto.patch
Description: Cygwin-_endian.h-Add-AArch64-implementations-for-nto.patch

Reply via email to