Пример #1
0
 internal void ClearCalleeSaves()
 {
     EBX.ClearCalleeReg();
     ESI.ClearCalleeReg();
     EDI.ClearCalleeReg();
     EBP.ClearCalleeReg();
 }
Пример #2
0
 void SetCalleeSaves(CalleeSaveRegistersX86 *calleeSaveRegisters)
 {
     EBX.SetCalleeReg(&calleeSaveRegisters->EBX);
     EDI.SetCalleeReg(&calleeSaveRegisters->EDI);
     ESI.SetCalleeReg(&calleeSaveRegisters->ESI);
     EBP.SetCalleeReg(&calleeSaveRegisters->EBP);
 }
Пример #3
0
 internal void SetCalleeSaves(SpillContext *context)
 {
     EBX.SetCalleeReg(&context->ebx);
     EDI.SetCalleeReg(&context->edi);
     ESI.SetCalleeReg(&context->esi);
     EBP.SetCalleeReg(&context->ebp);
 }
Пример #4
0
 internal void ClearFrame(UIntPtr calleeSaveMask,
                          bool framePointerOmitted)
 {
     if (!framePointerOmitted)
     {
         VTable.Assert((calleeSaveMask & 0x10) == 0,
                       "EBP should not be callee saved");
         EBP.ClearFrameReg();
     }
     if ((calleeSaveMask & 0x1) != 0)
     {
         EBX.ClearFrameReg();
     }
     if ((calleeSaveMask & 0x8) != 0)
     {
         EBP.ClearFrameReg();
     }
     if ((calleeSaveMask & 0x4) != 0)
     {
         ESI.ClearFrameReg();
     }
     if ((calleeSaveMask & 0x2) != 0)
     {
         EDI.ClearFrameReg();
     }
 }
Пример #5
0
 internal void ScanLiveRegs(UIntPtr mask,
                            NonNullReferenceVisitor referenceVisitor)
 {
     EDI.ScanLiveReg((mask >> 2) & 0x3, referenceVisitor);
     ESI.ScanLiveReg((mask >> 4) & 0x3, referenceVisitor);
     EBX.ScanLiveReg((mask >> 0) & 0x3, referenceVisitor);
     EBP.ScanLiveReg((mask >> 6) & 0x3, referenceVisitor);
 }
Пример #6
0
        internal void PopFrame(UIntPtr *framePointer,
                               UIntPtr calleeSaveMask,
                               bool framePointerOmitted,
                               bool hasTransitionRecord)
        {
            UIntPtr *calleeSaveStart;

            if (framePointerOmitted)
            {
                calleeSaveStart = framePointer - 1;
            }
            else
            {
                VTable.Assert((calleeSaveMask & 0x100) == 0,
                              "EBP should not be callee saved");
                calleeSaveStart = framePointer;
                EBP.PopFrameReg(ref calleeSaveStart);
            }
            if (hasTransitionRecord)
            {
                calleeSaveStart -=
                    sizeof(CallStack.TransitionRecord) / sizeof(UIntPtr);
            }

            // Note: the order in which these appear is important!
            if ((calleeSaveMask & 0x1) != 0)
            {
                EBX.PopFrameReg(ref calleeSaveStart);
            }
            if ((calleeSaveMask & 0x80) != 0)
            {
                EBP.PopFrameReg(ref calleeSaveStart);
            }
            if ((calleeSaveMask & 0x4) != 0)
            {
                ESI.PopFrameReg(ref calleeSaveStart);
            }
            if ((calleeSaveMask & 0x2) != 0)
            {
                EDI.PopFrameReg(ref calleeSaveStart);
            }
            if ((calleeSaveMask & 0x8) != 0)
            {
                R12.PopFrameReg(ref calleeSaveStart);
            }
            if ((calleeSaveMask & 0x10) != 0)
            {
                R13.PopFrameReg(ref calleeSaveStart);
            }
            if ((calleeSaveMask & 0x20) != 0)
            {
                R14.PopFrameReg(ref calleeSaveStart);
            }
            if ((calleeSaveMask & 0x40) != 0)
            {
                R15.PopFrameReg(ref calleeSaveStart);
            }
        }
Пример #7
0
 internal void ClearCalleeSaves()
 {
     EBX.ClearCalleeReg();
     ESI.ClearCalleeReg();
     EDI.ClearCalleeReg();
     EBP.ClearCalleeReg();
     R12.ClearCalleeReg();
     R13.ClearCalleeReg();
     R14.ClearCalleeReg();
     R15.ClearCalleeReg();
 }
Пример #8
0
 void SetCalleeSaves(CalleeSaveRegistersX64 *calleeSaveRegisters)
 {
     EBX.SetCalleeReg(&calleeSaveRegisters->EBX);
     EDI.SetCalleeReg(&calleeSaveRegisters->EDI);
     ESI.SetCalleeReg(&calleeSaveRegisters->ESI);
     EBP.SetCalleeReg(&calleeSaveRegisters->EBP);
     R12.SetCalleeReg(&calleeSaveRegisters->R12);
     R13.SetCalleeReg(&calleeSaveRegisters->R13);
     R14.SetCalleeReg(&calleeSaveRegisters->R14);
     R15.SetCalleeReg(&calleeSaveRegisters->R15);
 }
Пример #9
0
 internal void SetCalleeSaves(SpillContext *context)
 {
     EBX.SetCalleeReg(&context->bx);
     EDI.SetCalleeReg(&context->di);
     ESI.SetCalleeReg(&context->si);
     EBP.SetCalleeReg(&context->bp);
     R12.SetCalleeReg(&context->r12);
     R13.SetCalleeReg(&context->r13);
     R14.SetCalleeReg(&context->r14);
     R15.SetCalleeReg(&context->r15);
 }