Index: src/IceTargetLoweringMIPS32.cpp |
diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp |
index 32656ce4ee9ba008bee7b1f7482b627942c6a49c..f61ba8a862993c3098ebd14d8e0e8447e8a9432c 100644 |
--- a/src/IceTargetLoweringMIPS32.cpp |
+++ b/src/IceTargetLoweringMIPS32.cpp |
@@ -2846,8 +2846,25 @@ void TargetMIPS32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
return; |
} |
case Intrinsics::Ctlz: { |
- UnimplementedLoweringError(this, Instr); |
- return; |
+ auto *Src = Instr->getArg(0); |
+ const Type SrcTy = Src->getType(); |
+ assert(SrcTy == IceType_i32 || SrcTy == IceType_i64); |
+ switch (SrcTy) { |
+ case IceType_i32: { |
+ auto *T = I32Reg(); |
+ auto *SrcR = legalizeToReg(Src); |
+ _clz(T, SrcR); |
+ _mov(Dest, T); |
+ break; |
+ } |
+ case IceType_i64: { |
+ UnimplementedLoweringError(this, Instr); |
+ break; |
+ } |
+ default: |
+ llvm::report_fatal_error("Control flow should never have reached here."); |
+ } |
+ break; |
} |
case Intrinsics::Cttz: { |
UnimplementedLoweringError(this, Instr); |