Index: src/IceTargetLoweringMIPS32.cpp |
diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp |
index e4f2fd09e6e34acc2f975029f91c3cd053bc47d4..8db22764ef5117c22bc96353e68a9665527b4497 100644 |
--- a/src/IceTargetLoweringMIPS32.cpp |
+++ b/src/IceTargetLoweringMIPS32.cpp |
@@ -3209,12 +3209,23 @@ void TargetMIPS32::lowerRet(const InstRet *Instr) { |
if (Instr->hasRetValue()) { |
Operand *Src0 = Instr->getRetValue(); |
switch (Src0->getType()) { |
+ case IceType_f32: { |
+ Operand *Src0F = legalizeToReg(Src0); |
+ Reg = makeReg(Src0F->getType(), RegMIPS32::Reg_F0); |
+ _mov(Reg, Src0F); |
+ break; |
+ } |
+ case IceType_f64: { |
+ Operand *Src0F = legalizeToReg(Src0); |
+ Reg = makeReg(Src0F->getType(), RegMIPS32::Reg_F0F1); |
+ _mov(Reg, Src0F); |
+ break; |
+ } |
case IceType_i1: |
case IceType_i8: |
case IceType_i16: |
case IceType_i32: { |
- // Reg = legalizeToReg(Src0, RegMIPS32::Reg_V0); |
- Operand *Src0F = legalize(Src0, Legal_Reg); |
+ Operand *Src0F = legalizeToReg(Src0); |
Reg = makeReg(Src0F->getType(), RegMIPS32::Reg_V0); |
_mov(Reg, Src0F); |
break; |
@@ -3235,7 +3246,44 @@ void TargetMIPS32::lowerRet(const InstRet *Instr) { |
} |
void TargetMIPS32::lowerSelect(const InstSelect *Instr) { |
- UnimplementedLoweringError(this, Instr); |
+ Variable *Dest = Instr->getDest(); |
+ const Type DestTy = Dest->getType(); |
+ |
+ if (DestTy == IceType_i64 || isVectorType(DestTy)) { |
+ UnimplementedLoweringError(this, Instr); |
+ return; |
+ } |
+ |
+ Variable *DestR = legalizeToReg(Dest); |
+ Variable *SrcTR = legalizeToReg(Instr->getTrueOperand()); |
+ Variable *SrcFR = legalizeToReg(Instr->getFalseOperand()); |
+ |
+ Variable *ConditionR = legalizeToReg(Instr->getCondition()); |
+ |
+ assert(Instr->getCondition()->getType() == IceType_i1); |
+ |
+ switch (DestTy) { |
+ case IceType_i1: |
+ case IceType_i8: |
+ case IceType_i16: |
+ case IceType_i32: |
+ _movn(SrcFR, SrcTR, ConditionR); |
+ _mov(DestR, SrcFR); |
+ _mov(Dest, DestR); |
+ break; |
+ case IceType_f32: |
+ _movn_s(SrcFR, SrcTR, ConditionR); |
+ _mov(DestR, SrcFR); |
+ _mov(Dest, DestR); |
+ break; |
+ case IceType_f64: |
+ _movn_d(SrcFR, SrcTR, ConditionR); |
+ _mov(DestR, SrcFR); |
+ _mov(Dest, DestR); |
+ break; |
+ default: |
+ UnimplementedLoweringError(this, Instr); |
+ } |
} |
void TargetMIPS32::lowerShuffleVector(const InstShuffleVector *Instr) { |