diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 1ff884047d86..ac27168879c6 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -724,7 +724,9 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm) : TM(tm) { // with the Target-specific changes necessary. MaxAtomicSizeInBitsSupported = 1024; - MaxDivRemBitWidthSupported = llvm::IntegerType::MAX_INT_BITS; + // Assume that even with libcalls, no target supports wider than 128 bit + // division. + MaxDivRemBitWidthSupported = 128; MaxLargeFPConvertBitWidthSupported = llvm::IntegerType::MAX_INT_BITS; diff --git a/llvm/test/CodeGen/Mips/idiv_large.ll b/llvm/test/CodeGen/Mips/idiv_large.ll new file mode 100644 index 000000000000..ffd263fafbd5 --- /dev/null +++ b/llvm/test/CodeGen/Mips/idiv_large.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=mips-- < %s | FileCheck %s +; RUN: llc -mtriple=mips64-- < %s | FileCheck %s + +define i128 @udiv_i128(i128 %x, i128 %y) nounwind { +; CHECK-LABEL: udiv_i128: +; CHECK: jal __udivti3 + %res = udiv i128 %x, %y + ret i128 %res +} + +define i129 @udiv_i129(i129 %x, i129 %y) nounwind { +; CHECK-LABEL: udiv_i129: +; CHECK-NOT: jal + %res = udiv i129 %x, %y + ret i129 %res +} diff --git a/llvm/test/CodeGen/PowerPC/idiv_large.ll b/llvm/test/CodeGen/PowerPC/idiv_large.ll new file mode 100644 index 000000000000..476aaa59a5cb --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/idiv_large.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=powerpc-- < %s | FileCheck %s +; RUN: llc -mtriple=powerpc64-- < %s | FileCheck %s + +define i128 @udiv_i128(i128 %x, i128 %y) nounwind { +; CHECK-LABEL: udiv_i128: +; CHECK: bl __udivti3 + %res = udiv i128 %x, %y + ret i128 %res +} + +define i129 @udiv_i129(i129 %x, i129 %y) nounwind { +; CHECK-LABEL: udiv_i129: +; CHECK-NOT: bl __ + %res = udiv i129 %x, %y + ret i129 %res +} diff --git a/llvm/test/CodeGen/RISCV/idiv_large.ll b/llvm/test/CodeGen/RISCV/idiv_large.ll new file mode 100644 index 000000000000..fb7e4a4d103d --- /dev/null +++ b/llvm/test/CodeGen/RISCV/idiv_large.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=riscv32 < %s | FileCheck %s +; RUN: llc -mtriple=riscv64 < %s | FileCheck %s + +define i128 @udiv_i128(i128 %x, i128 %y) nounwind { +; CHECK-LABEL: udiv_i128: +; CHECK: call __udivti3 + %res = udiv i128 %x, %y + ret i128 %res +} + +define i129 @udiv_i129(i129 %x, i129 %y) nounwind { +; CHECK-LABEL: udiv_i129: +; CHECK-NOT: call{{.*}}div + %res = udiv i129 %x, %y + ret i129 %res +}