While the bug was definately on our side, I still think there is a GCC/CLANG bug here as well. Memory operands larger than register size are a rare case (probably limited to the bittest instructions) but allowing a register operand here should cause the compiler to either error out or in the worst case emit something like "mov eax, [BaseAddress]; bt eax, cl;" or "mov eax, [PointerToBaseAddress]; mov eax, [eax]; bt eax, cl;" rather than "bt [PointerToBaseAddress], cl;", which it actually did. Changing the constraint to something that wasn't working changed the behaviour in a way that changed the level of dereference! The operation was done on the pointer instead of on the memory pointed to by the pointer! Maybe we should file a bugreport.
Am 20.02.2014 20:28, schrieb [email protected]: > Author: tfaber > Date: Thu Feb 20 19:28:27 2014 > New Revision: 62266 > > URL: http://svn.reactos.org/svn/reactos?rev=62266&view=rev > Log: > [CRT] > - Force the use of memory operands in bit test intrinsics. Bit offsets above > 31 (or 63) can't behave correctly with registers (the constant case is fine > because it ensures low offsets). Thanks to Timo Kreuzer and Alex Radocea. > > 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_x86.h?rev=62266&r1=62265&r2=62266&view=diff > ============================================================================== > --- trunk/reactos/include/crt/mingw32/intrin_x86.h [iso-8859-1] (original) > +++ trunk/reactos/include/crt/mingw32/intrin_x86.h [iso-8859-1] Thu Feb 20 > 19:28:27 2014 > @@ -1032,7 +1032,7 @@ > 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)); > + __asm__("bt %[b], %[a]; setb %b[retval]" : [retval] "=q" > (retval) : [a] "m" (*a), [b] "r" (b)); > > return retval; > } > @@ -1045,7 +1045,7 @@ > 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)); > + __asm__("bt %[b], %[a]; setb %b[retval]" : [retval] "=q" > (retval) : [a] "m" (*a), [b] "r" (b)); > > return retval; > } > @@ -1058,7 +1058,7 @@ > if(__builtin_constant_p(b)) > __asm__("btc %[b], %[a]; setb %b[retval]" : [a] "+mr" (*(a + (b > / 32))), [retval] "=q" (retval) : [b] "Ir" (b % 32)); > else > - __asm__("btc %[b], %[a]; setb %b[retval]" : [a] "+mr" (*a), > [retval] "=q" (retval) : [b] "r" (b)); > + __asm__("btc %[b], %[a]; setb %b[retval]" : [a] "+m" (*a), > [retval] "=q" (retval) : [b] "r" (b)); > > return retval; > } > @@ -1070,7 +1070,7 @@ > if(__builtin_constant_p(b)) > __asm__("btr %[b], %[a]; setb %b[retval]" : [a] "+mr" (*(a + (b > / 32))), [retval] "=q" (retval) : [b] "Ir" (b % 32)); > else > - __asm__("btr %[b], %[a]; setb %b[retval]" : [a] "+mr" (*a), > [retval] "=q" (retval) : [b] "r" (b)); > + __asm__("btr %[b], %[a]; setb %b[retval]" : [a] "+m" (*a), > [retval] "=q" (retval) : [b] "r" (b)); > > return retval; > } > @@ -1082,7 +1082,7 @@ > if(__builtin_constant_p(b)) > __asm__("bts %[b], %[a]; setb %b[retval]" : [a] "+mr" (*(a + (b > / 32))), [retval] "=q" (retval) : [b] "Ir" (b % 32)); > else > - __asm__("bts %[b], %[a]; setb %b[retval]" : [a] "+mr" (*a), > [retval] "=q" (retval) : [b] "r" (b)); > + __asm__("bts %[b], %[a]; setb %b[retval]" : [a] "+m" (*a), > [retval] "=q" (retval) : [b] "r" (b)); > > return retval; > } > > > _______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev
