1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown \
3; RUN:     -mcpu=pwr9 -ppc-asm-full-reg-names \
4; RUN:     -ppc-vsr-nums-as-vr < %s | FileCheck %s
5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-unknown \
6; RUN:     -mcpu=pwr9 -ppc-asm-full-reg-names \
7; RUN:     -ppc-vsr-nums-as-vr < %s | FileCheck %s
8; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown \
9; RUN:     -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
10; RUN:     < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10
11; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-unknown \
12; RUN:     -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
13; RUN:     < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10-BE
14; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr \
15; RUN:   -ppc-asm-full-reg-names -mtriple=powerpc64-ibm-aix-xcoff < %s | \
16; RUN: FileCheck %s --check-prefix=AIX-64
17; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr \
18; RUN:   -ppc-asm-full-reg-names -mtriple=powerpc-ibm-aix-xcoff < %s | \
19; RUN: FileCheck %s --check-prefix=AIX-32
20
21; Function Attrs: norecurse nounwind readonly
22define dso_local <2 x double> @test1(<2 x float>* nocapture readonly %Ptr) {
23; CHECK-LABEL: test1:
24; CHECK:       # %bb.0: # %entry
25; CHECK-NEXT:    lfd f0, 0(r3)
26; CHECK-NEXT:    xxmrghw vs0, vs0, vs0
27; CHECK-NEXT:    xvcvspdp v2, vs0
28; CHECK-NEXT:    blr
29;
30; AIX-64-LABEL: test1:
31; AIX-64:       # %bb.0: # %entry
32; AIX-64-NEXT:    lfdx f0, 0, r3
33; AIX-64-NEXT:    xxmrghw vs0, vs0, vs0
34; AIX-64-NEXT:    xvcvspdp v2, vs0
35; AIX-64-NEXT:    blr
36;
37; AIX-32-LABEL: test1:
38; AIX-32:       # %bb.0: # %entry
39; AIX-32-NEXT:    lfs f0, 4(r3)
40; AIX-32-NEXT:    lfs f1, 0(r3)
41; AIX-32-NEXT:    xxmrghd v2, vs1, vs0
42; AIX-32-NEXT:    blr
43entry:
44  %0 = load <2 x float>, <2 x float>* %Ptr, align 8
45  %1 = fpext <2 x float> %0 to <2 x double>
46  ret <2 x double> %1
47}
48
49; Function Attrs: norecurse nounwind readonly
50define dso_local <2 x double> @test2(<2 x float>* nocapture readonly %a, <2 x float>* nocapture readonly %b) {
51; CHECK-LABEL: test2:
52; CHECK:       # %bb.0: # %entry
53; CHECK-NEXT:    lfd f0, 0(r4)
54; CHECK-NEXT:    lfd f1, 0(r3)
55; CHECK-NEXT:    xvsubsp vs0, vs1, vs0
56; CHECK-NEXT:    xxmrghw vs0, vs0, vs0
57; CHECK-NEXT:    xvcvspdp v2, vs0
58; CHECK-NEXT:    blr
59;
60; AIX-64-LABEL: test2:
61; AIX-64:       # %bb.0: # %entry
62; AIX-64-NEXT:    lfdx f0, 0, r3
63; AIX-64-NEXT:    lfdx f1, 0, r4
64; AIX-64-NEXT:    xvsubsp vs0, vs0, vs1
65; AIX-64-NEXT:    xxmrghw vs0, vs0, vs0
66; AIX-64-NEXT:    xvcvspdp v2, vs0
67; AIX-64-NEXT:    blr
68;
69; AIX-32-LABEL: test2:
70; AIX-32:       # %bb.0: # %entry
71; AIX-32-NEXT:    lwz r5, L..C0(r2) # %const.0
72; AIX-32-NEXT:    li r6, 4
73; AIX-32-NEXT:    lxsiwzx v3, 0, r3
74; AIX-32-NEXT:    lxsiwzx v0, 0, r4
75; AIX-32-NEXT:    lxsiwzx v2, r3, r6
76; AIX-32-NEXT:    lxsiwzx v5, r4, r6
77; AIX-32-NEXT:    lxvw4x v4, 0, r5
78; AIX-32-NEXT:    vperm v2, v3, v2, v4
79; AIX-32-NEXT:    vperm v3, v0, v5, v4
80; AIX-32-NEXT:    xvsubsp vs0, v2, v3
81; AIX-32-NEXT:    xxsldwi vs1, vs0, vs0, 1
82; AIX-32-NEXT:    xscvspdpn f0, vs0
83; AIX-32-NEXT:    xscvspdpn f1, vs1
84; AIX-32-NEXT:    xxmrghd v2, vs0, vs1
85; AIX-32-NEXT:    blr
86entry:
87  %0 = load <2 x float>, <2 x float>* %a, align 8
88  %1 = load <2 x float>, <2 x float>* %b, align 8
89  %sub = fsub <2 x float> %0, %1
90  %2 = fpext <2 x float> %sub to <2 x double>
91  ret <2 x double> %2
92}
93
94; Function Attrs: norecurse nounwind readonly
95; Function Attrs: norecurse nounwind readonly
96define dso_local <2 x double> @test3(<2 x float>* nocapture readonly %a, <2 x float>* nocapture readonly %b) {
97; CHECK-LABEL: test3:
98; CHECK:       # %bb.0: # %entry
99; CHECK-NEXT:    lfd f0, 0(r4)
100; CHECK-NEXT:    lfd f1, 0(r3)
101; CHECK-NEXT:    xvaddsp vs0, vs1, vs0
102; CHECK-NEXT:    xxmrghw vs0, vs0, vs0
103; CHECK-NEXT:    xvcvspdp v2, vs0
104; CHECK-NEXT:    blr
105;
106; AIX-64-LABEL: test3:
107; AIX-64:       # %bb.0: # %entry
108; AIX-64-NEXT:    lfdx f0, 0, r3
109; AIX-64-NEXT:    lfdx f1, 0, r4
110; AIX-64-NEXT:    xvaddsp vs0, vs0, vs1
111; AIX-64-NEXT:    xxmrghw vs0, vs0, vs0
112; AIX-64-NEXT:    xvcvspdp v2, vs0
113; AIX-64-NEXT:    blr
114;
115; AIX-32-LABEL: test3:
116; AIX-32:       # %bb.0: # %entry
117; AIX-32-NEXT:    lwz r5, L..C1(r2) # %const.0
118; AIX-32-NEXT:    li r6, 4
119; AIX-32-NEXT:    lxsiwzx v3, 0, r3
120; AIX-32-NEXT:    lxsiwzx v0, 0, r4
121; AIX-32-NEXT:    lxsiwzx v2, r3, r6
122; AIX-32-NEXT:    lxsiwzx v5, r4, r6
123; AIX-32-NEXT:    lxvw4x v4, 0, r5
124; AIX-32-NEXT:    vperm v2, v3, v2, v4
125; AIX-32-NEXT:    vperm v3, v0, v5, v4
126; AIX-32-NEXT:    xvaddsp vs0, v2, v3
127; AIX-32-NEXT:    xxsldwi vs1, vs0, vs0, 1
128; AIX-32-NEXT:    xscvspdpn f0, vs0
129; AIX-32-NEXT:    xscvspdpn f1, vs1
130; AIX-32-NEXT:    xxmrghd v2, vs0, vs1
131; AIX-32-NEXT:    blr
132entry:
133  %0 = load <2 x float>, <2 x float>* %a, align 8
134  %1 = load <2 x float>, <2 x float>* %b, align 8
135  %sub = fadd <2 x float> %0, %1
136  %2 = fpext <2 x float> %sub to <2 x double>
137  ret <2 x double> %2
138}
139
140; Function Attrs: norecurse nounwind readonly
141; Function Attrs: norecurse nounwind readonly
142define dso_local <2 x double> @test4(<2 x float>* nocapture readonly %a, <2 x float>* nocapture readonly %b) {
143; CHECK-LABEL: test4:
144; CHECK:       # %bb.0: # %entry
145; CHECK-NEXT:    lfd f0, 0(r4)
146; CHECK-NEXT:    lfd f1, 0(r3)
147; CHECK-NEXT:    xvmulsp vs0, vs1, vs0
148; CHECK-NEXT:    xxmrghw vs0, vs0, vs0
149; CHECK-NEXT:    xvcvspdp v2, vs0
150; CHECK-NEXT:    blr
151;
152; AIX-64-LABEL: test4:
153; AIX-64:       # %bb.0: # %entry
154; AIX-64-NEXT:    lfdx f0, 0, r3
155; AIX-64-NEXT:    lfdx f1, 0, r4
156; AIX-64-NEXT:    xvmulsp vs0, vs0, vs1
157; AIX-64-NEXT:    xxmrghw vs0, vs0, vs0
158; AIX-64-NEXT:    xvcvspdp v2, vs0
159; AIX-64-NEXT:    blr
160;
161; AIX-32-LABEL: test4:
162; AIX-32:       # %bb.0: # %entry
163; AIX-32-NEXT:    lwz r5, L..C2(r2) # %const.0
164; AIX-32-NEXT:    li r6, 4
165; AIX-32-NEXT:    lxsiwzx v3, 0, r3
166; AIX-32-NEXT:    lxsiwzx v0, 0, r4
167; AIX-32-NEXT:    lxsiwzx v2, r3, r6
168; AIX-32-NEXT:    lxsiwzx v5, r4, r6
169; AIX-32-NEXT:    lxvw4x v4, 0, r5
170; AIX-32-NEXT:    vperm v2, v3, v2, v4
171; AIX-32-NEXT:    vperm v3, v0, v5, v4
172; AIX-32-NEXT:    xvmulsp vs0, v2, v3
173; AIX-32-NEXT:    xxsldwi vs1, vs0, vs0, 1
174; AIX-32-NEXT:    xscvspdpn f0, vs0
175; AIX-32-NEXT:    xscvspdpn f1, vs1
176; AIX-32-NEXT:    xxmrghd v2, vs0, vs1
177; AIX-32-NEXT:    blr
178entry:
179  %0 = load <2 x float>, <2 x float>* %a, align 8
180  %1 = load <2 x float>, <2 x float>* %b, align 8
181  %sub = fmul <2 x float> %0, %1
182  %2 = fpext <2 x float> %sub to <2 x double>
183  ret <2 x double> %2
184}
185
186@G = dso_local local_unnamed_addr global <2 x float> <float 3.000000e+00, float 0x3FF3333340000000>, align 8
187
188; Function Attrs: mustprogress nofree norecurse nosync nounwind readonly uwtable willreturn
189define dso_local <2 x double> @test5(<2 x double> %a) {
190; CHECK-P10-LABEL: test5:
191; CHECK-P10:       # %bb.0: # %entry
192; CHECK-P10-NEXT:    plfd f0, G@PCREL(0), 1
193; CHECK-P10-NEXT:    xxmrghw vs0, vs0, vs0
194; CHECK-P10-NEXT:    xvcvspdp vs0, vs0
195; CHECK-P10-NEXT:    xvadddp v2, vs0, v2
196; CHECK-P10-NEXT:    blr
197;
198; CHECK-P10-BE-LABEL: test5:
199; CHECK-P10-BE:       # %bb.0: # %entry
200; CHECK-P10-BE-NEXT:    addis r3, r2, G@toc@ha
201; CHECK-P10-BE-NEXT:    lfd f0, G@toc@l(r3)
202; CHECK-P10-BE-NEXT:    xxmrghw vs0, vs0, vs0
203; CHECK-P10-BE-NEXT:    xvcvspdp vs0, vs0
204; CHECK-P10-BE-NEXT:    xvadddp v2, vs0, v2
205; CHECK-P10-BE-NEXT:    blr
206;
207; AIX-64-LABEL: test5:
208; AIX-64:       # %bb.0: # %entry
209; AIX-64-NEXT:    ld r3, L..C0(r2) # @G
210; AIX-64-NEXT:    lfdx f0, 0, r3
211; AIX-64-NEXT:    xxmrghw vs0, vs0, vs0
212; AIX-64-NEXT:    xvcvspdp vs0, vs0
213; AIX-64-NEXT:    xvadddp v2, vs0, v2
214; AIX-64-NEXT:    blr
215;
216; AIX-32-LABEL: test5:
217; AIX-32:       # %bb.0: # %entry
218; AIX-32-NEXT:    lwz r3, L..C3(r2) # @G
219; AIX-32-NEXT:    lfs f0, 4(r3)
220; AIX-32-NEXT:    lfs f1, 0(r3)
221; AIX-32-NEXT:    xxmrghd vs0, vs1, vs0
222; AIX-32-NEXT:    xvadddp v2, vs0, v2
223; AIX-32-NEXT:    blr
224entry:
225  %0 = load <2 x float>, <2 x float>* @G, align 8
226  %1 = fpext <2 x float> %0 to <2 x double>
227  %add = fadd <2 x double> %1, %a
228  ret <2 x double> %add
229}
230
231%0 = type <{ i32, i8, [1 x i8], i16, i32, i32, i8, [1 x i8], i16, i32, float, float, double, double, ppc_fp128, { float, float }, { float, float }, { double, double }, { double, double }, { ppc_fp128, ppc_fp128 }, [89856 x i8] }>
232@Glob1 = external dso_local unnamed_addr global [25 x %0], align 16
233
234define dso_local i32 @test6() #0 {
235; CHECK-P10-LABEL: test6:
236; CHECK-P10:       # %bb.0: # %bb
237; CHECK-P10-NEXT:    plfd f0, Glob1@PCREL+562536(0), 1
238; CHECK-P10-NEXT:    xxlxor vs1, vs1, vs1
239; CHECK-P10-NEXT:    xxmrghw vs0, vs0, vs0
240; CHECK-P10-NEXT:    xvcvspdp vs0, vs0
241; CHECK-P10-NEXT:    xvcmpeqdp v2, vs1, vs0
242; CHECK-P10-NEXT:    xxswapd v3, v2
243; CHECK-P10-NEXT:    xxland vs0, v2, v3
244; CHECK-P10-NEXT:    mfvsrld r3, vs0
245; CHECK-P10-NEXT:    andi. r3, r3, 1
246; CHECK-P10-NEXT:    bc 4, gt, .LBB5_2
247; CHECK-P10-NEXT:  # %bb.1: # %bb8
248; CHECK-P10-NEXT:  .LBB5_2: # %bb7
249;
250; CHECK-P10-BE-LABEL: test6:
251; CHECK-P10-BE:       # %bb.0: # %bb
252; CHECK-P10-BE-NEXT:    addis r3, r2, Glob1@toc@ha
253; CHECK-P10-BE-NEXT:    xxlxor vs1, vs1, vs1
254; CHECK-P10-BE-NEXT:    addi r3, r3, Glob1@toc@l
255; CHECK-P10-BE-NEXT:    plfd f0, 562536(r3), 0
256; CHECK-P10-BE-NEXT:    xxmrghw vs0, vs0, vs0
257; CHECK-P10-BE-NEXT:    xvcvspdp vs0, vs0
258; CHECK-P10-BE-NEXT:    xvcmpeqdp v2, vs1, vs0
259; CHECK-P10-BE-NEXT:    xxswapd v3, v2
260; CHECK-P10-BE-NEXT:    xxland vs0, v2, v3
261; CHECK-P10-BE-NEXT:    mffprd r3, f0
262; CHECK-P10-BE-NEXT:    andi. r3, r3, 1
263; CHECK-P10-BE-NEXT:    bc 4, gt, .LBB5_2
264; CHECK-P10-BE-NEXT:  # %bb.1: # %bb8
265; CHECK-P10-BE-NEXT:  .LBB5_2: # %bb7
266;
267; AIX-64-LABEL: test6:
268; AIX-64:       # %bb.0: # %bb
269; AIX-64-NEXT:    ld r3, L..C1(r2) # @Glob1
270; AIX-64-NEXT:    lis r4, 8
271; AIX-64-NEXT:    xxlxor vs1, vs1, vs1
272; AIX-64-NEXT:    ori r4, r4, 38248
273; AIX-64-NEXT:    lfdx f0, r3, r4
274; AIX-64-NEXT:    xxmrghw vs0, vs0, vs0
275; AIX-64-NEXT:    xvcvspdp vs0, vs0
276; AIX-64-NEXT:    xvcmpeqdp v2, vs1, vs0
277; AIX-64-NEXT:    xxswapd v3, v2
278; AIX-64-NEXT:    xxland vs0, v2, v3
279; AIX-64-NEXT:    mffprd r3, f0
280; AIX-64-NEXT:    andi. r3, r3, 1
281; AIX-64-NEXT:    bc 4, gt, L..BB5_2
282; AIX-64-NEXT:  # %bb.1: # %bb8
283; AIX-64-NEXT:  L..BB5_2: # %bb7
284;
285; AIX-32-LABEL: test6:
286; AIX-32:       # %bb.0: # %bb
287; AIX-32-NEXT:    lwz r3, L..C4(r2) # @Glob1
288; AIX-32-NEXT:    lis r4, 8
289; AIX-32-NEXT:    ori r4, r4, 38248
290; AIX-32-NEXT:    lfsux f0, r3, r4
291; AIX-32-NEXT:    lfs f1, 4(r3)
292; AIX-32-NEXT:    addi r3, r1, -16
293; AIX-32-NEXT:    xxmrghd vs0, vs0, vs1
294; AIX-32-NEXT:    xxlxor vs1, vs1, vs1
295; AIX-32-NEXT:    xvcmpeqdp v2, vs1, vs0
296; AIX-32-NEXT:    xxswapd v3, v2
297; AIX-32-NEXT:    xxland vs0, v2, v3
298; AIX-32-NEXT:    stxvw4x vs0, 0, r3
299; AIX-32-NEXT:    lwz r3, -12(r1)
300; AIX-32-NEXT:    andi. r3, r3, 1
301; AIX-32-NEXT:    bc 4, gt, L..BB5_2
302; AIX-32-NEXT:  # %bb.1: # %bb8
303; AIX-32-NEXT:  L..BB5_2: # %bb7
304bb:
305  br label %bb1
306
307bb1:                                              ; preds = %bb
308  %i = load <2 x float>, <2 x float>* bitcast (i8* getelementptr inbounds ([25 x %0], [25 x %0]* @Glob1, i64 0, i64 6, i32 20, i64 22392) to <2 x float>*), align 8
309  %i2 = fpext <2 x float> %i to <2 x double>
310  %i3 = fcmp contract oeq <2 x double> zeroinitializer, %i2
311  %i4 = shufflevector <2 x i1> %i3, <2 x i1> poison, <2 x i32> <i32 1, i32 undef>
312  %i5 = and <2 x i1> %i3, %i4
313  %i6 = extractelement <2 x i1> %i5, i32 0
314  br i1 %i6, label %bb8, label %bb7
315
316bb7:                                              ; preds = %bb1
317  unreachable
318
319bb8:                                              ; preds = %bb1
320  unreachable
321}
322