use REV on aarch64 for endianness swapping (VPP-1067) 05/9505/3
authorGabriel Ganne <gabriel.ganne@enea.com>
Tue, 21 Nov 2017 10:33:45 +0000 (11:33 +0100)
committerDamjan Marion <dmarion.lists@gmail.com>
Tue, 21 Nov 2017 14:36:51 +0000 (14:36 +0000)
Change-Id: I2de52725f40380422ca5019405df36cc05681603
Signed-off-by: Gabriel Ganne <gabriel.ganne@enea.com>
src/vppinfra/byte_order.h

index b263538..4cdc06f 100644 (file)
 always_inline u16
 clib_byte_swap_u16 (u16 x)
 {
+#if defined (__aarch64__)
+  if (!__builtin_constant_p (x))
+    {
+    __asm__ ("rev16 %w0, %w0":"+r" (x));
+      return x;
+    }
+#endif
   return (x >> 8) | (x << 8);
 }
 
@@ -74,6 +81,12 @@ clib_byte_swap_u32 (u32 x)
       asm volatile ("bswap %0":"=r" (x):"0" (x));
       return x;
     }
+#elif defined (__aarch64__)
+  if (!__builtin_constant_p (x))
+    {
+    __asm__ ("rev %w0, %w0":"+r" (x));
+      return x;
+    }
 #endif
   return ((x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24));
 }
@@ -93,6 +106,12 @@ clib_byte_swap_u64 (u64 x)
       asm volatile ("bswapq %0":"=r" (x):"0" (x));
       return x;
     }
+#elif defined (__aarch64__)
+  if (!__builtin_constant_p (x))
+    {
+    __asm__ ("rev %0, %0":"+r" (x));
+      return x;
+    }
 #endif
 #define _(x,n,i) \
   ((((x) >> (8*(i))) & 0xff) << (8*((n)-(i)-1)))