1) Move these functions to intrin-impl.h:

_BitScanForward, _BitScanReverse
_BitScanForward64, _BitScanReverse64

2) Update inline asm code:

*a) Remove "memory" clobber*.
*b) Remove volatile keyword.*
/c) Change (Mask) from output to input//.
//d) Change constraint for (n) to "r"//.
/e) add "cc" clobber.
f) Use symbolic names.
g) Support both att and intel asm formats.

dw
Index: mingw-w64-crt/intrincs/bitscanfwd.c
===================================================================
--- mingw-w64-crt/intrincs/bitscanfwd.c (revision 5949)
+++ mingw-w64-crt/intrincs/bitscanfwd.c (working copy)
@@ -1,10 +1,4 @@
+#define __INTRINSIC_ONLYSPECIAL
+#define __INTRINSIC_SPECIAL__BitScanForward /* Causes code generation in 
intrin-impl.h */
+
 #include <intrin.h>
-
-unsigned char _BitScanForward(unsigned __LONG32 *Index, unsigned __LONG32 Mask)
-{
-  unsigned __LONG32 n;
-  __asm__ __volatile__("bsfl %0,%1" : "+r" (Mask),"=rm" (n) : : "memory");
-  *Index = n;
-  return (Mask != 0);
-}
-
Index: mingw-w64-crt/intrincs/bitscanfwd64.c
===================================================================
--- mingw-w64-crt/intrincs/bitscanfwd64.c       (revision 5949)
+++ mingw-w64-crt/intrincs/bitscanfwd64.c       (working copy)
@@ -1,10 +1,4 @@
+#define __INTRINSIC_ONLYSPECIAL
+#define __INTRINSIC_SPECIAL__BitScanForward64 /* Causes code generation in 
intrin-impl.h */
+
 #include <intrin.h>
-
-unsigned char _BitScanForward64(unsigned __LONG32 *Index, unsigned __int64 
Mask)
-{
-  unsigned __int64 n;
-  __asm__ __volatile__("bsfq %0,%1" : "+r" (Mask),"=rm" (n) : : "memory");
-  *Index = (unsigned __LONG32) n;
-  return (Mask != 0);
-}
-
Index: mingw-w64-crt/intrincs/bitscanrev.c
===================================================================
--- mingw-w64-crt/intrincs/bitscanrev.c (revision 5949)
+++ mingw-w64-crt/intrincs/bitscanrev.c (working copy)
@@ -1,10 +1,4 @@
+#define __INTRINSIC_ONLYSPECIAL
+#define __INTRINSIC_SPECIAL__BitScanReverse /* Causes code generation in 
intrin-impl.h */
+
 #include <intrin.h>
-
-unsigned char _BitScanReverse(unsigned __LONG32 *Index, unsigned __LONG32 Mask)
-{
-  unsigned __LONG32 n;
-  __asm__ __volatile__("bsrl %0,%1" : "+r" (Mask),"=rm" (n) : : "memory");
-  *Index = n;
-  return (Mask != 0);
-}
-
Index: mingw-w64-crt/intrincs/bitscanrev64.c
===================================================================
--- mingw-w64-crt/intrincs/bitscanrev64.c       (revision 5949)
+++ mingw-w64-crt/intrincs/bitscanrev64.c       (working copy)
@@ -1,10 +1,4 @@
+#define __INTRINSIC_ONLYSPECIAL
+#define __INTRINSIC_SPECIAL__BitScanReverse64 /* Causes code generation in 
intrin-impl.h */
+
 #include <intrin.h>
-
-unsigned char _BitScanReverse64(unsigned __LONG32 *Index, unsigned __int64 
Mask)
-{
-  unsigned __int64 n;
-  __asm__ __volatile__("bsrq %0,%1" : "+r" (Mask),"=rm" (n) : : "memory");
-  *Index = (unsigned __LONG32) n;
-  return (Mask != 0);
-}
-
Index: mingw-w64-headers/crt/intrin.h
===================================================================
--- mingw-w64-headers/crt/intrin.h      (revision 5950)
+++ mingw-w64-headers/crt/intrin.h      (working copy)
@@ -1095,10 +1095,10 @@
 
     __MACHINE(__MINGW_EXTENSION __int64 __cdecl _abs64(__int64))
 
