From: John Wolfe Date: Fri, 9 Jul 2021 03:10:23 +0000 (-0700) Subject: Common header file change not directly applicable to open-vm-tools. X-Git-Tag: stable-12.0.0~148 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e6ff175716602a91fa1385c30846961c57d089f2;p=thirdparty%2Fopen-vm-tools.git Common header file change not directly applicable to open-vm-tools. --- diff --git a/open-vm-tools/lib/include/vm_basic_asm.h b/open-vm-tools/lib/include/vm_basic_asm.h index bd651d2fc..f9520a3b2 100644 --- a/open-vm-tools/lib/include/vm_basic_asm.h +++ b/open-vm-tools/lib/include/vm_basic_asm.h @@ -910,18 +910,27 @@ TestBit64(const uint64 *var, unsigned index) *----------------------------------------------------------------------------- */ +#if defined __GCC_ASM_FLAG_OUTPUTS__ +/* + * See https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html + * 6.47.2.4 Flag Output Operands + * + * This expands to 0 or 1 instructions followed by the output operand string. + */ +#define GCC_ASM_BT_EPILOG : "=@ccc" +#else +#define GCC_ASM_BT_EPILOG "\n\tsetc\t%0" : "=qQm" +#endif + static INLINE Bool SetBitVector(void *var, int32 index) { #if defined(__GNUC__) && defined(VM_X86_ANY) Bool bit; - __asm__ ( - "bts %2, %1;" - "setc %0" - : "=qQm" (bit), "+m" (*(uint32 *)var) - : "rI" (index) - : "memory", "cc" - ); + __asm__("bts\t%2, %1" + GCC_ASM_BT_EPILOG (bit), "+m" (*(uint32 *)var) + : "rI" (index) + : "memory", "cc"); return bit; #elif defined(_MSC_VER) return _bittestandset((long *)var, index) != 0; @@ -937,13 +946,10 @@ ClearBitVector(void *var, int32 index) { #if defined(__GNUC__) && defined(VM_X86_ANY) Bool bit; - __asm__ ( - "btr %2, %1;" - "setc %0" - : "=qQm" (bit), "+m" (*(uint32 *)var) - : "rI" (index) - : "memory", "cc" - ); + __asm__("btr\t%2, %1" + GCC_ASM_BT_EPILOG (bit), "+m" (*(uint32 *)var) + : "rI" (index) + : "memory", "cc"); return bit; #elif defined(_MSC_VER) return _bittestandreset((long *)var, index) != 0; @@ -959,13 +965,10 @@ ComplementBitVector(void *var, int32 index) { #if defined(__GNUC__) && defined(VM_X86_ANY) Bool bit; - __asm__ ( - "btc %2, %1;" - "setc %0" - : "=qQm" (bit), "+m" (*(uint32 *)var) - : "rI" (index) - : "memory", "cc" - ); + __asm__("btc\t%2, %1" + GCC_ASM_BT_EPILOG (bit), "+m" (*(uint32 *)var) + : "rI" (index) + : "memory", "cc"); return bit; #elif defined(_MSC_VER) return _bittestandcomplement((long *)var, index) != 0; @@ -981,13 +984,10 @@ TestBitVector(const void *var, int32 index) { #if defined(__GNUC__) && defined(VM_X86_ANY) Bool bit; - __asm__ ( - "bt %2, %1;" - "setc %0" - : "=qQm" (bit) - : "m" (*(const uint32 *)var), "rI" (index) - : "cc" - ); + __asm__("bt\t%2, %1" + GCC_ASM_BT_EPILOG (bit) + : "m" (*(const uint32 *)var), "rI" (index) + : "cc"); return bit; #elif defined _MSC_VER return _bittest((long *)var, index) != 0; @@ -996,6 +996,7 @@ TestBitVector(const void *var, int32 index) #endif } +#undef GCC_ASM_BT_EPILOG /* *-----------------------------------------------------------------------------