blob: 89e09625a142de9942c34dfbf4a3c336b35541d5 [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:
10; CHECK-LABEL: test1
11; CHECK: mtvsrdd 34, 4, 3
12; CHECK-BE-LABEL: test1
13; CHECK-BE: mtvsrdd 34, 3, 4
14 %vecins = insertelement <2 x i64> undef, i64 %a, i32 0
15 %vecins1 = insertelement <2 x i64> %vecins, i64 %b, i32 1
16 ret <2 x i64> %vecins1
17}
18
19define i64 @test2(<2 x i64> %a) {
20entry:
21; CHECK-LABEL: test2
22; CHECK: mfvsrld 3, 34
23 %0 = extractelement <2 x i64> %a, i32 0
24 ret i64 %0
25}
26
27define i64 @test3(<2 x i64> %a) {
28entry:
29; CHECK-BE-LABEL: test3
30; CHECK-BE: mfvsrld 3, 34
31 %0 = extractelement <2 x i64> %a, i32 1
32 ret i64 %0
33}
34
35define <4 x i32> @test4(i32* nocapture readonly %in) {
36entry:
37; CHECK-LABEL: test4
38; CHECK: lxvwsx 34, 0, 3
39; CHECK-NOT: xxspltw
40; CHECK-BE-LABEL: test4
41; CHECK-BE: lxvwsx 34, 0, 3
42; CHECK-BE-NOT: xxspltw
43 %0 = load i32, i32* %in, align 4
44 %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
45 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
46 ret <4 x i32> %splat.splat
47}
48
49define <4 x float> @test5(float* nocapture readonly %in) {
50entry:
51; CHECK-LABEL: test5
52; CHECK: lxvwsx 34, 0, 3
53; CHECK-NOT: xxspltw
54; CHECK-BE-LABEL: test5
55; CHECK-BE: lxvwsx 34, 0, 3
56; CHECK-BE-NOT: xxspltw
57 %0 = load float, float* %in, align 4
58 %splat.splatinsert = insertelement <4 x float> undef, float %0, i32 0
59 %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
60 ret <4 x float> %splat.splat
61}
62
63define <4 x i32> @test6() {
64entry:
65; CHECK-LABEL: test6
66; CHECK: addis
67; CHECK: ld [[TOC:[0-9]+]], .LC0
68; CHECK: lxvwsx 34, 0, 3
69; CHECK-NOT: xxspltw
70; CHECK-BE-LABEL: test6
71; CHECK-BE: addis
72; CHECK-BE: ld [[TOC:[0-9]+]], .LC0
73; CHECK-BE: lxvwsx 34, 0, 3
74; CHECK-BE-NOT: xxspltw
75 %0 = load i32, i32* @Globi, align 4
76 %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
77 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
78 ret <4 x i32> %splat.splat
79}
80
81define <4 x float> @test7() {
82entry:
83; CHECK-LABEL: test7
84; CHECK: addis
85; CHECK: ld [[TOC:[0-9]+]], .LC1
86; CHECK: lxvwsx 34, 0, 3
87; CHECK-NOT: xxspltw
88; CHECK-BE-LABEL: test7
89; CHECK-BE: addis
90; CHECK-BE: ld [[TOC:[0-9]+]], .LC1
91; CHECK-BE: lxvwsx 34, 0, 3
92; CHECK-BE-NOT: xxspltw
93 %0 = load float, float* @Globf, align 4
94 %splat.splatinsert = insertelement <4 x float> undef, float %0, i32 0
95 %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
96 ret <4 x float> %splat.splat
97}
98
99define <16 x i8> @test8() {
100entry:
101; CHECK-LABEL: test8
102; CHECK: xxlxor 34, 34, 34
103; CHECK-BE-LABEL: test8
104; CHECK-BE: xxlxor 34, 34, 34
105 ret <16 x i8> zeroinitializer
106}
107
108define <16 x i8> @test9() {
109entry:
110; CHECK-LABEL: test9
111; CHECK: xxspltib 34, 1
112; CHECK-BE-LABEL: test9
113; CHECK-BE: xxspltib 34, 1
114 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>
115}
116
117define <16 x i8> @test10() {
118entry:
119; CHECK-LABEL: test10
120; CHECK: xxspltib 34, 127
121; CHECK-BE-LABEL: test10
122; CHECK-BE: xxspltib 34, 127
123 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>
124}
125
126define <16 x i8> @test11() {
127entry:
128; CHECK-LABEL: test11
129; CHECK: xxspltib 34, 128
130; CHECK-BE-LABEL: test11
131; CHECK-BE: xxspltib 34, 128
132 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>
133}
134
135define <16 x i8> @test12() {
136entry:
137; CHECK-LABEL: test12
138; CHECK: xxspltib 34, 255
139; CHECK-BE-LABEL: test12
140; CHECK-BE: xxspltib 34, 255
141 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>
142}
143
144define <16 x i8> @test13() {
145entry:
146; CHECK-LABEL: test13
147; CHECK: xxspltib 34, 129
148; CHECK-BE-LABEL: test13
149; CHECK-BE: xxspltib 34, 129
150 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>
151}
152
153define <4 x i32> @test14(<4 x i32> %a, i32* nocapture readonly %b) {
154entry:
155; CHECK-LABEL: test14
156; CHECK: lwz [[LD:[0-9]+]],
157; CHECK: mtvsrws 34, [[LD]]
158; CHECK-BE-LABEL: test14
159; CHECK-BE: lwz [[LD:[0-9]+]],
160; CHECK-BE: mtvsrws 34, [[LD]]
161 %0 = load i32, i32* %b, align 4
162 %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
163 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
164 %1 = add i32 %0, 5
165 store i32 %1, i32* %b, align 4
166 ret <4 x i32> %splat.splat
167}