Merging r259740:
[oota-llvm.git] / test / CodeGen / PowerPC / qpx-recipest.ll
1 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2q -enable-unsafe-fp-math | FileCheck %s
2 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2q | FileCheck -check-prefix=CHECK-SAFE %s
3 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
4 target triple = "powerpc64-unknown-linux-gnu"
5
6 declare <4 x double> @llvm.sqrt.v4f64(<4 x double>)
7 declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)
8
9 define <4 x double> @foo(<4 x double> %a, <4 x double> %b) nounwind {
10 entry:
11   %x = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %b)
12   %r = fdiv <4 x double> %a, %x
13   ret <4 x double> %r
14
15 ; CHECK-LABEL: @foo
16 ; CHECK: qvfrsqrte
17 ; CHECK: qvfmul
18 ; FIXME: We're currently loading two constants here (1.5 and -1.5), and using
19 ;        an qvfmadd instead of a qvfnmsub
20 ; CHECK: qvfmadd
21 ; CHECK: qvfmadd
22 ; CHECK: qvfmul
23 ; CHECK: qvfmul
24 ; CHECK: qvfmadd
25 ; CHECK: qvfmul
26 ; CHECK: qvfmul
27 ; CHECK: blr
28
29 ; CHECK-SAFE-LABEL: @foo
30 ; CHECK-SAFE: fsqrt
31 ; CHECK-SAFE: fdiv
32 ; CHECK-SAFE: blr
33 }
34
35 define <4 x double> @foof(<4 x double> %a, <4 x float> %b) nounwind {
36 entry:
37   %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b)
38   %y = fpext <4 x float> %x to <4 x double>
39   %r = fdiv <4 x double> %a, %y
40   ret <4 x double> %r
41
42 ; CHECK-LABEL: @foof
43 ; CHECK: qvfrsqrtes
44 ; CHECK: qvfmuls
45 ; FIXME: We're currently loading two constants here (1.5 and -1.5), and using
46 ;        an qvfmadd instead of a qvfnmsubs
47 ; CHECK: qvfmadds
48 ; CHECK: qvfmadds
49 ; CHECK: qvfmuls
50 ; CHECK: qvfmul
51 ; CHECK: blr
52
53 ; CHECK-SAFE-LABEL: @foof
54 ; CHECK-SAFE: fsqrts
55 ; CHECK-SAFE: fdiv
56 ; CHECK-SAFE: blr
57 }
58
59 define <4 x float> @food(<4 x float> %a, <4 x double> %b) nounwind {
60 entry:
61   %x = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %b)
62   %y = fptrunc <4 x double> %x to <4 x float>
63   %r = fdiv <4 x float> %a, %y
64   ret <4 x float> %r
65
66 ; CHECK-LABEL: @food
67 ; CHECK: qvfrsqrte
68 ; CHECK: qvfmul
69 ; FIXME: We're currently loading two constants here (1.5 and -1.5), and using
70 ;        an qvfmadd instead of a qvfnmsub
71 ; CHECK: qvfmadd
72 ; CHECK: qvfmadd
73 ; CHECK: qvfmul
74 ; CHECK: qvfmul
75 ; CHECK: qvfmadd
76 ; CHECK: qvfmul
77 ; CHECK: qvfrsp
78 ; CHECK: qvfmuls
79 ; CHECK: blr
80
81 ; CHECK-SAFE-LABEL: @food
82 ; CHECK-SAFE: fsqrt
83 ; CHECK-SAFE: fdivs
84 ; CHECK-SAFE: blr
85 }
86
87 define <4 x float> @goo(<4 x float> %a, <4 x float> %b) nounwind {
88 entry:
89   %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b)
90   %r = fdiv <4 x float> %a, %x
91   ret <4 x float> %r
92
93 ; CHECK-LABEL: @goo
94 ; CHECK: qvfrsqrtes
95 ; CHECK: qvfmuls
96 ; FIXME: We're currently loading two constants here (1.5 and -1.5), and using
97 ;        an qvfmadd instead of a qvfnmsubs
98 ; CHECK: qvfmadds
99 ; CHECK: qvfmadds
100 ; CHECK: qvfmuls
101 ; CHECK: qvfmuls
102 ; CHECK: blr
103
104 ; CHECK-SAFE-LABEL: @goo
105 ; CHECK-SAFE: fsqrts
106 ; CHECK-SAFE: fdivs
107 ; CHECK-SAFE: blr
108 }
109
110 define <4 x double> @foo2(<4 x double> %a, <4 x double> %b) nounwind {
111 entry:
112   %r = fdiv <4 x double> %a, %b
113   ret <4 x double> %r
114
115 ; CHECK-LABEL: @foo2
116 ; CHECK: qvfre
117 ; CHECK: qvfnmsub
118 ; CHECK: qvfmadd
119 ; CHECK: qvfnmsub
120 ; CHECK: qvfmadd
121 ; CHECK: qvfmul
122 ; CHECK: blr
123
124 ; CHECK-SAFE-LABEL: @foo2
125 ; CHECK-SAFE: fdiv
126 ; CHECK-SAFE: blr
127 }
128
129 define <4 x float> @goo2(<4 x float> %a, <4 x float> %b) nounwind {
130 entry:
131   %r = fdiv <4 x float> %a, %b
132   ret <4 x float> %r
133
134 ; CHECK-LABEL: @goo2
135 ; CHECK: qvfres
136 ; CHECK: qvfnmsubs
137 ; CHECK: qvfmadds
138 ; CHECK: qvfmuls
139 ; CHECK: blr
140
141 ; CHECK-SAFE-LABEL: @goo2
142 ; CHECK-SAFE: fdivs
143 ; CHECK-SAFE: blr
144 }
145
146 define <4 x double> @foo3(<4 x double> %a) nounwind {
147 entry:
148   %r = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %a)
149   ret <4 x double> %r
150
151 ; CHECK-LABEL: @foo3
152 ; CHECK: qvfrsqrte
153 ; CHECK: qvfmul
154 ; FIXME: We're currently loading two constants here (1.5 and -1.5), and using
155 ;        an qvfmadd instead of a qvfnmsub
156 ; CHECK-DAG: qvfmadd
157 ; CHECK-DAG: qvfcmpeq
158 ; CHECK-DAG: qvfmadd
159 ; CHECK-DAG: qvfmul
160 ; CHECK-DAG: qvfmul
161 ; CHECK-DAG: qvfmadd
162 ; CHECK-DAG: qvfmul
163 ; CHECK-DAG: qvfmul
164 ; CHECK: qvfsel
165 ; CHECK: blr
166
167 ; CHECK-SAFE-LABEL: @foo3
168 ; CHECK-SAFE: fsqrt
169 ; CHECK-SAFE: blr
170 }
171
172 define <4 x float> @goo3(<4 x float> %a) nounwind {
173 entry:
174   %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
175   ret <4 x float> %r
176
177 ; CHECK-LABEL: @goo3
178 ; CHECK: qvfrsqrtes
179 ; CHECK: qvfmuls
180 ; FIXME: We're currently loading two constants here (1.5 and -1.5), and using
181 ;        an qvfmadds instead of a qvfnmsubs
182 ; CHECK-DAG: qvfmadds
183 ; CHECK-DAG: qvfcmpeq
184 ; CHECK-DAG: qvfmadds
185 ; CHECK-DAG: qvfmuls
186 ; CHECK-DAG: qvfmuls
187 ; CHECK: qvfsel
188 ; CHECK: blr
189
190 ; CHECK-SAFE-LABEL: @goo3
191 ; CHECK-SAFE: fsqrts
192 ; CHECK-SAFE: blr
193 }
194