Introduce the method fullIntArgRegMask()
authorBrian Sullivan <briansul@microsoft.com>
Wed, 22 Jun 2016 21:36:45 +0000 (14:36 -0700)
committerBrian Sullivan <briansul@microsoft.com>
Thu, 23 Jun 2016 00:29:04 +0000 (17:29 -0700)
This method returns the full integer argument register mask
that also include the fixed return buffer argument register.

src/jit/codegenarm.cpp
src/jit/codegenarm64.cpp
src/jit/codegenxarch.cpp
src/jit/compiler.hpp
src/jit/target.h

index caabf1f..419c7a2 100644 (file)
@@ -1609,7 +1609,7 @@ CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
         break;
 
     case GT_PINVOKE_PROLOG:
-        noway_assert(((gcInfo.gcRegGCrefSetCur|gcInfo.gcRegByrefSetCur) & ~RBM_ARG_REGS) == 0);
+        noway_assert(((gcInfo.gcRegGCrefSetCur|gcInfo.gcRegByrefSetCur) & ~fullIntArgRegMask()) == 0);
 
         // the runtime side requires the codegen here to be consistent
         emit->emitDisableRandomNops();
index 4f15fe3..e02e922 100644 (file)
@@ -3271,7 +3271,7 @@ CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
         break;
 
     case GT_PINVOKE_PROLOG:
-        noway_assert(((gcInfo.gcRegGCrefSetCur|gcInfo.gcRegByrefSetCur) & ~RBM_ARG_REGS) == 0);
+        noway_assert(((gcInfo.gcRegGCrefSetCur|gcInfo.gcRegByrefSetCur) & ~fullIntArgRegMask()) == 0);
 
         // the runtime side requires the codegen here to be consistent
         emit->emitDisableRandomNops();
index 84803f0..af23298 100755 (executable)
@@ -2640,7 +2640,7 @@ CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
 #endif
 
     case GT_PINVOKE_PROLOG:
-        noway_assert(((gcInfo.gcRegGCrefSetCur|gcInfo.gcRegByrefSetCur) & ~RBM_ARG_REGS) == 0);
+        noway_assert(((gcInfo.gcRegGCrefSetCur|gcInfo.gcRegByrefSetCur) & ~fullIntArgRegMask()) == 0);
 
         // the runtime side requires the codegen here to be consistent
         emit->emitDisableRandomNops();
index fd0154d..6a45f9c 100644 (file)
@@ -3243,14 +3243,7 @@ __forceinline regMaskTP genMapArgNumToRegMask(unsigned argNum, var_types type)
 inline
 unsigned           genMapIntRegNumToRegArgNum(regNumber regNum)
 {
-    // First check for the Arm64 fixed return buffer argument register
-    // as it is not in the RBM_ARG_REGS set of registers
-    if (hasFixedRetBuffReg() && (regNum == theFixedRetBuffReg()))
-    {
-        return theFixedRetBuffArgNum();
-    }
-
-    assert (genRegMask(regNum) & RBM_ARG_REGS);
+    assert(genRegMask(regNum) & fullIntArgRegMask());
 
     switch (regNum)
     {
@@ -3277,8 +3270,16 @@ unsigned           genMapIntRegNumToRegArgNum(regNumber regNum)
 #endif
 #endif
     default: 
-        assert(!"invalid register arg register"); 
-        return BAD_VAR_NUM;
+        // Check for the Arm64 fixed return buffer argument register
+        if (hasFixedRetBuffReg() && (regNum == theFixedRetBuffReg()))
+        {
+            return theFixedRetBuffArgNum();
+        }
+        else
+        {
+            assert(!"invalid register arg register");
+            return BAD_VAR_NUM;
+        }
     }
 }
 
index 49ebc4b..4896348 100644 (file)
@@ -1919,6 +1919,20 @@ inline regNumber    theFixedRetBuffReg()
 }
 
 //-------------------------------------------------------------------------------------------
+// theFixedRetBuffMask: 
+//     Returns the regNumber to use for the fixed return buffer 
+// 
+inline regMaskTP    theFixedRetBuffMask()
+{
+    assert(hasFixedRetBuffReg());   // This predicate should be checked before calling this method
+#ifdef _TARGET_ARM64_
+    return RBM_ARG_RET_BUFF;
+#else
+    return 0;
+#endif
+}
+
+//-------------------------------------------------------------------------------------------
 // theFixedRetBuffArgNum: 
 //     Returns the argNum to use for the fixed return buffer 
 // 
@@ -1933,17 +1947,30 @@ inline unsigned     theFixedRetBuffArgNum()
 }
 
 //-------------------------------------------------------------------------------------------
+// fullIntArgRegMask: 
+//     Returns the full mask of all possible integer registers
+//     Note this includes the fixed return buffer register on Arm64 
+//
+inline regMaskTP       fullIntArgRegMask()
+{    
+    if (hasFixedRetBuffReg())
+    {
+        return RBM_ARG_REGS | theFixedRetBuffMask();
+    }
+    else
+    {
+        return RBM_ARG_REGS;
+    }    
+}
+
+//-------------------------------------------------------------------------------------------
 // isValidIntArgReg: 
 //     Returns true if the register is a valid integer argument register 
 //     Note this method also returns true on Arm64 when 'reg' is the RetBuff register 
 //
 inline bool         isValidIntArgReg(regNumber reg)
 {
-    if (hasFixedRetBuffReg() && (reg == theFixedRetBuffReg()))
-    {
-        return true;
-    }
-    return (genRegMask(reg) & RBM_ARG_REGS) != 0;
+    return (genRegMask(reg) & fullIntArgRegMask()) != 0;
 }
 
 //-------------------------------------------------------------------------------------------