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