| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8664.cpp - x86-64 lowering -----------===// | 1 //===- subzero/src/IceTargetLoweringX8664.cpp - x86-64 lowering -----------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 Traits::X86_RET_IP_SIZE_BYTES + PreservedRegsSizeBytes; | 505 Traits::X86_RET_IP_SIZE_BYTES + PreservedRegsSizeBytes; |
| 506 uint32_t StackSize = | 506 uint32_t StackSize = |
| 507 Traits::applyStackAlignment(StackOffset + SpillAreaSizeBytes); | 507 Traits::applyStackAlignment(StackOffset + SpillAreaSizeBytes); |
| 508 SpillAreaSizeBytes = StackSize - StackOffset; | 508 SpillAreaSizeBytes = StackSize - StackOffset; |
| 509 } | 509 } |
| 510 | 510 |
| 511 // Generate "sub esp, SpillAreaSizeBytes" | 511 // Generate "sub esp, SpillAreaSizeBytes" |
| 512 if (SpillAreaSizeBytes) | 512 if (SpillAreaSizeBytes) |
| 513 _sub(getPhysicalRegister(Traits::RegisterSet::Reg_esp), | 513 _sub(getPhysicalRegister(Traits::RegisterSet::Reg_esp), |
| 514 Ctx->getConstantInt32(SpillAreaSizeBytes)); | 514 Ctx->getConstantInt32(SpillAreaSizeBytes)); |
| 515 |
| 516 // Account for alloca instructions with known frame offsets. |
| 517 SpillAreaSizeBytes += FixedAllocaSizeBytes; |
| 518 |
| 515 Ctx->statsUpdateFrameBytes(SpillAreaSizeBytes); | 519 Ctx->statsUpdateFrameBytes(SpillAreaSizeBytes); |
| 516 | 520 |
| 521 // Initialize the stack adjustment so that after all the known-frame-offset |
| 522 // alloca instructions are emitted, the stack adjustment will reach zero. |
| 517 resetStackAdjustment(); | 523 resetStackAdjustment(); |
| 524 updateStackAdjustment(-FixedAllocaSizeBytes); |
| 518 | 525 |
| 519 // Fill in stack offsets for stack args, and copy args into registers for | 526 // Fill in stack offsets for stack args, and copy args into registers for |
| 520 // those that were register-allocated. Args are pushed right to left, so | 527 // those that were register-allocated. Args are pushed right to left, so |
| 521 // Arg[0] is closest to the stack/frame pointer. | 528 // Arg[0] is closest to the stack/frame pointer. |
| 522 Variable *FramePtr = getPhysicalRegister(getFrameOrStackReg()); | 529 Variable *FramePtr = getPhysicalRegister(getFrameOrStackReg()); |
| 523 size_t BasicFrameOffset = | 530 size_t BasicFrameOffset = |
| 524 PreservedRegsSizeBytes + Traits::X86_RET_IP_SIZE_BYTES; | 531 PreservedRegsSizeBytes + Traits::X86_RET_IP_SIZE_BYTES; |
| 525 if (!IsEbpBasedFrame) | 532 if (!IsEbpBasedFrame) |
| 526 BasicFrameOffset += SpillAreaSizeBytes; | 533 BasicFrameOffset += SpillAreaSizeBytes; |
| 527 | 534 |
| 528 const VarList &Args = Func->getArgs(); | 535 const VarList &Args = Func->getArgs(); |
| 529 size_t InArgsSizeBytes = 0; | 536 size_t InArgsSizeBytes = 0; |
| 530 unsigned NumXmmArgs = 0; | 537 unsigned NumXmmArgs = 0; |
| 531 unsigned NumGPRArgs = 0; | 538 unsigned NumGPRArgs = 0; |
| 532 for (Variable *Arg : Args) { | 539 for (Variable *Arg : Args) { |
| 533 // Skip arguments passed in registers. | 540 // Skip arguments passed in registers. |
| 534 if (isVectorType(Arg->getType()) || isScalarFloatingType(Arg->getType())) { | 541 if (isVectorType(Arg->getType()) || isScalarFloatingType(Arg->getType())) { |
| 535 if (NumXmmArgs < Traits::X86_MAX_XMM_ARGS) { | 542 if (NumXmmArgs < Traits::X86_MAX_XMM_ARGS) { |
| 536 ++NumXmmArgs; | 543 ++NumXmmArgs; |
| 537 continue; | 544 continue; |
| 538 } | 545 } |
| 539 } else { | 546 } else { |
| 540 assert(isScalarIntegerType(Arg->getType())); | 547 assert(isScalarIntegerType(Arg->getType())); |
| 541 if (NumGPRArgs < Traits::X86_MAX_GPR_ARGS) { | 548 if (NumGPRArgs < Traits::X86_MAX_GPR_ARGS) { |
| 542 ++NumGPRArgs; | 549 ++NumGPRArgs; |
| 543 continue; | 550 continue; |
| 544 } | 551 } |
| 545 } | 552 } |
| 546 finishArgumentLowering(Arg, FramePtr, BasicFrameOffset, InArgsSizeBytes); | 553 // For esp-based frames, the esp value may not stabilize to its home value |
| 554 // until after all the fixed-size alloca instructions have executed. In |
| 555 // this case, a stack adjustment is needed when accessing in-args in order |
| 556 // to copy them into registers. |
| 557 size_t StackAdjBytes = IsEbpBasedFrame ? 0 : -FixedAllocaSizeBytes; |
| 558 finishArgumentLowering(Arg, FramePtr, BasicFrameOffset, StackAdjBytes, |
| 559 InArgsSizeBytes); |
| 547 } | 560 } |
| 548 | 561 |
| 549 // Fill in stack offsets for locals. | 562 // Fill in stack offsets for locals. |
| 550 assignVarStackSlots(SortedSpilledVariables, SpillAreaPaddingBytes, | 563 assignVarStackSlots(SortedSpilledVariables, SpillAreaPaddingBytes, |
| 551 SpillAreaSizeBytes, GlobalsAndSubsequentPaddingSize, | 564 SpillAreaSizeBytes, GlobalsAndSubsequentPaddingSize, |
| 552 IsEbpBasedFrame); | 565 IsEbpBasedFrame); |
| 553 // Assign stack offsets to variables that have been linked to spilled | 566 // Assign stack offsets to variables that have been linked to spilled |
| 554 // variables. | 567 // variables. |
| 555 for (Variable *Var : VariablesLinkedToSpillSlots) { | 568 for (Variable *Var : VariablesLinkedToSpillSlots) { |
| 556 Variable *Linked = | 569 Variable *Linked = |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 944 // case the high-level table has extra entries. | 957 // case the high-level table has extra entries. |
| 945 #define X(tag, sizeLog2, align, elts, elty, str) \ | 958 #define X(tag, sizeLog2, align, elts, elty, str) \ |
| 946 static_assert(_table1_##tag == _table2_##tag, \ | 959 static_assert(_table1_##tag == _table2_##tag, \ |
| 947 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE"); | 960 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE"); |
| 948 ICETYPE_TABLE | 961 ICETYPE_TABLE |
| 949 #undef X | 962 #undef X |
| 950 } // end of namespace dummy3 | 963 } // end of namespace dummy3 |
| 951 } // end of anonymous namespace | 964 } // end of anonymous namespace |
| 952 | 965 |
| 953 } // end of namespace Ice | 966 } // end of namespace Ice |
| OLD | NEW |