-    __MACHINEIW64(unsigned char _BitScanForward(unsigned __LONG32 
*Index,unsigned __LONG32 Mask))
-    __MACHINEIW64(unsigned char _BitScanReverse(unsigned __LONG32 
*Index,unsigned __LONG32 Mask))
-    __MACHINEW64(__MINGW_EXTENSION unsigned char _BitScanForward64(unsigned 
__LONG32 *Index,unsigned __int64 Mask))
-    __MACHINEW64(__MINGW_EXTENSION unsigned char _BitScanReverse64(unsigned 
__LONG32 *Index,unsigned __int64 Mask))
+    /* __MACHINEIW64(unsigned char _BitScanForward(unsigned __LONG32 
*Index,unsigned __LONG32 Mask)) moved to psdk_inc/intrin-impl.h */
+    /* __MACHINEIW64(unsigned char _BitScanReverse(unsigned __LONG32 
*Index,unsigned __LONG32 Mask)) moved to psdk_inc/intrin-impl.h */
+    /* __MACHINEW64(__MINGW_EXTENSION unsigned char _BitScanForward64(unsigned 
__LONG32 *Index,unsigned __int64 Mask)) moved to psdk_inc/intrin-impl.h */
+    /* __MACHINEW64(__MINGW_EXTENSION unsigned char _BitScanReverse64(unsigned 
__LONG32 *Index,unsigned __int64 Mask)) moved to psdk_inc/intrin-impl.h */
     __MACHINEIW64(_CRTIMP wchar_t *__cdecl _wcsset(wchar_t *,wchar_t))
     __MACHINEW64(__MINGW_EXTENSION unsigned __int64 __shiftleft128(unsigned 
__int64 LowPart,unsigned __int64 HighPart,unsigned char Shift))
     __MACHINEW64(__MINGW_EXTENSION unsigned __int64 __shiftright128(unsigned 
__int64 LowPart,unsigned __int64 HighPart,unsigned char Shift))
Index: mingw-w64-headers/include/psdk_inc/intrin-impl.h
===================================================================
--- mingw-w64-headers/include/psdk_inc/intrin-impl.h    (revision 5950)
+++ mingw-w64-headers/include/psdk_inc/intrin-impl.h    (working copy)
@@ -161,6 +161,10 @@
 #define __INTRINSIC_SPECIAL___writefsbyte
 #define __INTRINSIC_SPECIAL___writefsword
 #define __INTRINSIC_SPECIAL___writefsdword
+#define __INTRINSIC_SPECIAL__BitScanForward
+#define __INTRINSIC_SPECIAL__BitScanForward64
+#define __INTRINSIC_SPECIAL__BitScanReverse
+#define __INTRINSIC_SPECIAL__BitScanReverse64
 
 #endif /* __INTRINSIC_GROUP_WINNT */
 
@@ -347,6 +351,20 @@
 #define __INTRINSIC_DEFINED___writegsqword
 #endif /* __INTRINSIC_PROLOG */
 
+#if __INTRINSIC_PROLOG(_BitScanForward64)
+__MINGW_EXTENSION unsigned char _BitScanForward64(unsigned __LONG32 *Index, 
unsigned __int64 Mask);
+__MINGW_EXTENSION __INTRINSICS_USEINLINE
+__buildbitscan(_BitScanForward64, unsigned __int64, "bsf")
+#define __INTRINSIC_DEFINED__BitScanForward64
+#endif /* __INTRINSIC_PROLOG */
+
+#if __INTRINSIC_PROLOG(_BitScanReverse64)
+__MINGW_EXTENSION unsigned char _BitScanReverse64(unsigned __LONG32 *Index, 
unsigned __int64 Mask);
+__MINGW_EXTENSION __INTRINSICS_USEINLINE
+__buildbitscan(_BitScanReverse64, unsigned __int64, "bsr")
+#define __INTRINSIC_DEFINED__BitScanReverse64
+#endif /* __INTRINSIC_PROLOG */
+
 #endif /* __x86_64__ */
 
 /* ***************************************************** */
@@ -545,6 +563,20 @@
 #define __INTRINSIC_DEFINED__InterlockedExchangePointer
 #endif /* __INTRINSIC_PROLOG */
 
+#if __INTRINSIC_PROLOG(_BitScanForward)
+unsigned char _BitScanForward(unsigned __LONG32 *Index, unsigned __LONG32 
Mask);
+__INTRINSICS_USEINLINE 
+__buildbitscan(_BitScanForward, unsigned __LONG32, "bsf")
+#define __INTRINSIC_DEFINED__BitScanForward
+#endif /* __INTRINSIC_PROLOG */
+
+#if __INTRINSIC_PROLOG(_BitScanReverse)
+unsigned char _BitScanReverse(unsigned __LONG32 *Index, unsigned __LONG32 
Mask);
+__INTRINSICS_USEINLINE 
+__buildbitscan(_BitScanReverse, unsigned __LONG32, "bsr")
+#define __INTRINSIC_DEFINED__BitScanReverse
+#endif /* __INTRINSIC_PROLOG */
+
 #endif /* defined(__x86_64__) || (defined(_X86_) */
 
 #if defined(_X86_)
