| Index: src/IceTargetLoweringMIPS32.cpp
|
| diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp
|
| index 238b7bb9d8eb52dddae9b0685600022b5c0d1935..5b0556ee5f0120f8866b5a164983ed2c6cf23296 100644
|
| --- a/src/IceTargetLoweringMIPS32.cpp
|
| +++ b/src/IceTargetLoweringMIPS32.cpp
|
| @@ -956,8 +956,104 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
|
| UnimplementedLoweringError(this, Instr);
|
| }
|
|
|
| -void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) {
|
| +void TargetMIPS32::lower64Icmp(const InstIcmp *Instr) {
|
| UnimplementedLoweringError(this, Instr);
|
| + return;
|
| +}
|
| +
|
| +void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) {
|
| + auto *Src0 = Instr->getSrc(0);
|
| + auto *Src1 = Instr->getSrc(1);
|
| + if (Src0->getType() == IceType_i64) {
|
| + lower64Icmp(Instr);
|
| + return;
|
| + }
|
| + Variable *Dest = Instr->getDest();
|
| + if (isVectorType(Dest->getType())) {
|
| + UnimplementedLoweringError(this, Instr);
|
| + return;
|
| + }
|
| + InstIcmp::ICond Cond = Instr->getCondition();
|
| + auto *Src0R = legalizeToReg(Src0);
|
| + auto *Src1R = legalizeToReg(Src1);
|
| + switch (Cond) {
|
| + case InstIcmp::Eq: {
|
| + auto *DestT = I32Reg();
|
| + auto *T = I32Reg();
|
| + _xor(T, Src0R, Src1R);
|
| + _sltiu(DestT, T, 1);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Ne: {
|
| + auto *DestT = I32Reg();
|
| + auto *T = I32Reg();
|
| + auto *Zero = getZero();
|
| + _xor(T, Src0R, Src1R);
|
| + _sltu(DestT, Zero, T);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Ugt: {
|
| + auto *DestT = I32Reg();
|
| + _sltu(DestT, Src1R, Src0R);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Uge: {
|
| + auto *DestT = I32Reg();
|
| + auto *T = I32Reg();
|
| + _sltu(T, Src0R, Src1R);
|
| + _xori(DestT, T, 1);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Ult: {
|
| + auto *DestT = I32Reg();
|
| + _sltu(DestT, Src0R, Src1R);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Ule: {
|
| + auto *DestT = I32Reg();
|
| + auto *T = I32Reg();
|
| + _sltu(T, Src1R, Src0R);
|
| + _xori(DestT, T, 1);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Sgt: {
|
| + auto *DestT = I32Reg();
|
| + _slt(DestT, Src1R, Src0R);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Sge: {
|
| + auto *DestT = I32Reg();
|
| + auto *T = I32Reg();
|
| + _slt(T, Src1R, Src0R);
|
| + _xori(DestT, T, 1);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Slt: {
|
| + auto *DestT = I32Reg();
|
| + _slt(DestT, Src0R, Src1R);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + case InstIcmp::Sle: {
|
| + auto *DestT = I32Reg();
|
| + auto *T = I32Reg();
|
| + _slt(T, Src1R, Src0R);
|
| + _xori(DestT, T, 1);
|
| + _mov(Dest, DestT);
|
| + return;
|
| + }
|
| + default:
|
| + llvm_unreachable("Invalid ICmp operator");
|
| + return;
|
| + }
|
| }
|
|
|
| void TargetMIPS32::lowerInsertElement(const InstInsertElement *Instr) {
|
|
|