powerpc has byte-swapping 16 and 32-bit load/stores and we use those
in <machine/endian.h>.

Starting with POWER7 (Power ISA v.2.06), there are also corresponding
64-bit instructions.  Do we want to use those on powerpc64?  Or do
we want to keep compatibility with older processors?


Index: arch/powerpc64/include/endian.h
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/include/endian.h,v
retrieving revision 1.1
diff -u -p -r1.1 endian.h
--- arch/powerpc64/include/endian.h     16 May 2020 17:11:14 -0000      1.1
+++ arch/powerpc64/include/endian.h     8 Jun 2020 11:16:33 -0000
@@ -36,7 +36,7 @@ __mswap16(volatile const __uint16_t *m)
 
        __asm("lhbrx %0, 0, %1"
            : "=r" (v)
-            : "r" (m), "m" (*m));
+           : "r" (m), "m" (*m));
 
        return (v);
 }
@@ -48,7 +48,7 @@ __mswap32(volatile const __uint32_t *m)
 
        __asm("lwbrx %0, 0, %1"
            : "=r" (v)
-            : "r" (m), "m" (*m));
+           : "r" (m), "m" (*m));
 
        return (v);
 }
@@ -56,11 +56,11 @@ __mswap32(volatile const __uint32_t *m)
 static inline __uint64_t
 __mswap64(volatile const __uint64_t *m)
 {
-       __uint32_t *a = (__uint32_t *)m;
        __uint64_t v;
 
-       v = (__uint64_t)__mswap32(a + 1) << 32 |
-           (__uint64_t)__mswap32(a);
+       __asm("ldbrx %0, 0, %1"
+           : "=r" (v)
+           : "r" (m), "m" (*m));
 
        return (v);
 }
@@ -84,10 +84,9 @@ __swapm32(volatile __uint32_t *m, __uint
 static inline void
 __swapm64(volatile __uint64_t *m, __uint64_t v)
 {
-       __uint32_t *a = (__uint32_t *)m;
-
-       __swapm32(a + 1, v >> 32);
-       __swapm32(a, v);
+       __asm("stdbrx %1, 0, %2"
+           : "=m" (*m)
+           : "r" (v), "r" (m));
 }
 
 #define __HAVE_MD_SWAPIO
-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to