[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] 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 <jbeulich@xxxxxxxx>

--- 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() )
         {



Attachment: x86emul-flag-outputs.patch
Description: Text document

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.