Index: src/IceTargetLoweringMIPS32.cpp |
diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp |
index 7bdf723d3796b4da898c12e1f0a54380a7fbff89..b601178f028a60cddf58eab54d31329609a1c479 100644 |
--- a/src/IceTargetLoweringMIPS32.cpp |
+++ b/src/IceTargetLoweringMIPS32.cpp |
@@ -2052,7 +2052,186 @@ void TargetMIPS32::lowerExtractElement(const InstExtractElement *Instr) { |
} |
void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { |
- UnimplementedLoweringError(this, Instr); |
+ |
Jim Stichnoth
2016/09/12 14:14:41
delete this blank line?
obucinac
2016/09/12 19:16:16
Done.
|
+ Variable *Dest = Instr->getDest(); |
+ if (isVectorType(Dest->getType())) { |
+ UnimplementedLoweringError(this, Instr); |
+ return; |
+ } |
+ |
+ auto *Src0 = Instr->getSrc(0); |
+ auto *Src1 = Instr->getSrc(1); |
+ auto *Zero = getZero(); |
+ |
+ InstFcmp::FCond Cond = Instr->getCondition(); |
+ auto *DestR = legalizeToReg(Dest); |
+ auto *Src0R = legalizeToReg(Src0); |
+ auto *Src1R = legalizeToReg(Src1); |
+ const Type Src0Ty = Src0->getType(); |
+ |
+ Operand *FCC0 = OperandMIPS32FCC::create(getContext().getNode()->getCfg(), |
Jim Stichnoth
2016/09/12 14:14:41
You can just use TargetLowering::getFunc() here.
obucinac
2016/09/12 19:16:16
Done.
|
+ IceType_i32, OperandMIPS32FCC::FCC0); |
+ |
+ switch (Cond) { |
+ default: { |
+ UnimplementedLoweringError(this, Instr); |
+ return; |
+ } |
+ case InstFcmp::False: { |
+ Context.insert<InstFakeUse>(Src0R); |
+ Context.insert<InstFakeUse>(Src1R); |
+ _addiu(DestR, Zero, 0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Oeq: { |
Jim Stichnoth
2016/09/12 14:14:41
Does the MIPS instruction set really provide a 1:1
obucinac
2016/09/12 19:16:16
This is related link:
https://imagination-technol
|
+ if (Src0Ty == IceType_f32) { |
+ _c_eq_s(Src0R, Src1R); |
+ } else { |
+ _c_eq_d(Src0R, Src1R); |
+ } |
+ _movf(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Ogt: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_ule_s(Src0R, Src1R); |
+ } else { |
+ _c_ule_d(Src0R, Src1R); |
+ } |
+ _movt(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Oge: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_ult_s(Src0R, Src1R); |
+ } else { |
+ _c_ult_d(Src0R, Src1R); |
+ } |
+ _movt(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Olt: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_olt_s(Src0R, Src1R); |
+ } else { |
+ _c_olt_d(Src0R, Src1R); |
+ } |
+ _movf(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Ole: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_ole_s(Src0R, Src1R); |
+ } else { |
+ _c_ole_d(Src0R, Src1R); |
+ } |
+ _movf(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::One: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_ueq_s(Src0R, Src1R); |
+ } else { |
+ _c_ueq_d(Src0R, Src1R); |
+ } |
+ _movt(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Ord: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_un_s(Src0R, Src1R); |
+ } else { |
+ _c_un_d(Src0R, Src1R); |
+ } |
+ _movt(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Ueq: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_ueq_s(Src0R, Src1R); |
+ } else { |
+ _c_ueq_d(Src0R, Src1R); |
+ } |
+ _movf(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Ugt: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_ole_s(Src0R, Src1R); |
+ } else { |
+ _c_ole_d(Src0R, Src1R); |
+ } |
+ _movt(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Uge: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_olt_s(Src0R, Src1R); |
+ } else { |
+ _c_olt_d(Src0R, Src1R); |
+ } |
+ _movt(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Ult: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_ult_s(Src0R, Src1R); |
+ } else { |
+ _c_ult_d(Src0R, Src1R); |
+ } |
+ _movf(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Ule: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_ule_s(Src0R, Src1R); |
+ } else { |
+ _c_ule_d(Src0R, Src1R); |
+ } |
+ _movf(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Une: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_eq_s(Src0R, Src1R); |
+ } else { |
+ _c_eq_d(Src0R, Src1R); |
+ } |
+ _movt(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::Uno: { |
+ if (Src0Ty == IceType_f32) { |
+ _c_un_s(Src0R, Src1R); |
+ } else { |
+ _c_un_d(Src0R, Src1R); |
+ } |
+ _movf(DestR, Zero, FCC0); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ case InstFcmp::True: { |
+ Context.insert<InstFakeUse>(Src0R); |
+ Context.insert<InstFakeUse>(Src1R); |
+ _addiu(DestR, Zero, 1); |
+ _mov(Dest, DestR); |
+ break; |
+ } |
+ } |
} |
void TargetMIPS32::lower64Icmp(const InstIcmp *Instr) { |