Index: mingw-w64-headers/include/psdk_inc/intrin-mac.h
===================================================================
--- mingw-w64-headers/include/psdk_inc/intrin-mac.h     (revision 5950)
+++ mingw-w64-headers/include/psdk_inc/intrin-mac.h     (working copy)
@@ -104,4 +104,21 @@
         : [Data] "ri" (Data)); \
 }
 
+/* This macro is used by _BitScanForward, _BitScanForward64, _BitScanReverse 
_BitScanReverse64
+
+   FunctionName: Any valid function name
+   DataType: unsigned __LONG32 or unsigned __int64
+   Segment: BSF or BSR */
+
+#define __buildbitscan(x, y, z) unsigned char x(unsigned __LONG32 *Index, y 
Mask) \
+{ \
+   y n; \
+   __asm__ (z "{%z[Mask] %[Mask],%[Index] | %[Index],%[Mask]}" \
+      : [Index] "=r" (n) \
+      : [Mask] "r" (Mask) \
+      : "cc"); \
+   *Index = n; \
+   return Mask!=0; \
+}
+
 #endif /* _INTRIN_MAC_ */
Index: mingw-w64-headers/include/winnt.h
===================================================================
--- mingw-w64-headers/include/winnt.h   (revision 5950)
+++ mingw-w64-headers/include/winnt.h   (working copy)
@@ -1261,38 +1261,11 @@
 #define BitScanForward64 _BitScanForward64
 #define BitScanReverse64 _BitScanReverse64
 
-    BOOLEAN _BitScanForward(DWORD *Index,DWORD Mask);
-    BOOLEAN _BitScanReverse(DWORD *Index,DWORD Mask);
-    BOOLEAN _BitScanForward64(DWORD *Index,DWORD64 Mask);
-    BOOLEAN _BitScanReverse64(DWORD *Index,DWORD64 Mask);
+    /* BOOLEAN _BitScanForward(DWORD *Index,DWORD Mask); moved to 
psdk_inc/intrin-impl.h */
+    /* BOOLEAN _BitScanReverse(DWORD *Index,DWORD Mask); moved to 
psdk_inc/intrin-impl.h */
+    /* BOOLEAN _BitScanForward64(DWORD *Index,DWORD64 Mask); moved to 
psdk_inc/intrin-impl.h */
+    /* BOOLEAN _BitScanReverse64(DWORD *Index,DWORD64 Mask); moved to 
psdk_inc/intrin-impl.h */
 
-#ifndef __CRT__NO_INLINE
-    __CRT_INLINE BOOLEAN _BitScanForward(DWORD *Index,DWORD Mask) {
-      DWORD n;
-      __asm__ __volatile__("bsfl %0,%1" : "+r" (Mask),"=rm" (n) : : "memory");
-      *Index = n;
-      return Mask!=0;
-    }
-    __CRT_INLINE BOOLEAN _BitScanReverse(DWORD *Index,DWORD Mask) {
-     DWORD n;
-      __asm__ __volatile__("bsrl %0,%1" : "+r" (Mask),"=rm" (n) : : "memory");
-      *Index = n;
-      return Mask!=0;
-    }
-    __CRT_INLINE BOOLEAN _BitScanForward64(DWORD *Index,DWORD64 Mask) {
-      DWORD64 n;
-      __asm__ __volatile__("bsfq %0,%1" : "+r" (Mask),"=rm" (n) : : "memory");
-      *Index = (DWORD) n;
-      return Mask!=0;
-    }
-    __CRT_INLINE BOOLEAN _BitScanReverse64(DWORD *Index,DWORD64 Mask) {
-      DWORD64 n;
-      __asm__ __volatile__("bsrq %0,%1" : "+r" (Mask),"=rm" (n) : : "memory");
-      *Index = (DWORD) n;
-      return Mask!=0;
-    }
-#endif /* !__CRT__NO_INLINE */
-
 #define InterlockedIncrement16 _InterlockedIncrement16
 #define InterlockedDecrement16 _InterlockedDecrement16
 #define InterlockedCompareExchange16 _InterlockedCompareExchange16
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to