Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
use REV on aarch64 for endianness swapping (VPP-1067)
[vpp.git]
/
src
/
vppinfra
/
byte_order.h
diff --git
a/src/vppinfra/byte_order.h
b/src/vppinfra/byte_order.h
index
b263538
..
4cdc06f
100644
(file)
--- a/
src/vppinfra/byte_order.h
+++ b/
src/vppinfra/byte_order.h
@@
-56,6
+56,13
@@
always_inline u16
clib_byte_swap_u16 (u16 x)
{
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);
}
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;
}
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));
}
#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;
}
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)))
#endif
#define _(x,n,i) \
((((x) >> (8*(i))) & 0xff) << (8*((n)-(i)-1)))