[llvm] [LoongArch] Lowering v32i8 vector mask generation to `VMSKLTZ` (PR #149953)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 21 19:02:06 PDT 2025


https://github.com/heiher created https://github.com/llvm/llvm-project/pull/149953

None

>From 1c8b4708216a0c2b2c310158f929baee734e3f91 Mon Sep 17 00:00:00 2001
From: WANG Rui <wangrui at loongson.cn>
Date: Fri, 18 Jul 2025 20:25:58 +0800
Subject: [PATCH 1/2] [LoongArch][NFC] Pre-commit for lowering v32i8 vector
 mask generation to `VMSKLTZ`

---
 llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll | 1337 +++++++++++++++++++
 1 file changed, 1337 insertions(+)

diff --git a/llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll b/llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll
index ad57bbf9ee5c0..397896c543898 100644
--- a/llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll
+++ b/llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll
@@ -603,3 +603,1340 @@ define i4 @vmsk_eq_allzeros_v4i8(<4 x i8> %a) {
   %2 = bitcast <4 x i1> %1 to i4
   ret i4 %2
 }
+
+define i32 @vmsk2_eq_allzeros_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_eq_allzeros_i8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vseqi.b $vr0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vseqi.b $vr0, $vr1, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+entry:
+  %1 = icmp eq <32 x i8> %a, splat (i8 0)
+  %2 = bitcast <32 x i1> %1 to i32
+  ret i32 %2
+}
+
+define i32 @vmsk2_sgt_allzeros_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_sgt_allzeros_i8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vrepli.b $vr2, 0
+; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr0
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+entry:
+  %1 = icmp sgt <32 x i8> %a, splat (i8 0)
+  %2 = bitcast <32 x i1> %1 to i32
+  ret i32 %2
+}
+
+define i32 @vmsk2_sgt_allones_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_sgt_allones_i8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vrepli.b $vr2, -1
+; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr0
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+entry:
+  %1 = icmp sgt <32 x i8> %a, splat (i8 -1)
+  %2 = bitcast <32 x i1> %1 to i32
+  ret i32 %2
+}
+
+define i32 @vmsk2_sge_allzeros_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_sge_allzeros_i8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vrepli.b $vr2, 0
+; CHECK-NEXT:    vsle.b $vr0, $vr2, $vr0
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vsle.b $vr0, $vr2, $vr1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+entry:
+  %1 = icmp sge <32 x i8> %a, splat (i8 0)
+  %2 = bitcast <32 x i1> %1 to i32
+  ret i32 %2
+}
+
+define i32 @vmsk2_slt_allzeros_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_slt_allzeros_i8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vslti.b $vr0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vslti.b $vr0, $vr1, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+entry:
+  %1 = icmp slt <32 x i8> %a, splat (i8 0)
+  %2 = bitcast <32 x i1> %1 to i32
+  ret i32 %2
+}
+
+define i32 @vmsk2_sle_allzeros_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_sle_allzeros_i8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vslei.b $vr0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vslei.b $vr0, $vr1, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+entry:
+  %1 = icmp sle <32 x i8> %a, splat (i8 0)
+  %2 = bitcast <32 x i1> %1 to i32
+  ret i32 %2
+}
+
+define i32 @vmsk2_sle_allones_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_sle_allones_i8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vslei.b $vr0, $vr0, -1
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vslei.b $vr0, $vr1, -1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+entry:
+  %1 = icmp sle <32 x i8> %a, splat (i8 -1)
+  %2 = bitcast <32 x i1> %1 to i32
+  ret i32 %2
+}
+
+define i32 @vmsk2_ne_allzeros_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_ne_allzeros_i8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vseqi.b $vr0, $vr0, 0
+; CHECK-NEXT:    vxori.b $vr0, $vr0, 255
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vseqi.b $vr0, $vr1, 0
+; CHECK-NEXT:    vxori.b $vr0, $vr0, 255
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+entry:
+  %1 = icmp ne <32 x i8> %a, splat (i8 0)
+  %2 = bitcast <32 x i1> %1 to i32
+  ret i32 %2
+}
+
+define i32 @vmsk2_sgt_v32i8(<32 x i8> %a, <32 x i8> %b) {
+; CHECK-LABEL: vmsk2_sgt_v32i8:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr0
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vslt.b $vr0, $vr3, $vr1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+  %x = icmp sgt <32 x i8> %a, %b
+  %res = bitcast <32 x i1> %x to i32
+  ret i32 %res
+}
+
+define i32 @vmsk2_sgt_and_sgt_v32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> %c, <32 x i8> %d) {
+; CHECK-LABEL: vmsk2_sgt_and_sgt_v32i8:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vslt.b $vr1, $vr3, $vr1
+; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr0
+; CHECK-NEXT:    vslt.b $vr2, $vr7, $vr5
+; CHECK-NEXT:    vslt.b $vr3, $vr6, $vr4
+; CHECK-NEXT:    vand.v $vr0, $vr0, $vr3
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vand.v $vr0, $vr1, $vr2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+  %x0 = icmp sgt <32 x i8> %a, %b
+  %x1 = icmp sgt <32 x i8> %c, %d
+  %y = and <32 x i1> %x0, %x1
+  %res = bitcast <32 x i1> %y to i32
+  ret i32 %res
+}
+
+define i32 @vmsk2_trunc_i8(<32 x i8> %a) {
+; CHECK-LABEL: vmsk2_trunc_i8:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi.d $sp, $sp, -16
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
+; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
+; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
+; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
+; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 6
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 7
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 8
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 9
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 10
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 11
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 12
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 13
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
+; CHECK-NEXT:    andi $a1, $a1, 1
+; CHECK-NEXT:    slli.d $a1, $a1, 14
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
+; CHECK-NEXT:    slli.d $a1, $a1, 15
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vpickve2gr.b $a1, $vr1, 0
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 1
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 2
+; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 3
+; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 4
+; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 5
+; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 6
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 6
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 7
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 7
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 8
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 8
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 9
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 9
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 10
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 10
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 11
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 11
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 12
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 12
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 13
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 13
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 14
+; CHECK-NEXT:    andi $a2, $a2, 1
+; CHECK-NEXT:    slli.d $a2, $a2, 14
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 15
+; CHECK-NEXT:    slli.d $a2, $a2, 15
+; CHECK-NEXT:    or $a1, $a1, $a2
+; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    slli.d $a1, $a1, 16
+; CHECK-NEXT:    or $a0, $a0, $a1
+; CHECK-NEXT:    addi.d $sp, $sp, 16
+; CHECK-NEXT:    ret
+  %y = trunc <32 x i8> %a to <32 x i1>
+  %res = bitcast <32 x i1> %y to i32
+  ret i32 %res
+}

