Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // | 1 // |
| 2 // The Subzero Code Generator | 2 // The Subzero Code Generator |
| 3 // | 3 // |
| 4 // This file is distributed under the University of Illinois Open Source | 4 // This file is distributed under the University of Illinois Open Source |
| 5 // License. See LICENSE.TXT for details. | 5 // License. See LICENSE.TXT for details. |
| 6 // | 6 // |
| 7 //===----------------------------------------------------------------------===// | 7 //===----------------------------------------------------------------------===// |
| 8 /// | 8 /// |
| 9 /// \file | 9 /// \file |
| 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost | 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost |
| (...skipping 5826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5837 // tryOptimizedCmpxchgCmpBr(). | 5837 // tryOptimizedCmpxchgCmpBr(). |
| 5838 Iter->second.Instr->setDead(); | 5838 Iter->second.Instr->setDead(); |
| 5839 ++Iter; | 5839 ++Iter; |
| 5840 } | 5840 } |
| 5841 } | 5841 } |
| 5842 | 5842 |
| 5843 TargetHeaderMIPS32::TargetHeaderMIPS32(GlobalContext *Ctx) | 5843 TargetHeaderMIPS32::TargetHeaderMIPS32(GlobalContext *Ctx) |
| 5844 : TargetHeaderLowering(Ctx) {} | 5844 : TargetHeaderLowering(Ctx) {} |
| 5845 | 5845 |
| 5846 void TargetHeaderMIPS32::lower() { | 5846 void TargetHeaderMIPS32::lower() { |
| 5847 OstreamLocker L(Ctx); | 5847 OstreamLocker L(Ctx); |
|
Jim Stichnoth
2016/11/21 20:08:39
Just noticed this... Use the normal pattern at th
Stefan Maksimovic
2016/11/22 11:38:13
Done.
| |
| 5848 Ostream &Str = Ctx->getStrEmit(); | 5848 Ostream &Str = Ctx->getStrEmit(); |
| 5849 Str << "\t.set\t" | 5849 Str << "\t.set\t" |
| 5850 << "nomicromips\n"; | 5850 << "nomicromips\n"; |
| 5851 Str << "\t.set\t" | 5851 Str << "\t.set\t" |
| 5852 << "nomips16\n"; | 5852 << "nomips16\n"; |
| 5853 Str << "\t.set\t" | 5853 Str << "\t.set\t" |
| 5854 << "noat\n"; | 5854 << "noat\n"; |
| 5855 if(getFlags().getUseSandboxing()) | |
| 5856 Str << "\t.bundle_align_mode 4\n"; | |
| 5855 } | 5857 } |
| 5856 | 5858 |
| 5857 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 5859 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 5858 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 5860 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 5859 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 5861 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 5860 | 5862 |
| 5861 TargetMIPS32::Sandboxer::Sandboxer(TargetMIPS32 *Target, | 5863 TargetMIPS32::Sandboxer::Sandboxer(TargetMIPS32 *Target, |
| 5862 InstBundleLock::Option BundleOption) | 5864 InstBundleLock::Option BundleOption) |
| 5863 : Target(Target), BundleOption(BundleOption) {} | 5865 : Target(Target), BundleOption(BundleOption) {} |
| 5864 | 5866 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 5881 } | 5883 } |
| 5882 | 5884 |
| 5883 void TargetMIPS32::Sandboxer::lw(Variable *Dest, OperandMIPS32Mem *Mem) { | 5885 void TargetMIPS32::Sandboxer::lw(Variable *Dest, OperandMIPS32Mem *Mem) { |
| 5884 Variable *Base = Mem->getBase(); | 5886 Variable *Base = Mem->getBase(); |
| 5885 Variable *T7 = Target->getPhysicalRegister(RegMIPS32::Reg_T7); | 5887 Variable *T7 = Target->getPhysicalRegister(RegMIPS32::Reg_T7); |
| 5886 if (Target->NeedSandboxing && (Target->getStackReg() != Base->getRegNum())) { | 5888 if (Target->NeedSandboxing && (Target->getStackReg() != Base->getRegNum())) { |
| 5887 createAutoBundle(); | 5889 createAutoBundle(); |
| 5888 Target->_and(Base, Base, T7); | 5890 Target->_and(Base, Base, T7); |
| 5889 } | 5891 } |
| 5890 Target->_lw(Dest, Mem); | 5892 Target->_lw(Dest, Mem); |
| 5893 if (Target->NeedSandboxing && (Dest->getRegNum() == Target->getStackReg())) | |
| 5894 Target->_and(Dest, Dest, T7); | |
| 5891 } | 5895 } |
| 5892 | 5896 |
| 5893 void TargetMIPS32::Sandboxer::sw(Variable *Dest, OperandMIPS32Mem *Mem) { | 5897 void TargetMIPS32::Sandboxer::sw(Variable *Dest, OperandMIPS32Mem *Mem) { |
| 5894 Variable *Base = Mem->getBase(); | 5898 Variable *Base = Mem->getBase(); |
| 5895 Variable *T7 = Target->getPhysicalRegister(RegMIPS32::Reg_T7); | 5899 Variable *T7 = Target->getPhysicalRegister(RegMIPS32::Reg_T7); |
| 5896 if (Target->NeedSandboxing && (Target->getStackReg() != Base->getRegNum())) { | 5900 if (Target->NeedSandboxing && (Target->getStackReg() != Base->getRegNum())) { |
| 5897 createAutoBundle(); | 5901 createAutoBundle(); |
| 5898 Target->_and(Base, Base, T7); | 5902 Target->_and(Base, Base, T7); |
| 5899 } | 5903 } |
| 5900 Target->_sw(Dest, Mem); | 5904 Target->_sw(Dest, Mem); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5939 void TargetMIPS32::Sandboxer::reset_sp(Variable *Src) { | 5943 void TargetMIPS32::Sandboxer::reset_sp(Variable *Src) { |
| 5940 Variable *SP = Target->getPhysicalRegister(RegMIPS32::Reg_SP); | 5944 Variable *SP = Target->getPhysicalRegister(RegMIPS32::Reg_SP); |
| 5941 if (!Target->NeedSandboxing) { | 5945 if (!Target->NeedSandboxing) { |
| 5942 Target->_mov(SP, Src); | 5946 Target->_mov(SP, Src); |
| 5943 return; | 5947 return; |
| 5944 } | 5948 } |
| 5945 Variable *T7 = Target->getPhysicalRegister(RegMIPS32::Reg_T7); | 5949 Variable *T7 = Target->getPhysicalRegister(RegMIPS32::Reg_T7); |
| 5946 createAutoBundle(); | 5950 createAutoBundle(); |
| 5947 Target->_mov(SP, Src); | 5951 Target->_mov(SP, Src); |
| 5948 Target->_and(SP, SP, T7); | 5952 Target->_and(SP, SP, T7); |
| 5953 Target->getContext().insert<InstFakeUse>(SP); | |
| 5949 } | 5954 } |
| 5950 | 5955 |
| 5951 InstMIPS32Call *TargetMIPS32::Sandboxer::jal(Variable *ReturnReg, | 5956 InstMIPS32Call *TargetMIPS32::Sandboxer::jal(Variable *ReturnReg, |
| 5952 Operand *CallTarget) { | 5957 Operand *CallTarget) { |
| 5953 if (Target->NeedSandboxing) | 5958 if (Target->NeedSandboxing) { |
| 5954 createAutoBundle(); | 5959 createAutoBundle(); |
| 5960 if (auto *CallTargetR = llvm::dyn_cast<Variable>(CallTarget)) { | |
| 5961 Variable *T6 = Target->getPhysicalRegister(RegMIPS32::Reg_T6); | |
| 5962 Target->_and(CallTargetR, CallTargetR, T6); | |
| 5963 } | |
| 5964 } | |
| 5955 return Target->Context.insert<InstMIPS32Call>(ReturnReg, CallTarget); | 5965 return Target->Context.insert<InstMIPS32Call>(ReturnReg, CallTarget); |
| 5956 } | 5966 } |
| 5957 | 5967 |
| 5958 } // end of namespace MIPS32 | 5968 } // end of namespace MIPS32 |
| 5959 } // end of namespace Ice | 5969 } // end of namespace Ice |
| OLD | NEW |