Fix floatingpoint register offsets in TransitionBlock for Unix
authorJan Vorlicek <janvorli@microsoft.com>
Thu, 22 Oct 2015 17:55:02 +0000 (10:55 -0700)
committerJan Vorlicek <janvorli@microsoft.com>
Thu, 22 Oct 2015 17:55:02 +0000 (10:55 -0700)
The conversion between floating point register index and offset was incorrectly
multiplying the the index by 8 instead of 16. The xmm registers in the
TransitionBlock on Unix take 16 bytes each, not 8.

Commit migrated from https://github.com/dotnet/coreclr/commit/c13593b553ca78c6a94a2523e8f8549031077b60

src/coreclr/src/vm/argdestination.h
src/coreclr/src/vm/callingconvention.h

index 5896414..7837e51 100644 (file)
@@ -57,7 +57,7 @@ public:
     {
         LIMITED_METHOD_CONTRACT;
         _ASSERTE(IsStructPassedInRegs());
-        int offset = TransitionBlock::GetOffsetOfFloatArgumentRegisters() + m_argLocDescForStructInRegs->m_idxFloatReg * 8;
+        int offset = TransitionBlock::GetOffsetOfFloatArgumentRegisters() + m_argLocDescForStructInRegs->m_idxFloatReg * 16;
         return dac_cast<PTR_VOID>(dac_cast<TADDR>(m_base) + offset);
     }
 
index 490ae3c..f382f50 100644 (file)
@@ -611,7 +611,7 @@ public:
         if (TransitionBlock::IsFloatArgumentRegisterOffset(argOffset))
         {
             // Dividing by 8 as size of each register in FloatArgumentRegisters is 8 bytes.
-            pLoc->m_idxFloatReg = (argOffset - TransitionBlock::GetOffsetOfFloatArgumentRegisters()) / 8;
+            pLoc->m_idxFloatReg = (argOffset - TransitionBlock::GetOffsetOfFloatArgumentRegisters()) / 16;
             pLoc->m_cFloatReg = 1;
         }
         else if (!TransitionBlock::IsStackArgumentOffset(argOffset))
@@ -1032,7 +1032,7 @@ int ArgIteratorTemplate<ARGITERATOR_BASE>::GetNextOffset()
 
     if ((cFPRegs > 0) && (cFPRegs + m_idxFPReg <= NUM_FLOAT_ARGUMENT_REGISTERS))
     {
-        int argOfs = TransitionBlock::GetOffsetOfFloatArgumentRegisters() + m_idxFPReg * 8;
+        int argOfs = TransitionBlock::GetOffsetOfFloatArgumentRegisters() + m_idxFPReg * 16;
         m_idxFPReg += cFPRegs;
         return argOfs;
     }