Chromium Code Reviews| Index: src/IceTargetLoweringMIPS32.cpp |
| diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp |
| index 3954e79a4f1e427485e066284b7ff3d6b5e3713f..9094b5ef5e453cb3bf2cddfe69d00d5ed4cc0e00 100644 |
| --- a/src/IceTargetLoweringMIPS32.cpp |
| +++ b/src/IceTargetLoweringMIPS32.cpp |
| @@ -2900,8 +2900,145 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { |
| } |
| void TargetMIPS32::lower64Icmp(const InstIcmp *Instr) { |
| - UnimplementedLoweringError(this, Instr); |
| - return; |
| + Operand *Src0 = legalize(Instr->getSrc(0)); |
| + Operand *Src1 = legalize(Instr->getSrc(1)); |
| + Variable *Dest = Instr->getDest(); |
| + InstIcmp::ICond Condition = Instr->getCondition(); |
| + |
| + Variable *Src0LoR = legalizeToReg(loOperand(Src0)); |
| + Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); |
| + Variable *Src1LoR = legalizeToReg(loOperand(Src1)); |
| + Variable *Src1HiR = legalizeToReg(hiOperand(Src1)); |
| + |
| + switch (Condition) { |
| + default: |
| + llvm_unreachable("unexpected condition"); |
| + break; |
| + case InstIcmp::Eq: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _xor(T2, Src0LoR, Src1LoR); |
| + _or(T3, T1, T2); |
| + _sltiu(Dest, T3, 1); |
|
Jim Stichnoth
2016/09/27 13:45:35
Dest isn't necessarily a physical register (and pr
sagar.thakur
2016/09/28 08:23:23
Done.
|
| + return; |
| + } |
| + case InstIcmp::Ne: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _xor(T2, Src0LoR, Src1LoR); |
| + _or(T3, T1, T2); |
| + _sltu(Dest, getZero(), T3); |
| + return; |
| + } |
| + case InstIcmp::Sgt: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _slt(T2, Src1HiR, Src0HiR); |
| + _sltu(T3, Src1LoR, Src0LoR); |
| + _movz(T2, T3, T1); |
| + _mov(Dest, T2); |
| + return; |
| + } |
| + case InstIcmp::Ugt: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _sltu(T2, Src1HiR, Src0HiR); |
| + _sltu(T3, Src1LoR, Src0LoR); |
| + _movz(T2, T3, T1); |
| + _mov(Dest, T2); |
| + return; |
| + } |
| + case InstIcmp::Sge: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + auto *T4 = I32Reg(); |
| + auto *T5 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _slt(T2, Src0HiR, Src1HiR); |
| + _xori(T3, T2, 1); |
| + _sltu(T4, Src0LoR, Src1LoR); |
| + _xori(T5, T4, 1); |
| + _movz(T3, T5, T1); |
| + _mov(Dest, T3); |
| + return; |
| + } |
| + case InstIcmp::Uge: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + auto *T4 = I32Reg(); |
| + auto *T5 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _sltu(T2, Src0HiR, Src1HiR); |
| + _xori(T3, T2, 1); |
| + _sltu(T4, Src0LoR, Src1LoR); |
| + _xori(T5, T4, 1); |
| + _movz(T3, T5, T1); |
| + _mov(Dest, T3); |
| + return; |
| + } |
| + case InstIcmp::Slt: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _slt(T2, Src0HiR, Src1HiR); |
| + _sltu(T3, Src0LoR, Src1LoR); |
| + _movz(T2, T3, T1); |
| + _mov(Dest, T2); |
| + return; |
| + } |
| + case InstIcmp::Ult: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _sltu(T2, Src0HiR, Src1HiR); |
| + _sltu(T3, Src0LoR, Src1LoR); |
| + _movz(T2, T3, T1); |
| + _mov(Dest, T2); |
| + return; |
| + } |
| + case InstIcmp::Sle: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + auto *T4 = I32Reg(); |
| + auto *T5 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _slt(T2, Src1HiR, Src0HiR); |
| + _xori(T3, T2, 1); |
| + _sltu(T4, Src1LoR, Src0LoR); |
| + _xori(T5, T4, 1); |
| + _movz(T3, T5, T1); |
| + _mov(Dest, T3); |
| + return; |
| + } |
| + case InstIcmp::Ule: { |
| + auto *T1 = I32Reg(); |
| + auto *T2 = I32Reg(); |
| + auto *T3 = I32Reg(); |
| + auto *T4 = I32Reg(); |
| + auto *T5 = I32Reg(); |
| + _xor(T1, Src0HiR, Src1HiR); |
| + _sltu(T2, Src1HiR, Src0HiR); |
| + _xori(T3, T2, 1); |
| + _sltu(T4, Src1LoR, Src0LoR); |
| + _xori(T5, T4, 1); |
| + _movz(T3, T5, T1); |
| + _mov(Dest, T3); |
| + return; |
| + } |
| + } |
| } |
| void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) { |