From: Nikita Popov Date: Mon, 18 Mar 2019 09:12:15 +0000 (+0100) Subject: Remove x86 bit test optimization X-Git-Tag: php-7.3.4RC1~12 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c4464526cd8c7ef246ea4be145d798e084460d9d;p=php Remove x86 bit test optimization This is undefined behavior and we cannot rely on it. Additionally it breaks builds using undefined behavior sanitizers. --- diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h index 12e99b74d8..301032d8c3 100644 --- a/Zend/zend_portability.h +++ b/Zend/zend_portability.h @@ -440,12 +440,8 @@ char *alloca(); #define MAX(a, b) (((a)>(b))?(a):(b)) #define MIN(a, b) (((a)<(b))?(a):(b)) -/* x86 instructions BT, SHL, SHR don't require masking */ -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) || defined(ZEND_WIN32) -# define ZEND_BIT_TEST(bits, bit) (((bits)[(bit) / (sizeof((bits)[0])*8)] >> (bit)) & 1) -#else -# define ZEND_BIT_TEST(bits, bit) (((bits)[(bit) / (sizeof((bits)[0])*8)] >> ((bit) & (sizeof((bits)[0])*8-1))) & 1) -#endif +#define ZEND_BIT_TEST(bits, bit) \ + (((bits)[(bit) / (sizeof((bits)[0])*8)] >> ((bit) & (sizeof((bits)[0])*8-1))) & 1) /* We always define a function, even if there's a macro or expression we could * alias, so that using it in contexts where we can't make function calls