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 4437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4448 // Assert that a physical register is allowed. To date, all calls | 4448 // Assert that a physical register is allowed. To date, all calls |
4449 // to legalize() allow a physical register. If a physical register | 4449 // to legalize() allow a physical register. If a physical register |
4450 // needs to be explicitly disallowed, then new code will need to be | 4450 // needs to be explicitly disallowed, then new code will need to be |
4451 // written to force a spill. | 4451 // written to force a spill. |
4452 assert(Allowed & Legal_Reg); | 4452 assert(Allowed & Legal_Reg); |
4453 // If we're asking for a specific physical register, make sure we're | 4453 // If we're asking for a specific physical register, make sure we're |
4454 // not allowing any other operand kinds. (This could be future | 4454 // not allowing any other operand kinds. (This could be future |
4455 // work, e.g. allow the shl shift amount to be either an immediate | 4455 // work, e.g. allow the shl shift amount to be either an immediate |
4456 // or in ecx.) | 4456 // or in ecx.) |
4457 assert(RegNum == Variable::NoRegister || Allowed == Legal_Reg); | 4457 assert(RegNum == Variable::NoRegister || Allowed == Legal_Reg); |
4458 if (OperandX8632Mem *Mem = llvm::dyn_cast<OperandX8632Mem>(From)) { | 4458 if (auto Mem = llvm::dyn_cast<OperandX8632Mem>(From)) { |
4459 // Before doing anything with a Mem operand, we need to ensure | 4459 // Before doing anything with a Mem operand, we need to ensure |
4460 // that the Base and Index components are in physical registers. | 4460 // that the Base and Index components are in physical registers. |
4461 Variable *Base = Mem->getBase(); | 4461 Variable *Base = Mem->getBase(); |
4462 Variable *Index = Mem->getIndex(); | 4462 Variable *Index = Mem->getIndex(); |
4463 Variable *RegBase = nullptr; | 4463 Variable *RegBase = nullptr; |
4464 Variable *RegIndex = nullptr; | 4464 Variable *RegIndex = nullptr; |
4465 if (Base) { | 4465 if (Base) { |
4466 RegBase = legalizeToVar(Base); | 4466 RegBase = legalizeToVar(Base); |
4467 } | 4467 } |
4468 if (Index) { | 4468 if (Index) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4503 // Immediate specifically not allowed | 4503 // Immediate specifically not allowed |
4504 NeedsReg = true; | 4504 NeedsReg = true; |
4505 if (!(Allowed & Legal_Mem) && isScalarFloatingType(From->getType())) | 4505 if (!(Allowed & Legal_Mem) && isScalarFloatingType(From->getType())) |
4506 // On x86, FP constants are lowered to mem operands. | 4506 // On x86, FP constants are lowered to mem operands. |
4507 NeedsReg = true; | 4507 NeedsReg = true; |
4508 if (NeedsReg) { | 4508 if (NeedsReg) { |
4509 From = copyToReg(From, RegNum); | 4509 From = copyToReg(From, RegNum); |
4510 } | 4510 } |
4511 return From; | 4511 return From; |
4512 } | 4512 } |
4513 if (Variable *Var = llvm::dyn_cast<Variable>(From)) { | 4513 if (auto Var = llvm::dyn_cast<Variable>(From)) { |
4514 // Check if the variable is guaranteed a physical register. This | 4514 // Check if the variable is guaranteed a physical register. This |
4515 // can happen either when the variable is pre-colored or when it is | 4515 // can happen either when the variable is pre-colored or when it is |
4516 // assigned infinite weight. | 4516 // assigned infinite weight. |
4517 bool MustHaveRegister = (Var->hasReg() || Var->getWeight().isInf()); | 4517 bool MustHaveRegister = (Var->hasReg() || Var->getWeight().isInf()); |
4518 // We need a new physical register for the operand if: | 4518 // We need a new physical register for the operand if: |
4519 // Mem is not allowed and Var isn't guaranteed a physical | 4519 // Mem is not allowed and Var isn't guaranteed a physical |
4520 // register, or | 4520 // register, or |
4521 // RegNum is required and Var->getRegNum() doesn't match. | 4521 // RegNum is required and Var->getRegNum() doesn't match. |
4522 if ((!(Allowed & Legal_Mem) && !MustHaveRegister) || | 4522 if ((!(Allowed & Legal_Mem) && !MustHaveRegister) || |
4523 (RegNum != Variable::NoRegister && RegNum != Var->getRegNum())) { | 4523 (RegNum != Variable::NoRegister && RegNum != Var->getRegNum())) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4561 if (RegNum == Variable::NoRegister) | 4561 if (RegNum == Variable::NoRegister) |
4562 Reg->setWeightInfinite(); | 4562 Reg->setWeightInfinite(); |
4563 else | 4563 else |
4564 Reg->setRegNum(RegNum); | 4564 Reg->setRegNum(RegNum); |
4565 return Reg; | 4565 return Reg; |
4566 } | 4566 } |
4567 | 4567 |
4568 void TargetX8632::postLower() { | 4568 void TargetX8632::postLower() { |
4569 if (Ctx->getFlags().getOptLevel() == Opt_m1) | 4569 if (Ctx->getFlags().getOptLevel() == Opt_m1) |
4570 return; | 4570 return; |
4571 // Find two-address non-SSA instructions where Dest==Src0, and set | 4571 inferTwoAddress(); |
4572 // the DestNonKillable flag to keep liveness analysis consistent. | |
4573 for (auto Inst = Context.getCur(), E = Context.getNext(); Inst != E; ++Inst) { | |
4574 if (Inst->isDeleted()) | |
4575 continue; | |
4576 if (Variable *Dest = Inst->getDest()) { | |
4577 // TODO(stichnot): We may need to consider all source | |
4578 // operands, not just the first one, if using 3-address | |
4579 // instructions. | |
4580 if (Inst->getSrcSize() > 0 && Inst->getSrc(0) == Dest) | |
4581 Inst->setDestNonKillable(); | |
4582 } | |
4583 } | |
4584 } | 4572 } |
4585 | 4573 |
4586 void TargetX8632::makeRandomRegisterPermutation( | 4574 void TargetX8632::makeRandomRegisterPermutation( |
4587 llvm::SmallVectorImpl<int32_t> &Permutation, | 4575 llvm::SmallVectorImpl<int32_t> &Permutation, |
4588 const llvm::SmallBitVector &ExcludeRegisters) const { | 4576 const llvm::SmallBitVector &ExcludeRegisters) const { |
4589 // TODO(stichnot): Declaring Permutation this way loses type/size | 4577 // TODO(stichnot): Declaring Permutation this way loses type/size |
4590 // information. Fix this in conjunction with the caller-side TODO. | 4578 // information. Fix this in conjunction with the caller-side TODO. |
4591 assert(Permutation.size() >= RegX8632::Reg_NUM); | 4579 assert(Permutation.size() >= RegX8632::Reg_NUM); |
4592 // Expected upper bound on the number of registers in a single | 4580 // Expected upper bound on the number of registers in a single |
4593 // equivalence class. For x86-32, this would comprise the 8 XMM | 4581 // equivalence class. For x86-32, this would comprise the 8 XMM |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4849 case FT_Asm: | 4837 case FT_Asm: |
4850 case FT_Iasm: { | 4838 case FT_Iasm: { |
4851 OstreamLocker L(Ctx); | 4839 OstreamLocker L(Ctx); |
4852 emitConstantPool<PoolTypeConverter<float>>(Ctx); | 4840 emitConstantPool<PoolTypeConverter<float>>(Ctx); |
4853 emitConstantPool<PoolTypeConverter<double>>(Ctx); | 4841 emitConstantPool<PoolTypeConverter<double>>(Ctx); |
4854 } break; | 4842 } break; |
4855 } | 4843 } |
4856 } | 4844 } |
4857 | 4845 |
4858 } // end of namespace Ice | 4846 } // end of namespace Ice |
OLD | NEW |