aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2021-01-31 23:35:30 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2021-02-01 04:53:23 +0000
commitaae89f6f09576351cc3a9a54959649e60fdd849b (patch)
tree9c9dc1175d40e491ea97d3f62957e7b9b1c0f39e
parent6f19dc2124a31aadf419743288d2ec1abd895563 (diff)
downloadsrc-aae89f6f09576351cc3a9a54959649e60fdd849b.tar.gz
src-aae89f6f09576351cc3a9a54959649e60fdd849b.zip
amd64: use compiler intrinsics for bsf* and bsr*
-rw-r--r--sys/amd64/include/cpufunc.h36
1 files changed, 4 insertions, 32 deletions
diff --git a/sys/amd64/include/cpufunc.h b/sys/amd64/include/cpufunc.h
index 763ed2c64c8a..8ef298e1d7d5 100644
--- a/sys/amd64/include/cpufunc.h
+++ b/sys/amd64/include/cpufunc.h
@@ -65,41 +65,13 @@ breakpoint(void)
__asm __volatile("int $3");
}
-static __inline __pure2 u_int
-bsfl(u_int mask)
-{
- u_int result;
-
- __asm __volatile("bsfl %1,%0" : "=r" (result) : "rm" (mask));
- return (result);
-}
-
-static __inline __pure2 u_long
-bsfq(u_long mask)
-{
- u_long result;
-
- __asm __volatile("bsfq %1,%0" : "=r" (result) : "rm" (mask));
- return (result);
-}
-
-static __inline __pure2 u_int
-bsrl(u_int mask)
-{
- u_int result;
+#define bsfl(mask) __builtin_ctz(mask)
- __asm __volatile("bsrl %1,%0" : "=r" (result) : "rm" (mask));
- return (result);
-}
+#define bsfq(mask) __builtin_ctzl(mask)
-static __inline __pure2 u_long
-bsrq(u_long mask)
-{
- u_long result;
+#define bsrl(mask) (__builtin_clz(mask) ^ 0x1f)
- __asm __volatile("bsrq %1,%0" : "=r" (result) : "rm" (mask));
- return (result);
-}
+#define bsrq(mask) (__builtin_clzl(mask) ^ 0x3f)
static __inline void
clflush(u_long addr)