>From 1e1fb3fcad3de5fafdd67b5468f720fbc7b43186 Mon Sep 17 00:00:00 2001
From: WANG Rui <wangrui at loongson.cn>
Date: Fri, 18 Jul 2025 20:27:25 +0800
Subject: [PATCH 2/2] [LoongArch] Lowering v32i8 vector mask generation to
 `VMSKLTZ`

---
 .../LoongArch/LoongArchISelLowering.cpp       |   24 +-
 llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll   | 1235 +----------------
 2 files changed, 71 insertions(+), 1188 deletions(-)

diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index a31fa57fcd8c6..cc8b853432118 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -4700,13 +4700,29 @@ static SDValue performBITCASTCombine(SDNode *N, SelectionDAG &DAG,
     UseLASX = true;
     break;
   };
-  if (UseLASX && !(Subtarget.has32S() && Subtarget.hasExtLASX()))
-    return SDValue();
   Src = PropagateSExt ? signExtendBitcastSrcVector(DAG, SExtVT, Src, DL)
                       : DAG.getNode(ISD::SIGN_EXTEND, DL, SExtVT, Src);
-  Opc = UseLASX ? LoongArchISD::XVMSKLTZ : LoongArchISD::VMSKLTZ;
 
-  SDValue V = DAG.getNode(Opc, DL, MVT::i64, Src);
+  SDValue V;
+  if (!Subtarget.has32S() || !Subtarget.hasExtLASX()) {
+    if (Src.getSimpleValueType() == MVT::v32i8) {
+      SDValue Lo, Hi;
+      std::tie(Lo, Hi) = DAG.SplitVector(Src, DL);
+      Lo = DAG.getNode(LoongArchISD::VMSKLTZ, DL, MVT::i64, Lo);
+      Hi = DAG.getNode(LoongArchISD::VMSKLTZ, DL, MVT::i64, Hi);
+      Hi = DAG.getNode(ISD::SHL, DL, MVT::i64, Hi,
+                       DAG.getConstant(16, DL, MVT::i8));
+      V = DAG.getNode(ISD::OR, DL, MVT::i64, Lo, Hi);
+    } else if (UseLASX) {
+      return SDValue();
+    }
+  }
+
+  if (!V) {
+    Opc = UseLASX ? LoongArchISD::XVMSKLTZ : LoongArchISD::VMSKLTZ;
+    V = DAG.getNode(Opc, DL, MVT::i64, Src);
+  }
+
   EVT T = EVT::getIntegerVT(*DAG.getContext(), SrcVT.getVectorNumElements());
   V = DAG.getZExtOrTrunc(V, DL, T);
   return DAG.getBitcast(VT, V);
