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 3191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3202 | 3202 |
3203 void TargetMIPS32::lowerPhi(const InstPhi * /*Instr*/) { | 3203 void TargetMIPS32::lowerPhi(const InstPhi * /*Instr*/) { |
3204 Func->setError("Phi found in regular instruction list"); | 3204 Func->setError("Phi found in regular instruction list"); |
3205 } | 3205 } |
3206 | 3206 |
3207 void TargetMIPS32::lowerRet(const InstRet *Instr) { | 3207 void TargetMIPS32::lowerRet(const InstRet *Instr) { |
3208 Variable *Reg = nullptr; | 3208 Variable *Reg = nullptr; |
3209 if (Instr->hasRetValue()) { | 3209 if (Instr->hasRetValue()) { |
3210 Operand *Src0 = Instr->getRetValue(); | 3210 Operand *Src0 = Instr->getRetValue(); |
3211 switch (Src0->getType()) { | 3211 switch (Src0->getType()) { |
| 3212 case IceType_f32: { |
| 3213 Operand *Src0F = legalizeToReg(Src0); |
| 3214 Reg = makeReg(Src0F->getType(), RegMIPS32::Reg_F0); |
| 3215 _mov(Reg, Src0F); |
| 3216 break; |
| 3217 } |
| 3218 case IceType_f64: { |
| 3219 Operand *Src0F = legalizeToReg(Src0); |
| 3220 Reg = makeReg(Src0F->getType(), RegMIPS32::Reg_F0F1); |
| 3221 _mov(Reg, Src0F); |
| 3222 break; |
| 3223 } |
3212 case IceType_i1: | 3224 case IceType_i1: |
3213 case IceType_i8: | 3225 case IceType_i8: |
3214 case IceType_i16: | 3226 case IceType_i16: |
3215 case IceType_i32: { | 3227 case IceType_i32: { |
3216 // Reg = legalizeToReg(Src0, RegMIPS32::Reg_V0); | 3228 Operand *Src0F = legalizeToReg(Src0); |
3217 Operand *Src0F = legalize(Src0, Legal_Reg); | |
3218 Reg = makeReg(Src0F->getType(), RegMIPS32::Reg_V0); | 3229 Reg = makeReg(Src0F->getType(), RegMIPS32::Reg_V0); |
3219 _mov(Reg, Src0F); | 3230 _mov(Reg, Src0F); |
3220 break; | 3231 break; |
3221 } | 3232 } |
3222 case IceType_i64: { | 3233 case IceType_i64: { |
3223 Src0 = legalizeUndef(Src0); | 3234 Src0 = legalizeUndef(Src0); |
3224 Variable *R0 = legalizeToReg(loOperand(Src0), RegMIPS32::Reg_V0); | 3235 Variable *R0 = legalizeToReg(loOperand(Src0), RegMIPS32::Reg_V0); |
3225 Variable *R1 = legalizeToReg(hiOperand(Src0), RegMIPS32::Reg_V1); | 3236 Variable *R1 = legalizeToReg(hiOperand(Src0), RegMIPS32::Reg_V1); |
3226 Reg = R0; | 3237 Reg = R0; |
3227 Context.insert<InstFakeUse>(R1); | 3238 Context.insert<InstFakeUse>(R1); |
3228 break; | 3239 break; |
3229 } | 3240 } |
3230 default: | 3241 default: |
3231 UnimplementedLoweringError(this, Instr); | 3242 UnimplementedLoweringError(this, Instr); |
3232 } | 3243 } |
3233 } | 3244 } |
3234 _ret(getPhysicalRegister(RegMIPS32::Reg_RA), Reg); | 3245 _ret(getPhysicalRegister(RegMIPS32::Reg_RA), Reg); |
3235 } | 3246 } |
3236 | 3247 |
3237 void TargetMIPS32::lowerSelect(const InstSelect *Instr) { | 3248 void TargetMIPS32::lowerSelect(const InstSelect *Instr) { |
3238 UnimplementedLoweringError(this, Instr); | 3249 Variable *Dest = Instr->getDest(); |
| 3250 const Type DestTy = Dest->getType(); |
| 3251 |
| 3252 if (DestTy == IceType_i64 || isVectorType(DestTy)) { |
| 3253 UnimplementedLoweringError(this, Instr); |
| 3254 return; |
| 3255 } |
| 3256 |
| 3257 Variable *DestR = legalizeToReg(Dest); |
| 3258 Variable *SrcTR = legalizeToReg(Instr->getTrueOperand()); |
| 3259 Variable *SrcFR = legalizeToReg(Instr->getFalseOperand()); |
| 3260 |
| 3261 Variable *ConditionR = legalizeToReg(Instr->getCondition()); |
| 3262 |
| 3263 assert(Instr->getCondition()->getType() == IceType_i1); |
| 3264 |
| 3265 switch (DestTy) { |
| 3266 case IceType_i1: |
| 3267 case IceType_i8: |
| 3268 case IceType_i16: |
| 3269 case IceType_i32: |
| 3270 _movn(SrcFR, SrcTR, ConditionR); |
| 3271 _mov(DestR, SrcFR); |
| 3272 _mov(Dest, DestR); |
| 3273 break; |
| 3274 case IceType_f32: |
| 3275 _movn_s(SrcFR, SrcTR, ConditionR); |
| 3276 _mov(DestR, SrcFR); |
| 3277 _mov(Dest, DestR); |
| 3278 break; |
| 3279 case IceType_f64: |
| 3280 _movn_d(SrcFR, SrcTR, ConditionR); |
| 3281 _mov(DestR, SrcFR); |
| 3282 _mov(Dest, DestR); |
| 3283 break; |
| 3284 default: |
| 3285 UnimplementedLoweringError(this, Instr); |
| 3286 } |
3239 } | 3287 } |
3240 | 3288 |
3241 void TargetMIPS32::lowerShuffleVector(const InstShuffleVector *Instr) { | 3289 void TargetMIPS32::lowerShuffleVector(const InstShuffleVector *Instr) { |
3242 UnimplementedLoweringError(this, Instr); | 3290 UnimplementedLoweringError(this, Instr); |
3243 } | 3291 } |
3244 | 3292 |
3245 void TargetMIPS32::lowerStore(const InstStore *Instr) { | 3293 void TargetMIPS32::lowerStore(const InstStore *Instr) { |
3246 Operand *Value = Instr->getData(); | 3294 Operand *Value = Instr->getData(); |
3247 Operand *Addr = Instr->getAddr(); | 3295 Operand *Addr = Instr->getAddr(); |
3248 OperandMIPS32Mem *NewAddr = formMemoryOperand(Addr, Value->getType()); | 3296 OperandMIPS32Mem *NewAddr = formMemoryOperand(Addr, Value->getType()); |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3619 Str << "\t.set\t" | 3667 Str << "\t.set\t" |
3620 << "nomips16\n"; | 3668 << "nomips16\n"; |
3621 } | 3669 } |
3622 | 3670 |
3623 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 3671 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
3624 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 3672 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
3625 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 3673 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
3626 | 3674 |
3627 } // end of namespace MIPS32 | 3675 } // end of namespace MIPS32 |
3628 } // end of namespace Ice | 3676 } // end of namespace Ice |
OLD | NEW |