xref: /llvm-project/llvm/test/CodeGen/PowerPC/pr61315.ll (revision 6dbb2a717a14327e086d22265440dfc9b1d842b6)
1; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
2; RUN:   -mcpu=pwr9 -mtriple=powerpc64 < %s | FileCheck %s
3define dso_local <16 x i8> @ConvertExtractedMaskBitsToVect(<16 x i8> noundef %0) local_unnamed_addr #0 {
4; CHECK: .LCPI0_0:
5; CHECK-NEXT: .byte	23                               # 0x17
6; CHECK-NEXT: .byte	23                               # 0x17
7; CHECK-NEXT: .byte	23                               # 0x17
8; CHECK-NEXT: .byte	23                               # 0x17
9; CHECK-NEXT: .byte	23                               # 0x17
10; CHECK-NEXT: .byte	23                               # 0x17
11; CHECK-NEXT: .byte	23                               # 0x17
12; CHECK-NEXT: .byte	23                               # 0x17
13; CHECK-NEXT: .byte	0                                # 0x0
14; CHECK-NEXT: .byte	0                                # 0x0
15; CHECK-NEXT: .byte	0                                # 0x0
16; CHECK-NEXT: .byte	0                                # 0x0
17; CHECK-NEXT: .byte	0                                # 0x0
18; CHECK-NEXT: .byte	0                                # 0x0
19; CHECK-NEXT: .byte	0                                # 0x0
20; CHECK-NEXT: .byte	0                                # 0x0
21; CHECK-LABEL: ConvertExtractedMaskBitsToVect:
22; CHECK:       # %bb.0:
23; CHECK-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
24; CHECK-NEXT:    xxlxor v3, v3, v3
25; CHECK-NEXT:    addi r3, r3, .LCPI0_0@toc@l
26; CHECK-NEXT:    lxv vs0, 0(r3)
27; CHECK-NEXT:    addis r3, r2, .LCPI0_1@toc@ha
28; CHECK-NEXT:    addi r3, r3, .LCPI0_1@toc@l
29; CHECK-NEXT:    xxperm v2, v3, vs0
30; CHECK-NEXT:    lxv vs0, 0(r3)
31; CHECK-NEXT:    xxland v2, v2, vs0
32; CHECK-NEXT:    vcmpequb v2, v2, v3
33; CHECK-NEXT:    xxlnor v2, v2, v2
34; CHECK-NEXT:    blr
35  %a4 = extractelement <16 x i8> %0, i64 7
36  %a5 = zext i8 %a4 to i16
37  %a6 = insertelement <8 x i16> poison, i16 %a5, i64 0
38  %a7 = bitcast <8 x i16> %a6 to <16 x i8>
39  %a8 = shufflevector <16 x i8> %a7, <16 x i8> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
40  %a9 = and <16 x i8> %a8, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128>
41  %a10 = icmp eq <16 x i8> %a9, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128>
42  %a11 = sext <16 x i1> %a10 to <16 x i8>
43  ret <16 x i8> %a11
44}
45
46define dso_local <16 x i8> @ConvertExtractedMaskBitsToVect2(<16 x i8> noundef %0) local_unnamed_addr #0 {
47; CHECK: .LCPI1_0:
48; CHECK-NEXT: .byte	23                               # 0x17
49; CHECK-NEXT: .byte	23                               # 0x17
50; CHECK-NEXT: .byte	23                               # 0x17
51; CHECK-NEXT: .byte	23                               # 0x17
52; CHECK-NEXT: .byte	23                               # 0x17
53; CHECK-NEXT: .byte	23                               # 0x17
54; CHECK-NEXT: .byte	23                               # 0x17
55; CHECK-NEXT: .byte	23                               # 0x17
56; CHECK-NEXT: .byte	0                                # 0x0
57; CHECK-NEXT: .byte	0                                # 0x0
58; CHECK-NEXT: .byte	0                                # 0x0
59; CHECK-NEXT: .byte	0                                # 0x0
60; CHECK-NEXT: .byte	0                                # 0x0
61; CHECK-NEXT: .byte	0                                # 0x0
62; CHECK-NEXT: .byte	0                                # 0x0
63; CHECK-NEXT: .byte	0                                # 0x0
64; CHECK-LABEL: ConvertExtractedMaskBitsToVect2:
65; CHECK:       # %bb.0:
66; CHECK-NEXT:    addis r3, r2, .LCPI1_0@toc@ha
67; CHECK-NEXT:    xxlxor v3, v3, v3
68; CHECK-NEXT:    addi r3, r3, .LCPI1_0@toc@l
69; CHECK-NEXT:    lxv vs0, 0(r3)
70; CHECK-NEXT:    addis r3, r2, .LCPI1_1@toc@ha
71; CHECK-NEXT:    addi r3, r3, .LCPI1_1@toc@l
72; CHECK-NEXT:    xxperm v2, v3, vs0
73; CHECK-NEXT:    lxv vs0, 0(r3)
74; CHECK-NEXT:    xxland v2, v2, vs0
75; CHECK-NEXT:    vcmpequb v2, v2, v3
76; CHECK-NEXT:    xxlnor v2, v2, v2
77; CHECK-NEXT:    blr
78  %a4 = extractelement <16 x i8> %0, i64 7
79  %a5 = zext i8 %a4 to i32
80  %a6 = insertelement <4 x i32> poison, i32 %a5, i64 0
81  %a7 = bitcast <4 x i32> %a6 to <16 x i8>
82  %a8 = shufflevector <16 x i8> %a7, <16 x i8> undef, <16 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
83  %a9 = and <16 x i8> %a8, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128>
84  %a10 = icmp eq <16 x i8> %a9, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128>
85  %a11 = sext <16 x i1> %a10 to <16 x i8>
86  ret <16 x i8> %a11
87}
88
89define dso_local <16 x i8> @ConvertExtractedMaskBitsToVect3(<8 x i16> noundef %0) local_unnamed_addr #0 {
90; CHECK: .LCPI2_0:
91; CHECK-NEXT: .byte	22                                # 0x16
92; CHECK-NEXT: .byte	23                                # 0x17
93; CHECK-NEXT: .byte	22                                # 0x16
94; CHECK-NEXT: .byte	23                                # 0x17
95; CHECK-NEXT: .byte	22                                # 0x16
96; CHECK-NEXT: .byte	23                                # 0x17
97; CHECK-NEXT: .byte	22                                # 0x16
98; CHECK-NEXT: .byte	23                                # 0x17
99; CHECK-NEXT: .byte	0                                 # 0x0
100; CHECK-NEXT: .byte	0                                 # 0x0
101; CHECK-NEXT: .byte	0                                 # 0x0
102; CHECK-NEXT: .byte	0                                 # 0x0
103; CHECK-NEXT: .byte	0                                 # 0x0
104; CHECK-NEXT: .byte	0                                 # 0x0
105; CHECK-NEXT: .byte	0                                 # 0x0
106; CHECK-NEXT: .byte	0                                 # 0x0
107; CHECK-LABEL: ConvertExtractedMaskBitsToVect3:
108; CHECK:       # %bb.0:
109; CHECK-NEXT:    addis r3, r2, .LCPI2_0@toc@ha
110; CHECK-NEXT:    xxlxor v3, v3, v3
111; CHECK-NEXT:    addi r3, r3, .LCPI2_0@toc@l
112; CHECK-NEXT:    lxv vs0, 0(r3)
113; CHECK-NEXT:    addis r3, r2, .LCPI2_1@toc@ha
114; CHECK-NEXT:    addi r3, r3, .LCPI2_1@toc@l
115; CHECK-NEXT:    xxperm v2, v3, vs0
116; CHECK-NEXT:    lxv vs0, 0(r3)
117; CHECK-NEXT:    xxland v2, v2, vs0
118; CHECK-NEXT:    vcmpequb v2, v2, v3
119; CHECK-NEXT:    xxlnor v2, v2, v2
120; CHECK-NEXT:    blr
121  %a4 = extractelement <8 x i16> %0, i64 3
122  %a5 = zext i16 %a4 to i32
123  %a6 = insertelement <4 x i32> poison, i32 %a5, i64 0
124  %a7 = bitcast <4 x i32> %a6 to <16 x i8>
125  %a8 = shufflevector <16 x i8> %a7, <16 x i8> undef, <16 x i32> <i32 2, i32 3, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
126  %a9 = and <16 x i8> %a8, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128>
127  %a10 = icmp eq <16 x i8> %a9, <i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32, i8 64, i8 -128>
128  %a11 = sext <16 x i1> %a10 to <16 x i8>
129  ret <16 x i8> %a11
130}
131