diff --git a/llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll b/llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll
index 397896c543898..7fa591db5d1fa 100644
--- a/llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll
+++ b/llvm/test/CodeGen/LoongArch/lsx/vmskcond.ll
@@ -607,117 +607,14 @@ define i4 @vmsk_eq_allzeros_v4i8(<4 x i8> %a) {
 define i32 @vmsk2_eq_allzeros_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_eq_allzeros_i8:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
 ; CHECK-NEXT:    vseqi.b $vr0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
 ; CHECK-NEXT:    vseqi.b $vr0, $vr1, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
 entry:
   %1 = icmp eq <32 x i8> %a, splat (i8 0)
@@ -728,118 +625,15 @@ entry:
 define i32 @vmsk2_sgt_allzeros_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_sgt_allzeros_i8:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
 ; CHECK-NEXT:    vrepli.b $vr2, 0
 ; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr0
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
 ; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
 entry:
   %1 = icmp sgt <32 x i8> %a, splat (i8 0)
@@ -850,118 +644,15 @@ entry:
 define i32 @vmsk2_sgt_allones_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_sgt_allones_i8:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
 ; CHECK-NEXT:    vrepli.b $vr2, -1
 ; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr0
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
 ; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
 entry:
   %1 = icmp sgt <32 x i8> %a, splat (i8 -1)
@@ -972,118 +663,15 @@ entry:
 define i32 @vmsk2_sge_allzeros_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_sge_allzeros_i8:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
 ; CHECK-NEXT:    vrepli.b $vr2, 0
 ; CHECK-NEXT:    vsle.b $vr0, $vr2, $vr0
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
 ; CHECK-NEXT:    vsle.b $vr0, $vr2, $vr1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
 entry:
   %1 = icmp sge <32 x i8> %a, splat (i8 0)
@@ -1094,117 +682,12 @@ entry:
 define i32 @vmsk2_slt_allzeros_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_slt_allzeros_i8:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
-; CHECK-NEXT:    vslti.b $vr0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
-; CHECK-NEXT:    vslti.b $vr0, $vr1, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr1
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
 entry:
   %1 = icmp slt <32 x i8> %a, splat (i8 0)
@@ -1215,117 +698,14 @@ entry:
 define i32 @vmsk2_sle_allzeros_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_sle_allzeros_i8:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
 ; CHECK-NEXT:    vslei.b $vr0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
 ; CHECK-NEXT:    vslei.b $vr0, $vr1, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
 entry:
   %1 = icmp sle <32 x i8> %a, splat (i8 0)
@@ -1336,117 +716,14 @@ entry:
 define i32 @vmsk2_sle_allones_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_sle_allones_i8:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
 ; CHECK-NEXT:    vslei.b $vr0, $vr0, -1
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
 ; CHECK-NEXT:    vslei.b $vr0, $vr1, -1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
 entry:
   %1 = icmp sle <32 x i8> %a, splat (i8 -1)
@@ -1457,119 +734,16 @@ entry:
 define i32 @vmsk2_ne_allzeros_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_ne_allzeros_i8:
 ; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
 ; CHECK-NEXT:    vseqi.b $vr0, $vr0, 0
 ; CHECK-NEXT:    vxori.b $vr0, $vr0, 255
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
 ; CHECK-NEXT:    vseqi.b $vr0, $vr1, 0
 ; CHECK-NEXT:    vxori.b $vr0, $vr0, 255
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
 entry:
   %1 = icmp ne <32 x i8> %a, splat (i8 0)
@@ -1580,117 +754,14 @@ entry:
 define i32 @vmsk2_sgt_v32i8(<32 x i8> %a, <32 x i8> %b) {
 ; CHECK-LABEL: vmsk2_sgt_v32i8:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
 ; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr0
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
 ; CHECK-NEXT:    vslt.b $vr0, $vr3, $vr1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
   %x = icmp sgt <32 x i8> %a, %b
   %res = bitcast <32 x i1> %x to i32
@@ -1700,121 +771,18 @@ define i32 @vmsk2_sgt_v32i8(<32 x i8> %a, <32 x i8> %b) {
 define i32 @vmsk2_sgt_and_sgt_v32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> %c, <32 x i8> %d) {
 ; CHECK-LABEL: vmsk2_sgt_and_sgt_v32i8:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
-; CHECK-NEXT:    vslt.b $vr1, $vr3, $vr1
 ; CHECK-NEXT:    vslt.b $vr0, $vr2, $vr0
-; CHECK-NEXT:    vslt.b $vr2, $vr7, $vr5
-; CHECK-NEXT:    vslt.b $vr3, $vr6, $vr4
-; CHECK-NEXT:    vand.v $vr0, $vr0, $vr3
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
-; CHECK-NEXT:    vand.v $vr0, $vr1, $vr2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr0, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vslt.b $vr1, $vr3, $vr1
+; CHECK-NEXT:    vslt.b $vr2, $vr6, $vr4
+; CHECK-NEXT:    vslt.b $vr3, $vr7, $vr5
+; CHECK-NEXT:    vand.v $vr1, $vr1, $vr3
+; CHECK-NEXT:    vand.v $vr0, $vr0, $vr2
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
+; CHECK-NEXT:    vmskltz.b $vr0, $vr1
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
   %x0 = icmp sgt <32 x i8> %a, %b
   %x1 = icmp sgt <32 x i8> %c, %d
@@ -1826,115 +794,14 @@ define i32 @vmsk2_sgt_and_sgt_v32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> %c, <3
 define i32 @vmsk2_trunc_i8(<32 x i8> %a) {
 ; CHECK-LABEL: vmsk2_trunc_i8:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    addi.d $sp, $sp, -16
-; CHECK-NEXT:    .cfi_def_cfa_offset 16
-; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 1
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    bstrins.d $a0, $a1, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 2
-; CHECK-NEXT:    bstrins.d $a0, $a1, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 3
-; CHECK-NEXT:    bstrins.d $a0, $a1, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 4
-; CHECK-NEXT:    bstrins.d $a0, $a1, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 5
-; CHECK-NEXT:    bstrins.d $a0, $a1, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 6
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 6
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 7
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 7
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 8
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 8
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 9
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 9
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 10
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 10
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 11
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 11
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 12
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 12
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 13
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 13
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 14
-; CHECK-NEXT:    andi $a1, $a1, 1
-; CHECK-NEXT:    slli.d $a1, $a1, 14
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr0, 15
-; CHECK-NEXT:    slli.d $a1, $a1, 15
-; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    bstrpick.d $a0, $a0, 15, 0
-; CHECK-NEXT:    vpickve2gr.b $a1, $vr1, 0
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 1
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    bstrins.d $a1, $a2, 63, 1
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 2
-; CHECK-NEXT:    bstrins.d $a1, $a2, 2, 2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 3
-; CHECK-NEXT:    bstrins.d $a1, $a2, 3, 3
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 4
-; CHECK-NEXT:    bstrins.d $a1, $a2, 4, 4
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 5
-; CHECK-NEXT:    bstrins.d $a1, $a2, 5, 5
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 6
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 6
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 7
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 7
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 8
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 8
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 9
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 9
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 10
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 10
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 11
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 11
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 12
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 12
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 13
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 13
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 14
-; CHECK-NEXT:    andi $a2, $a2, 1
-; CHECK-NEXT:    slli.d $a2, $a2, 14
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    vpickve2gr.b $a2, $vr1, 15
-; CHECK-NEXT:    slli.d $a2, $a2, 15
-; CHECK-NEXT:    or $a1, $a1, $a2
-; CHECK-NEXT:    bstrpick.d $a1, $a1, 15, 0
+; CHECK-NEXT:    vslli.b $vr0, $vr0, 7
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a0, $vr0, 0
+; CHECK-NEXT:    vslli.b $vr0, $vr1, 7
+; CHECK-NEXT:    vmskltz.b $vr0, $vr0
+; CHECK-NEXT:    vpickve2gr.hu $a1, $vr0, 0
 ; CHECK-NEXT:    slli.d $a1, $a1, 16
 ; CHECK-NEXT:    or $a0, $a0, $a1
-; CHECK-NEXT:    addi.d $sp, $sp, 16
 ; CHECK-NEXT:    ret
   %y = trunc <32 x i8> %a to <32 x i1>
   %res = bitcast <32 x i1> %y to i32



More information about the llvm-commits mailing list