| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===// | 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 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 // This file implements the TargetLoweringX8632 class, which | 10 // This file implements the TargetLoweringX8632 class, which |
| (...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 797 // If there is a separate locals area, this specifies the alignment | 797 // If there is a separate locals area, this specifies the alignment |
| 798 // for it. | 798 // for it. |
| 799 uint32_t LocalsSlotsAlignmentBytes = 0; | 799 uint32_t LocalsSlotsAlignmentBytes = 0; |
| 800 // The entire spill locations area gets aligned to largest natural | 800 // The entire spill locations area gets aligned to largest natural |
| 801 // alignment of the variables that have a spill slot. | 801 // alignment of the variables that have a spill slot. |
| 802 uint32_t SpillAreaAlignmentBytes = 0; | 802 uint32_t SpillAreaAlignmentBytes = 0; |
| 803 // A spill slot linked to a variable with a stack slot should reuse | 803 // A spill slot linked to a variable with a stack slot should reuse |
| 804 // that stack slot. | 804 // that stack slot. |
| 805 std::function<bool(Variable *)> TargetVarHook = | 805 std::function<bool(Variable *)> TargetVarHook = |
| 806 [&VariablesLinkedToSpillSlots](Variable *Var) { | 806 [&VariablesLinkedToSpillSlots](Variable *Var) { |
| 807 if (SpillVariable *SpillVar = llvm::dyn_cast<SpillVariable>(Var)) { | 807 if (SpillVariable *SpillVar = llvm::dyn_cast<SpillVariable>(Var)) { |
| 808 assert(Var->getWeight().isZero()); | 808 assert(Var->getWeight().isZero()); |
| 809 if (SpillVar->getLinkedTo() && !SpillVar->getLinkedTo()->hasReg()) { | 809 if (SpillVar->getLinkedTo() && !SpillVar->getLinkedTo()->hasReg()) { |
| 810 VariablesLinkedToSpillSlots.push_back(Var); | 810 VariablesLinkedToSpillSlots.push_back(Var); |
| 811 return true; | 811 return true; |
| 812 } | 812 } |
| 813 } | 813 } |
| 814 return false; | 814 return false; |
| 815 }; | 815 }; |
| 816 | 816 |
| 817 // Compute the list of spilled variables and bounds for GlobalsSize, etc. | 817 // Compute the list of spilled variables and bounds for GlobalsSize, etc. |
| 818 getVarStackSlotParams(SortedSpilledVariables, RegsUsed, &GlobalsSize, | 818 getVarStackSlotParams(SortedSpilledVariables, RegsUsed, &GlobalsSize, |
| 819 &SpillAreaSizeBytes, &SpillAreaAlignmentBytes, | 819 &SpillAreaSizeBytes, &SpillAreaAlignmentBytes, |
| 820 &LocalsSlotsAlignmentBytes, TargetVarHook); | 820 &LocalsSlotsAlignmentBytes, TargetVarHook); |
| 821 uint32_t LocalsSpillAreaSize = SpillAreaSizeBytes; | 821 uint32_t LocalsSpillAreaSize = SpillAreaSizeBytes; |
| 822 SpillAreaSizeBytes += GlobalsSize; | 822 SpillAreaSizeBytes += GlobalsSize; |
| 823 | 823 |
| 824 // Add push instructions for preserved registers. | 824 // Add push instructions for preserved registers. |
| 825 uint32_t NumCallee = 0; | 825 uint32_t NumCallee = 0; |
| (...skipping 2173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2999 Context.insert( | 2999 Context.insert( |
| 3000 InstFakeUse::create(Func, Context.getLastInserted()->getDest())); | 3000 InstFakeUse::create(Func, Context.getLastInserted()->getDest())); |
| 3001 return; | 3001 return; |
| 3002 } | 3002 } |
| 3003 case Intrinsics::AtomicRMW: | 3003 case Intrinsics::AtomicRMW: |
| 3004 if (!Intrinsics::isMemoryOrderValid( | 3004 if (!Intrinsics::isMemoryOrderValid( |
| 3005 ID, getConstantMemoryOrder(Instr->getArg(3)))) { | 3005 ID, getConstantMemoryOrder(Instr->getArg(3)))) { |
| 3006 Func->setError("Unexpected memory ordering for AtomicRMW"); | 3006 Func->setError("Unexpected memory ordering for AtomicRMW"); |
| 3007 return; | 3007 return; |
| 3008 } | 3008 } |
| 3009 lowerAtomicRMW(Instr->getDest(), | 3009 lowerAtomicRMW( |
| 3010 static_cast<uint32_t>(llvm::cast<ConstantInteger32>( | 3010 Instr->getDest(), |
| 3011 Instr->getArg(0))->getValue()), | 3011 static_cast<uint32_t>( |
| 3012 Instr->getArg(1), Instr->getArg(2)); | 3012 llvm::cast<ConstantInteger32>(Instr->getArg(0))->getValue()), |
| 3013 Instr->getArg(1), Instr->getArg(2)); |
| 3013 return; | 3014 return; |
| 3014 case Intrinsics::AtomicStore: { | 3015 case Intrinsics::AtomicStore: { |
| 3015 if (!Intrinsics::isMemoryOrderValid( | 3016 if (!Intrinsics::isMemoryOrderValid( |
| 3016 ID, getConstantMemoryOrder(Instr->getArg(2)))) { | 3017 ID, getConstantMemoryOrder(Instr->getArg(2)))) { |
| 3017 Func->setError("Unexpected memory ordering for AtomicStore"); | 3018 Func->setError("Unexpected memory ordering for AtomicStore"); |
| 3018 return; | 3019 return; |
| 3019 } | 3020 } |
| 3020 // We require the memory address to be naturally aligned. | 3021 // We require the memory address to be naturally aligned. |
| 3021 // Given that is the case, then normal stores are atomic. | 3022 // Given that is the case, then normal stores are atomic. |
| 3022 // Add a fence after the store to make it visible. | 3023 // Add a fence after the store to make it visible. |
| (...skipping 1919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4942 case FT_Asm: | 4943 case FT_Asm: |
| 4943 case FT_Iasm: { | 4944 case FT_Iasm: { |
| 4944 OstreamLocker L(Ctx); | 4945 OstreamLocker L(Ctx); |
| 4945 emitConstantPool<PoolTypeConverter<float>>(Ctx); | 4946 emitConstantPool<PoolTypeConverter<float>>(Ctx); |
| 4946 emitConstantPool<PoolTypeConverter<double>>(Ctx); | 4947 emitConstantPool<PoolTypeConverter<double>>(Ctx); |
| 4947 } break; | 4948 } break; |
| 4948 } | 4949 } |
| 4949 } | 4950 } |
| 4950 | 4951 |
| 4951 } // end of namespace Ice | 4952 } // end of namespace Ice |
| OLD | NEW |