[llvm] [LoongArch][NFC] Add tests for vector extraction with zero extension (PR #214119)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 4 19:52:27 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-loongarch
Author: hev (heiher)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/214119.diff
2 Files Affected:
- (modified) llvm/test/CodeGen/LoongArch/lasx/ir-instruction/extractelement.ll (+107)
- (modified) llvm/test/CodeGen/LoongArch/lsx/ir-instruction/extractelement.ll (+64)
``````````diff
diff --git a/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/extractelement.ll b/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/extractelement.ll
index 9634605dddfdc..826c4fe0a315d 100644
--- a/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/extractelement.ll
+++ b/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/extractelement.ll
@@ -243,6 +243,113 @@ define void @extract_4xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
ret void
}
+define void @vextract_32xi8_zext(ptr %src, ptr %dst) nounwind {
+; CHECK-LABEL: vextract_32xi8_zext:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: xvld $xr0, $a0, 0
+; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT: andi $a0, $a0, 255
+; CHECK-NEXT: st.w $a0, $a1, 0
+; CHECK-NEXT: ret
+entry:
+ %0 = load volatile <32 x i8>, ptr %src
+ %1 = extractelement <32 x i8> %0, i64 0
+ %2 = zext i8 %1 to i32
+ store i32 %2, ptr %dst
+ ret void
+}
+
+define void @vextract_32xi8_zext_hi(ptr %src, ptr %dst) nounwind {
+; CHECK-LABEL: vextract_32xi8_zext_hi:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: xvld $xr0, $a0, 0
+; CHECK-NEXT: xvpermi.d $xr0, $xr0, 14
+; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT: andi $a0, $a0, 255
+; CHECK-NEXT: st.w $a0, $a1, 0
+; CHECK-NEXT: ret
+entry:
+ %0 = load volatile <32 x i8>, ptr %src
+ %1 = extractelement <32 x i8> %0, i64 16
+ %2 = zext i8 %1 to i32
+ store i32 %2, ptr %dst
+ ret void
+}
+
+define void @vextract_16xi16_zext(ptr %src, ptr %dst) nounwind {
+; LA32-LABEL: vextract_16xi16_zext:
+; LA32: # %bb.0: # %entry
+; LA32-NEXT: xvld $xr0, $a0, 0
+; LA32-NEXT: vpickve2gr.h $a0, $vr0, 0
+; LA32-NEXT: bstrpick.w $a0, $a0, 15, 0
+; LA32-NEXT: st.w $a0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: vextract_16xi16_zext:
+; LA64: # %bb.0: # %entry
+; LA64-NEXT: xvld $xr0, $a0, 0
+; LA64-NEXT: vpickve2gr.h $a0, $vr0, 0
+; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0
+; LA64-NEXT: st.w $a0, $a1, 0
+; LA64-NEXT: ret
+entry:
+ %0 = load volatile <16 x i16>, ptr %src
+ %1 = extractelement <16 x i16> %0, i64 0
+ %2 = zext i16 %1 to i32
+ store i32 %2, ptr %dst
+ ret void
+}
+
+define void @vextract_16xi16_zext_hi(ptr %src, ptr %dst) nounwind {
+; LA32-LABEL: vextract_16xi16_zext_hi:
+; LA32: # %bb.0: # %entry
+; LA32-NEXT: xvld $xr0, $a0, 0
+; LA32-NEXT: xvpermi.d $xr0, $xr0, 14
+; LA32-NEXT: vpickve2gr.h $a0, $vr0, 0
+; LA32-NEXT: bstrpick.w $a0, $a0, 15, 0
+; LA32-NEXT: st.w $a0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: vextract_16xi16_zext_hi:
+; LA64: # %bb.0: # %entry
+; LA64-NEXT: xvld $xr0, $a0, 0
+; LA64-NEXT: xvpermi.d $xr0, $xr0, 14
+; LA64-NEXT: vpickve2gr.h $a0, $vr0, 0
+; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0
+; LA64-NEXT: st.w $a0, $a1, 0
+; LA64-NEXT: ret
+entry:
+ %0 = load volatile <16 x i16>, ptr %src
+ %1 = extractelement <16 x i16> %0, i64 8
+ %2 = zext i16 %1 to i32
+ store i32 %2, ptr %dst
+ ret void
+}
+
+define void @vextract_8xi32_zext(ptr %src, ptr %dst) nounwind {
+; LA32-LABEL: vextract_8xi32_zext:
+; LA32: # %bb.0: # %entry
+; LA32-NEXT: xvld $xr0, $a0, 0
+; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 0
+; LA32-NEXT: st.w $zero, $a1, 4
+; LA32-NEXT: st.w $a0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: vextract_8xi32_zext:
+; LA64: # %bb.0: # %entry
+; LA64-NEXT: xvld $xr0, $a0, 0
+; LA64-NEXT: xvpickve2gr.w $a0, $xr0, 0
+; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
+; LA64-NEXT: st.d $a0, $a1, 0
+; LA64-NEXT: ret
+entry:
+ %0 = load volatile <8 x i32>, ptr %src
+ %1 = extractelement <8 x i32> %0, i64 0
+ %2 = zext i32 %1 to i64
+ store i64 %2, ptr %dst
+ ret void
+}
+
define void @eliminate_frame_index(<8 x i32> %a) nounwind {
; LA32-LABEL: eliminate_frame_index:
; LA32: # %bb.0:
diff --git a/llvm/test/CodeGen/LoongArch/lsx/ir-instruction/extractelement.ll b/llvm/test/CodeGen/LoongArch/lsx/ir-instruction/extractelement.ll
index b25c2da9761b5..75ef121ed64e2 100644
--- a/llvm/test/CodeGen/LoongArch/lsx/ir-instruction/extractelement.ll
+++ b/llvm/test/CodeGen/LoongArch/lsx/ir-instruction/extractelement.ll
@@ -233,6 +233,70 @@ define void @extract_2xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
ret void
}
+define void @extract_16xi8_zext(ptr %src, ptr %dst) nounwind {
+; CHECK-LABEL: extract_16xi8_zext:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: vld $vr0, $a0, 0
+; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT: andi $a0, $a0, 255
+; CHECK-NEXT: st.w $a0, $a1, 0
+; CHECK-NEXT: ret
+entry:
+ %0 = load volatile <16 x i8>, ptr %src
+ %1 = extractelement <16 x i8> %0, i64 0
+ %2 = zext i8 %1 to i32
+ store i32 %2, ptr %dst
+ ret void
+}
+
+define void @extract_8xi16_zext(ptr %src, ptr %dst) nounwind {
+; LA32-LABEL: extract_8xi16_zext:
+; LA32: # %bb.0: # %entry
+; LA32-NEXT: vld $vr0, $a0, 0
+; LA32-NEXT: vpickve2gr.h $a0, $vr0, 0
+; LA32-NEXT: bstrpick.w $a0, $a0, 15, 0
+; LA32-NEXT: st.w $a0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: extract_8xi16_zext:
+; LA64: # %bb.0: # %entry
+; LA64-NEXT: vld $vr0, $a0, 0
+; LA64-NEXT: vpickve2gr.h $a0, $vr0, 0
+; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0
+; LA64-NEXT: st.w $a0, $a1, 0
+; LA64-NEXT: ret
+entry:
+ %0 = load volatile <8 x i16>, ptr %src
+ %1 = extractelement <8 x i16> %0, i64 0
+ %2 = zext i16 %1 to i32
+ store i32 %2, ptr %dst
+ ret void
+}
+
+define void @extract_4xi32_zext(ptr %src, ptr %dst) nounwind {
+; LA32-LABEL: extract_4xi32_zext:
+; LA32: # %bb.0: # %entry
+; LA32-NEXT: vld $vr0, $a0, 0
+; LA32-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA32-NEXT: st.w $zero, $a1, 4
+; LA32-NEXT: st.w $a0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: extract_4xi32_zext:
+; LA64: # %bb.0: # %entry
+; LA64-NEXT: vld $vr0, $a0, 0
+; LA64-NEXT: vpickve2gr.w $a0, $vr0, 0
+; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
+; LA64-NEXT: st.d $a0, $a1, 0
+; LA64-NEXT: ret
+entry:
+ %0 = load volatile <4 x i32>, ptr %src
+ %1 = extractelement <4 x i32> %0, i64 0
+ %2 = zext i32 %1 to i64
+ store i64 %2, ptr %dst
+ ret void
+}
+
define void @eliminate_frame_index(<4 x i32> %a) nounwind {
; LA32-LABEL: eliminate_frame_index:
; LA32: # %bb.0:
``````````
</details>
https://github.com/llvm/llvm-project/pull/214119
More information about the llvm-commits
mailing list