Author: hyperion Date: Wed Oct 29 08:43:31 2008 New Revision: 37057
URL: http://svn.reactos.org/svn/reactos?rev=37057&view=rev Log: added include/crt/mingw32/intrin.h added include/crt/mingw32/intrin_arm.h added include/crt/mingw32/intrin_ppc.h added include/crt/mingw32/intrin_x86.h added include/crt/mingw32/intrin_x86_64.h deleted include/psdk/intrin.h.bak deleted include/psdk/intrin_arm.h deleted include/psdk/intrin_ppc.h deleted include/psdk/intrin_x86.h deleted include/psdk/intrin_x86_64.h Moved <intrin.h> from PSDK to MinGW backend, where it belongs
modified ReactOS-generic.rbuild modified tools/rbuild/backend/mingw/modulehandler.cpp Don't compile against an external CRT, it's just not worth it ReactOS is compiled with MinGW: to support new compilers, port MinGW
modified tools/rbuild/backend/mingw/mingw.cpp Disable more warnings. This should really go in a standard header file or a response file
Added: branches/the-real-msvc/include/crt/mingw32/intrin.h (props changed) - copied unchanged from r36960, branches/the-real-msvc/include/psdk/intrin.h branches/the-real-msvc/include/crt/mingw32/intrin_arm.h (props changed) - copied unchanged from r36960, branches/the-real-msvc/include/psdk/intrin_arm.h branches/the-real-msvc/include/crt/mingw32/intrin_ppc.h (props changed) - copied unchanged from r36960, branches/the-real-msvc/include/psdk/intrin_ppc.h branches/the-real-msvc/include/crt/mingw32/intrin_x86.h (props changed) - copied unchanged from r36960, branches/the-real-msvc/include/psdk/intrin_x86.h branches/the-real-msvc/include/crt/mingw32/intrin_x86_64.h (props changed) - copied unchanged from r36960, branches/the-real-msvc/include/psdk/intrin_x86_64.h Removed: branches/the-real-msvc/include/psdk/intrin.h.bak branches/the-real-msvc/include/psdk/intrin_arm.h branches/the-real-msvc/include/psdk/intrin_ppc.h branches/the-real-msvc/include/psdk/intrin_x86.h branches/the-real-msvc/include/psdk/intrin_x86_64.h Modified: branches/the-real-msvc/ReactOS-generic.rbuild branches/the-real-msvc/tools/rbuild/backend/mingw/mingw.cpp branches/the-real-msvc/tools/rbuild/backend/mingw/modulehandler.cpp
Modified: branches/the-real-msvc/ReactOS-generic.rbuild URL: http://svn.reactos.org/svn/reactos/branches/the-real-msvc/ReactOS-generic.rb... ============================================================================== --- branches/the-real-msvc/ReactOS-generic.rbuild [iso-8859-1] (original) +++ branches/the-real-msvc/ReactOS-generic.rbuild [iso-8859-1] Wed Oct 29 08:43:31 2008 @@ -64,8 +64,8 @@ <include root="intermediate">include/psdk</include> <include>include/dxsdk</include> <include root="intermediate">include/dxsdk</include> - <!--<include>include/crt</include>--> - <!--<include>include/crt/mingw32</include>--> + <include>include/crt</include> + <include>include/crt/msc</include> <include>include/ddk</include> <include>include/GL</include> <include>include/ndk</include>
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin.h ------------------------------------------------------------------------------ svn:eol-style = native
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin.h ------------------------------------------------------------------------------ svn:mergeinfo =
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_arm.h ------------------------------------------------------------------------------ svn:eol-style = native
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_arm.h ------------------------------------------------------------------------------ svn:mergeinfo =
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_arm.h ------------------------------------------------------------------------------ svn:mime-type = text/plain
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_ppc.h ------------------------------------------------------------------------------ svn:eol-style = native
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_ppc.h ------------------------------------------------------------------------------ svn:mergeinfo =
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_x86.h ------------------------------------------------------------------------------ svn:eol-style = native
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_x86.h ------------------------------------------------------------------------------ svn:mergeinfo =
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_x86_64.h ------------------------------------------------------------------------------ svn:eol-style = native
Propchange: branches/the-real-msvc/include/crt/mingw32/intrin_x86_64.h ------------------------------------------------------------------------------ svn:mergeinfo =
Removed: branches/the-real-msvc/include/psdk/intrin.h.bak URL: http://svn.reactos.org/svn/reactos/branches/the-real-msvc/include/psdk/intri... ============================================================================== --- branches/the-real-msvc/include/psdk/intrin.h.bak [iso-8859-1] (original) +++ branches/the-real-msvc/include/psdk/intrin.h.bak (removed) @@ -1,96 +1,0 @@ -/* - Compatibility <intrin.h> header for GCC -- GCC equivalents of intrinsic - Microsoft Visual C++ functions. Originally developed for the ReactOS - (http://www.reactos.org/) and TinyKrnl (http://www.tinykrnl.org/) - projects. - - Copyright (c) 2006 KJK::Hyperion hackbunny@reactos.com - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#ifndef KJK_INTRIN_H_ -#define KJK_INTRIN_H_ - -#ifndef __GNUC__ -#error Unsupported compiler -#endif - -/* - FIXME: review all "memory" clobbers, add/remove to match Visual C++ - behavior: some "obvious" memory barriers are not present in the Visual C++ - implementation - e.g. __stosX; on the other hand, some memory barriers that - *are* present could have been missed -*/ - -/* - NOTE: this is a *compatibility* header. Some functions may look wrong at - first, but they're only "as wrong" as they would be on Visual C++. Our - priority is compatibility - - NOTE: unlike most people who write inline asm for GCC, I didn't pull the - constraints and the uses of __volatile__ out of my... hat. Do not touch - them. I hate cargo cult programming - - NOTE: be very careful with declaring "memory" clobbers. Some "obvious" - barriers aren't there in Visual C++ (e.g. __stosX) - - NOTE: review all intrinsics with a return value, add/remove __volatile__ - where necessary. If an intrinsic whose value is ignored generates a no-op - under Visual C++, __volatile__ must be omitted; if it always generates code - (for example, if it has side effects), __volatile__ must be specified. GCC - will only optimize out non-volatile asm blocks with outputs, so input-only - blocks are safe. Oddities such as the non-volatile 'rdmsr' are intentional - and follow Visual C++ behavior - - NOTE: on GCC 4.1.0, please use the __sync_* built-ins for barriers and - atomic operations. Test the version like this: - - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 - ... - - Pay attention to the type of barrier. Make it match with what Visual C++ - would use in the same case -*/ - -#if defined(__i386__) -#include "intrin_x86.h" -#elif defined(_PPC_) -#include "intrin_ppc.h" -#elif defined(_MIPS_) -#include "intrin_mips.h" -#elif defined(_M_ARM) -#include "intrin_arm.h" -#elif defined(__x86_64__) -/* TODO: the x64 architecture shares most of the i386 intrinsics. It should be easy to support */ -#include "intrin_x86.h" -#else -#error Unsupported architecture -#endif - - -/*** Miscellaneous ***/ -/* BUGBUG: only good for use in macros. Cannot be taken the address of */ -#define __noop(...) ((void)0) - -/* TODO: __assume. GCC only supports the weaker __builtin_expect */ - -#endif - -/* EOF */
Removed: branches/the-real-msvc/include/psdk/intrin_arm.h URL: http://svn.reactos.org/svn/reactos/branches/the-real-msvc/include/psdk/intri... ============================================================================== --- branches/the-real-msvc/include/psdk/intrin_arm.h [iso-8859-1] (original) +++ branches/the-real-msvc/include/psdk/intrin_arm.h (removed) @@ -1,315 +1,0 @@ -/* - Compatibility <intrin.h> header for GCC -- GCC equivalents of intrinsic - Microsoft Visual C++ functions. Originally developed for the ReactOS - (http://www.reactos.org/) and TinyKrnl (http://www.tinykrnl.org/) - projects. - - Copyright (c) 2006 KJK::Hyperion hackbunny@reactos.com - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#ifndef KJK_INTRIN_ARM_H_ -#define KJK_INTRIN_ARM_H_ - -#ifndef __GNUC__ -#error Unsupported compiler -#endif - -#define _ReadWriteBarrier() __sync_synchronize() - -static __inline__ __attribute__((always_inline)) long _InterlockedCompareExchange(volatile long * const dest, const long exch, const long comp) -{ - long a, b; - - __asm__ __volatile__ ( "0:\n\t" - "ldr %1, [%2]\n\t" - "cmp %1, %4\n\t" - "bne 1f\n\t" - "swp %0, %3, [%2]\n\t" - "cmp %0, %1\n\t" - "swpne %3, %0, [%2]\n\t" - "bne 0b\n\t" - "1:" - : "=&r" (a), "=&r" (b) - : "r" (dest), "r" (exch), "r" (comp) - : "cc", "memory"); - - return a; -} - -static __inline__ __attribute__((always_inline)) long long _InterlockedCompareExchange64(volatile long long * const dest, const long long exch, const long long comp) -{ - // - // FIXME - // - long long result; - result = *dest; - if (*dest == comp) *dest = exch; - return result; -} - -static __inline__ __attribute__((always_inline)) void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand) -{ - return (void*)_InterlockedCompareExchange((volatile long* const)Destination, (const long)Exchange, (const long)Comperand); -} - - -static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd(volatile long * const dest, const long add) -{ - long a, b, c; - - __asm__ __volatile__ ( "0:\n\t" - "ldr %0, [%3]\n\t" - "add %1, %0, %4\n\t" - "swp %2, %1, [%3]\n\t" - "cmp %0, %2\n\t" - "swpne %1, %2, [%3]\n\t" - "bne 0b" - : "=&r" (a), "=&r" (b), "=&r" (c) - : "r" (dest), "r" (add) - : "cc", "memory"); - - return a; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedExchange(volatile long * const dest, const long exch) -{ - long a; - - __asm__ __volatile__ ( "swp %0, %2, [%1]" - : "=&r" (a) - : "r" (dest), "r" (exch)); - - return a; -} - - -static __inline__ __attribute__((always_inline)) void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value) -{ - return _InterlockedExchange(Target, Value); -} - -static __inline__ __attribute__((always_inline)) char _InterlockedAnd8(volatile char * const value, const char mask) -{ - char x; - char y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange8(value, x & mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) short _InterlockedAnd16(volatile short * const value, const short mask) -{ - short x; - short y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange16(value, x & mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedAnd(volatile long * const value, const long mask) -{ - long x; - long y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange(value, x & mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) char _InterlockedOr8(volatile char * const value, const char mask) -{ - char x; - char y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange8(value, x | mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) short _InterlockedOr16(volatile short * const value, const short mask) -{ - short x; - short y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange16(value, x | mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedOr(volatile long * const value, const long mask) -{ - long x; - long y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange(value, x | mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) char _InterlockedXor8(volatile char * const value, const char mask) -{ - char x; - char y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange8(value, x ^ mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) short _InterlockedXor16(volatile short * const value, const short mask) -{ - short x; - short y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange16(value, x ^ mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedXor(volatile long * const value, const long mask) -{ - long x; - long y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange(value, x ^ mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedDecrement(volatile long * const lpAddend) -{ - return _InterlockedExchangeAdd(lpAddend, -1) - 1; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedIncrement(volatile long * const lpAddend) -{ - return _InterlockedExchangeAdd(lpAddend, 1) + 1; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedDecrement16(volatile short * const lpAddend) -{ - return _InterlockedExchangeAdd16(lpAddend, -1) - 1; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedIncrement16(volatile short * const lpAddend) -{ - return _InterlockedExchangeAdd16(lpAddend, 1) + 1; -} - -static __inline__ __attribute__((always_inline)) void _disable(void) -{ - __asm__ __volatile__ - ( - "mrs r1, cpsr;" - "orr r1, r1, #0x80;" - "msr cpsr, r1;" - ); -} - -static __inline__ __attribute__((always_inline)) void _enable(void) -{ - __asm__ __volatile__ - ( - "mrs r1, cpsr;" - "bic r1, r1, #0x80;" - "msr cpsr, r1;" - ); -} - -#ifndef __MSVCRT__ -static __inline__ __attribute__((always_inline)) unsigned long _rotl(const unsigned long value, const unsigned char shift) -{ - return (((value) << ((int)(shift))) | ((value) >> (32 - (int)(shift)))); -} -#endif - -#define _clz(a) \ -({ ULONG __value, __arg = (a); \ -asm ("clz\t%0, %1": "=r" (__value): "r" (__arg)); \ -__value; }) - -#endif -/* EOF */
Removed: branches/the-real-msvc/include/psdk/intrin_ppc.h URL: http://svn.reactos.org/svn/reactos/branches/the-real-msvc/include/psdk/intri... ============================================================================== --- branches/the-real-msvc/include/psdk/intrin_ppc.h [iso-8859-1] (original) +++ branches/the-real-msvc/include/psdk/intrin_ppc.h (removed) @@ -1,791 +1,0 @@ -/* - Compatibility <intrin.h> header for GCC -- GCC equivalents of intrinsic - Microsoft Visual C++ functions. Originally developed for the ReactOS - (http://www.reactos.org/) and TinyKrnl (http://www.tinykrnl.org/) - projects. - - Copyright (c) 2006 KJK::Hyperion hackbunny@reactos.com - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#ifndef KJK_INTRIN_PPC_H_ -#define KJK_INTRIN_PPC_H_ - -//#define PPC_QUAL static __inline__ __attribute__((always_inline)) -#define PPC_QUAL extern __inline__ - -#ifndef __GNUC__ -#error Unsupported compiler -#endif - -/*** Stack frame juggling ***/ -#define _ReturnAddress() (__builtin_return_address(0)) -#define _AddressOfReturnAddress() (&(((void **)(__builtin_frame_address(0)))[1])) -/* TODO: __getcallerseflags but how??? */ - - -/*** Atomic operations ***/ -/* TODO: _ReadBarrier */ -/* TODO: _WriteBarrier */ - -#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 -#define _ReadWriteBarrier() __sync_synchronize() -#else -/* TODO: _ReadWriteBarrier() */ -#endif - -#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 - -PPC_QUAL char _InterlockedCompareExchange8(volatile char * const Destination, const char Exchange, const char Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -PPC_QUAL short _InterlockedCompareExchange16(volatile short * const Destination, const short Exchange, const short Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -PPC_QUAL long _InterlockedCompareExchange(volatile long * const Destination, const long Exchange, const long Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -PPC_QUAL long long _InterlockedCompareExchange64(volatile long long * const Destination, const long long Exchange, const long long Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -PPC_QUAL void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -PPC_QUAL long _InterlockedExchange(volatile long * const Target, const long Value) -{ - /* NOTE: __sync_lock_test_and_set would be an acquire barrier, so we force a full barrier */ - __sync_synchronize(); - return __sync_lock_test_and_set(Target, Value); -} - -PPC_QUAL void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value) -{ - /* NOTE: ditto */ - __sync_synchronize(); - return __sync_lock_test_and_set(Target, Value); -} - -PPC_QUAL long _InterlockedExchangeAdd(volatile long * const Addend, const long Value) -{ - return __sync_fetch_and_add(Addend, Value); -} - -PPC_QUAL char _InterlockedAnd8(volatile char * const value, const char mask) -{ - return __sync_fetch_and_and(value, mask); -} - -PPC_QUAL short _InterlockedAnd16(volatile short * const value, const short mask) -{ - return __sync_fetch_and_and(value, mask); -} - -PPC_QUAL long _InterlockedAnd(volatile long * const value, const long mask) -{ - return __sync_fetch_and_and(value, mask); -} - -PPC_QUAL char _InterlockedOr8(volatile char * const value, const char mask) -{ - return __sync_fetch_and_or(value, mask); -} - -PPC_QUAL short _InterlockedOr16(volatile short * const value, const short mask) -{ - return __sync_fetch_and_or(value, mask); -} - -PPC_QUAL long _InterlockedOr(volatile long * const value, const long mask) -{ - return __sync_fetch_and_or(value, mask); -} - -PPC_QUAL char _InterlockedXor8(volatile char * const value, const char mask) -{ - return __sync_fetch_and_xor(value, mask); -} - -PPC_QUAL short _InterlockedXor16(volatile short * const value, const short mask) -{ - return __sync_fetch_and_xor(value, mask); -} - -PPC_QUAL long _InterlockedXor(volatile long * const value, const long mask) -{ - return __sync_fetch_and_xor(value, mask); -} - -#else - -PPC_QUAL char _InterlockedCompareExchange8(volatile char * const Destination, const char Exchange, const char Comperand) -{ - volatile long retval __asm__("r8") = 0; - __asm__ __volatile__ ( - "sync\n" - "1: lbarx %0,0,%1\n" - : "=r" (retval) : "r" (Destination)); - __asm__ __volatile__ ( - " cmpw %3,%1\n" - " bne- 2f\n" - " stbcx. %2,0,%0\n" - " bne- 1b\n" - "2: isync" - : - : "r" (Destination), "r" (Comperand), "r" (Exchange), "r" (retval)); - return retval; -} - -PPC_QUAL short _InterlockedCompareExchange16(volatile short * const Destination, const short Exchange, const short Comperand) -{ - volatile long retval __asm__("r8") = 0; - __asm__ __volatile__ ( - "sync\n" - "1: lharx %0,0,%1\n" - : "=&r" (retval) : "r" (Destination)); - __asm__ __volatile__ ( - " cmpw %3,%1\n" - " bne- 2f\n" - " sthcx. %2,0,%0\n" - " bne- 1b\n" - "2: isync" - : - : "r" (Destination), "r" (Comperand), "r" (Exchange), "r" (retval)); - return retval; -} - -PPC_QUAL long _InterlockedCompareExchange(volatile long * const Destination, const long Exchange, const long Comperand) -{ - volatile long retval __asm__("r8") = 0; - __asm__ __volatile__ ( - "sync\n" - "1: lwarx %0,0,%1\n" - : "=&r" (retval) : "r" (Destination)); - __asm__ __volatile__ ( - " cmpw %3,%1\n" - " bne- 2f\n" - " stwcx. %2,0,%0\n" - " bne- 1b\n" - "2: isync" - : - : "r" (Destination), "r" (Comperand), "r" (Exchange), "r" (retval)); - return retval; -} - -PPC_QUAL long long _InterlockedCompareExchange64(volatile long long * const Target, const long long Exchange, const long long Comperand) -{ - long long capture = *Target; - if (*Target == Comperand) *Target = Exchange; - return capture; -} - -PPC_QUAL void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand) -{ - return (void *)_InterlockedCompareExchange - ((long *)Destination, (long) Exchange, (long) Comperand); -} - -PPC_QUAL long _InterlockedExchange(volatile long * const Target, const long Value) -{ - long retval __asm__("r8"); - __asm__ __volatile__ ( - "sync\n" - "1: lwarx 8,0,3\n" - " stwcx. 4,0,3\n" - " bne- 1b\n" - " mr 3,8\n" - : "=b" (retval) - : "b" (Target), "b" (Value) - : "cr0", "memory"); - return retval; -} - -PPC_QUAL void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value) -{ - return (void *)_InterlockedExchange((long *)Target, (long)Value); -} - -#define PPC_MakeInterlockedFunction(type,name,op,proto) \ -PPC_QUAL type name proto \ -{ \ - long addend, y; \ - do \ - { \ - addend = *value; \ - y = _InterlockedCompareExchange(value, addend op modify, addend); \ - } \ - while(y != addend); \ - \ - return y; \ -} - -PPC_QUAL unsigned char _interlockedbittestandreset(volatile long * const a, const long b) -{ - long x; - long y; - long mask = ~(1<<b); - - do - { - x = *a; - y = _InterlockedCompareExchange(a, x & mask, x); - } - while(y != x); - - return (y & ~mask) != 0; -} - -PPC_MakeInterlockedFunction(long,_InterlockedExchangeAdd,+,(volatile long * const value, const long modify)) -PPC_MakeInterlockedFunction(char,_InterlockedAnd8,&,(volatile char * const value, const char modify)) -PPC_MakeInterlockedFunction(short,_InterlockedAnd16,&,(volatile short * const value, const short modify)) -PPC_MakeInterlockedFunction(long,_InterlockedAnd,&,(volatile long * const value, const long modify)) -PPC_MakeInterlockedFunction(char,_InterlockedOr8,|,(volatile char * const value, const char modify)) -PPC_MakeInterlockedFunction(short,_InterlockedOr16,|,(volatile short * const value, const short modify)) -PPC_MakeInterlockedFunction(long,_InterlockedOr,|,(volatile long * const value, const long modify)) -PPC_MakeInterlockedFunction(char,_InterlockedXor8,^,(volatile char * const value, const char modify)) -PPC_MakeInterlockedFunction(short,_InterlockedXor16,^,(volatile short * const value, const short modify)) -PPC_MakeInterlockedFunction(long,_InterlockedXor,^,(volatile long * const value, const long modify)) - -PPC_QUAL unsigned char _interlockedbittestandset(volatile long * const a, const long b) -{ - long x; - long y; - long mask = 1<<b; - - do - { - x = *a; - y = _InterlockedCompareExchange(a, x | mask, x); - } - while(y != x); - - return (y & ~mask) != 0; -} -#endif - -PPC_QUAL long _InterlockedDecrement(volatile long * const lpAddend) -{ - return _InterlockedExchangeAdd(lpAddend, -1) - 1; -} - -PPC_QUAL long _InterlockedIncrement(volatile long * const lpAddend) -{ - return _InterlockedExchangeAdd(lpAddend, 1) + 1; -} - -/*** String operations ***/ -/* NOTE: we don't set a memory clobber in the __stosX functions because Visual C++ doesn't */ -/* Note that the PPC store multiple operations may raise an exception in LE - * mode */ -PPC_QUAL void __stosb(unsigned char * Dest, const unsigned char Data, unsigned long Count) -{ - memset(Dest, Data, Count); -} - -PPC_QUAL void __stosw(unsigned short * Dest, const unsigned short Data, unsigned long Count) -{ - while(Count--) - *Dest++ = Data; -} - -PPC_QUAL void __stosd(unsigned long * Dest, const unsigned long Data, unsigned long Count) -{ - while(Count--) - *Dest++ = Data; -} - -PPC_QUAL void __movsb(unsigned char * Destination, const unsigned char * Source, unsigned long Count) -{ - memcpy(Destination, Source, Count); -} - -PPC_QUAL void __movsw(unsigned short * Destination, const unsigned short * Source, unsigned long Count) -{ - memcpy(Destination, Source, Count * sizeof(*Source)); -} - -PPC_QUAL void __movsd(unsigned long * Destination, const unsigned long * Source, unsigned long Count) -{ - memcpy(Destination, Source, Count * sizeof(*Source)); -} - - -/*** FS segment addressing ***/ -/* On PowerPC, r13 points to TLS data, including the TEB at 0(r13) from what I - * can tell */ -PPC_QUAL void __writefsbyte(const unsigned long Offset, const unsigned char Data) -{ - char *addr; - __asm__("\tadd %0,13,%1\n\tstb %2,0(%0)" : "=r" (addr) : "r" (Offset), "r" (Data)); -} - -PPC_QUAL void __writefsword(const unsigned long Offset, const unsigned short Data) -{ - char *addr; - __asm__("\tadd %0,13,%1\n\tsth %2,0(%0)" : "=r" (addr) : "r" (Offset), "r" (Data)); -} - -PPC_QUAL void __writefsdword(const unsigned long Offset, const unsigned long Data) -{ - char *addr; - __asm__("\tadd %0,13,%1\n\tstw %2,0(%0)" : "=r" (addr) : "r" (Offset), "r" (Data)); -} - -PPC_QUAL unsigned char __readfsbyte(const unsigned long Offset) -{ - unsigned short result; - __asm__("\tadd 7,13,%1\n" - "\tlbz %0,0(7)\n" - : "=r" (result) - : "r" (Offset) - : "r7"); - return result; -} - -PPC_QUAL unsigned short __readfsword(const unsigned long Offset) -{ - unsigned short result; - __asm__("\tadd 7,13,%1\n" - "\tlhz %0,0(7)\n" - : "=r" (result) - : "r" (Offset) - : "r7"); - return result; -} - -PPC_QUAL unsigned long __readfsdword(const unsigned long Offset) -{ - unsigned long result; - __asm__("\tadd 7,13,%1\n" - "\tlwz %0,0(7)\n" - : "=r" (result) - : "r" (Offset) - : "r7"); - return result; -} - -PPC_QUAL void __incfsbyte(const unsigned long Offset) -{ - __writefsbyte(Offset, __readfsbyte(Offset)+1); -} - -PPC_QUAL void __incfsword(const unsigned long Offset) -{ - __writefsword(Offset, __readfsword(Offset)+1); -} - -PPC_QUAL void __incfsdword(const unsigned long Offset) -{ - __writefsdword(Offset, __readfsdword(Offset)+1); -} - -/* NOTE: the bizarre implementation of __addfsxxx mimics the broken Visual C++ behavior */ -/* PPC Note: Not sure about the bizarre behavior. We'll try to emulate it later */ -PPC_QUAL void __addfsbyte(const unsigned long Offset, const unsigned char Data) -{ - __writefsbyte(Offset, __readfsbyte(Offset) + Data); -} - -PPC_QUAL void __addfsword(const unsigned long Offset, const unsigned short Data) -{ - __writefsword(Offset, __readfsword(Offset) + Data); -} - -PPC_QUAL void __addfsdword(const unsigned long Offset, const unsigned int Data) -{ - __writefsdword(Offset, __readfsdword(Offset) + Data); -} - - -/*** Bit manipulation ***/ -PPC_QUAL unsigned char _BitScanForward(unsigned long * const Index, const unsigned long Mask) -{ - if(Mask == 0) return 0; - else { - unsigned long mask = Mask; - mask &= -mask; - *Index = - ((mask & 0xffff0000) ? 16 : 0) + - ((mask & 0xff00ff00) ? 8 : 0) + - ((mask & 0xf0f0f0f0) ? 4 : 0) + - ((mask & 0xcccccccc) ? 2 : 0) + - ((mask & 0xaaaaaaaa) ? 1 : 0); - return 1; - } -} - -/* Thanks http://www.jjj.de/bitwizardry/files/bithigh.h */ -PPC_QUAL unsigned char _BitScanReverse(unsigned long * const Index, const unsigned long Mask) -{ - unsigned long check = 16, checkmask; - if(Mask == 0) return 0; - else { - unsigned long mask = Mask; - *Index = 0; - while(check) { - checkmask = ((1<<check)-1) << check; - if( mask & checkmask ) { - mask >>= check; - *Index += check; - } - check >>= 1; - } - return 1; - } -} - -/* NOTE: again, the bizarre implementation follows Visual C++ */ -PPC_QUAL unsigned char _bittest(const long * const a, const long b) -{ - return ((*a) & (1<<b)) != 0; -} - -PPC_QUAL unsigned char _bittestandcomplement(long * const a, const long b) -{ - unsigned char ret = ((*a) & (1<<b)) != 0; - (*a) ^= (1<<b); - return ret; -} - -PPC_QUAL unsigned char _bittestandreset(long * const a, const long b) -{ - unsigned char ret = ((*a) & (1<<b)) != 0; - (*a) &= ~(1<<b); - return ret; -} - -PPC_QUAL unsigned char _bittestandset(long * const a, const long b) -{ - unsigned char ret = ((*a) & (1<<b)) != 0; - (*a) |= (1<<b); - return ret; -} - -PPC_QUAL unsigned char _rotl8(const unsigned char value, const unsigned char shift) -{ - return (value << shift) | (value >> (8-shift)); -} - -PPC_QUAL unsigned short _rotl16(const unsigned short value, const unsigned char shift) -{ - return (value << shift) | (value >> (16-shift)); -} - -PPC_QUAL unsigned char _rotr8(const unsigned char value, const unsigned char shift) -{ - return (value >> shift) | (value << (8-shift)); -} - -PPC_QUAL unsigned short _rotr16(const unsigned short value, const unsigned char shift) -{ - return (value >> shift) | (value << (16-shift)); -} - -PPC_QUAL unsigned long long __ll_lshift(const unsigned long long Mask, int Bit) -{ - return Mask << Bit; -} - -PPC_QUAL long long __ll_rshift(const long long Mask, const int Bit) -{ - return Mask >> Bit; -} - -PPC_QUAL unsigned long long __ull_rshift(const unsigned long long Mask, int Bit) -{ - return Mask >> Bit; -} - - -/*** 64-bit math ***/ -PPC_QUAL long long __emul(const int a, const int b) -{ - return a * b; -} - -PPC_QUAL unsigned long long __emulu(const unsigned int a, const unsigned int b) -{ - return a * b; -} - - -/*** Port I/O ***/ -PPC_QUAL unsigned char __inbyte(const unsigned long Port) -{ - int ret; - __asm__( - "mfmsr 5\n\t" - "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ - "mtmsr 6\n\t" - "isync\n\t" - "sync\n\t" - "lbz %0,0(%1)\n\t" /* Get actual value at phys addr r3 */ - "mtmsr 5\n\t" : "=r" (ret) : "b" (Port) - ); - return ret; -} - -PPC_QUAL unsigned short __inword(const unsigned long Port) -{ - int ret; - __asm__( - "mfmsr 5\n\t" - "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ - "mtmsr 6\n\t" - "isync\n\t" - "sync\n\t" - "lhz %0,0(%1)\n\t" /* Get actual value at phys addr r3 */ - "mtmsr 5\n\t" : "=r" (ret) : "b" (Port) - ); - return ret; -} - -PPC_QUAL unsigned long __indword(const unsigned long Port) -{ - int ret; - __asm__( - "mfmsr 5\n\t" - "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ - "mtmsr 6\n\t" - "isync\n\t" - "sync\n\t" - "lwz %0,0(%1)\n\t" /* Get actual value at phys addr r3 */ - "mtmsr 5\n\t" : "=r" (ret) : "b" (Port) - ); - return ret; -} - -PPC_QUAL void __inbytestring(unsigned long Port, unsigned char * Buffer, unsigned long Count) -{ - while(Count--) { - *Buffer++ = __inbyte(Port); - } -} - -PPC_QUAL void __inwordstring(unsigned long Port, unsigned short * Buffer, unsigned long Count) -{ - while(Count--) { - *Buffer++ = __inword(Port); - } -} - -PPC_QUAL void __indwordstring(unsigned long Port, unsigned long * Buffer, unsigned long Count) -{ - while(Count--) { - *Buffer++ = __indword(Port); - } -} - -PPC_QUAL void __outbyte(unsigned long const Port, const unsigned char Data) -{ - __asm__( - "mfmsr 5\n\t" - "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ - "mtmsr 6\n\t" - "sync\n\t" - "eieio\n\t" - "stb %1,0(%0)\n\t" /* Set actual value at phys addr r3 */ - "dcbst 0,%1\n\t" - "mtmsr 5\n\t" - "sync\n\t" - "eieio\n\t" : : "b" (Port), "r" (Data) - ); -} - -PPC_QUAL void __outword(unsigned long const Port, const unsigned short Data) -{ - __asm__( - "mfmsr 5\n\t" - "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ - "mtmsr 6\n\t" - "sync\n\t" - "eieio\n\t" - "sth %1,0(%0)\n\t" /* Set actual value at phys addr r3 */ - "dcbst 0,%1\n\t" - "mtmsr 5\n\t" - "sync\n\t" - "eieio\n\t" : : "b" (Port), "b" (Data) - ); -} - -PPC_QUAL void __outdword(unsigned long const Port, const unsigned long Data) -{ - __asm__( - "mfmsr 5\n\t" - "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ - "mtmsr 6\n\t" - "sync\n\t" - "eieio\n\t" - "stw %1,0(%0)\n\t" /* Set actual value at phys addr r3 */ - "dcbst 0,%1\n\t" - "mtmsr 5\n\t" - "sync\n\t" - "eieio\n\t" : : "b" (Port), "b" (Data) - ); -} - -PPC_QUAL void __outbytestring(unsigned long const Port, const unsigned char * const Buffer, const unsigned long Count) -{ - unsigned long count = Count; - const unsigned char *buffer = Buffer; - while(count--) { - __outbyte(Port, *buffer++); - } -} - -PPC_QUAL void __outwordstring(unsigned long const Port, const unsigned short * const Buffer, const unsigned long Count) -{ - unsigned long count = Count; - const unsigned short *buffer = Buffer; - while(count--) { - __outword(Port, *buffer++); - } -} - -PPC_QUAL void __outdwordstring(unsigned long const Port, const unsigned long * const Buffer, const unsigned long Count) -{ - unsigned long count = Count; - const unsigned long *buffer = Buffer; - while(count--) { - __outdword(Port, *buffer++); - } -} - - -/*** System information ***/ -PPC_QUAL void __cpuid(int CPUInfo[], const int InfoType) -{ - unsigned long lo32; - __asm__("mfpvr" : "=b" (lo32)); -} - -PPC_QUAL unsigned long long __rdtsc(void) -{ - unsigned long lo32; - __asm__("mfdec %0" : "=b" (lo32)); - return -lo32; -} - - -/*** Interrupts ***/ -/* Finally decided to do this by enabling single step trap */ -PPC_QUAL void __debugbreak(void) -{ - -} - -PPC_QUAL void __int2c(void) -{ - /* Not sure yet */ -} - -#ifndef _ENABLE_DISABLE_DEFINED -#define _ENABLE_DISABLE_DEFINED -PPC_QUAL void _disable(void) -{ - __asm__ __volatile__("mfmsr 0\n\t" \ - "li 8,0x7fff\n\t" \ - "and 0,8,0\n\t" \ - "mtmsr 0\n\t"); -} - -PPC_QUAL void _enable(void) -{ - __asm__ __volatile__("mfmsr 8\n\t" \ - "ori 8,8,0x8000\n\t" \ - "mtmsr 8\n\t"); -} - -/*** Protected memory management ***/ -PPC_QUAL unsigned long __readsdr1(void) -{ - unsigned long value; - __asm__("mfsdr1 %0" : "=b" (value)); - return value; -} - -PPC_QUAL void __writesdr1(const unsigned long long Data) -{ - __asm__("mtsdr1 %0" : : "b" (Data)); -} - -/*** System operations ***/ -/* This likely has a different meaning from the X86 equivalent. We'll keep - * the name cause it fits */ -PPC_QUAL unsigned long long __readmsr() -{ - unsigned long temp; - __asm__("mfmsr %0" : "=b" (temp)); - return temp; -} - -PPC_QUAL void __writemsr(const unsigned long Value) -{ - __asm__("mtmsr %0" : : "b" (Value)); -} - -/* We'll make sure of the following: - * IO operations have completed - * Write operations through cache have completed - * We've reloaded anything in the data or instruction cache that might have - * changed in real ram. - */ -PPC_QUAL void __wbinvd(void) -{ - __asm__("eieio\n\t" - "dcs\n\t" - "sync\n\t" - "isync\n\t"); -} -#endif - -PPC_QUAL long _InterlockedAddLargeStatistic(volatile long long * const Addend, const long Value) -{ -#if 0 - __asm__ - ( - "lock; add %[Value], %[Lo32];" - "jae LABEL%=;" - "lock; adc $0, %[Hi32];" - "LABEL%=:;" : - [Lo32] "=m" (*((volatile long *)(Addend) + 0)), [Hi32] "=m" (*((volatile long *)(Addend) + 1)) : - [Value] "ir" (Value) - ); -#endif - return Value; -} - -/*** Miscellaneous ***/ -/* BUGBUG: only good for use in macros. Cannot be taken the address of */ -#define __noop(...) ((void)0) - -/* TODO: __assume. GCC only supports the weaker __builtin_expect */ - -#endif -/* EOF */
Removed: branches/the-real-msvc/include/psdk/intrin_x86.h URL: http://svn.reactos.org/svn/reactos/branches/the-real-msvc/include/psdk/intri... ============================================================================== --- branches/the-real-msvc/include/psdk/intrin_x86.h [iso-8859-1] (original) +++ branches/the-real-msvc/include/psdk/intrin_x86.h (removed) @@ -1,1284 +1,0 @@ -/* - Compatibility <intrin_x86.h> header for GCC -- GCC equivalents of intrinsic - Microsoft Visual C++ functions. Originally developed for the ReactOS - (http://www.reactos.org/) and TinyKrnl (http://www.tinykrnl.org/) - projects. - - Copyright (c) 2006 KJK::Hyperion hackbunny@reactos.com - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -#ifndef KJK_INTRIN_X86_H_ -#define KJK_INTRIN_X86_H_ - -/* - FIXME: review all "memory" clobbers, add/remove to match Visual C++ - behavior: some "obvious" memory barriers are not present in the Visual C++ - implementation - e.g. __stosX; on the other hand, some memory barriers that - *are* present could have been missed -*/ - -/* - NOTE: this is a *compatibility* header. Some functions may look wrong at - first, but they're only "as wrong" as they would be on Visual C++. Our - priority is compatibility - - NOTE: unlike most people who write inline asm for GCC, I didn't pull the - constraints and the uses of __volatile__ out of my... hat. Do not touch - them. I hate cargo cult programming - - NOTE: be very careful with declaring "memory" clobbers. Some "obvious" - barriers aren't there in Visual C++ (e.g. __stosX) - - NOTE: review all intrinsics with a return value, add/remove __volatile__ - where necessary. If an intrinsic whose value is ignored generates a no-op - under Visual C++, __volatile__ must be omitted; if it always generates code - (for example, if it has side effects), __volatile__ must be specified. GCC - will only optimize out non-volatile asm blocks with outputs, so input-only - blocks are safe. Oddities such as the non-volatile 'rdmsr' are intentional - and follow Visual C++ behavior - - NOTE: on GCC 4.1.0, please use the __sync_* built-ins for barriers and - atomic operations. Test the version like this: - - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 - ... - - Pay attention to the type of barrier. Make it match with what Visual C++ - would use in the same case -*/ - -/*** Stack frame juggling ***/ -#define _ReturnAddress() (__builtin_return_address(0)) -#define _AddressOfReturnAddress() (&(((void **)(__builtin_frame_address(0)))[1])) -/* TODO: __getcallerseflags but how??? */ - - -/*** Atomic operations ***/ - -#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 -#define _ReadWriteBarrier() __sync_synchronize() -#else -static void __inline__ __attribute__((always_inline)) _MemoryBarrier(void) -{ - __asm__ __volatile__("" : : : "memory"); -} -#define _ReadWriteBarrier() _MemoryBarrier() -#endif - -/* BUGBUG: GCC only supports full barriers */ -#define _ReadBarrier _ReadWriteBarrier -#define _WriteBarrier _ReadWriteBarrier - -#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 - -static __inline__ __attribute__((always_inline)) char _InterlockedCompareExchange8(volatile char * const Destination, const char Exchange, const char Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -static __inline__ __attribute__((always_inline)) short _InterlockedCompareExchange16(volatile short * const Destination, const short Exchange, const short Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -static __inline__ __attribute__((always_inline)) long _InterlockedCompareExchange(volatile long * const Destination, const long Exchange, const long Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -static __inline__ __attribute__((always_inline)) void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -static __inline__ __attribute__((always_inline)) long _InterlockedExchange(volatile long * const Target, const long Value) -{ - /* NOTE: __sync_lock_test_and_set would be an acquire barrier, so we force a full barrier */ - __sync_synchronize(); - return __sync_lock_test_and_set(Target, Value); -} - -#if defined(_M_AMD64) -static __inline__ __attribute__((always_inline)) long long _InterlockedExchange64(volatile long long * const Target, const long long Value) -{ - /* NOTE: __sync_lock_test_and_set would be an acquire barrier, so we force a full barrier */ - __sync_synchronize(); - return __sync_lock_test_and_set(Target, Value); -} -#endif - -static __inline__ __attribute__((always_inline)) void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value) -{ - /* NOTE: ditto */ - __sync_synchronize(); - return __sync_lock_test_and_set(Target, Value); -} - -static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd16(volatile short * const Addend, const short Value) -{ - return __sync_fetch_and_add(Addend, Value); -} - -static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd(volatile long * const Addend, const long Value) -{ - return __sync_fetch_and_add(Addend, Value); -} - -#if defined(_M_AMD64) -static __inline__ __attribute__((always_inline)) long long _InterlockedExchangeAdd64(volatile long long * const Addend, const long long Value) -{ - return __sync_fetch_and_add(Addend, Value); -} -#endif - -static __inline__ __attribute__((always_inline)) char _InterlockedAnd8(volatile char * const value, const char mask) -{ - return __sync_fetch_and_and(value, mask); -} - -static __inline__ __attribute__((always_inline)) short _InterlockedAnd16(volatile short * const value, const short mask) -{ - return __sync_fetch_and_and(value, mask); -} - -static __inline__ __attribute__((always_inline)) long _InterlockedAnd(volatile long * const value, const long mask) -{ - return __sync_fetch_and_and(value, mask); -} - -#if defined(_M_AMD64) -static __inline__ __attribute__((always_inline)) long _InterlockedAnd64(volatile long long * const value, const long long mask) -{ - return __sync_fetch_and_and(value, mask); -} -#endif - -static __inline__ __attribute__((always_inline)) char _InterlockedOr8(volatile char * const value, const char mask) -{ - return __sync_fetch_and_or(value, mask); -} - -static __inline__ __attribute__((always_inline)) short _InterlockedOr16(volatile short * const value, const short mask) -{ - return __sync_fetch_and_or(value, mask); -} - -static __inline__ __attribute__((always_inline)) long _InterlockedOr(volatile long * const value, const long mask) -{ - return __sync_fetch_and_or(value, mask); -} - -#if defined(_M_AMD64) -static __inline__ __attribute__((always_inline)) long _InterlockedOr64(volatile long long * const value, const long long mask) -{ - return __sync_fetch_and_or(value, mask); -} -#endif - -static __inline__ __attribute__((always_inline)) char _InterlockedXor8(volatile char * const value, const char mask) -{ - return __sync_fetch_and_xor(value, mask); -} - -static __inline__ __attribute__((always_inline)) short _InterlockedXor16(volatile short * const value, const short mask) -{ - return __sync_fetch_and_xor(value, mask); -} - -static __inline__ __attribute__((always_inline)) long _InterlockedXor(volatile long * const value, const long mask) -{ - return __sync_fetch_and_xor(value, mask); -} - -#else - -static __inline__ __attribute__((always_inline)) char _InterlockedCompareExchange8(volatile char * const Destination, const char Exchange, const char Comperand) -{ - char retval = Comperand; - __asm__("lock; cmpxchgb %b[Exchange], %[Destination]" : [retval] "+a" (retval) : [Destination] "m" (*Destination), [Exchange] "q" (Exchange) : "memory"); - return retval; -} - -static __inline__ __attribute__((always_inline)) short _InterlockedCompareExchange16(volatile short * const Destination, const short Exchange, const short Comperand) -{ - short retval = Comperand; - __asm__("lock; cmpxchgw %w[Exchange], %[Destination]" : [retval] "+a" (retval) : [Destination] "m" (*Destination), [Exchange] "q" (Exchange): "memory"); - return retval; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedCompareExchange(volatile long * const Destination, const long Exchange, const long Comperand) -{ - long retval = Comperand; - __asm__("lock; cmpxchgl %k[Exchange], %[Destination]" : [retval] "+a" (retval) : [Destination] "m" (*Destination), [Exchange] "q" (Exchange): "memory"); - return retval; -} - -static __inline__ __attribute__((always_inline)) void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand) -{ - void * retval = (void *)Comperand; - __asm__("lock; cmpxchgl %k[Exchange], %[Destination]" : [retval] "=a" (retval) : "[retval]" (retval), [Destination] "m" (*Destination), [Exchange] "q" (Exchange) : "memory"); - return retval; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedExchange(volatile long * const Target, const long Value) -{ - long retval = Value; - __asm__("xchgl %[retval], %[Target]" : [retval] "+r" (retval) : [Target] "m" (*Target) : "memory"); - return retval; -} - -static __inline__ __attribute__((always_inline)) void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value) -{ - void * retval = Value; - __asm__("xchgl %[retval], %[Target]" : [retval] "+r" (retval) : [Target] "m" (*Target) : "memory"); - return retval; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd16(volatile short * const Addend, const short Value) -{ - long retval = Value; - __asm__("lock; xaddw %[retval], %[Addend]" : [retval] "+r" (retval) : [Addend] "m" (*Addend) : "memory"); - return retval; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedExchangeAdd(volatile long * const Addend, const long Value) -{ - long retval = Value; - __asm__("lock; xaddl %[retval], %[Addend]" : [retval] "+r" (retval) : [Addend] "m" (*Addend) : "memory"); - return retval; -} - -static __inline__ __attribute__((always_inline)) char _InterlockedAnd8(volatile char * const value, const char mask) -{ - char x; - char y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange8(value, x & mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) short _InterlockedAnd16(volatile short * const value, const short mask) -{ - short x; - short y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange16(value, x & mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedAnd(volatile long * const value, const long mask) -{ - long x; - long y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange(value, x & mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) char _InterlockedOr8(volatile char * const value, const char mask) -{ - char x; - char y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange8(value, x | mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) short _InterlockedOr16(volatile short * const value, const short mask) -{ - short x; - short y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange16(value, x | mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedOr(volatile long * const value, const long mask) -{ - long x; - long y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange(value, x | mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) char _InterlockedXor8(volatile char * const value, const char mask) -{ - char x; - char y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange8(value, x ^ mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) short _InterlockedXor16(volatile short * const value, const short mask) -{ - short x; - short y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange16(value, x ^ mask, x); - } - while(y != x); - - return y; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedXor(volatile long * const value, const long mask) -{ - long x; - long y; - - y = *value; - - do - { - x = y; - y = _InterlockedCompareExchange(value, x ^ mask, x); - } - while(y != x); - - return y; -} - -#endif - -#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 && defined(__x86_64__) - -static __inline__ __attribute__((always_inline)) long long _InterlockedCompareExchange64(volatile long long * const Destination, const long long Exchange, const long long Comperand) -{ - return __sync_val_compare_and_swap(Destination, Comperand, Exchange); -} - -#else - -static __inline__ __attribute__((always_inline)) long long _InterlockedCompareExchange64(volatile long long * const Destination, const long long Exchange, const long long Comperand) -{ - long long retval = Comperand; - - __asm__ - ( - "lock; cmpxchg8b %[Destination]" : - [retval] "+A" (retval) : - [Destination] "m" (*Destination), - "b" ((unsigned long)((Exchange >> 0) & 0xFFFFFFFF)), - "c" ((unsigned long)((Exchange >> 32) & 0xFFFFFFFF)) : - "memory" - ); - - return retval; -} - -#endif - -static __inline__ __attribute__((always_inline)) long _InterlockedAddLargeStatistic(volatile long long * const Addend, const long Value) -{ - __asm__ - ( - "lock; add %[Value], %[Lo32];" - "jae LABEL%=;" - "lock; adc $0, %[Hi32];" - "LABEL%=:;" : - [Lo32] "=m" (*((volatile long *)(Addend) + 0)), [Hi32] "=m" (*((volatile long *)(Addend) + 1)) : - [Value] "ir" (Value) - ); - - return Value; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedDecrement(volatile long * const lpAddend) -{ - return _InterlockedExchangeAdd(lpAddend, -1) - 1; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedIncrement(volatile long * const lpAddend) -{ - return _InterlockedExchangeAdd(lpAddend, 1) + 1; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedDecrement16(volatile short * const lpAddend) -{ - return _InterlockedExchangeAdd16(lpAddend, -1) - 1; -} - -static __inline__ __attribute__((always_inline)) long _InterlockedIncrement16(volatile short * const lpAddend) -{ - return _InterlockedExchangeAdd16(lpAddend, 1) + 1; -} - -#if defined(_M_AMD64) -static __inline__ __attribute__((always_inline)) long long _InterlockedDecrement64(volatile long long * const lpAddend) -{ - return _InterlockedExchangeAdd64(lpAddend, -1) - 1; -} - -static __inline__ __attribute__((always_inline)) long long _InterlockedIncrement64(volatile long long * const lpAddend) -{ - return _InterlockedExchangeAdd64(lpAddend, 1) + 1; -} -#endif - -static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandreset(volatile long * a, const long b) -{ - unsigned char retval; - __asm__("lock; btrl %[b], %[a]; setb %b[retval]" : [retval] "=r" (retval), [a] "=m" (*a) : [b] "Ir" (b) : "memory"); - return retval; -} - -#if defined(_M_AMD64) -static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandreset64(volatile long long * a, const long long b) -{ - unsigned char retval; - __asm__("lock; btrq %[b], %[a]; setb %b[retval]" : [retval] "=r" (retval), [a] "=m" (*a) : [b] "Ir" (b) : "memory"); - return retval; -} -#endif - -static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandset(volatile long * a, const long b) -{ - unsigned char retval; - __asm__("lock; btsl %[b], %[a]; setc %b[retval]" : [retval] "=r" (retval), [a] "=m" (*a) : [b] "Ir" (b) : "memory"); - return retval; -} - -#if defined(_M_AMD64) -static __inline__ __attribute__((always_inline)) unsigned char _interlockedbittestandset64(volatile long long * a, const long long b) -{ - unsigned char retval; - __asm__("lock; btsq %[b], %[a]; setc %b[retval]" : [retval] "=r" (retval), [a] "=m" (*a) : [b] "Ir" (b) : "memory"); - return retval; -} -#endif - -/*** String operations ***/ -/* NOTE: we don't set a memory clobber in the __stosX functions because Visual C++ doesn't */ -static __inline__ __attribute__((always_inline)) void __stosb(unsigned char * Dest, const unsigned char Data, size_t Count) -{ - __asm__ __volatile__ - ( - "rep; stosb" : - [Dest] "=D" (Dest), [Count] "=c" (Count) : - "[Dest]" (Dest), "a" (Data), "[Count]" (Count) - ); -} - -static __inline__ __attribute__((always_inline)) void __stosw(unsigned short * Dest, const unsigned short Data, size_t Count) -{ - __asm__ __volatile__ - ( - "rep; stosw" : - [Dest] "=D" (Dest), [Count] "=c" (Count) : - "[Dest]" (Dest), "a" (Data), "[Count]" (Count) - ); -} - -static __inline__ __attribute__((always_inline)) void __stosd(unsigned long * Dest, const unsigned long Data, size_t Count) -{ - __asm__ __volatile__ - ( - "rep; stosl" : - [Dest] "=D" (Dest), [Count] "=c" (Count) : - "[Dest]" (Dest), "a" (Data), "[Count]" (Count) - ); -} - -static __inline__ __attribute__((always_inline)) void __movsb(unsigned char * Destination, const unsigned char * Source, size_t Count) -{ - __asm__ __volatile__ - ( - "rep; movsb" : - [Destination] "=D" (Destination), [Source] "=S" (Source), [Count] "=c" (Count) : - "[Destination]" (Destination), "[Source]" (Source), "[Count]" (Count) - ); -} - -static __inline__ __attribute__((always_inline)) void __movsw(unsigned short * Destination, const unsigned short * Source, size_t Count) -{ - __asm__ __volatile__ - ( - "rep; movsw" : - [Destination] "=D" (Destination), [Source] "=S" (Source), [Count] "=c" (Count) : - "[Destination]" (Destination), "[Source]" (Source), "[Count]" (Count) - ); -} - -static __inline__ __attribute__((always_inline)) void __movsd(unsigned long * Destination, const unsigned long * Source, size_t Count) -{ - __asm__ __volatile__ - ( - "rep; movsd" : - [Destination] "=D" (Destination), [Source] "=S" (Source), [Count] "=c" (Count) : - "[Destination]" (Destination), "[Source]" (Source), "[Count]" (Count) - ); -} - -#if defined(_M_AMD64) -/*** GS segment addressing ***/ - -static __inline__ __attribute__((always_inline)) void __writegsbyte(const unsigned long Offset, const unsigned char Data) -{ - __asm__ __volatile__("movb %b[Data], %%gs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __writegsword(const unsigned long Offset, const unsigned short Data) -{ - __asm__ __volatile__("movw %w[Data], %%gs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __writegsdword(const unsigned long Offset, const unsigned long Data) -{ - __asm__ __volatile__("movl %k[Data], %%gs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __writegsqword(const unsigned long Offset, const unsigned __int64 Data) -{ - __asm__ __volatile__("movq %q[Data], %%gs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) unsigned char __readgsbyte(const unsigned long Offset) -{ - unsigned char value; - __asm__ __volatile__("movb %%gs:%a[Offset], %b[value]" : [value] "=q" (value) : [Offset] "irm" (Offset)); - return value; -} - -static __inline__ __attribute__((always_inline)) unsigned short __readgsword(const unsigned long Offset) -{ - unsigned short value; - __asm__ __volatile__("movw %%gs:%a[Offset], %w[value]" : [value] "=q" (value) : [Offset] "irm" (Offset)); - return value; -} - -static __inline__ __attribute__((always_inline)) unsigned long __readgsdword(const unsigned long Offset) -{ - unsigned long value; - __asm__ __volatile__("movl %%gs:%a[Offset], %k[value]" : [value] "=q" (value) : [Offset] "irm" (Offset)); - return value; -} - -static __inline__ __attribute__((always_inline)) unsigned __int64 __readgsqword(const unsigned long Offset) -{ - unsigned __int64 value; - __asm__ __volatile__("movq %%gs:%a[Offset], %q[value]" : [value] "=q" (value) : [Offset] "irm" (Offset)); - return value; -} - -static __inline__ __attribute__((always_inline)) void __incgsbyte(const unsigned long Offset) -{ - __asm__ __volatile__("incb %%gs:%a[Offset]" : : [Offset] "ir" (Offset) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __incgsword(const unsigned long Offset) -{ - __asm__ __volatile__("incw %%gs:%a[Offset]" : : [Offset] "ir" (Offset) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __incgsdword(const unsigned long Offset) -{ - __asm__ __volatile__("incl %%gs:%a[Offset]" : : [Offset] "ir" (Offset) : "memory"); -} - -/* NOTE: the bizarre implementation of __addgsxxx mimics the broken Visual C++ behavior */ -static __inline__ __attribute__((always_inline)) void __addgsbyte(const unsigned long Offset, const unsigned char Data) -{ - if(!__builtin_constant_p(Offset)) - __asm__ __volatile__("addb %k[Offset], %%gs:%a[Offset]" : : [Offset] "r" (Offset) : "memory"); - else - __asm__ __volatile__("addb %b[Data], %%gs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __addgsword(const unsigned long Offset, const unsigned short Data) -{ - if(!__builtin_constant_p(Offset)) - __asm__ __volatile__("addw %k[Offset], %%gs:%a[Offset]" : : [Offset] "r" (Offset) : "memory"); - else - __asm__ __volatile__("addw %w[Data], %%gs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __addgsdword(const unsigned long Offset, const unsigned int Data) -{ - if(!__builtin_constant_p(Offset)) - __asm__ __volatile__("addl %k[Offset], %%gs:%a[Offset]" : : [Offset] "r" (Offset) : "memory"); - else - __asm__ __volatile__("addl %k[Data], %%gs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -#else -/*** FS segment addressing ***/ -static __inline__ __attribute__((always_inline)) void __writefsbyte(const unsigned long Offset, const unsigned char Data) -{ - __asm__ __volatile__("movb %b[Data], %%fs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __writefsword(const unsigned long Offset, const unsigned short Data) -{ - __asm__ __volatile__("movw %w[Data], %%fs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __writefsdword(const unsigned long Offset, const unsigned long Data) -{ - __asm__ __volatile__("movl %k[Data], %%fs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) unsigned char __readfsbyte(const unsigned long Offset) -{ - unsigned char value; - __asm__ __volatile__("movb %%fs:%a[Offset], %b[value]" : [value] "=q" (value) : [Offset] "irm" (Offset) : "memory"); - return value; -} - -static __inline__ __attribute__((always_inline)) unsigned short __readfsword(const unsigned long Offset) -{ - unsigned short value; - __asm__ __volatile__("movw %%fs:%a[Offset], %w[value]" : [value] "=q" (value) : [Offset] "irm" (Offset)); - return value; -} - -static __inline__ __attribute__((always_inline)) unsigned long __readfsdword(const unsigned long Offset) -{ - unsigned long value; - __asm__ __volatile__("movl %%fs:%a[Offset], %k[value]" : [value] "=q" (value) : [Offset] "irm" (Offset)); - return value; -} - -static __inline__ __attribute__((always_inline)) void __incfsbyte(const unsigned long Offset) -{ - __asm__ __volatile__("incb %%fs:%a[Offset]" : : [Offset] "ir" (Offset) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __incfsword(const unsigned long Offset) -{ - __asm__ __volatile__("incw %%fs:%a[Offset]" : : [Offset] "ir" (Offset) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __incfsdword(const unsigned long Offset) -{ - __asm__ __volatile__("incl %%fs:%a[Offset]" : : [Offset] "ir" (Offset) : "memory"); -} - -/* NOTE: the bizarre implementation of __addfsxxx mimics the broken Visual C++ behavior */ -static __inline__ __attribute__((always_inline)) void __addfsbyte(const unsigned long Offset, const unsigned char Data) -{ - if(!__builtin_constant_p(Offset)) - __asm__ __volatile__("addb %k[Offset], %%fs:%a[Offset]" : : [Offset] "r" (Offset) : "memory"); - else - __asm__ __volatile__("addb %b[Data], %%fs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __addfsword(const unsigned long Offset, const unsigned short Data) -{ - if(!__builtin_constant_p(Offset)) - __asm__ __volatile__("addw %k[Offset], %%fs:%a[Offset]" : : [Offset] "r" (Offset) : "memory"); - else - __asm__ __volatile__("addw %w[Data], %%fs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __addfsdword(const unsigned long Offset, const unsigned int Data) -{ - if(!__builtin_constant_p(Offset)) - __asm__ __volatile__("addl %k[Offset], %%fs:%a[Offset]" : : [Offset] "r" (Offset) : "memory"); - else - __asm__ __volatile__("addl %k[Data], %%fs:%a[Offset]" : : [Offset] "ir" (Offset), [Data] "iq" (Data) : "memory"); -} -#endif - - -/*** Bit manipulation ***/ -static __inline__ __attribute__((always_inline)) unsigned char _BitScanForward(unsigned long * const Index, const unsigned long Mask) -{ - __asm__("bsfl %[Mask], %[Index]" : [Index] "=r" (*Index) : [Mask] "mr" (Mask)); - return Mask ? 1 : 0; -} - -static __inline__ __attribute__((always_inline)) unsigned char _BitScanReverse(unsigned long * const Index, const unsigned long Mask) -{ - __asm__("bsrl %[Mask], %[Index]" : [Index] "=r" (*Index) : [Mask] "mr" (Mask)); - return Mask ? 1 : 0; -} - -/* NOTE: again, the bizarre implementation follows Visual C++ */ -static __inline__ __attribute__((always_inline)) unsigned char _bittest(const long * const a, const long b) -{ - unsigned char retval; - - if(__builtin_constant_p(b)) - __asm__("bt %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) : [a] "mr" (*(a + (b / 32))), [b] "Ir" (b % 32)); - else - __asm__("bt %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) : [a] "mr" (*a), [b] "r" (b)); - - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned char _bittestandcomplement(long * const a, const long b) -{ - unsigned char retval; - - if(__builtin_constant_p(b)) - __asm__("btc %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) : [a] "mr" (*(a + (b / 32))), [b] "Ir" (b % 32)); - else - __asm__("btc %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) : [a] "mr" (*a), [b] "r" (b)); - - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned char _bittestandreset(long * const a, const long b) -{ - unsigned char retval; - - if(__builtin_constant_p(b)) - __asm__("btr %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) : [a] "mr" (*(a + (b / 32))), [b] "Ir" (b % 32)); - else - __asm__("btr %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) : [a] "mr" (*a), [b] "r" (b)); - - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned char _bittestandset(long * const a, const long b) -{ - unsigned char retval; - - if(__builtin_constant_p(b)) - __asm__("bts %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) : [a] "mr" (*(a + (b / 32))), [b] "Ir" (b % 32)); - else - __asm__("bts %[b], %[a]; setb %b[retval]" : [retval] "=q" (retval) : [a] "mr" (*a), [b] "r" (b)); - - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned char _rotl8(const unsigned char value, const unsigned char shift) -{ - unsigned char retval; - __asm__("rolb %b[shift], %b[retval]" : [retval] "=rm" (retval) : "[retval]" (value), [shift] "Nc" (shift)); - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned short _rotl16(const unsigned short value, const unsigned char shift) -{ - unsigned short retval; - __asm__("rolw %b[shift], %w[retval]" : [retval] "=rm" (retval) : "[retval]" (value), [shift] "Nc" (shift)); - return retval; -} - -#ifndef __MSVCRT__ -static __inline__ __attribute__((always_inline)) unsigned int _rotl(const unsigned int value, const int shift) -{ - unsigned long retval; - __asm__("roll %b[shift], %k[retval]" : [retval] "=rm" (retval) : "[retval]" (value), [shift] "Nc" (shift)); - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned long _rotr(const unsigned int value, const unsigned char shift) -{ - unsigned long retval; - __asm__("rorl %b[shift], %k[retval]" : [retval] "=rm" (retval) : "[retval]" (value), [shift] "Nc" (shift)); - return retval; -} -#endif - -static __inline__ __attribute__((always_inline)) unsigned char _rotr8(const unsigned char value, const unsigned char shift) -{ - unsigned char retval; - __asm__("rorb %b[shift], %b[retval]" : [retval] "=rm" (retval) : "[retval]" (value), [shift] "Nc" (shift)); - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned short _rotr16(const unsigned short value, const unsigned char shift) -{ - unsigned short retval; - __asm__("rorw %b[shift], %w[retval]" : [retval] "=rm" (retval) : "[retval]" (value), [shift] "Nc" (shift)); - return retval; -} - -/* - NOTE: in __ll_lshift, __ll_rshift and __ull_rshift we use the "A" - constraint (edx:eax) for the Mask argument, because it's the only way GCC - can pass 64-bit operands around - passing the two 32 bit parts separately - just confuses it. Also we declare Bit as an int and then truncate it to - match Visual C++ behavior -*/ -static __inline__ __attribute__((always_inline)) unsigned long long __ll_lshift(const unsigned long long Mask, const int Bit) -{ - unsigned long long retval = Mask; - - __asm__ - ( - "shldl %b[Bit], %%eax, %%edx; sall %b[Bit], %%eax" : - "+A" (retval) : - [Bit] "Nc" ((unsigned char)((unsigned long)Bit) & 0xFF) - ); - - return retval; -} - -static __inline__ __attribute__((always_inline)) long long __ll_rshift(const long long Mask, const int Bit) -{ - unsigned long long retval = Mask; - - __asm__ - ( - "shldl %b[Bit], %%eax, %%edx; sarl %b[Bit], %%eax" : - "+A" (retval) : - [Bit] "Nc" ((unsigned char)((unsigned long)Bit) & 0xFF) - ); - - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned long long __ull_rshift(const unsigned long long Mask, int Bit) -{ - unsigned long long retval = Mask; - - __asm__ - ( - "shrdl %b[Bit], %%eax, %%edx; shrl %b[Bit], %%eax" : - "+A" (retval) : - [Bit] "Nc" ((unsigned char)((unsigned long)Bit) & 0xFF) - ); - - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned short _byteswap_ushort(unsigned short value) -{ - unsigned short retval; - __asm__("rorw $8, %w[retval]" : [retval] "=rm" (retval) : "[retval]" (value)); - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned long _byteswap_ulong(unsigned long value) -{ - unsigned long retval; - __asm__("bswapl %[retval]" : [retval] "=rm" (retval) : "[retval]" (value)); - return retval; -} - -#ifdef _M_AMD64 -static __inline__ __attribute__((always_inline)) unsigned __int64 _byteswap_uint64(unsigned __int64 value) -{ - unsigned __int64 retval; - __asm__("bswapq %[retval]" : [retval] "=rm" (retval) : "[retval]" (value)); - return retval; -} -#else -static __inline__ __attribute__((always_inline)) unsigned __int64 _byteswap_uint64(unsigned __int64 value) -{ - union { - __int64 int64part; - struct { - unsigned long lowpart; - unsigned long hipart; - }; - } retval; - retval.int64part = value; - __asm__("bswapl %[lowpart]\n" - "bswapl %[hipart]\n" - : [lowpart] "=rm" (retval.hipart), [hipart] "=rm" (retval.lowpart) : "[lowpart]" (retval.lowpart), "[hipart]" (retval.hipart) ); - return retval.int64part; -} -#endif - -/*** 64-bit math ***/ -static __inline__ __attribute__((always_inline)) long long __emul(const int a, const int b) -{ - long long retval; - __asm__("imull %[b]" : "=A" (retval) : [a] "a" (a), [b] "rm" (b)); - return retval; -} - -static __inline__ __attribute__((always_inline)) unsigned long long __emulu(const unsigned int a, const unsigned int b) -{ - unsigned long long retval; - __asm__("mull %[b]" : "=A" (retval) : [a] "a" (a), [b] "rm" (b)); - return retval; -} - - -/*** Port I/O ***/ -static __inline__ __attribute__((always_inline)) unsigned char __inbyte(const unsigned short Port) -{ - unsigned char byte; - __asm__ __volatile__("inb %w[Port], %b[byte]" : [byte] "=a" (byte) : [Port] "Nd" (Port)); - return byte; -} - -static __inline__ __attribute__((always_inline)) unsigned short __inword(const unsigned short Port) -{ - unsigned short word; - __asm__ __volatile__("inw %w[Port], %w[word]" : [word] "=a" (word) : [Port] "Nd" (Port)); - return word; -} - -static __inline__ __attribute__((always_inline)) unsigned long __indword(const unsigned short Port) -{ - unsigned long dword; - __asm__ __volatile__("inl %w[Port], %k[dword]" : [dword] "=a" (dword) : [Port] "Nd" (Port)); - return dword; -} - -static __inline__ __attribute__((always_inline)) void __inbytestring(unsigned short Port, unsigned char * Buffer, unsigned long Count) -{ - __asm__ __volatile__ - ( - "rep; insb" : - [Buffer] "=D" (Buffer), [Count] "=c" (Count) : - "d" (Port), "[Buffer]" (Buffer), "[Count]" (Count) : - "memory" - ); -} - -static __inline__ __attribute__((always_inline)) void __inwordstring(unsigned short Port, unsigned short * Buffer, unsigned long Count) -{ - __asm__ __volatile__ - ( - "rep; insw" : - [Buffer] "=D" (Buffer), [Count] "=c" (Count) : - "d" (Port), "[Buffer]" (Buffer), "[Count]" (Count) : - "memory" - ); -} - -static __inline__ __attribute__((always_inline)) void __indwordstring(unsigned short Port, unsigned long * Buffer, unsigned long Count) -{ - __asm__ __volatile__ - ( - "rep; insl" : - [Buffer] "=D" (Buffer), [Count] "=c" (Count) : - "d" (Port), "[Buffer]" (Buffer), "[Count]" (Count) : - "memory" - ); -} - -static __inline__ __attribute__((always_inline)) void __outbyte(unsigned short const Port, const unsigned char Data) -{ - __asm__ __volatile__("outb %b[Data], %w[Port]" : : [Port] "Nd" (Port), [Data] "a" (Data)); -} - -static __inline__ __attribute__((always_inline)) void __outword(unsigned short const Port, const unsigned short Data) -{ - __asm__ __volatile__("outw %w[Data], %w[Port]" : : [Port] "Nd" (Port), [Data] "a" (Data)); -} - -static __inline__ __attribute__((always_inline)) void __outdword(unsigned short const Port, const unsigned long Data) -{ - __asm__ __volatile__("outl %k[Data], %w[Port]" : : [Port] "Nd" (Port), [Data] "a" (Data)); -} - -static __inline__ __attribute__((always_inline)) void __outbytestring(unsigned short const Port, const unsigned char * const Buffer, const unsigned long Count) -{ - __asm__ __volatile__("rep; outsb" : : [Port] "d" (Port), [Buffer] "S" (Buffer), "c" (Count)); -} - -static __inline__ __attribute__((always_inline)) void __outwordstring(unsigned short const Port, const unsigned short * const Buffer, const unsigned long Count) -{ - __asm__ __volatile__("rep; outsw" : : [Port] "d" (Port), [Buffer] "S" (Buffer), "c" (Count)); -} - -static __inline__ __attribute__((always_inline)) void __outdwordstring(unsigned short const Port, const unsigned long * const Buffer, const unsigned long Count) -{ - __asm__ __volatile__("rep; outsl" : : [Port] "d" (Port), [Buffer] "S" (Buffer), "c" (Count)); -} - - -/*** System information ***/ -static __inline__ __attribute__((always_inline)) void __cpuid(int CPUInfo[], const int InfoType) -{ - __asm__ __volatile__("cpuid" : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "a" (InfoType)); -} - -static __inline__ __attribute__((always_inline)) unsigned long long __rdtsc(void) -{ - unsigned long long retval; - __asm__ __volatile__("rdtsc" : "=A"(retval)); - return retval; -} - - -/*** Interrupts ***/ -static __inline__ __attribute__((always_inline)) void __debugbreak(void) -{ - __asm__("int $3"); -} - -static __inline__ __attribute__((always_inline)) void __int2c(void) -{ - __asm__("int $0x2c"); -} - -static __inline__ __attribute__((always_inline)) void _disable(void) -{ - __asm__("cli"); -} - -static __inline__ __attribute__((always_inline)) void _enable(void) -{ - __asm__("sti"); -} - - -/*** Protected memory management ***/ - -static __inline__ __attribute__((always_inline)) void __writecr0(const unsigned __int64 Data) -{ - __asm__("mov %[Data], %%cr0" : : [Data] "q" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __writecr3(const unsigned __int64 Data) -{ - __asm__("mov %[Data], %%cr3" : : [Data] "q" (Data) : "memory"); -} - -static __inline__ __attribute__((always_inline)) void __writecr4(const unsigned __int64 Data) -{ - __asm__("mov %[Data], %%cr4" : : [Data] "q" (Data) : "memory"); -} - -#ifdef _M_AMD64 -static __inline__ __attribute__((always_inline)) void __writecr8(const unsigned __int64 Data) -{ - __asm__("mov %[Data], %%cr8" : : [Data] "q" (Data) : "memory"); -} -#endif - -static __inline__ __attribute__((always_inline)) unsigned __int64 __readcr0(void) -{ - unsigned __int64 value; - __asm__ __volatile__("mov %%cr0, %[value]" : [value] "=q" (value)); - return value; -} - -static __inline__ __attribute__((always_inline)) unsigned __int64 __readcr2(void) -{ - unsigned __int64 value; - __asm__ __volatile__("mov %%cr2, %[value]" : [value] "=q" (value)); - return value; -} - -static __inline__ __attribute__((always_inline)) unsigned __int64 __readcr3(void) -{ - unsigned __int64 value; - __asm__ __volatile__("mov %%cr3, %[value]" : [value] "=q" (value)); - return value; -} - -static __inline__ __attribute__((always_inline)) unsigned __int64 __readcr4(void) -{ - unsigned __int64 value; - __asm__ __volatile__("mov %%cr4, %[value]" : [value] "=q" (value)); - return value; -} - -#ifdef _M_AMD64 -static __inline__ __attribute__((always_inline)) unsigned __int64 __readcr8(void) -{ - unsigned __int64 value; - __asm__ __volatile__("movq %%cr8, %q[value]" : [value] "=q" (value)); - return value; -} -#endif - -#ifdef _M_AMD64 -static __inline__ __attribute__((always_inline)) unsigned __int64 __readdr(unsigned int reg) -{ - unsigned __int64 value; - switch (reg) - { - case 0: - __asm__ __volatile__("movq %%dr0, %q[value]" : [value] "=q" (value)); - break; - case 1: - __asm__ __volatile__("movq %%dr1, %q[value]" : [value] "=q" (value)); - break; - case 2: - __asm__ __volatile__("movq %%dr2, %q[value]" : [value] "=q" (value)); - break; - case 3: - __asm__ __volatile__("movq %%dr3, %q[value]" : [value] "=q" (value)); - break; - case 4: - __asm__ __volatile__("movq %%dr4, %q[value]" : [value] "=q" (value)); - break; - case 5: - __asm__ __volatile__("movq %%dr5, %q[value]" : [value] "=q" (value)); - break; - case 6: - __asm__ __volatile__("movq %%dr6, %q[value]" : [value] "=q" (value)); - break; - case 7: - __asm__ __volatile__("movq %%dr7, %q[value]" : [value] "=q" (value)); - break; - } - return value; -} - -static __inline__ __attribute__((always_inline)) void __writedr(unsigned reg, unsigned __int64 value) -{ - switch (reg) - { - case 0: - __asm__("movq %q[value], %%dr0" : : [value] "q" (value) : "memory"); - break; - case 1: - __asm__("movq %q[value], %%dr1" : : [value] "q" (value) : "memory"); - break; - case 2: - __asm__("movq %q[value], %%dr2" : : [value] "q" (value) : "memory"); - break; - case 3: - __asm__("movq %q[value], %%dr3" : : [value] "q" (value) : "memory"); - break; - case 4: - __asm__("movq %q[value], %%dr4" : : [value] "q" (value) : "memory"); - break; - case 5: - __asm__("movq %q[value], %%dr5" : : [value] "q" (value) : "memory"); - break; - case 6: - __asm__("movq %q[value], %%dr6" : : [value] "q" (value) : "memory"); - break; - case 7: - __asm__("movq %q[value], %%dr7" : : [value] "q" (value) : "memory"); - break; - } -} -#endif - -static __inline__ __attribute__((always_inline)) void __invlpg(void * const Address) -{ - __asm__("invlpg %[Address]" : : [Address] "m" (*((unsigned char *)(Address)))); -} - - -/*** System operations ***/ -static __inline__ __attribute__((always_inline)) unsigned long long __readmsr(const int reg) -{ -#ifdef _M_AMD64 - unsigned long low, high; - __asm__ __volatile__("rdmsr" : "=a" (low), "=d" (high) : "c" (reg)); - return (high << 32) | low; -#else - unsigned long long retval; - __asm__ __volatile__("rdmsr" : "=A" (retval) : "c" (reg)); - return retval; -#endif -} - -static __inline__ __attribute__((always_inline)) void __writemsr(const unsigned long Register, const unsigned long long Value) -{ -#ifdef _M_AMD64 - __asm__ __volatile__("wrmsr" : : "a" (Value), "d" (Value >> 32), "c" (Register)); -#else - __asm__ __volatile__("wrmsr" : : "A" (Value), "c" (Register)); -#endif -} - -static __inline__ __attribute__((always_inline)) unsigned long long __readpmc(const int counter) -{ - unsigned long long retval; - __asm__ __volatile__("rdpmc" : "=A" (retval) : "c" (counter)); - return retval; -} - -/* NOTE: an immediate value for 'a' will raise an ICE in Visual C++ */ -static __inline__ __attribute__((always_inline)) unsigned long __segmentlimit(const unsigned long a) -{ - unsigned long retval; - __asm__ __volatile__("lsl %[a], %[retval]" : [retval] "=r" (retval) : [a] "rm" (a)); - return retval; -} - -static __inline__ __attribute__((always_inline)) void __wbinvd(void) -{ - __asm__ __volatile__("wbinvd"); -} - -static __inline__ __attribute__((always_inline)) void __lidt(void *Source) -{ - __asm__ __volatile__("lidt %0" : : "m"(*(short*)Source)); -} - -static __inline__ __attribute__((always_inline)) void __sidt(void *Destination) -{ - __asm__ __volatile__("sidt %0" : : "m"(*(short*)Destination) : "memory"); -} - -#endif /* KJK_INTRIN_X86_H_ */ - -/* EOF */
Removed: branches/the-real-msvc/include/psdk/intrin_x86_64.h URL: http://svn.reactos.org/svn/reactos/branches/the-real-msvc/include/psdk/intri... ============================================================================== --- branches/the-real-msvc/include/psdk/intrin_x86_64.h [iso-8859-1] (original) +++ branches/the-real-msvc/include/psdk/intrin_x86_64.h (removed) @@ -1,1 +1,0 @@ -
Modified: branches/the-real-msvc/tools/rbuild/backend/mingw/mingw.cpp URL: http://svn.reactos.org/svn/reactos/branches/the-real-msvc/tools/rbuild/backe... ============================================================================== --- branches/the-real-msvc/tools/rbuild/backend/mingw/mingw.cpp [iso-8859-1] (original) +++ branches/the-real-msvc/tools/rbuild/backend/mingw/mingw.cpp [iso-8859-1] Wed Oct 29 08:43:31 2008 @@ -497,7 +497,7 @@ fprintf ( fMakefile, "PROJECT_LFLAGS := '$(shell ${TARGET_CC} -print-libgcc-file-name)' %s\n", GenerateProjectLFLAGS ().c_str () ); fprintf ( fMakefile, "PROJECT_LPPFLAGS := '$(shell ${TARGET_CPP} -print-file-name=libstdc++.a)' '$(shell ${TARGET_CPP} -print-file-name=libgcc.a)' '$(shell ${TARGET_CPP} -print-file-name=libmingw32.a)' '$(shell ${TARGET_CPP} -print-file-name=libmingwex.a)'\n" ); //~ fprintf ( fMakefile, "PROJECT_CFLAGS += -Wall\n" ); - fprintf ( fMakefile, "PROJECT_CFLAGS += -Wall -W4 -wd4820 -wd4214 -wd4201 -wd4668 -wd4255 -wd4005 -wd4127 -wd4710 -wd4711 -wd4100 -wd4738 -wd4706\n" ); + fprintf ( fMakefile, "PROJECT_CFLAGS += -Wall -W4 -wd4820 -wd4214 -wd4201 -wd4668 -wd4255 -wd4005 -wd4127 -wd4710 -wd4711 -wd4100 -wd4738 -wd4706 -wd4245 -wd4242 -wd4244 -wd4152 -wd4717 -wd4273 -wd4018 -wd4204 -wd4054 -wd4055 -wd4514\n" ); //~ fprintf ( fMakefile, "ifneq ($(OARCH),)\n" ); //~ fprintf ( fMakefile, "PROJECT_CFLAGS += -march=$(OARCH)\n" ); //~ fprintf ( fMakefile, "endif\n" );
Modified: branches/the-real-msvc/tools/rbuild/backend/mingw/modulehandler.cpp URL: http://svn.reactos.org/svn/reactos/branches/the-real-msvc/tools/rbuild/backe... ============================================================================== --- branches/the-real-msvc/tools/rbuild/backend/mingw/modulehandler.cpp [iso-8859-1] (original) +++ branches/the-real-msvc/tools/rbuild/backend/mingw/modulehandler.cpp [iso-8859-1] Wed Oct 29 08:43:31 2008 @@ -1904,8 +1904,8 @@ if ( !module.allowWarnings ) globalCflags += " -WX";
- globalCflags += " -Zl -MD"; - globalCflags += " -D__MSVCRT__ -D__MINGW_IMPORT=__declspec(dllimport)"; + globalCflags += " -X -Zl -MT"; + globalCflags += " -D__MSVCRT__ -D__MINGW_IMPORT=__declspec(dllimport) -Dinline=__inline"; globalCflags += " -D_CRT_SECURE_NO_WARNINGS"; globalCflags += " -D_CRT_NON_CONFORMING_SWPRINTFS"; }