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

Reply via email to