[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / fold-load-unops.ll
blobbf47c633c35bfe30918165740cce94571605f084
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse2 < %s | FileCheck %s --check-prefix=SSE
3 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx < %s | FileCheck %s --check-prefix=AVX
4 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx512f < %s | FileCheck %s --check-prefix=AVX
6 ; Verify we fold loads into unary sse intrinsics only when optimizing for size
8 define float @rcpss(float* %a) {
9 ; SSE-LABEL: rcpss:
10 ; SSE:       # BB#0:
11 ; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
12 ; SSE-NEXT:    rcpss %xmm0, %xmm0
13 ; SSE-NEXT:    retq
15 ; AVX-LABEL: rcpss:
16 ; AVX:       # BB#0:
17 ; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
18 ; AVX-NEXT:    vrcpss %xmm0, %xmm0, %xmm0
19 ; AVX-NEXT:    retq
20     %ld = load float, float* %a
21     %ins = insertelement <4 x float> undef, float %ld, i32 0
22     %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ins)
23     %ext = extractelement <4 x float> %res, i32 0
24     ret float %ext
27 define float @rsqrtss(float* %a) {
28 ; SSE-LABEL: rsqrtss:
29 ; SSE:       # BB#0:
30 ; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
31 ; SSE-NEXT:    rsqrtss %xmm0, %xmm0
32 ; SSE-NEXT:    retq
34 ; AVX-LABEL: rsqrtss:
35 ; AVX:       # BB#0:
36 ; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
37 ; AVX-NEXT:    vrsqrtss %xmm0, %xmm0, %xmm0
38 ; AVX-NEXT:    retq
39     %ld = load float, float* %a
40     %ins = insertelement <4 x float> undef, float %ld, i32 0
41     %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ins)
42     %ext = extractelement <4 x float> %res, i32 0
43     ret float %ext
46 define float @sqrtss(float* %a) {
47 ; SSE-LABEL: sqrtss:
48 ; SSE:       # BB#0:
49 ; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
50 ; SSE-NEXT:    sqrtss %xmm0, %xmm0
51 ; SSE-NEXT:    retq
53 ; AVX-LABEL: sqrtss:
54 ; AVX:       # BB#0:
55 ; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
56 ; AVX-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0
57 ; AVX-NEXT:    retq
58     %ld = load float, float* %a
59     %ins = insertelement <4 x float> undef, float %ld, i32 0
60     %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ins)
61     %ext = extractelement <4 x float> %res, i32 0
62     ret float %ext
65 define double @sqrtsd(double* %a) {
66 ; SSE-LABEL: sqrtsd:
67 ; SSE:       # BB#0:
68 ; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
69 ; SSE-NEXT:    sqrtsd %xmm0, %xmm0
70 ; SSE-NEXT:    retq
72 ; AVX-LABEL: sqrtsd:
73 ; AVX:       # BB#0:
74 ; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
75 ; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm0
76 ; AVX-NEXT:    retq
77     %ld = load double, double* %a
78     %ins = insertelement <2 x double> undef, double %ld, i32 0
79     %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ins)
80     %ext = extractelement <2 x double> %res, i32 0
81     ret double %ext
84 define float @rcpss_size(float* %a) optsize {
85 ; SSE-LABEL: rcpss_size:
86 ; SSE:       # BB#0:
87 ; SSE-NEXT:    rcpss (%rdi), %xmm0
88 ; SSE-NEXT:    retq
90 ; AVX-LABEL: rcpss_size:
91 ; AVX:       # BB#0:
92 ; AVX-NEXT:    vrcpss (%rdi), %xmm0, %xmm0
93 ; AVX-NEXT:    retq
94     %ld = load float, float* %a
95     %ins = insertelement <4 x float> undef, float %ld, i32 0
96     %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ins)
97     %ext = extractelement <4 x float> %res, i32 0
98     ret float %ext
101 define <4 x float> @rcpss_full_size(<4 x float>* %a) optsize {
102 ; SSE-LABEL: rcpss_full_size:
103 ; SSE:       # BB#0:
104 ; SSE-NEXT:    rcpss (%rdi), %xmm0
105 ; SSE-NEXT:    retq
107 ; AVX-LABEL: rcpss_full_size:
108 ; AVX:       # BB#0:
109 ; AVX-NEXT:    vrcpss (%rdi), %xmm0, %xmm0
110 ; AVX-NEXT:    retq
111     %ld = load <4 x float>, <4 x float>* %a
112     %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ld)
113     ret <4 x float> %res
116 define float @rsqrtss_size(float* %a) optsize {
117 ; SSE-LABEL: rsqrtss_size:
118 ; SSE:       # BB#0:
119 ; SSE-NEXT:    rsqrtss (%rdi), %xmm0
120 ; SSE-NEXT:    retq
122 ; AVX-LABEL: rsqrtss_size:
123 ; AVX:       # BB#0:
124 ; AVX-NEXT:    vrsqrtss (%rdi), %xmm0, %xmm0
125 ; AVX-NEXT:    retq
126     %ld = load float, float* %a
127     %ins = insertelement <4 x float> undef, float %ld, i32 0
128     %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ins)
129     %ext = extractelement <4 x float> %res, i32 0
130     ret float %ext
133 define <4 x float> @rsqrtss_full_size(<4 x float>* %a) optsize {
134 ; SSE-LABEL: rsqrtss_full_size:
135 ; SSE:       # BB#0:
136 ; SSE-NEXT:    rsqrtss (%rdi), %xmm0
137 ; SSE-NEXT:    retq
139 ; AVX-LABEL: rsqrtss_full_size:
140 ; AVX:       # BB#0:
141 ; AVX-NEXT:    vrsqrtss (%rdi), %xmm0, %xmm0
142 ; AVX-NEXT:    retq
143     %ld = load <4 x float>, <4 x float>* %a
144     %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ld)
145     ret <4 x float> %res
148 define float @sqrtss_size(float* %a) optsize{
149 ; SSE-LABEL: sqrtss_size:
150 ; SSE:       # BB#0:
151 ; SSE-NEXT:    sqrtss (%rdi), %xmm0
152 ; SSE-NEXT:    retq
154 ; AVX-LABEL: sqrtss_size:
155 ; AVX:       # BB#0:
156 ; AVX-NEXT:    vsqrtss (%rdi), %xmm0, %xmm0
157 ; AVX-NEXT:    retq
158     %ld = load float, float* %a
159     %ins = insertelement <4 x float> undef, float %ld, i32 0
160     %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ins)
161     %ext = extractelement <4 x float> %res, i32 0
162     ret float %ext
165 define <4 x float> @sqrtss_full_size(<4 x float>* %a) optsize{
166 ; SSE-LABEL: sqrtss_full_size:
167 ; SSE:       # BB#0:
168 ; SSE-NEXT:    sqrtss (%rdi), %xmm0
169 ; SSE-NEXT:    retq
171 ; AVX-LABEL: sqrtss_full_size:
172 ; AVX:       # BB#0:
173 ; AVX-NEXT:    vsqrtss (%rdi), %xmm0, %xmm0
174 ; AVX-NEXT:    retq
175     %ld = load <4 x float>, <4 x float>* %a
176     %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)
177     ret <4 x float> %res
180 define double @sqrtsd_size(double* %a) optsize {
181 ; SSE-LABEL: sqrtsd_size:
182 ; SSE:       # BB#0:
183 ; SSE-NEXT:    sqrtsd (%rdi), %xmm0
184 ; SSE-NEXT:    retq
186 ; AVX-LABEL: sqrtsd_size:
187 ; AVX:       # BB#0:
188 ; AVX-NEXT:    vsqrtsd (%rdi), %xmm0, %xmm0
189 ; AVX-NEXT:    retq
190     %ld = load double, double* %a
191     %ins = insertelement <2 x double> undef, double %ld, i32 0
192     %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ins)
193     %ext = extractelement <2 x double> %res, i32 0
194     ret double %ext
197 define <2 x double> @sqrtsd_full_size(<2 x double>* %a) optsize {
198 ; SSE-LABEL: sqrtsd_full_size:
199 ; SSE:       # BB#0:
200 ; SSE-NEXT:    sqrtsd (%rdi), %xmm0
201 ; SSE-NEXT:    retq
203 ; AVX-LABEL: sqrtsd_full_size:
204 ; AVX:       # BB#0:
205 ; AVX-NEXT:    vsqrtsd (%rdi), %xmm0, %xmm0
206 ; AVX-NEXT:    retq
207     %ld = load <2 x double>, <2 x double>* %a
208     %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)
209     ret <2 x double> %res
212 declare <4 x float> @llvm.x86.sse.rcp.ss(<4 x float>) nounwind readnone
213 declare <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float>) nounwind readnone
214 declare <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float>) nounwind readnone
215 declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone