blob: fa4f0320c9286d641a997e3c046434d121101c76 [file] [log] [blame]
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00001; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s \
3; RUN: --check-prefix=CHECK-BE
4
5@Globi = external global i32, align 4
6@Globf = external global float, align 4
7
8define <2 x i64> @test1(i64 %a, i64 %b) {
9entry:
Nemanja Ivanovic11049f82016-10-04 06:59:23 +000010; The FIXME below is due to the lowering for BUILD_VECTOR needing a re-vamp
11; which will happen in a subsequent patch.
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +000012; CHECK-LABEL: test1
Nemanja Ivanovic11049f82016-10-04 06:59:23 +000013; FIXME: mtvsrdd 34, 4, 3
14; CHECK: mtvsrd {{[0-9]+}}, 3
15; CHECK: mtvsrd {{[0-9]+}}, 4
16; CHECK: xxmrgld
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +000017; CHECK-BE-LABEL: test1
Nemanja Ivanovic11049f82016-10-04 06:59:23 +000018; FIXME-BE: mtvsrdd 34, 3, 4
19; CHECK-BE: mtvsrd {{[0-9]+}}, 4
20; CHECK-BE: mtvsrd {{[0-9]+}}, 3
21; CHECK-BE: xxmrghd
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +000022 %vecins = insertelement <2 x i64> undef, i64 %a, i32 0
23 %vecins1 = insertelement <2 x i64> %vecins, i64 %b, i32 1
24 ret <2 x i64> %vecins1
25}
26
27define i64 @test2(<2 x i64> %a) {
28entry:
29; CHECK-LABEL: test2
30; CHECK: mfvsrld 3, 34
31 %0 = extractelement <2 x i64> %a, i32 0
32 ret i64 %0
33}
34
35define i64 @test3(<2 x i64> %a) {
36entry:
37; CHECK-BE-LABEL: test3
38; CHECK-BE: mfvsrld 3, 34
39 %0 = extractelement <2 x i64> %a, i32 1
40 ret i64 %0
41}
42
43define <4 x i32> @test4(i32* nocapture readonly %in) {
44entry:
45; CHECK-LABEL: test4
46; CHECK: lxvwsx 34, 0, 3
47; CHECK-NOT: xxspltw
48; CHECK-BE-LABEL: test4
49; CHECK-BE: lxvwsx 34, 0, 3
50; CHECK-BE-NOT: xxspltw
51 %0 = load i32, i32* %in, align 4
52 %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
53 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
54 ret <4 x i32> %splat.splat
55}
56
57define <4 x float> @test5(float* nocapture readonly %in) {
58entry:
59; CHECK-LABEL: test5
60; CHECK: lxvwsx 34, 0, 3
61; CHECK-NOT: xxspltw
62; CHECK-BE-LABEL: test5
63; CHECK-BE: lxvwsx 34, 0, 3
64; CHECK-BE-NOT: xxspltw
65 %0 = load float, float* %in, align 4
66 %splat.splatinsert = insertelement <4 x float> undef, float %0, i32 0
67 %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
68 ret <4 x float> %splat.splat
69}
70
71define <4 x i32> @test6() {
72entry:
73; CHECK-LABEL: test6
74; CHECK: addis
75; CHECK: ld [[TOC:[0-9]+]], .LC0
76; CHECK: lxvwsx 34, 0, 3
77; CHECK-NOT: xxspltw
78; CHECK-BE-LABEL: test6
79; CHECK-BE: addis
80; CHECK-BE: ld [[TOC:[0-9]+]], .LC0
81; CHECK-BE: lxvwsx 34, 0, 3
82; CHECK-BE-NOT: xxspltw
83 %0 = load i32, i32* @Globi, align 4
84 %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
85 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
86 ret <4 x i32> %splat.splat
87}
88
89define <4 x float> @test7() {
90entry:
91; CHECK-LABEL: test7
92; CHECK: addis
93; CHECK: ld [[TOC:[0-9]+]], .LC1
94; CHECK: lxvwsx 34, 0, 3
95; CHECK-NOT: xxspltw
96; CHECK-BE-LABEL: test7
97; CHECK-BE: addis
98; CHECK-BE: ld [[TOC:[0-9]+]], .LC1
99; CHECK-BE: lxvwsx 34, 0, 3
100; CHECK-BE-NOT: xxspltw
101 %0 = load float, float* @Globf, align 4
102 %splat.splatinsert = insertelement <4 x float> undef, float %0, i32 0
103 %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
104 ret <4 x float> %splat.splat
105}
106
107define <16 x i8> @test8() {
108entry:
109; CHECK-LABEL: test8
110; CHECK: xxlxor 34, 34, 34
111; CHECK-BE-LABEL: test8
112; CHECK-BE: xxlxor 34, 34, 34
113 ret <16 x i8> zeroinitializer
114}
115
116define <16 x i8> @test9() {
117entry:
118; CHECK-LABEL: test9
119; CHECK: xxspltib 34, 1
120; CHECK-BE-LABEL: test9
121; CHECK-BE: xxspltib 34, 1
122 ret <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
123}
124
125define <16 x i8> @test10() {
126entry:
127; CHECK-LABEL: test10
128; CHECK: xxspltib 34, 127
129; CHECK-BE-LABEL: test10
130; CHECK-BE: xxspltib 34, 127
131 ret <16 x i8> <i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127>
132}
133
134define <16 x i8> @test11() {
135entry:
136; CHECK-LABEL: test11
137; CHECK: xxspltib 34, 128
138; CHECK-BE-LABEL: test11
139; CHECK-BE: xxspltib 34, 128
140 ret <16 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
141}
142
143define <16 x i8> @test12() {
144entry:
145; CHECK-LABEL: test12
146; CHECK: xxspltib 34, 255
147; CHECK-BE-LABEL: test12
148; CHECK-BE: xxspltib 34, 255
149 ret <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
150}
151
152define <16 x i8> @test13() {
153entry:
154; CHECK-LABEL: test13
155; CHECK: xxspltib 34, 129
156; CHECK-BE-LABEL: test13
157; CHECK-BE: xxspltib 34, 129
158 ret <16 x i8> <i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127>
159}
160
161define <4 x i32> @test14(<4 x i32> %a, i32* nocapture readonly %b) {
162entry:
163; CHECK-LABEL: test14
164; CHECK: lwz [[LD:[0-9]+]],
165; CHECK: mtvsrws 34, [[LD]]
166; CHECK-BE-LABEL: test14
167; CHECK-BE: lwz [[LD:[0-9]+]],
168; CHECK-BE: mtvsrws 34, [[LD]]
169 %0 = load i32, i32* %b, align 4
170 %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
171 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
172 %1 = add i32 %0, 5
173 store i32 %1, i32* %b, align 4
174 ret <4 x i32> %splat.splat
175}