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) {