Author: tkreuzer
Date: Tue Mar 30 18:25:51 2010
New Revision: 46599
URL:
http://svn.reactos.org/svn/reactos?rev=46599&view=rev
Log:
merge from amd64 branch:
38333
[INTRIN_X86]
#define _alloca() to __builtin_alloca() on amd64
46388
[INTRIN_X86]
- Add __stosq, __movsq, _bittest64
Modified:
trunk/reactos/include/crt/mingw32/intrin_x86.h
Modified: trunk/reactos/include/crt/mingw32/intrin_x86.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/crt/mingw32/intrin…
==============================================================================
--- trunk/reactos/include/crt/mingw32/intrin_x86.h [iso-8859-1] (original)
+++ trunk/reactos/include/crt/mingw32/intrin_x86.h [iso-8859-1] Tue Mar 30 18:25:51 2010
@@ -74,6 +74,10 @@
#define _AddressOfReturnAddress() (&(((void **)(__builtin_frame_address(0)))[1]))
/* TODO: __getcallerseflags but how??? */
+/* Maybe the same for x86? */
+#ifdef _x86_64
+#define _alloca(s) __builtin_alloca(s)
+#endif
/*** Atomic operations ***/
@@ -565,6 +569,18 @@
);
}
+#ifdef _M_AMD64
+__INTRIN_INLINE void __stosq(unsigned __int64 * Dest, const unsigned __int64 Data, size_t
Count)
+{
+ __asm__ __volatile__
+ (
+ "rep; stosq" :
+ [Dest] "=D" (Dest), [Count] "=c" (Count) :
+ "[Dest]" (Dest), "a" (Data), "[Count]" (Count)
+ );
+}
+#endif
+
__INTRIN_INLINE void __movsb(unsigned char * Destination, const unsigned char * Source,
size_t Count)
{
__asm__ __volatile__
@@ -594,6 +610,18 @@
"[Destination]" (Destination), "[Source]" (Source),
"[Count]" (Count)
);
}
+
+#ifdef _M_AMD64
+__INTRIN_INLINE void __movsq(unsigned long * Destination, const unsigned long * Source,
size_t Count)
+{
+ __asm__ __volatile__
+ (
+ "rep; movsq" :
+ [Destination] "=D" (Destination), [Source] "=S" (Source), [Count]
"=c" (Count) :
+ "[Destination]" (Destination), "[Source]" (Source),
"[Count]" (Count)
+ );
+}
+#endif
#if defined(_M_AMD64)
/*** GS segment addressing ***/
@@ -786,6 +814,20 @@
return retval;
}
+
+#ifdef _M_AMD64
+__INTRIN_INLINE unsigned char _bittest64(const __int64 * const a, const __int64 b)
+{
+ unsigned char retval;
+
+ if(__builtin_constant_p(b))
+ __asm__("bt %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) :
[a] "mr" (*(a + (b / 64))), [b] "Ir" (b % 64));
+ else
+ __asm__("bt %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) :
[a] "mr" (*a), [b] "r" (b));
+
+ return retval;
+}
+#endif
__INTRIN_INLINE unsigned char _bittestandcomplement(long * const a, const long b)
{