[clang] [Clang][X86] Remove useless `extractvalue` on aesencwide/aesdecwide builtin CodeGen (PR #175113)
https://github.com/Luhaocong closed https://github.com/llvm/llvm-project/pull/175113 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][X86] Remove useless `extractvalue` on aesencwide/aesdecwide builtin CodeGen (PR #175113)
Luhaocong wrote: done https://github.com/llvm/llvm-project/pull/175113 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][X86] Remove useless `extractvalue` on aesencwide/aesdecwide builtin CodeGen (PR #175113)
https://github.com/Luhaocong updated
https://github.com/llvm/llvm-project/pull/175113
>From dcf668e2fd783ee6aea5613093439380517d2872 Mon Sep 17 00:00:00 2001
From: Haocong Lu
Date: Fri, 9 Jan 2026 11:26:32 +0800
Subject: [PATCH 1/2] [Clang][X86] Remove useless `extractvalue` on
aesencwide/aesdecwide builtin CodeGen
This is a pre-commit of CIR codegen for `aesencwide/aesdecwide` builtin, remove
useless `extractvalue` on clang CodeGen for this builtin.
---
clang/lib/CodeGen/TargetBuiltins/X86.cpp | 5 +-
clang/test/CodeGen/X86/keylocker.c | 344 +--
2 files changed, 142 insertions(+), 207 deletions(-)
diff --git a/clang/lib/CodeGen/TargetBuiltins/X86.cpp
b/clang/lib/CodeGen/TargetBuiltins/X86.cpp
index 685040fc4524f..52b1921cab91c 100644
--- a/clang/lib/CodeGen/TargetBuiltins/X86.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/X86.cpp
@@ -3194,9 +3194,8 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned
BuiltinID,
Builder.SetInsertPoint(Error);
for (int i = 0; i != 8; ++i) {
- Value *Out = Builder.CreateExtractValue(Call, i + 1);
- Constant *Zero = llvm::Constant::getNullValue(Out->getType());
- Value *Ptr = Builder.CreateConstGEP1_32(Out->getType(), Ops[0], i);
+ Constant *Zero = llvm::Constant::getNullValue(Ty);
+ Value *Ptr = Builder.CreateConstGEP1_32(Ty, Ops[0], i);
Builder.CreateAlignedStore(Zero, Ptr, Align(16));
}
Builder.CreateBr(End);
diff --git a/clang/test/CodeGen/X86/keylocker.c
b/clang/test/CodeGen/X86/keylocker.c
index e0003fabdcd95..8a7f8a793ef07 100644
--- a/clang/test/CodeGen/X86/keylocker.c
+++ b/clang/test/CodeGen/X86/keylocker.c
@@ -89,14 +89,14 @@ void test_loadiwkey(unsigned int ctl, __m128i intkey,
__m128i enkey_lo, __m128i
// CHECK64-NEXT:[[TMP6:%.*]] = call { i32, <2 x i64>, <2 x i64>, <2 x
i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 [[TMP3]], <2
x i64> [[TMP4]])
// CHECK64-NEXT:[[TMP7:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 1
// CHECK64-NEXT:store <2 x i64> [[TMP7]], ptr [[TMP5]], align 1
-// CHECK64-NEXT:[[TMP9:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
-// CHECK64-NEXT:[[TMP10:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
-// CHECK64-NEXT:store <2 x i64> [[TMP9]], ptr [[TMP10]], align 1
-// CHECK64-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
-// CHECK64-NEXT:[[TMP13:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
-// CHECK64-NEXT:store <2 x i64> [[TMP12]], ptr [[TMP13]], align 1
-// CHECK64-NEXT:[[TMP15:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 0
-// CHECK64-NEXT:ret i32 [[TMP15]]
+// CHECK64-NEXT:[[TMP8:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
+// CHECK64-NEXT:[[TMP9:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
+// CHECK64-NEXT:store <2 x i64> [[TMP8]], ptr [[TMP9]], align 1
+// CHECK64-NEXT:[[TMP10:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
+// CHECK64-NEXT:[[TMP11:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
+// CHECK64-NEXT:store <2 x i64> [[TMP10]], ptr [[TMP11]], align 1
+// CHECK64-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 0
+// CHECK64-NEXT:ret i32 [[TMP12]]
//
// CHECK32-LABEL: @test_encodekey128_u32(
// CHECK32-NEXT: entry:
@@ -121,14 +121,14 @@ void test_loadiwkey(unsigned int ctl, __m128i intkey,
__m128i enkey_lo, __m128i
// CHECK32-NEXT:[[TMP6:%.*]] = call { i32, <2 x i64>, <2 x i64>, <2 x
i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 [[TMP3]], <2
x i64> [[TMP4]])
// CHECK32-NEXT:[[TMP7:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 1
// CHECK32-NEXT:store <2 x i64> [[TMP7]], ptr [[TMP5]], align 1
-// CHECK32-NEXT:[[TMP9:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
-// CHECK32-NEXT:[[TMP10:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
-// CHECK32-NEXT:store <2 x i64> [[TMP9]], ptr [[TMP10]], align 1
-// CHECK32-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
-// CHECK32-NEXT:[[TMP13:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
-// CHECK32-NEXT:store <2 x i64> [[TMP12]], ptr [[TMP13]], align 1
-// CHECK32-NEXT:[[TMP15:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 0
-// CHECK32-NEXT:ret i32 [[TMP15]]
+// CHECK32-NEXT:[[TMP8:%.*]] = extractvalue { i32, <2 x i64>, <2 x i6
[clang] [Clang][X86] Remove useless `extractvalue` on aesencwide/aesdecwide builtin CodeGen (PR #175113)
https://github.com/phoebewang edited https://github.com/llvm/llvm-project/pull/175113 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][X86] Remove useless `extractvalue` on aesencwide/aesdecwide builtin CodeGen (PR #175113)
phoebewang wrote: This can be `Ty` too. https://github.com/llvm/llvm-project/pull/175113 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][X86] Remove useless `extractvalue` on aesencwide/aesdecwide builtin CodeGen (PR #175113)
https://github.com/phoebewang approved this pull request. LGTM. https://github.com/llvm/llvm-project/pull/175113 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][X86] Remove useless `extractvalue` on aesencwide/aesdecwide builtin CodeGen (PR #175113)
llvmbot wrote:
@llvm/pr-subscribers-clang-codegen
Author: Haocong Lu (Luhaocong)
Changes
This is a pre-commit of CIR codegen for `aesencwide/aesdecwide` builtin, remove
useless `extractvalue` on clang CodeGen for this builtin.
---
Patch is 43.51 KiB, truncated to 20.00 KiB below, full version:
https://github.com/llvm/llvm-project/pull/175113.diff
2 Files Affected:
- (modified) clang/lib/CodeGen/TargetBuiltins/X86.cpp (+2-3)
- (modified) clang/test/CodeGen/X86/keylocker.c (+140-204)
``diff
diff --git a/clang/lib/CodeGen/TargetBuiltins/X86.cpp
b/clang/lib/CodeGen/TargetBuiltins/X86.cpp
index 685040fc4524f..52b1921cab91c 100644
--- a/clang/lib/CodeGen/TargetBuiltins/X86.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/X86.cpp
@@ -3194,9 +3194,8 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned
BuiltinID,
Builder.SetInsertPoint(Error);
for (int i = 0; i != 8; ++i) {
- Value *Out = Builder.CreateExtractValue(Call, i + 1);
- Constant *Zero = llvm::Constant::getNullValue(Out->getType());
- Value *Ptr = Builder.CreateConstGEP1_32(Out->getType(), Ops[0], i);
+ Constant *Zero = llvm::Constant::getNullValue(Ty);
+ Value *Ptr = Builder.CreateConstGEP1_32(Ty, Ops[0], i);
Builder.CreateAlignedStore(Zero, Ptr, Align(16));
}
Builder.CreateBr(End);
diff --git a/clang/test/CodeGen/X86/keylocker.c
b/clang/test/CodeGen/X86/keylocker.c
index e0003fabdcd95..8a7f8a793ef07 100644
--- a/clang/test/CodeGen/X86/keylocker.c
+++ b/clang/test/CodeGen/X86/keylocker.c
@@ -89,14 +89,14 @@ void test_loadiwkey(unsigned int ctl, __m128i intkey,
__m128i enkey_lo, __m128i
// CHECK64-NEXT:[[TMP6:%.*]] = call { i32, <2 x i64>, <2 x i64>, <2 x
i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 [[TMP3]], <2
x i64> [[TMP4]])
// CHECK64-NEXT:[[TMP7:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 1
// CHECK64-NEXT:store <2 x i64> [[TMP7]], ptr [[TMP5]], align 1
-// CHECK64-NEXT:[[TMP9:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
-// CHECK64-NEXT:[[TMP10:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
-// CHECK64-NEXT:store <2 x i64> [[TMP9]], ptr [[TMP10]], align 1
-// CHECK64-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
-// CHECK64-NEXT:[[TMP13:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
-// CHECK64-NEXT:store <2 x i64> [[TMP12]], ptr [[TMP13]], align 1
-// CHECK64-NEXT:[[TMP15:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 0
-// CHECK64-NEXT:ret i32 [[TMP15]]
+// CHECK64-NEXT:[[TMP8:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
+// CHECK64-NEXT:[[TMP9:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
+// CHECK64-NEXT:store <2 x i64> [[TMP8]], ptr [[TMP9]], align 1
+// CHECK64-NEXT:[[TMP10:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
+// CHECK64-NEXT:[[TMP11:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
+// CHECK64-NEXT:store <2 x i64> [[TMP10]], ptr [[TMP11]], align 1
+// CHECK64-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 0
+// CHECK64-NEXT:ret i32 [[TMP12]]
//
// CHECK32-LABEL: @test_encodekey128_u32(
// CHECK32-NEXT: entry:
@@ -121,14 +121,14 @@ void test_loadiwkey(unsigned int ctl, __m128i intkey,
__m128i enkey_lo, __m128i
// CHECK32-NEXT:[[TMP6:%.*]] = call { i32, <2 x i64>, <2 x i64>, <2 x
i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 [[TMP3]], <2
x i64> [[TMP4]])
// CHECK32-NEXT:[[TMP7:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 1
// CHECK32-NEXT:store <2 x i64> [[TMP7]], ptr [[TMP5]], align 1
-// CHECK32-NEXT:[[TMP9:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
-// CHECK32-NEXT:[[TMP10:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
-// CHECK32-NEXT:store <2 x i64> [[TMP9]], ptr [[TMP10]], align 1
-// CHECK32-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
-// CHECK32-NEXT:[[TMP13:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
-// CHECK32-NEXT:store <2 x i64> [[TMP12]], ptr [[TMP13]], align 1
-// CHECK32-NEXT:[[TMP15:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 0
-// CHECK32-NEXT:ret i32 [[TMP15]]
+// CHECK32-NEXT:[[TMP8:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
+// CHECK32-NEXT:[[TMP9:%.*]] = getelementptr i8, ptr [
[clang] [Clang][X86] Remove useless `extractvalue` on aesencwide/aesdecwide builtin CodeGen (PR #175113)
https://github.com/Luhaocong created
https://github.com/llvm/llvm-project/pull/175113
This is a pre-commit of CIR codegen for `aesencwide/aesdecwide` builtin, remove
useless `extractvalue` on clang CodeGen for this builtin.
>From dcf668e2fd783ee6aea5613093439380517d2872 Mon Sep 17 00:00:00 2001
From: Haocong Lu
Date: Fri, 9 Jan 2026 11:26:32 +0800
Subject: [PATCH] [Clang][X86] Remove useless `extractvalue` on
aesencwide/aesdecwide builtin CodeGen
This is a pre-commit of CIR codegen for `aesencwide/aesdecwide` builtin, remove
useless `extractvalue` on clang CodeGen for this builtin.
---
clang/lib/CodeGen/TargetBuiltins/X86.cpp | 5 +-
clang/test/CodeGen/X86/keylocker.c | 344 +--
2 files changed, 142 insertions(+), 207 deletions(-)
diff --git a/clang/lib/CodeGen/TargetBuiltins/X86.cpp
b/clang/lib/CodeGen/TargetBuiltins/X86.cpp
index 685040fc4524f..52b1921cab91c 100644
--- a/clang/lib/CodeGen/TargetBuiltins/X86.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/X86.cpp
@@ -3194,9 +3194,8 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned
BuiltinID,
Builder.SetInsertPoint(Error);
for (int i = 0; i != 8; ++i) {
- Value *Out = Builder.CreateExtractValue(Call, i + 1);
- Constant *Zero = llvm::Constant::getNullValue(Out->getType());
- Value *Ptr = Builder.CreateConstGEP1_32(Out->getType(), Ops[0], i);
+ Constant *Zero = llvm::Constant::getNullValue(Ty);
+ Value *Ptr = Builder.CreateConstGEP1_32(Ty, Ops[0], i);
Builder.CreateAlignedStore(Zero, Ptr, Align(16));
}
Builder.CreateBr(End);
diff --git a/clang/test/CodeGen/X86/keylocker.c
b/clang/test/CodeGen/X86/keylocker.c
index e0003fabdcd95..8a7f8a793ef07 100644
--- a/clang/test/CodeGen/X86/keylocker.c
+++ b/clang/test/CodeGen/X86/keylocker.c
@@ -89,14 +89,14 @@ void test_loadiwkey(unsigned int ctl, __m128i intkey,
__m128i enkey_lo, __m128i
// CHECK64-NEXT:[[TMP6:%.*]] = call { i32, <2 x i64>, <2 x i64>, <2 x
i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 [[TMP3]], <2
x i64> [[TMP4]])
// CHECK64-NEXT:[[TMP7:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 1
// CHECK64-NEXT:store <2 x i64> [[TMP7]], ptr [[TMP5]], align 1
-// CHECK64-NEXT:[[TMP9:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
-// CHECK64-NEXT:[[TMP10:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
-// CHECK64-NEXT:store <2 x i64> [[TMP9]], ptr [[TMP10]], align 1
-// CHECK64-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
-// CHECK64-NEXT:[[TMP13:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
-// CHECK64-NEXT:store <2 x i64> [[TMP12]], ptr [[TMP13]], align 1
-// CHECK64-NEXT:[[TMP15:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 0
-// CHECK64-NEXT:ret i32 [[TMP15]]
+// CHECK64-NEXT:[[TMP8:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
+// CHECK64-NEXT:[[TMP9:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
+// CHECK64-NEXT:store <2 x i64> [[TMP8]], ptr [[TMP9]], align 1
+// CHECK64-NEXT:[[TMP10:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
+// CHECK64-NEXT:[[TMP11:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
+// CHECK64-NEXT:store <2 x i64> [[TMP10]], ptr [[TMP11]], align 1
+// CHECK64-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 0
+// CHECK64-NEXT:ret i32 [[TMP12]]
//
// CHECK32-LABEL: @test_encodekey128_u32(
// CHECK32-NEXT: entry:
@@ -121,14 +121,14 @@ void test_loadiwkey(unsigned int ctl, __m128i intkey,
__m128i enkey_lo, __m128i
// CHECK32-NEXT:[[TMP6:%.*]] = call { i32, <2 x i64>, <2 x i64>, <2 x
i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 [[TMP3]], <2
x i64> [[TMP4]])
// CHECK32-NEXT:[[TMP7:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 1
// CHECK32-NEXT:store <2 x i64> [[TMP7]], ptr [[TMP5]], align 1
-// CHECK32-NEXT:[[TMP9:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 2
-// CHECK32-NEXT:[[TMP10:%.*]] = getelementptr i8, ptr [[TMP5]], i32 16
-// CHECK32-NEXT:store <2 x i64> [[TMP9]], ptr [[TMP10]], align 1
-// CHECK32-NEXT:[[TMP12:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[TMP6]], 3
-// CHECK32-NEXT:[[TMP13:%.*]] = getelementptr i8, ptr [[TMP5]], i32 32
-// CHECK32-NEXT:store <2 x i64> [[TMP12]], ptr [[TMP13]], align 1
-// CHECK32-NEXT:[[TMP15:%.*]] = extractvalue { i32, <2 x i64>, <2 x i64>,
<2 x i64>, <2 x i64>, <2 x i64>, <
