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 18 matching lines...) Expand all Loading... |
29 } | 29 } |
30 | 30 |
31 std::unique_ptr<::Ice::TargetHeaderLowering> | 31 std::unique_ptr<::Ice::TargetHeaderLowering> |
32 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { | 32 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { |
33 return ::Ice::X8664::TargetHeaderX86::create(Ctx); | 33 return ::Ice::X8664::TargetHeaderX86::create(Ctx); |
34 } | 34 } |
35 | 35 |
36 void staticInit(::Ice::GlobalContext *Ctx) { | 36 void staticInit(::Ice::GlobalContext *Ctx) { |
37 ::Ice::X8664::TargetX8664::staticInit(Ctx); | 37 ::Ice::X8664::TargetX8664::staticInit(Ctx); |
38 } | 38 } |
| 39 |
| 40 bool shouldBePooled(const class ::Ice::Constant *C) { |
| 41 return ::Ice::X8664::TargetX8664::shouldBePooled(C); |
| 42 } |
| 43 |
39 } // end of namespace X8664 | 44 } // end of namespace X8664 |
40 | 45 |
41 namespace Ice { | 46 namespace Ice { |
42 namespace X8664 { | 47 namespace X8664 { |
43 | 48 |
44 //------------------------------------------------------------------------------ | 49 //------------------------------------------------------------------------------ |
45 // ______ ______ ______ __ ______ ______ | 50 // ______ ______ ______ __ ______ ______ |
46 // /\__ _\ /\ == \ /\ __ \ /\ \ /\__ _\ /\ ___\ | 51 // /\__ _\ /\ == \ /\ __ \ /\ \ /\__ _\ /\ ___\ |
47 // \/_/\ \/ \ \ __< \ \ __ \ \ \ \ \/_/\ \/ \ \___ \ | 52 // \/_/\ \/ \ \ __< \ \ __ \ \ \ \ \/_/\ \/ \ \___ \ |
48 // \ \_\ \ \_\ \_\ \ \_\ \_\ \ \_\ \ \_\ \/\_____\ | 53 // \ \_\ \ \_\ \_\ \ \_\ \_\ \ \_\ \ \_\ \/\_____\ |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 342 |
338 Variable *Base = Mem->getBase(); | 343 Variable *Base = Mem->getBase(); |
339 Variable *Index = Mem->getIndex(); | 344 Variable *Index = Mem->getIndex(); |
340 uint16_t Shift = 0; | 345 uint16_t Shift = 0; |
341 Variable *ZeroReg = RebasePtr; | 346 Variable *ZeroReg = RebasePtr; |
342 Constant *Offset = Mem->getOffset(); | 347 Constant *Offset = Mem->getOffset(); |
343 Variable *T = nullptr; | 348 Variable *T = nullptr; |
344 | 349 |
345 bool AbsoluteAddress = false; | 350 bool AbsoluteAddress = false; |
346 if (Base == nullptr && Index == nullptr) { | 351 if (Base == nullptr && Index == nullptr) { |
347 if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Offset)) { | 352 if (llvm::isa<ConstantRelocatable>(Offset)) { |
348 if (CR->getName() != "") { | 353 // Mem is RIP-relative. There's no need to rebase it. |
349 // Mem is RIP-relative. There's no need to rebase it. | 354 return Mem; |
350 return Mem; | |
351 } | |
352 } | 355 } |
353 // Offset is an absolute address, so we need to emit | 356 // Offset is an absolute address, so we need to emit |
354 // Offset(%r15) | 357 // Offset(%r15) |
355 AbsoluteAddress = true; | 358 AbsoluteAddress = true; |
356 } | 359 } |
357 | 360 |
358 if (Mem->getIsRebased()) { | 361 if (Mem->getIsRebased()) { |
359 // If Mem.IsRebased, then we don't need to update Mem, as it's already been | 362 // If Mem.IsRebased, then we don't need to update Mem, as it's already been |
360 // updated to contain a reference to one of %rsp, %rbp, or %r15. | 363 // updated to contain a reference to one of %rsp, %rbp, or %r15. |
361 // We don't return early because we still need to zero extend Index. | 364 // We don't return early because we still need to zero extend Index. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 } | 407 } |
405 | 408 |
406 // NeedsLea is a flags indicating whether Mem needs to be materialized to a | 409 // NeedsLea is a flags indicating whether Mem needs to be materialized to a |
407 // GPR prior to being used. A LEA is needed if Mem.Offset is a constant | 410 // GPR prior to being used. A LEA is needed if Mem.Offset is a constant |
408 // relocatable, or if Mem.Offset is negative. In both these cases, the LEA is | 411 // relocatable, or if Mem.Offset is negative. In both these cases, the LEA is |
409 // needed to ensure the sandboxed memory operand will only use the lower | 412 // needed to ensure the sandboxed memory operand will only use the lower |
410 // 32-bits of T+Offset. | 413 // 32-bits of T+Offset. |
411 bool NeedsLea = false; | 414 bool NeedsLea = false; |
412 if (Offset != nullptr) { | 415 if (Offset != nullptr) { |
413 if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Offset)) { | 416 if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Offset)) { |
414 NeedsLea = CR->getName() != "" || CR->getOffset() < 0; | 417 NeedsLea = CR->getOffset() < 0; |
415 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Offset)) { | 418 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Offset)) { |
416 NeedsLea = Imm->getValue() < 0; | 419 NeedsLea = Imm->getValue() < 0; |
417 } else { | 420 } else { |
418 llvm::report_fatal_error("Unexpected Offset type."); | 421 llvm::report_fatal_error("Unexpected Offset type."); |
419 } | 422 } |
420 } | 423 } |
421 | 424 |
422 RegNumT RegNum, RegNum32; | 425 RegNumT RegNum, RegNum32; |
423 if (T != nullptr) { | 426 if (T != nullptr) { |
424 if (T->hasReg()) { | 427 if (T->hasReg()) { |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 // | 622 // |
620 // ReturnReloc has an offset that is only known during binary emission. | 623 // ReturnReloc has an offset that is only known during binary emission. |
621 // Therefore, we set a custom emit string for ReturnReloc that will be | 624 // Therefore, we set a custom emit string for ReturnReloc that will be |
622 // used instead. In this particular case, the code will be emitted as | 625 // used instead. In this particular case, the code will be emitted as |
623 // | 626 // |
624 // push .after_call | 627 // push .after_call |
625 InstX86Label *ReturnAddress = InstX86Label::create(Func, this); | 628 InstX86Label *ReturnAddress = InstX86Label::create(Func, this); |
626 auto *ReturnRelocOffset = RelocOffset::create(Func->getAssembler()); | 629 auto *ReturnRelocOffset = RelocOffset::create(Func->getAssembler()); |
627 ReturnAddress->setRelocOffset(ReturnRelocOffset); | 630 ReturnAddress->setRelocOffset(ReturnRelocOffset); |
628 constexpr RelocOffsetT NoFixedOffset = 0; | 631 constexpr RelocOffsetT NoFixedOffset = 0; |
629 const IceString EmitString = ReturnAddress->getName(Func); | 632 const std::string EmitString = |
| 633 BuildDefs::dump() ? ReturnAddress->getLabelName().toString() : ""; |
630 auto *ReturnReloc = ConstantRelocatable::create( | 634 auto *ReturnReloc = ConstantRelocatable::create( |
631 Func->getAssembler(), IceType_i32, | 635 Func->getAssembler(), Ctx, IceType_i32, |
632 RelocatableTuple(NoFixedOffset, {ReturnRelocOffset}, | 636 RelocatableTuple(NoFixedOffset, {ReturnRelocOffset}, |
633 Func->getFunctionName(), EmitString)); | 637 Func->getFunctionName(), EmitString)); |
634 /* AutoBundle scoping */ { | 638 /* AutoBundle scoping */ { |
635 std::unique_ptr<AutoBundle> Bundler; | 639 std::unique_ptr<AutoBundle> Bundler; |
636 if (CallTargetR == nullptr) { | 640 if (CallTargetR == nullptr) { |
637 Bundler = makeUnique<AutoBundle>(this, InstBundleLock::Opt_PadToEnd); | 641 Bundler = makeUnique<AutoBundle>(this, InstBundleLock::Opt_PadToEnd); |
638 _push(ReturnReloc); | 642 _push(ReturnReloc); |
639 } else { | 643 } else { |
640 Variable *T = makeReg(IceType_i32); | 644 Variable *T = makeReg(IceType_i32); |
641 Variable *T64 = makeReg(IceType_i64); | 645 Variable *T64 = makeReg(IceType_i64); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 #define X(tag, sizeLog2, align, elts, elty, str, rcstr) \ | 810 #define X(tag, sizeLog2, align, elts, elty, str, rcstr) \ |
807 static_assert(_table1_##tag == _table2_##tag, \ | 811 static_assert(_table1_##tag == _table2_##tag, \ |
808 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE"); | 812 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE"); |
809 ICETYPE_TABLE | 813 ICETYPE_TABLE |
810 #undef X | 814 #undef X |
811 } // end of namespace dummy3 | 815 } // end of namespace dummy3 |
812 } // end of anonymous namespace | 816 } // end of anonymous namespace |
813 | 817 |
814 } // end of namespace X8664 | 818 } // end of namespace X8664 |
815 } // end of namespace Ice | 819 } // end of namespace Ice |
OLD | NEW |