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

Reply via email to