x86emul: abstract gcc asm() flag output handling Let's try to limit #ifdef-ery, or else more of these would need to appear later. Signed-off-by: Jan Beulich --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -404,6 +404,12 @@ typedef union { (void *)((long)(__##var + __alignof(type) - __alignof(long)) \ & -__alignof(type)) +#ifdef __GCC_ASM_FLAG_OUTPUTS__ +# define ASM_FLAG_OUT(yes, no) yes +#else +# define ASM_FLAG_OUT(yes, no) no +#endif + /* MSRs. */ #define MSR_TSC 0x00000010 #define MSR_SYSENTER_CS 0x00000174 @@ -694,11 +700,8 @@ static inline int mkec(uint8_t e, int32_ */ static bool even_parity(uint8_t v) { -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "test %1,%1" : "=@ccp" (v) : "q" (v) ); -#else - asm ( "test %1,%1; setp %0" : "=qm" (v) : "q" (v) ); -#endif + asm ( "test %1,%1" ASM_FLAG_OUT(, "; setp %0") + : ASM_FLAG_OUT("=@ccp", "=qm") (v) : "q" (v) ); return v; } @@ -985,12 +988,8 @@ static bool mul_dbl(unsigned long m[2]) { bool rc; -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "mul %1" : "+a" (m[0]), "+d" (m[1]), "=@cco" (rc) ); -#else - asm ( "mul %1; seto %2" - : "+a" (m[0]), "+d" (m[1]), "=qm" (rc) ); -#endif + asm ( "mul %1" ASM_FLAG_OUT(, "; seto %2") + : "+a" (m[0]), "+d" (m[1]), ASM_FLAG_OUT("=@cco", "=qm") (rc) ); return rc; } @@ -1004,12 +1003,8 @@ static bool imul_dbl(unsigned long m[2]) { bool rc; -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "imul %1" : "+a" (m[0]), "+d" (m[1]), "=@cco" (rc) ); -#else - asm ( "imul %1; seto %2" - : "+a" (m[0]), "+d" (m[1]), "=qm" (rc) ); -#endif + asm ( "imul %1" ASM_FLAG_OUT(, "; seto %2") + : "+a" (m[0]), "+d" (m[1]), ASM_FLAG_OUT("=@cco", "=qm") (rc) ); return rc; } @@ -5190,15 +5185,9 @@ x86_emulate( { bool zf; -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "bsf %2,%0" - : "=r" (dst.val), "=@ccz" (zf) - : "rm" (src.val) ); -#else - asm ( "bsf %2,%0; setz %1" - : "=r" (dst.val), "=qm" (zf) + asm ( "bsf %2,%0" ASM_FLAG_OUT(, "; setz %1") + : "=r" (dst.val), ASM_FLAG_OUT("=@ccz", "=qm") (zf) : "rm" (src.val) ); -#endif _regs.eflags &= ~EFLG_ZF; if ( (vex.pfx == vex_f3) && vcpu_has_bmi1() ) { @@ -5223,15 +5212,9 @@ x86_emulate( { bool zf; -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "bsr %2,%0" - : "=r" (dst.val), "=@ccz" (zf) + asm ( "bsr %2,%0" ASM_FLAG_OUT(, "; setz %1") + : "=r" (dst.val), ASM_FLAG_OUT("=@ccz", "=qm") (zf) : "rm" (src.val) ); -#else - asm ( "bsr %2,%0; setz %1" - : "=r" (dst.val), "=qm" (zf) - : "rm" (src.val) ); -#endif _regs.eflags &= ~EFLG_ZF; if ( (vex.pfx == vex_f3) && vcpu_has_lzcnt() ) {