https://github.com/jam7 updated https://github.com/llvm/llvm-project/pull/186587
>From ad173e83d789313d69983f7db143a3f2eb810960 Mon Sep 17 00:00:00 2001 From: "Kazushi (Jam) Marukawa" <[email protected]> Date: Sat, 21 Feb 2026 04:34:41 +0900 Subject: [PATCH 1/3] [VE] Enable _BitInt support Add hasBitIntType() override returning true in VETargetInfo in order to enable _BitInt for VE. --- clang/lib/Basic/Targets/VE.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/lib/Basic/Targets/VE.h b/clang/lib/Basic/Targets/VE.h index b518407d34438..17ea07541420f 100644 --- a/clang/lib/Basic/Targets/VE.h +++ b/clang/lib/Basic/Targets/VE.h @@ -53,6 +53,8 @@ class LLVM_LIBRARY_VISIBILITY VETargetInfo : public TargetInfo { bool hasSjLjLowering() const override { return true; } + bool hasBitIntType() const override { return true; } + llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override; BuiltinVaListKind getBuiltinVaListKind() const override { >From 692f17d728fedacc3e2a359026a6847a4336efe6 Mon Sep 17 00:00:00 2001 From: "Kazushi (Jam) Marukawa" <[email protected]> Date: Thu, 19 Mar 2026 17:34:27 +0900 Subject: [PATCH 2/3] [VE] Add _BitInt codegen tests Add tests for _BitInt support on VE: - clang/test/CodeGen/VE/bitint.c: Clang IR generation test for _BitInt addition with various widths (i17, i32, i65, i77) and signedness. - llvm/test/CodeGen/VE/Scalar/bitint_addition.ll: LLVM CodeGen test for non-power-of-2 integer addition (i17, i65, i77). - llvm/test/CodeGen/VE/Scalar/bitint_cast.ll: LLVM CodeGen test for trunc/sext/zext between non-power-of-2 and standard integer types. --- clang/test/CodeGen/VE/bitint.c | 92 +++++++++++++++++++ .../test/CodeGen/VE/Scalar/bitint_addition.ll | 52 +++++++++++ llvm/test/CodeGen/VE/Scalar/bitint_cast.ll | 73 +++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 clang/test/CodeGen/VE/bitint.c create mode 100644 llvm/test/CodeGen/VE/Scalar/bitint_addition.ll create mode 100644 llvm/test/CodeGen/VE/Scalar/bitint_cast.ll diff --git a/clang/test/CodeGen/VE/bitint.c b/clang/test/CodeGen/VE/bitint.c new file mode 100644 index 0000000000000..3b1eb5577e48e --- /dev/null +++ b/clang/test/CodeGen/VE/bitint.c @@ -0,0 +1,92 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature +// RUN: %clang_cc1 -triple ve-unknown-linux -O2 -emit-llvm -o - %s | FileCheck %s + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_17_add_unsigned +// CHECK-SAME: (i17 noundef zeroext [[A:%.*]], i17 noundef zeroext [[B:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add i17 [[B]], [[A]] +// CHECK-NEXT: ret i17 [[ADD]] +// +unsigned _BitInt(17) test_bitint_17_add_unsigned(unsigned _BitInt(17) a, unsigned _BitInt(17) b) { + return a + b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_17_add_signed +// CHECK-SAME: (i17 noundef signext [[A:%.*]], i17 noundef signext [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add nsw i17 [[B]], [[A]] +// CHECK-NEXT: ret i17 [[ADD]] +// +signed _BitInt(17) test_bitint_17_add_signed(signed _BitInt(17) a, signed _BitInt(17) b) { + return a + b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_17_add_default +// CHECK-SAME: (i17 noundef signext [[A:%.*]], i17 noundef signext [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add nsw i17 [[B]], [[A]] +// CHECK-NEXT: ret i17 [[ADD]] +// +_BitInt(17) test_bitint_17_add_default(_BitInt(17) a, _BitInt(17) b) { + return a + b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_32_add_unsigned +// CHECK-SAME: (i32 noundef zeroext [[A:%.*]], i32 noundef zeroext [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add i32 [[B]], [[A]] +// CHECK-NEXT: ret i32 [[ADD]] +// +unsigned _BitInt(32) test_bitint_32_add_unsigned(unsigned _BitInt(32) a, unsigned _BitInt(32) b) { + return a + b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_32_add_signed +// CHECK-SAME: (i32 noundef signext [[A:%.*]], i32 noundef signext [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[B]], [[A]] +// CHECK-NEXT: ret i32 [[ADD]] +// +signed _BitInt(32) test_bitint_32_add_signed(signed _BitInt(32) a, signed _BitInt(32) b) { + return a + b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_65_add_unsigned +// CHECK-SAME: (i65 noundef [[A:%.*]], i65 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add i65 [[B]], [[A]] +// CHECK-NEXT: ret i65 [[ADD]] +// +unsigned _BitInt(65) test_bitint_65_add_unsigned(unsigned _BitInt(65) a, unsigned _BitInt(65) b) { + return a + b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_65_add_signed +// CHECK-SAME: (i65 noundef [[A:%.*]], i65 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add nsw i65 [[B]], [[A]] +// CHECK-NEXT: ret i65 [[ADD]] +// +signed _BitInt(65) test_bitint_65_add_signed(signed _BitInt(65) a, signed _BitInt(65) b) { + return a + b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_77_add_unsigned +// CHECK-SAME: (i77 noundef [[A:%.*]], i77 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add i77 [[B]], [[A]] +// CHECK-NEXT: ret i77 [[ADD]] +// +unsigned _BitInt(77) test_bitint_77_add_unsigned(unsigned _BitInt(77) a, unsigned _BitInt(77) b) { + return a + b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_77_add_signed +// CHECK-SAME: (i77 noundef [[A:%.*]], i77 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add nsw i77 [[B]], [[A]] +// CHECK-NEXT: ret i77 [[ADD]] +// +signed _BitInt(77) test_bitint_77_add_signed(signed _BitInt(77) a, signed _BitInt(77) b) { + return a + b; +} diff --git a/llvm/test/CodeGen/VE/Scalar/bitint_addition.ll b/llvm/test/CodeGen/VE/Scalar/bitint_addition.ll new file mode 100644 index 0000000000000..44acaca76c199 --- /dev/null +++ b/llvm/test/CodeGen/VE/Scalar/bitint_addition.ll @@ -0,0 +1,52 @@ +; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s + +define zeroext i17 @add_i17_zext(i17 zeroext %0, i17 zeroext %1) { +; CHECK-LABEL: add_i17_zext: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.w.sx %s0, %s1, %s0 +; CHECK-NEXT: and %s0, %s0, (47)0 +; CHECK-NEXT: b.l.t (, %s10) + %3 = add i17 %1, %0 + ret i17 %3 +} + +define signext i17 @add_i17_sext(i17 signext %0, i17 signext %1) { +; CHECK-LABEL: add_i17_sext: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.w.sx %s0, %s1, %s0 +; CHECK-NEXT: sll %s0, %s0, 47 +; CHECK-NEXT: sra.l %s0, %s0, 47 +; CHECK-NEXT: b.l.t (, %s10) + %3 = add nsw i17 %1, %0 + ret i17 %3 +} + +define i65 @add_i65(i65 %0, i65 %1) { +; CHECK-LABEL: add_i65: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.l %s1, %s3, %s1 +; CHECK-NEXT: adds.l %s0, %s2, %s0 +; CHECK-NEXT: cmpu.l %s2, %s0, %s2 +; CHECK-NEXT: or %s3, 0, (0)1 +; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s2 +; CHECK-NEXT: adds.w.zx %s2, %s3, (0)1 +; CHECK-NEXT: adds.l %s1, %s1, %s2 +; CHECK-NEXT: b.l.t (, %s10) + %3 = add i65 %1, %0 + ret i65 %3 +} + +define i77 @add_i77(i77 %0, i77 %1) { +; CHECK-LABEL: add_i77: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.l %s1, %s3, %s1 +; CHECK-NEXT: adds.l %s0, %s2, %s0 +; CHECK-NEXT: cmpu.l %s2, %s0, %s2 +; CHECK-NEXT: or %s3, 0, (0)1 +; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s2 +; CHECK-NEXT: adds.w.zx %s2, %s3, (0)1 +; CHECK-NEXT: adds.l %s1, %s1, %s2 +; CHECK-NEXT: b.l.t (, %s10) + %3 = add i77 %1, %0 + ret i77 %3 +} diff --git a/llvm/test/CodeGen/VE/Scalar/bitint_cast.ll b/llvm/test/CodeGen/VE/Scalar/bitint_cast.ll new file mode 100644 index 0000000000000..99aecb84bcbc9 --- /dev/null +++ b/llvm/test/CodeGen/VE/Scalar/bitint_cast.ll @@ -0,0 +1,73 @@ +; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s + +define signext i32 @trunc_i65_to_i32(i65 %0) { +; CHECK-LABEL: trunc_i65_to_i32: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 +; CHECK-NEXT: b.l.t (, %s10) + %2 = trunc i65 %0 to i32 + ret i32 %2 +} + +define i65 @sext_i32_to_i65(i32 signext %0) { +; CHECK-LABEL: sext_i32_to_i65: +; CHECK: # %bb.0: +; CHECK-NEXT: sra.l %s1, %s0, 63 +; CHECK-NEXT: b.l.t (, %s10) + %2 = sext i32 %0 to i65 + ret i65 %2 +} + +define i65 @zext_i32_to_i65(i32 zeroext %0) { +; CHECK-LABEL: zext_i32_to_i65: +; CHECK: # %bb.0: +; CHECK-NEXT: or %s1, 0, (0)1 +; CHECK-NEXT: b.l.t (, %s10) + %2 = zext i32 %0 to i65 + ret i65 %2 +} + +define signext i17 @trunc_i64_to_i17(i64 %0) { +; CHECK-LABEL: trunc_i64_to_i17: +; CHECK: # %bb.0: +; CHECK-NEXT: sll %s0, %s0, 47 +; CHECK-NEXT: sra.l %s0, %s0, 47 +; CHECK-NEXT: b.l.t (, %s10) + %2 = trunc i64 %0 to i17 + ret i17 %2 +} + +define i64 @sext_i17_to_i64(i17 signext %0) { +; CHECK-LABEL: sext_i17_to_i64: +; CHECK: # %bb.0: +; CHECK-NEXT: b.l.t (, %s10) + %2 = sext i17 %0 to i64 + ret i64 %2 +} + +define i64 @zext_i17_to_i64(i17 zeroext %0) { +; CHECK-LABEL: zext_i17_to_i64: +; CHECK: # %bb.0: +; CHECK-NEXT: b.l.t (, %s10) + %2 = zext i17 %0 to i64 + ret i64 %2 +} + +define i128 @sext_i77_to_i128(i77 %0) { +; CHECK-LABEL: sext_i77_to_i128: +; CHECK: # %bb.0: +; CHECK-NEXT: sll %s1, %s1, 51 +; CHECK-NEXT: sra.l %s1, %s1, 51 +; CHECK-NEXT: b.l.t (, %s10) + %2 = sext i77 %0 to i128 + ret i128 %2 +} + +define i128 @zext_i77_to_i128(i77 %0) { +; CHECK-LABEL: zext_i77_to_i128: +; CHECK: # %bb.0: +; CHECK-NEXT: and %s1, %s1, (51)0 +; CHECK-NEXT: b.l.t (, %s10) + %2 = zext i77 %0 to i128 + ret i128 %2 +} >From cfa1f0ca626f0ca3ffc59f938002c1d6ffa3e1d2 Mon Sep 17 00:00:00 2001 From: "Kazushi (Jam) Marukawa" <[email protected]> Date: Thu, 19 Mar 2026 19:00:11 +0900 Subject: [PATCH 3/3] [VE] Add _BitInt tests for i128 and i131 (>128-bit) types Extend existing _BitInt tests with i128 and i131 patterns: - bitint_addition.ll: i128 two-register pair addition, i131 three-register addition with upper bit masking. - bitint_cast.ll: i128/i131 trunc, sext, and zext operations. - bitint_division.ll (new): i17 native division, i65/i77/i128 division via compiler-rt (__divti3/__udivti3), and i131 inline expanded division (crash-free verification). - bitint.c: i128/i131 division at Clang IR level, using -fexperimental-max-bitint-width=1024 for >128-bit support. --- clang/test/CodeGen/VE/bitint.c | 28 ++++- .../test/CodeGen/VE/Scalar/bitint_addition.ll | 37 +++++++ llvm/test/CodeGen/VE/Scalar/bitint_cast.ll | 56 ++++++++++ .../test/CodeGen/VE/Scalar/bitint_division.ll | 100 ++++++++++++++++++ 4 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/VE/Scalar/bitint_division.ll diff --git a/clang/test/CodeGen/VE/bitint.c b/clang/test/CodeGen/VE/bitint.c index 3b1eb5577e48e..81e3d803c15f2 100644 --- a/clang/test/CodeGen/VE/bitint.c +++ b/clang/test/CodeGen/VE/bitint.c @@ -1,5 +1,5 @@ // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature -// RUN: %clang_cc1 -triple ve-unknown-linux -O2 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple ve-unknown-linux -O2 -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s // CHECK-LABEL: define {{[^@]+}}@test_bitint_17_add_unsigned // CHECK-SAME: (i17 noundef zeroext [[A:%.*]], i17 noundef zeroext [[B:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { @@ -90,3 +90,29 @@ unsigned _BitInt(77) test_bitint_77_add_unsigned(unsigned _BitInt(77) a, unsigne signed _BitInt(77) test_bitint_77_add_signed(signed _BitInt(77) a, signed _BitInt(77) b) { return a + b; } + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_128_div +// CHECK-SAME: (i128 noundef [[A:%.*]], i128 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv i128 [[A]], [[B]] +// CHECK-NEXT: ret i128 [[DIV]] +// +_BitInt(128) test_bitint_128_div(_BitInt(128) a, _BitInt(128) b) { + return a / b; +} + +// CHECK-LABEL: define {{[^@]+}}@test_bitint_131_div +// CHECK-SAME: (ptr dead_on_unwind noalias writable writeonly sret(i192) align 8 captures(none) initializes((0, 24)) [[AGG_RESULT:%.*]], ptr noundef readonly byval(i192) align 8 captures(none) [[TMP0:%.*]], ptr noundef readonly byval(i192) align 8 captures(none) [[TMP1:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP2:%.*]] = load i192, ptr [[TMP0]], align 8, !tbaa [[TBAA5:![0-9]+]] +// CHECK-NEXT: [[A:%.*]] = trunc i192 [[TMP2]] to i131 +// CHECK-NEXT: [[TMP3:%.*]] = load i192, ptr [[TMP1]], align 8, !tbaa [[TBAA5]] +// CHECK-NEXT: [[B:%.*]] = trunc i192 [[TMP3]] to i131 +// CHECK-NEXT: [[DIV:%.*]] = sdiv i131 [[A]], [[B]] +// CHECK-NEXT: [[STOREDV4:%.*]] = sext i131 [[DIV]] to i192 +// CHECK-NEXT: store i192 [[STOREDV4]], ptr [[AGG_RESULT]], align 8, !tbaa [[TBAA5]] +// CHECK-NEXT: ret void +// +_BitInt(131) test_bitint_131_div(_BitInt(131) a, _BitInt(131) b) { + return a / b; +} diff --git a/llvm/test/CodeGen/VE/Scalar/bitint_addition.ll b/llvm/test/CodeGen/VE/Scalar/bitint_addition.ll index 44acaca76c199..809fe8e1b59df 100644 --- a/llvm/test/CodeGen/VE/Scalar/bitint_addition.ll +++ b/llvm/test/CodeGen/VE/Scalar/bitint_addition.ll @@ -50,3 +50,40 @@ define i77 @add_i77(i77 %0, i77 %1) { %3 = add i77 %1, %0 ret i77 %3 } + +define i128 @add_i128(i128 %0, i128 %1) { +; CHECK-LABEL: add_i128: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.l %s1, %s3, %s1 +; CHECK-NEXT: adds.l %s0, %s2, %s0 +; CHECK-NEXT: cmpu.l %s2, %s0, %s2 +; CHECK-NEXT: or %s3, 0, (0)1 +; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s2 +; CHECK-NEXT: adds.w.zx %s2, %s3, (0)1 +; CHECK-NEXT: adds.l %s1, %s1, %s2 +; CHECK-NEXT: b.l.t (, %s10) + %3 = add i128 %1, %0 + ret i128 %3 +} + +define i131 @add_i131(i131 %0, i131 %1) { +; CHECK-LABEL: add_i131: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.l %s1, %s4, %s1 +; CHECK-NEXT: adds.l %s0, %s3, %s0 +; CHECK-NEXT: cmpu.l %s3, %s0, %s3 +; CHECK-NEXT: or %s6, 0, (0)1 +; CHECK-NEXT: or %s7, 0, (0)1 +; CHECK-NEXT: cmov.l.lt %s7, (63)0, %s3 +; CHECK-NEXT: adds.w.zx %s3, %s7, (0)1 +; CHECK-NEXT: adds.l %s1, %s1, %s3 +; CHECK-NEXT: cmpu.l %s3, %s1, %s4 +; CHECK-NEXT: cmov.l.lt %s6, (63)0, %s3 +; CHECK-NEXT: cmov.l.eq %s6, %s7, %s3 +; CHECK-NEXT: adds.l %s2, %s5, %s2 +; CHECK-NEXT: adds.l %s2, %s2, %s6 +; CHECK-NEXT: and %s2, 7, %s2 +; CHECK-NEXT: b.l.t (, %s10) + %3 = add i131 %1, %0 + ret i131 %3 +} diff --git a/llvm/test/CodeGen/VE/Scalar/bitint_cast.ll b/llvm/test/CodeGen/VE/Scalar/bitint_cast.ll index 99aecb84bcbc9..53d9b305bdcbf 100644 --- a/llvm/test/CodeGen/VE/Scalar/bitint_cast.ll +++ b/llvm/test/CodeGen/VE/Scalar/bitint_cast.ll @@ -71,3 +71,59 @@ define i128 @zext_i77_to_i128(i77 %0) { %2 = zext i77 %0 to i128 ret i128 %2 } + +define signext i32 @trunc_i128_to_i32(i128 %0) { +; CHECK-LABEL: trunc_i128_to_i32: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 +; CHECK-NEXT: b.l.t (, %s10) + %2 = trunc i128 %0 to i32 + ret i32 %2 +} + +define i128 @sext_i64_to_i128(i64 %0) { +; CHECK-LABEL: sext_i64_to_i128: +; CHECK: # %bb.0: +; CHECK-NEXT: sra.l %s1, %s0, 63 +; CHECK-NEXT: b.l.t (, %s10) + %2 = sext i64 %0 to i128 + ret i128 %2 +} + +define i128 @zext_i64_to_i128(i64 %0) { +; CHECK-LABEL: zext_i64_to_i128: +; CHECK: # %bb.0: +; CHECK-NEXT: or %s1, 0, (0)1 +; CHECK-NEXT: b.l.t (, %s10) + %2 = zext i64 %0 to i128 + ret i128 %2 +} + +define signext i32 @trunc_i131_to_i32(i131 %0) { +; CHECK-LABEL: trunc_i131_to_i32: +; CHECK: # %bb.0: +; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 +; CHECK-NEXT: b.l.t (, %s10) + %2 = trunc i131 %0 to i32 + ret i32 %2 +} + +define i131 @sext_i64_to_i131(i64 %0) { +; CHECK-LABEL: sext_i64_to_i131: +; CHECK: # %bb.0: +; CHECK-NEXT: sra.l %s1, %s0, 63 +; CHECK-NEXT: or %s2, 0, %s1 +; CHECK-NEXT: b.l.t (, %s10) + %2 = sext i64 %0 to i131 + ret i131 %2 +} + +define i131 @zext_i64_to_i131(i64 %0) { +; CHECK-LABEL: zext_i64_to_i131: +; CHECK: # %bb.0: +; CHECK-NEXT: or %s1, 0, (0)1 +; CHECK-NEXT: or %s2, 0, (0)1 +; CHECK-NEXT: b.l.t (, %s10) + %2 = zext i64 %0 to i131 + ret i131 %2 +} diff --git a/llvm/test/CodeGen/VE/Scalar/bitint_division.ll b/llvm/test/CodeGen/VE/Scalar/bitint_division.ll new file mode 100644 index 0000000000000..7435cdcac9135 --- /dev/null +++ b/llvm/test/CodeGen/VE/Scalar/bitint_division.ll @@ -0,0 +1,100 @@ +; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s + +define signext i17 @sdiv_i17(i17 signext %0, i17 signext %1) { +; CHECK-LABEL: sdiv_i17: +; CHECK: # %bb.0: +; CHECK-NEXT: divs.w.sx %s0, %s1, %s0 +; CHECK-NEXT: sll %s0, %s0, 47 +; CHECK-NEXT: sra.l %s0, %s0, 47 +; CHECK-NEXT: b.l.t (, %s10) + %3 = sdiv i17 %1, %0 + ret i17 %3 +} + +define zeroext i17 @udiv_i17(i17 zeroext %0, i17 zeroext %1) { +; CHECK-LABEL: udiv_i17: +; CHECK: # %bb.0: +; CHECK-NEXT: divu.w %s0, %s1, %s0 +; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1 +; CHECK-NEXT: b.l.t (, %s10) + %3 = udiv i17 %1, %0 + ret i17 %3 +} + +define i65 @sdiv_i65(i65 %0, i65 %1) { +; CHECK-LABEL: sdiv_i65: +; CHECK: # %bb.0: +; CHECK: lea {{.*}}, __divti3@lo +; CHECK: lea.sl %s12, __divti3@hi +; CHECK: bsic %s10, (, %s12) + %3 = sdiv i65 %1, %0 + ret i65 %3 +} + +define i65 @udiv_i65(i65 %0, i65 %1) { +; CHECK-LABEL: udiv_i65: +; CHECK: # %bb.0: +; CHECK: lea {{.*}}, __udivti3@lo +; CHECK: lea.sl %s12, __udivti3@hi +; CHECK: bsic %s10, (, %s12) + %3 = udiv i65 %1, %0 + ret i65 %3 +} + +define i77 @sdiv_i77(i77 %0, i77 %1) { +; CHECK-LABEL: sdiv_i77: +; CHECK: # %bb.0: +; CHECK: lea {{.*}}, __divti3@lo +; CHECK: lea.sl %s12, __divti3@hi +; CHECK: bsic %s10, (, %s12) + %3 = sdiv i77 %1, %0 + ret i77 %3 +} + +define i77 @udiv_i77(i77 %0, i77 %1) { +; CHECK-LABEL: udiv_i77: +; CHECK: # %bb.0: +; CHECK: lea {{.*}}, __udivti3@lo +; CHECK: lea.sl %s12, __udivti3@hi +; CHECK: bsic %s10, (, %s12) + %3 = udiv i77 %1, %0 + ret i77 %3 +} + +define i128 @sdiv_i128(i128 %0, i128 %1) { +; CHECK-LABEL: sdiv_i128: +; CHECK: # %bb.0: +; CHECK: lea {{.*}}, __divti3@lo +; CHECK: lea.sl %s12, __divti3@hi +; CHECK: bsic %s10, (, %s12) + %3 = sdiv i128 %1, %0 + ret i128 %3 +} + +define i128 @udiv_i128(i128 %0, i128 %1) { +; CHECK-LABEL: udiv_i128: +; CHECK: # %bb.0: +; CHECK: lea {{.*}}, __udivti3@lo +; CHECK: lea.sl %s12, __udivti3@hi +; CHECK: bsic %s10, (, %s12) + %3 = udiv i128 %1, %0 + ret i128 %3 +} + +; i131 division is expanded inline (no compiler-rt call) because +; compiler-rt only provides __divti3/__udivti3 for up to 128-bit integers. +; The inline expansion produces very large code, so we only verify it +; compiles without crashing rather than checking the full instruction sequence. +define i131 @sdiv_i131(i131 %0, i131 %1) { +; CHECK-LABEL: sdiv_i131: +; CHECK: b.l.t (, %s10) + %3 = sdiv i131 %1, %0 + ret i131 %3 +} + +define i131 @udiv_i131(i131 %0, i131 %1) { +; CHECK-LABEL: udiv_i131: +; CHECK: b.l.t (, %s10) + %3 = udiv i131 %1, %0 + ret i131 %3 +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
