OLD | NEW |
1 ; This tries to be a comprehensive test of f32 and f64 operations. | 1 ; This tries to be a comprehensive test of f32 and f64 operations. |
2 ; The CHECK lines are only checking for basic instruction patterns | 2 ; The CHECK lines are only checking for basic instruction patterns |
3 ; that should be present regardless of the optimization level, so | 3 ; that should be present regardless of the optimization level, so |
4 ; there are no special OPTM1 match lines. | 4 ; there are no special OPTM1 match lines. |
5 | 5 |
6 ; RUN: %llvm2ice -O2 --verbose none %s | FileCheck %s | 6 ; RUN: %llvm2ice -O2 --verbose none %s | FileCheck %s |
7 ; RUN: %llvm2ice -Om1 --verbose none %s | FileCheck %s | 7 ; RUN: %llvm2ice -Om1 --verbose none %s | FileCheck %s |
8 ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s | 8 ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s |
9 ; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s | 9 ; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s |
10 ; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \ | 10 ; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \ |
11 ; RUN: | FileCheck --check-prefix=DUMP %s | 11 ; RUN: | FileCheck --check-prefix=DUMP %s |
12 | 12 |
13 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 13 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
14 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 14 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
15 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | 15 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 |
16 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | 16 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 |
17 | 17 |
18 define internal i32 @doubleArgs(double %a, i32 %b, double %c) { | 18 define internal i32 @doubleArgs(double %a, i32 %b, double %c) { |
19 entry: | 19 entry: |
20 ret i32 %b | 20 ret i32 %b |
21 } | 21 } |
22 ; CHECK: doubleArgs: | 22 ; CHECK-LABEL: doubleArgs |
23 ; CHECK: mov eax, dword ptr [esp+12] | 23 ; CHECK: mov eax, dword ptr [esp+12] |
24 ; CHECK-NEXT: ret | 24 ; CHECK-NEXT: ret |
25 | 25 |
26 define internal i32 @floatArgs(float %a, i32 %b, float %c) { | 26 define internal i32 @floatArgs(float %a, i32 %b, float %c) { |
27 entry: | 27 entry: |
28 ret i32 %b | 28 ret i32 %b |
29 } | 29 } |
30 ; CHECK: floatArgs: | 30 ; CHECK-LABEL: floatArgs |
31 ; CHECK: mov eax, dword ptr [esp+8] | 31 ; CHECK: mov eax, dword ptr [esp+8] |
32 ; CHECK-NEXT: ret | 32 ; CHECK-NEXT: ret |
33 | 33 |
34 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float
%e, double %f) { | 34 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float
%e, double %f) { |
35 entry: | 35 entry: |
36 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b) | 36 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b) |
37 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d) | 37 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d) |
38 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f) | 38 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f) |
39 %add = add i32 %call1, %call | 39 %add = add i32 %call1, %call |
40 %add3 = add i32 %add, %call2 | 40 %add3 = add i32 %add, %call2 |
41 ret i32 %add3 | 41 ret i32 %add3 |
42 } | 42 } |
43 ; CHECK: passFpArgs: | 43 ; CHECK-LABEL: passFpArgs |
44 ; CHECK: push 123 | 44 ; CHECK: push 123 |
45 ; CHECK: call ignoreFpArgsNoInline | 45 ; CHECK: call ignoreFpArgsNoInline |
46 ; CHECK: push 123 | 46 ; CHECK: push 123 |
47 ; CHECK: call ignoreFpArgsNoInline | 47 ; CHECK: call ignoreFpArgsNoInline |
48 ; CHECK: push 123 | 48 ; CHECK: push 123 |
49 ; CHECK: call ignoreFpArgsNoInline | 49 ; CHECK: call ignoreFpArgsNoInline |
50 | 50 |
51 declare i32 @ignoreFpArgsNoInline(float, i32, double) | 51 declare i32 @ignoreFpArgsNoInline(float, i32, double) |
52 | 52 |
53 define internal i32 @passFpConstArg(float %a, double %b) { | 53 define internal i32 @passFpConstArg(float %a, double %b) { |
54 entry: | 54 entry: |
55 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00) | 55 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00) |
56 ret i32 %call | 56 ret i32 %call |
57 } | 57 } |
58 ; CHECK: passFpConstArg: | 58 ; CHECK-LABEL: passFpConstArg |
59 ; CHECK: push 123 | 59 ; CHECK: push 123 |
60 ; CHECK: call ignoreFpArgsNoInline | 60 ; CHECK: call ignoreFpArgsNoInline |
61 | 61 |
62 define internal i32 @passFp32ConstArg(float %a) { | 62 define internal i32 @passFp32ConstArg(float %a) { |
63 entry: | 63 entry: |
64 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0) | 64 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0) |
65 ret i32 %call | 65 ret i32 %call |
66 } | 66 } |
67 ; CHECK: passFp32ConstArg: | 67 ; CHECK-LABEL: passFp32ConstArg |
68 ; CHECK: push dword | 68 ; CHECK: push dword |
69 ; CHECK: push 123 | 69 ; CHECK: push 123 |
70 ; CHECK: call ignoreFp32ArgsNoInline | 70 ; CHECK: call ignoreFp32ArgsNoInline |
71 | 71 |
72 declare i32 @ignoreFp32ArgsNoInline(float, i32, float) | 72 declare i32 @ignoreFp32ArgsNoInline(float, i32, float) |
73 | 73 |
74 define internal float @returnFloatArg(float %a) { | 74 define internal float @returnFloatArg(float %a) { |
75 entry: | 75 entry: |
76 ret float %a | 76 ret float %a |
77 } | 77 } |
78 ; CHECK: returnFloatArg: | 78 ; CHECK-LABEL: returnFloatArg |
79 ; CHECK: fld dword ptr [esp | 79 ; CHECK: fld dword ptr [esp |
80 | 80 |
81 define internal double @returnDoubleArg(double %a) { | 81 define internal double @returnDoubleArg(double %a) { |
82 entry: | 82 entry: |
83 ret double %a | 83 ret double %a |
84 } | 84 } |
85 ; CHECK: returnDoubleArg: | 85 ; CHECK-LABEL: returnDoubleArg |
86 ; CHECK: fld qword ptr [esp | 86 ; CHECK: fld qword ptr [esp |
87 | 87 |
88 define internal float @returnFloatConst() { | 88 define internal float @returnFloatConst() { |
89 entry: | 89 entry: |
90 ret float 0x3FF3AE1480000000 | 90 ret float 0x3FF3AE1480000000 |
91 } | 91 } |
92 ; CHECK: returnFloatConst: | 92 ; CHECK-LABEL: returnFloatConst |
93 ; CHECK: fld | 93 ; CHECK: fld |
94 | 94 |
95 define internal double @returnDoubleConst() { | 95 define internal double @returnDoubleConst() { |
96 entry: | 96 entry: |
97 ret double 1.230000e+00 | 97 ret double 1.230000e+00 |
98 } | 98 } |
99 ; CHECK: returnDoubleConst: | 99 ; CHECK-LABEL: returnDoubleConst |
100 ; CHECK: fld | 100 ; CHECK: fld |
101 | 101 |
102 define internal float @addFloat(float %a, float %b) { | 102 define internal float @addFloat(float %a, float %b) { |
103 entry: | 103 entry: |
104 %add = fadd float %a, %b | 104 %add = fadd float %a, %b |
105 ret float %add | 105 ret float %add |
106 } | 106 } |
107 ; CHECK: addFloat: | 107 ; CHECK-LABEL: addFloat |
108 ; CHECK: addss | 108 ; CHECK: addss |
109 ; CHECK: fld | 109 ; CHECK: fld |
110 | 110 |
111 define internal double @addDouble(double %a, double %b) { | 111 define internal double @addDouble(double %a, double %b) { |
112 entry: | 112 entry: |
113 %add = fadd double %a, %b | 113 %add = fadd double %a, %b |
114 ret double %add | 114 ret double %add |
115 } | 115 } |
116 ; CHECK: addDouble: | 116 ; CHECK-LABEL: addDouble |
117 ; CHECK: addsd | 117 ; CHECK: addsd |
118 ; CHECK: fld | 118 ; CHECK: fld |
119 | 119 |
120 define internal float @subFloat(float %a, float %b) { | 120 define internal float @subFloat(float %a, float %b) { |
121 entry: | 121 entry: |
122 %sub = fsub float %a, %b | 122 %sub = fsub float %a, %b |
123 ret float %sub | 123 ret float %sub |
124 } | 124 } |
125 ; CHECK: subFloat: | 125 ; CHECK-LABEL: subFloat |
126 ; CHECK: subss | 126 ; CHECK: subss |
127 ; CHECK: fld | 127 ; CHECK: fld |
128 | 128 |
129 define internal double @subDouble(double %a, double %b) { | 129 define internal double @subDouble(double %a, double %b) { |
130 entry: | 130 entry: |
131 %sub = fsub double %a, %b | 131 %sub = fsub double %a, %b |
132 ret double %sub | 132 ret double %sub |
133 } | 133 } |
134 ; CHECK: subDouble: | 134 ; CHECK-LABEL: subDouble |
135 ; CHECK: subsd | 135 ; CHECK: subsd |
136 ; CHECK: fld | 136 ; CHECK: fld |
137 | 137 |
138 define internal float @mulFloat(float %a, float %b) { | 138 define internal float @mulFloat(float %a, float %b) { |
139 entry: | 139 entry: |
140 %mul = fmul float %a, %b | 140 %mul = fmul float %a, %b |
141 ret float %mul | 141 ret float %mul |
142 } | 142 } |
143 ; CHECK: mulFloat: | 143 ; CHECK-LABEL: mulFloat |
144 ; CHECK: mulss | 144 ; CHECK: mulss |
145 ; CHECK: fld | 145 ; CHECK: fld |
146 | 146 |
147 define internal double @mulDouble(double %a, double %b) { | 147 define internal double @mulDouble(double %a, double %b) { |
148 entry: | 148 entry: |
149 %mul = fmul double %a, %b | 149 %mul = fmul double %a, %b |
150 ret double %mul | 150 ret double %mul |
151 } | 151 } |
152 ; CHECK: mulDouble: | 152 ; CHECK-LABEL: mulDouble |
153 ; CHECK: mulsd | 153 ; CHECK: mulsd |
154 ; CHECK: fld | 154 ; CHECK: fld |
155 | 155 |
156 define internal float @divFloat(float %a, float %b) { | 156 define internal float @divFloat(float %a, float %b) { |
157 entry: | 157 entry: |
158 %div = fdiv float %a, %b | 158 %div = fdiv float %a, %b |
159 ret float %div | 159 ret float %div |
160 } | 160 } |
161 ; CHECK: divFloat: | 161 ; CHECK-LABEL: divFloat |
162 ; CHECK: divss | 162 ; CHECK: divss |
163 ; CHECK: fld | 163 ; CHECK: fld |
164 | 164 |
165 define internal double @divDouble(double %a, double %b) { | 165 define internal double @divDouble(double %a, double %b) { |
166 entry: | 166 entry: |
167 %div = fdiv double %a, %b | 167 %div = fdiv double %a, %b |
168 ret double %div | 168 ret double %div |
169 } | 169 } |
170 ; CHECK: divDouble: | 170 ; CHECK-LABEL: divDouble |
171 ; CHECK: divsd | 171 ; CHECK: divsd |
172 ; CHECK: fld | 172 ; CHECK: fld |
173 | 173 |
174 define internal float @remFloat(float %a, float %b) { | 174 define internal float @remFloat(float %a, float %b) { |
175 entry: | 175 entry: |
176 %div = frem float %a, %b | 176 %div = frem float %a, %b |
177 ret float %div | 177 ret float %div |
178 } | 178 } |
179 ; CHECK: remFloat: | 179 ; CHECK-LABEL: remFloat |
180 ; CHECK: call fmodf | 180 ; CHECK: call fmodf |
181 | 181 |
182 define internal double @remDouble(double %a, double %b) { | 182 define internal double @remDouble(double %a, double %b) { |
183 entry: | 183 entry: |
184 %div = frem double %a, %b | 184 %div = frem double %a, %b |
185 ret double %div | 185 ret double %div |
186 } | 186 } |
187 ; CHECK: remDouble: | 187 ; CHECK-LABEL: remDouble |
188 ; CHECK: call fmod | 188 ; CHECK: call fmod |
189 | 189 |
190 define internal float @fptrunc(double %a) { | 190 define internal float @fptrunc(double %a) { |
191 entry: | 191 entry: |
192 %conv = fptrunc double %a to float | 192 %conv = fptrunc double %a to float |
193 ret float %conv | 193 ret float %conv |
194 } | 194 } |
195 ; CHECK: fptrunc: | 195 ; CHECK-LABEL: fptrunc |
196 ; CHECK: cvtsd2ss | 196 ; CHECK: cvtsd2ss |
197 ; CHECK: fld | 197 ; CHECK: fld |
198 | 198 |
199 define internal double @fpext(float %a) { | 199 define internal double @fpext(float %a) { |
200 entry: | 200 entry: |
201 %conv = fpext float %a to double | 201 %conv = fpext float %a to double |
202 ret double %conv | 202 ret double %conv |
203 } | 203 } |
204 ; CHECK: fpext: | 204 ; CHECK-LABEL: fpext |
205 ; CHECK: cvtss2sd | 205 ; CHECK: cvtss2sd |
206 ; CHECK: fld | 206 ; CHECK: fld |
207 | 207 |
208 define internal i64 @doubleToSigned64(double %a) { | 208 define internal i64 @doubleToSigned64(double %a) { |
209 entry: | 209 entry: |
210 %conv = fptosi double %a to i64 | 210 %conv = fptosi double %a to i64 |
211 ret i64 %conv | 211 ret i64 %conv |
212 } | 212 } |
213 ; CHECK: doubleToSigned64: | 213 ; CHECK-LABEL: doubleToSigned64 |
214 ; CHECK: call cvtdtosi64 | 214 ; CHECK: call cvtdtosi64 |
215 | 215 |
216 define internal i64 @floatToSigned64(float %a) { | 216 define internal i64 @floatToSigned64(float %a) { |
217 entry: | 217 entry: |
218 %conv = fptosi float %a to i64 | 218 %conv = fptosi float %a to i64 |
219 ret i64 %conv | 219 ret i64 %conv |
220 } | 220 } |
221 ; CHECK: floatToSigned64: | 221 ; CHECK-LABEL: floatToSigned64 |
222 ; CHECK: call cvtftosi64 | 222 ; CHECK: call cvtftosi64 |
223 | 223 |
224 define internal i64 @doubleToUnsigned64(double %a) { | 224 define internal i64 @doubleToUnsigned64(double %a) { |
225 entry: | 225 entry: |
226 %conv = fptoui double %a to i64 | 226 %conv = fptoui double %a to i64 |
227 ret i64 %conv | 227 ret i64 %conv |
228 } | 228 } |
229 ; CHECK: doubleToUnsigned64: | 229 ; CHECK-LABEL: doubleToUnsigned64 |
230 ; CHECK: call cvtdtoui64 | 230 ; CHECK: call cvtdtoui64 |
231 | 231 |
232 define internal i64 @floatToUnsigned64(float %a) { | 232 define internal i64 @floatToUnsigned64(float %a) { |
233 entry: | 233 entry: |
234 %conv = fptoui float %a to i64 | 234 %conv = fptoui float %a to i64 |
235 ret i64 %conv | 235 ret i64 %conv |
236 } | 236 } |
237 ; CHECK: floatToUnsigned64: | 237 ; CHECK-LABEL: floatToUnsigned64 |
238 ; CHECK: call cvtftoui64 | 238 ; CHECK: call cvtftoui64 |
239 | 239 |
240 define internal i32 @doubleToSigned32(double %a) { | 240 define internal i32 @doubleToSigned32(double %a) { |
241 entry: | 241 entry: |
242 %conv = fptosi double %a to i32 | 242 %conv = fptosi double %a to i32 |
243 ret i32 %conv | 243 ret i32 %conv |
244 } | 244 } |
245 ; CHECK: doubleToSigned32: | 245 ; CHECK-LABEL: doubleToSigned32 |
246 ; CHECK: cvtsd2si | 246 ; CHECK: cvtsd2si |
247 | 247 |
248 define internal i32 @floatToSigned32(float %a) { | 248 define internal i32 @floatToSigned32(float %a) { |
249 entry: | 249 entry: |
250 %conv = fptosi float %a to i32 | 250 %conv = fptosi float %a to i32 |
251 ret i32 %conv | 251 ret i32 %conv |
252 } | 252 } |
253 ; CHECK: floatToSigned32: | 253 ; CHECK-LABEL: floatToSigned32 |
254 ; CHECK: cvtss2si | 254 ; CHECK: cvtss2si |
255 | 255 |
256 define internal i32 @doubleToUnsigned32(double %a) { | 256 define internal i32 @doubleToUnsigned32(double %a) { |
257 entry: | 257 entry: |
258 %conv = fptoui double %a to i32 | 258 %conv = fptoui double %a to i32 |
259 ret i32 %conv | 259 ret i32 %conv |
260 } | 260 } |
261 ; CHECK: doubleToUnsigned32: | 261 ; CHECK-LABEL: doubleToUnsigned32 |
262 ; CHECK: call cvtdtoui32 | 262 ; CHECK: call cvtdtoui32 |
263 | 263 |
264 define internal i32 @floatToUnsigned32(float %a) { | 264 define internal i32 @floatToUnsigned32(float %a) { |
265 entry: | 265 entry: |
266 %conv = fptoui float %a to i32 | 266 %conv = fptoui float %a to i32 |
267 ret i32 %conv | 267 ret i32 %conv |
268 } | 268 } |
269 ; CHECK: floatToUnsigned32: | 269 ; CHECK-LABEL: floatToUnsigned32 |
270 ; CHECK: call cvtftoui32 | 270 ; CHECK: call cvtftoui32 |
271 | 271 |
272 define internal i32 @doubleToSigned16(double %a) { | 272 define internal i32 @doubleToSigned16(double %a) { |
273 entry: | 273 entry: |
274 %conv = fptosi double %a to i16 | 274 %conv = fptosi double %a to i16 |
275 %conv.ret_ext = sext i16 %conv to i32 | 275 %conv.ret_ext = sext i16 %conv to i32 |
276 ret i32 %conv.ret_ext | 276 ret i32 %conv.ret_ext |
277 } | 277 } |
278 ; CHECK: doubleToSigned16: | 278 ; CHECK-LABEL: doubleToSigned16 |
279 ; CHECK: cvtsd2si | 279 ; CHECK: cvtsd2si |
280 ; CHECK: movsx | 280 ; CHECK: movsx |
281 | 281 |
282 define internal i32 @floatToSigned16(float %a) { | 282 define internal i32 @floatToSigned16(float %a) { |
283 entry: | 283 entry: |
284 %conv = fptosi float %a to i16 | 284 %conv = fptosi float %a to i16 |
285 %conv.ret_ext = sext i16 %conv to i32 | 285 %conv.ret_ext = sext i16 %conv to i32 |
286 ret i32 %conv.ret_ext | 286 ret i32 %conv.ret_ext |
287 } | 287 } |
288 ; CHECK: floatToSigned16: | 288 ; CHECK-LABEL: floatToSigned16 |
289 ; CHECK: cvtss2si | 289 ; CHECK: cvtss2si |
290 ; CHECK: movsx | 290 ; CHECK: movsx |
291 | 291 |
292 define internal i32 @doubleToUnsigned16(double %a) { | 292 define internal i32 @doubleToUnsigned16(double %a) { |
293 entry: | 293 entry: |
294 %conv = fptoui double %a to i16 | 294 %conv = fptoui double %a to i16 |
295 %conv.ret_ext = zext i16 %conv to i32 | 295 %conv.ret_ext = zext i16 %conv to i32 |
296 ret i32 %conv.ret_ext | 296 ret i32 %conv.ret_ext |
297 } | 297 } |
298 ; CHECK: doubleToUnsigned16: | 298 ; CHECK-LABEL: doubleToUnsigned16 |
299 ; CHECK: cvtsd2si | 299 ; CHECK: cvtsd2si |
300 ; CHECK: movzx | 300 ; CHECK: movzx |
301 | 301 |
302 define internal i32 @floatToUnsigned16(float %a) { | 302 define internal i32 @floatToUnsigned16(float %a) { |
303 entry: | 303 entry: |
304 %conv = fptoui float %a to i16 | 304 %conv = fptoui float %a to i16 |
305 %conv.ret_ext = zext i16 %conv to i32 | 305 %conv.ret_ext = zext i16 %conv to i32 |
306 ret i32 %conv.ret_ext | 306 ret i32 %conv.ret_ext |
307 } | 307 } |
308 ; CHECK: floatToUnsigned16: | 308 ; CHECK-LABEL: floatToUnsigned16 |
309 ; CHECK: cvtss2si | 309 ; CHECK: cvtss2si |
310 ; CHECK: movzx | 310 ; CHECK: movzx |
311 | 311 |
312 define internal i32 @doubleToSigned8(double %a) { | 312 define internal i32 @doubleToSigned8(double %a) { |
313 entry: | 313 entry: |
314 %conv = fptosi double %a to i8 | 314 %conv = fptosi double %a to i8 |
315 %conv.ret_ext = sext i8 %conv to i32 | 315 %conv.ret_ext = sext i8 %conv to i32 |
316 ret i32 %conv.ret_ext | 316 ret i32 %conv.ret_ext |
317 } | 317 } |
318 ; CHECK: doubleToSigned8: | 318 ; CHECK-LABEL: doubleToSigned8 |
319 ; CHECK: cvtsd2si | 319 ; CHECK: cvtsd2si |
320 ; CHECK: movsx | 320 ; CHECK: movsx |
321 | 321 |
322 define internal i32 @floatToSigned8(float %a) { | 322 define internal i32 @floatToSigned8(float %a) { |
323 entry: | 323 entry: |
324 %conv = fptosi float %a to i8 | 324 %conv = fptosi float %a to i8 |
325 %conv.ret_ext = sext i8 %conv to i32 | 325 %conv.ret_ext = sext i8 %conv to i32 |
326 ret i32 %conv.ret_ext | 326 ret i32 %conv.ret_ext |
327 } | 327 } |
328 ; CHECK: floatToSigned8: | 328 ; CHECK-LABEL: floatToSigned8 |
329 ; CHECK: cvtss2si | 329 ; CHECK: cvtss2si |
330 ; CHECK: movsx | 330 ; CHECK: movsx |
331 | 331 |
332 define internal i32 @doubleToUnsigned8(double %a) { | 332 define internal i32 @doubleToUnsigned8(double %a) { |
333 entry: | 333 entry: |
334 %conv = fptoui double %a to i8 | 334 %conv = fptoui double %a to i8 |
335 %conv.ret_ext = zext i8 %conv to i32 | 335 %conv.ret_ext = zext i8 %conv to i32 |
336 ret i32 %conv.ret_ext | 336 ret i32 %conv.ret_ext |
337 } | 337 } |
338 ; CHECK: doubleToUnsigned8: | 338 ; CHECK-LABEL: doubleToUnsigned8 |
339 ; CHECK: cvtsd2si | 339 ; CHECK: cvtsd2si |
340 ; CHECK: movzx | 340 ; CHECK: movzx |
341 | 341 |
342 define internal i32 @floatToUnsigned8(float %a) { | 342 define internal i32 @floatToUnsigned8(float %a) { |
343 entry: | 343 entry: |
344 %conv = fptoui float %a to i8 | 344 %conv = fptoui float %a to i8 |
345 %conv.ret_ext = zext i8 %conv to i32 | 345 %conv.ret_ext = zext i8 %conv to i32 |
346 ret i32 %conv.ret_ext | 346 ret i32 %conv.ret_ext |
347 } | 347 } |
348 ; CHECK: floatToUnsigned8: | 348 ; CHECK-LABEL: floatToUnsigned8 |
349 ; CHECK: cvtss2si | 349 ; CHECK: cvtss2si |
350 ; CHECK: movzx | 350 ; CHECK: movzx |
351 | 351 |
352 define internal i32 @doubleToUnsigned1(double %a) { | 352 define internal i32 @doubleToUnsigned1(double %a) { |
353 entry: | 353 entry: |
354 %tobool = fptoui double %a to i1 | 354 %tobool = fptoui double %a to i1 |
355 %tobool.ret_ext = zext i1 %tobool to i32 | 355 %tobool.ret_ext = zext i1 %tobool to i32 |
356 ret i32 %tobool.ret_ext | 356 ret i32 %tobool.ret_ext |
357 } | 357 } |
358 ; CHECK: doubleToUnsigned1: | 358 ; CHECK-LABEL: doubleToUnsigned1 |
359 ; CHECK: cvtsd2si | 359 ; CHECK: cvtsd2si |
360 ; CHECK: and eax, 1 | 360 ; CHECK: and eax, 1 |
361 | 361 |
362 define internal i32 @floatToUnsigned1(float %a) { | 362 define internal i32 @floatToUnsigned1(float %a) { |
363 entry: | 363 entry: |
364 %tobool = fptoui float %a to i1 | 364 %tobool = fptoui float %a to i1 |
365 %tobool.ret_ext = zext i1 %tobool to i32 | 365 %tobool.ret_ext = zext i1 %tobool to i32 |
366 ret i32 %tobool.ret_ext | 366 ret i32 %tobool.ret_ext |
367 } | 367 } |
368 ; CHECK: floatToUnsigned1: | 368 ; CHECK-LABEL: floatToUnsigned1 |
369 ; CHECK: cvtss2si | 369 ; CHECK: cvtss2si |
370 ; CHECK: and eax, 1 | 370 ; CHECK: and eax, 1 |
371 | 371 |
372 define internal double @signed64ToDouble(i64 %a) { | 372 define internal double @signed64ToDouble(i64 %a) { |
373 entry: | 373 entry: |
374 %conv = sitofp i64 %a to double | 374 %conv = sitofp i64 %a to double |
375 ret double %conv | 375 ret double %conv |
376 } | 376 } |
377 ; CHECK: signed64ToDouble: | 377 ; CHECK-LABEL: signed64ToDouble |
378 ; CHECK: call cvtsi64tod | 378 ; CHECK: call cvtsi64tod |
379 ; CHECK: fstp | 379 ; CHECK: fstp |
380 | 380 |
381 define internal float @signed64ToFloat(i64 %a) { | 381 define internal float @signed64ToFloat(i64 %a) { |
382 entry: | 382 entry: |
383 %conv = sitofp i64 %a to float | 383 %conv = sitofp i64 %a to float |
384 ret float %conv | 384 ret float %conv |
385 } | 385 } |
386 ; CHECK: signed64ToFloat: | 386 ; CHECK-LABEL: signed64ToFloat |
387 ; CHECK: call cvtsi64tof | 387 ; CHECK: call cvtsi64tof |
388 ; CHECK: fstp | 388 ; CHECK: fstp |
389 | 389 |
390 define internal double @unsigned64ToDouble(i64 %a) { | 390 define internal double @unsigned64ToDouble(i64 %a) { |
391 entry: | 391 entry: |
392 %conv = uitofp i64 %a to double | 392 %conv = uitofp i64 %a to double |
393 ret double %conv | 393 ret double %conv |
394 } | 394 } |
395 ; CHECK: unsigned64ToDouble: | 395 ; CHECK-LABEL: unsigned64ToDouble |
396 ; CHECK: call cvtui64tod | 396 ; CHECK: call cvtui64tod |
397 ; CHECK: fstp | 397 ; CHECK: fstp |
398 | 398 |
399 define internal float @unsigned64ToFloat(i64 %a) { | 399 define internal float @unsigned64ToFloat(i64 %a) { |
400 entry: | 400 entry: |
401 %conv = uitofp i64 %a to float | 401 %conv = uitofp i64 %a to float |
402 ret float %conv | 402 ret float %conv |
403 } | 403 } |
404 ; CHECK: unsigned64ToFloat: | 404 ; CHECK-LABEL: unsigned64ToFloat |
405 ; CHECK: call cvtui64tof | 405 ; CHECK: call cvtui64tof |
406 ; CHECK: fstp | 406 ; CHECK: fstp |
407 | 407 |
408 define internal double @signed32ToDouble(i32 %a) { | 408 define internal double @signed32ToDouble(i32 %a) { |
409 entry: | 409 entry: |
410 %conv = sitofp i32 %a to double | 410 %conv = sitofp i32 %a to double |
411 ret double %conv | 411 ret double %conv |
412 } | 412 } |
413 ; CHECK: signed32ToDouble: | 413 ; CHECK-LABEL: signed32ToDouble |
414 ; CHECK: cvtsi2sd | 414 ; CHECK: cvtsi2sd |
415 ; CHECK: fld | 415 ; CHECK: fld |
416 | 416 |
417 define internal float @signed32ToFloat(i32 %a) { | 417 define internal float @signed32ToFloat(i32 %a) { |
418 entry: | 418 entry: |
419 %conv = sitofp i32 %a to float | 419 %conv = sitofp i32 %a to float |
420 ret float %conv | 420 ret float %conv |
421 } | 421 } |
422 ; CHECK: signed32ToFloat: | 422 ; CHECK-LABEL: signed32ToFloat |
423 ; CHECK: cvtsi2ss | 423 ; CHECK: cvtsi2ss |
424 ; CHECK: fld | 424 ; CHECK: fld |
425 | 425 |
426 define internal double @unsigned32ToDouble(i32 %a) { | 426 define internal double @unsigned32ToDouble(i32 %a) { |
427 entry: | 427 entry: |
428 %conv = uitofp i32 %a to double | 428 %conv = uitofp i32 %a to double |
429 ret double %conv | 429 ret double %conv |
430 } | 430 } |
431 ; CHECK: unsigned32ToDouble: | 431 ; CHECK-LABEL: unsigned32ToDouble |
432 ; CHECK: call cvtui32tod | 432 ; CHECK: call cvtui32tod |
433 ; CHECK: fstp | 433 ; CHECK: fstp |
434 | 434 |
435 define internal float @unsigned32ToFloat(i32 %a) { | 435 define internal float @unsigned32ToFloat(i32 %a) { |
436 entry: | 436 entry: |
437 %conv = uitofp i32 %a to float | 437 %conv = uitofp i32 %a to float |
438 ret float %conv | 438 ret float %conv |
439 } | 439 } |
440 ; CHECK: unsigned32ToFloat: | 440 ; CHECK-LABEL: unsigned32ToFloat |
441 ; CHECK: call cvtui32tof | 441 ; CHECK: call cvtui32tof |
442 ; CHECK: fstp | 442 ; CHECK: fstp |
443 | 443 |
444 define internal double @signed16ToDouble(i32 %a) { | 444 define internal double @signed16ToDouble(i32 %a) { |
445 entry: | 445 entry: |
446 %a.arg_trunc = trunc i32 %a to i16 | 446 %a.arg_trunc = trunc i32 %a to i16 |
447 %conv = sitofp i16 %a.arg_trunc to double | 447 %conv = sitofp i16 %a.arg_trunc to double |
448 ret double %conv | 448 ret double %conv |
449 } | 449 } |
450 ; CHECK: signed16ToDouble: | 450 ; CHECK-LABEL: signed16ToDouble |
451 ; CHECK: cvtsi2sd | 451 ; CHECK: cvtsi2sd |
452 ; CHECK: fld | 452 ; CHECK: fld |
453 | 453 |
454 define internal float @signed16ToFloat(i32 %a) { | 454 define internal float @signed16ToFloat(i32 %a) { |
455 entry: | 455 entry: |
456 %a.arg_trunc = trunc i32 %a to i16 | 456 %a.arg_trunc = trunc i32 %a to i16 |
457 %conv = sitofp i16 %a.arg_trunc to float | 457 %conv = sitofp i16 %a.arg_trunc to float |
458 ret float %conv | 458 ret float %conv |
459 } | 459 } |
460 ; CHECK: signed16ToFloat: | 460 ; CHECK-LABEL: signed16ToFloat |
461 ; CHECK: cvtsi2ss | 461 ; CHECK: cvtsi2ss |
462 ; CHECK: fld | 462 ; CHECK: fld |
463 | 463 |
464 define internal double @unsigned16ToDouble(i32 %a) { | 464 define internal double @unsigned16ToDouble(i32 %a) { |
465 entry: | 465 entry: |
466 %a.arg_trunc = trunc i32 %a to i16 | 466 %a.arg_trunc = trunc i32 %a to i16 |
467 %conv = uitofp i16 %a.arg_trunc to double | 467 %conv = uitofp i16 %a.arg_trunc to double |
468 ret double %conv | 468 ret double %conv |
469 } | 469 } |
470 ; CHECK: unsigned16ToDouble: | 470 ; CHECK-LABEL: unsigned16ToDouble |
471 ; CHECK: cvtsi2sd | 471 ; CHECK: cvtsi2sd |
472 ; CHECK: fld | 472 ; CHECK: fld |
473 | 473 |
474 define internal float @unsigned16ToFloat(i32 %a) { | 474 define internal float @unsigned16ToFloat(i32 %a) { |
475 entry: | 475 entry: |
476 %a.arg_trunc = trunc i32 %a to i16 | 476 %a.arg_trunc = trunc i32 %a to i16 |
477 %conv = uitofp i16 %a.arg_trunc to float | 477 %conv = uitofp i16 %a.arg_trunc to float |
478 ret float %conv | 478 ret float %conv |
479 } | 479 } |
480 ; CHECK: unsigned16ToFloat: | 480 ; CHECK-LABEL: unsigned16ToFloat |
481 ; CHECK: cvtsi2ss | 481 ; CHECK: cvtsi2ss |
482 ; CHECK: fld | 482 ; CHECK: fld |
483 | 483 |
484 define internal double @signed8ToDouble(i32 %a) { | 484 define internal double @signed8ToDouble(i32 %a) { |
485 entry: | 485 entry: |
486 %a.arg_trunc = trunc i32 %a to i8 | 486 %a.arg_trunc = trunc i32 %a to i8 |
487 %conv = sitofp i8 %a.arg_trunc to double | 487 %conv = sitofp i8 %a.arg_trunc to double |
488 ret double %conv | 488 ret double %conv |
489 } | 489 } |
490 ; CHECK: signed8ToDouble: | 490 ; CHECK-LABEL: signed8ToDouble |
491 ; CHECK: cvtsi2sd | 491 ; CHECK: cvtsi2sd |
492 ; CHECK: fld | 492 ; CHECK: fld |
493 | 493 |
494 define internal float @signed8ToFloat(i32 %a) { | 494 define internal float @signed8ToFloat(i32 %a) { |
495 entry: | 495 entry: |
496 %a.arg_trunc = trunc i32 %a to i8 | 496 %a.arg_trunc = trunc i32 %a to i8 |
497 %conv = sitofp i8 %a.arg_trunc to float | 497 %conv = sitofp i8 %a.arg_trunc to float |
498 ret float %conv | 498 ret float %conv |
499 } | 499 } |
500 ; CHECK: signed8ToFloat: | 500 ; CHECK-LABEL: signed8ToFloat |
501 ; CHECK: cvtsi2ss | 501 ; CHECK: cvtsi2ss |
502 ; CHECK: fld | 502 ; CHECK: fld |
503 | 503 |
504 define internal double @unsigned8ToDouble(i32 %a) { | 504 define internal double @unsigned8ToDouble(i32 %a) { |
505 entry: | 505 entry: |
506 %a.arg_trunc = trunc i32 %a to i8 | 506 %a.arg_trunc = trunc i32 %a to i8 |
507 %conv = uitofp i8 %a.arg_trunc to double | 507 %conv = uitofp i8 %a.arg_trunc to double |
508 ret double %conv | 508 ret double %conv |
509 } | 509 } |
510 ; CHECK: unsigned8ToDouble: | 510 ; CHECK-LABEL: unsigned8ToDouble |
511 ; CHECK: cvtsi2sd | 511 ; CHECK: cvtsi2sd |
512 ; CHECK: fld | 512 ; CHECK: fld |
513 | 513 |
514 define internal float @unsigned8ToFloat(i32 %a) { | 514 define internal float @unsigned8ToFloat(i32 %a) { |
515 entry: | 515 entry: |
516 %a.arg_trunc = trunc i32 %a to i8 | 516 %a.arg_trunc = trunc i32 %a to i8 |
517 %conv = uitofp i8 %a.arg_trunc to float | 517 %conv = uitofp i8 %a.arg_trunc to float |
518 ret float %conv | 518 ret float %conv |
519 } | 519 } |
520 ; CHECK: unsigned8ToFloat: | 520 ; CHECK-LABEL: unsigned8ToFloat |
521 ; CHECK: cvtsi2ss | 521 ; CHECK: cvtsi2ss |
522 ; CHECK: fld | 522 ; CHECK: fld |
523 | 523 |
524 define internal double @unsigned1ToDouble(i32 %a) { | 524 define internal double @unsigned1ToDouble(i32 %a) { |
525 entry: | 525 entry: |
526 %a.arg_trunc = trunc i32 %a to i1 | 526 %a.arg_trunc = trunc i32 %a to i1 |
527 %conv = uitofp i1 %a.arg_trunc to double | 527 %conv = uitofp i1 %a.arg_trunc to double |
528 ret double %conv | 528 ret double %conv |
529 } | 529 } |
530 ; CHECK: unsigned1ToDouble: | 530 ; CHECK-LABEL: unsigned1ToDouble |
531 ; CHECK: cvtsi2sd | 531 ; CHECK: cvtsi2sd |
532 ; CHECK: fld | 532 ; CHECK: fld |
533 | 533 |
534 define internal float @unsigned1ToFloat(i32 %a) { | 534 define internal float @unsigned1ToFloat(i32 %a) { |
535 entry: | 535 entry: |
536 %a.arg_trunc = trunc i32 %a to i1 | 536 %a.arg_trunc = trunc i32 %a to i1 |
537 %conv = uitofp i1 %a.arg_trunc to float | 537 %conv = uitofp i1 %a.arg_trunc to float |
538 ret float %conv | 538 ret float %conv |
539 } | 539 } |
540 ; CHECK: unsigned1ToFloat: | 540 ; CHECK-LABEL: unsigned1ToFloat |
541 ; CHECK: cvtsi2ss | 541 ; CHECK: cvtsi2ss |
542 ; CHECK: fld | 542 ; CHECK: fld |
543 | 543 |
544 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { | 544 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { |
545 entry: | 545 entry: |
546 %cmp = fcmp oeq float %a, %b | 546 %cmp = fcmp oeq float %a, %b |
547 br i1 %cmp, label %if.then, label %if.end | 547 br i1 %cmp, label %if.then, label %if.end |
548 | 548 |
549 if.then: ; preds = %entry | 549 if.then: ; preds = %entry |
550 call void @func() | 550 call void @func() |
551 br label %if.end | 551 br label %if.end |
552 | 552 |
553 if.end: ; preds = %if.then, %entry | 553 if.end: ; preds = %if.then, %entry |
554 %cmp1 = fcmp oeq double %c, %d | 554 %cmp1 = fcmp oeq double %c, %d |
555 br i1 %cmp1, label %if.then2, label %if.end3 | 555 br i1 %cmp1, label %if.then2, label %if.end3 |
556 | 556 |
557 if.then2: ; preds = %if.end | 557 if.then2: ; preds = %if.end |
558 call void @func() | 558 call void @func() |
559 br label %if.end3 | 559 br label %if.end3 |
560 | 560 |
561 if.end3: ; preds = %if.then2, %if.end | 561 if.end3: ; preds = %if.then2, %if.end |
562 ret void | 562 ret void |
563 } | 563 } |
564 ; CHECK: fcmpEq: | 564 ; CHECK-LABEL: fcmpEq |
565 ; CHECK: ucomiss | 565 ; CHECK: ucomiss |
566 ; CHECK: jne . | 566 ; CHECK: jne . |
567 ; CHECK-NEXT: jp . | 567 ; CHECK-NEXT: jp . |
568 ; CHECK: call func | 568 ; CHECK: call func |
569 ; CHECK: ucomisd | 569 ; CHECK: ucomisd |
570 ; CHECK: jne . | 570 ; CHECK: jne . |
571 ; CHECK-NEXT: jp . | 571 ; CHECK-NEXT: jp . |
572 ; CHECK: call func | 572 ; CHECK: call func |
573 | 573 |
574 declare void @func() | 574 declare void @func() |
(...skipping 11 matching lines...) Expand all Loading... |
586 %cmp1 = fcmp une double %c, %d | 586 %cmp1 = fcmp une double %c, %d |
587 br i1 %cmp1, label %if.then2, label %if.end3 | 587 br i1 %cmp1, label %if.then2, label %if.end3 |
588 | 588 |
589 if.then2: ; preds = %if.end | 589 if.then2: ; preds = %if.end |
590 call void @func() | 590 call void @func() |
591 br label %if.end3 | 591 br label %if.end3 |
592 | 592 |
593 if.end3: ; preds = %if.then2, %if.end | 593 if.end3: ; preds = %if.then2, %if.end |
594 ret void | 594 ret void |
595 } | 595 } |
596 ; CHECK: fcmpNe: | 596 ; CHECK-LABEL: fcmpNe |
597 ; CHECK: ucomiss | 597 ; CHECK: ucomiss |
598 ; CHECK: jne . | 598 ; CHECK: jne . |
599 ; CHECK-NEXT: jp . | 599 ; CHECK-NEXT: jp . |
600 ; CHECK: call func | 600 ; CHECK: call func |
601 ; CHECK: ucomisd | 601 ; CHECK: ucomisd |
602 ; CHECK: jne . | 602 ; CHECK: jne . |
603 ; CHECK-NEXT: jp . | 603 ; CHECK-NEXT: jp . |
604 ; CHECK: call func | 604 ; CHECK: call func |
605 | 605 |
606 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { | 606 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { |
607 entry: | 607 entry: |
608 %cmp = fcmp ogt float %a, %b | 608 %cmp = fcmp ogt float %a, %b |
609 br i1 %cmp, label %if.then, label %if.end | 609 br i1 %cmp, label %if.then, label %if.end |
610 | 610 |
611 if.then: ; preds = %entry | 611 if.then: ; preds = %entry |
612 call void @func() | 612 call void @func() |
613 br label %if.end | 613 br label %if.end |
614 | 614 |
615 if.end: ; preds = %if.then, %entry | 615 if.end: ; preds = %if.then, %entry |
616 %cmp1 = fcmp ogt double %c, %d | 616 %cmp1 = fcmp ogt double %c, %d |
617 br i1 %cmp1, label %if.then2, label %if.end3 | 617 br i1 %cmp1, label %if.then2, label %if.end3 |
618 | 618 |
619 if.then2: ; preds = %if.end | 619 if.then2: ; preds = %if.end |
620 call void @func() | 620 call void @func() |
621 br label %if.end3 | 621 br label %if.end3 |
622 | 622 |
623 if.end3: ; preds = %if.then2, %if.end | 623 if.end3: ; preds = %if.then2, %if.end |
624 ret void | 624 ret void |
625 } | 625 } |
626 ; CHECK: fcmpGt: | 626 ; CHECK-LABEL: fcmpGt |
627 ; CHECK: ucomiss | 627 ; CHECK: ucomiss |
628 ; CHECK: ja . | 628 ; CHECK: ja . |
629 ; CHECK: call func | 629 ; CHECK: call func |
630 ; CHECK: ucomisd | 630 ; CHECK: ucomisd |
631 ; CHECK: ja . | 631 ; CHECK: ja . |
632 ; CHECK: call func | 632 ; CHECK: call func |
633 | 633 |
634 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { | 634 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { |
635 entry: | 635 entry: |
636 %cmp = fcmp ult float %a, %b | 636 %cmp = fcmp ult float %a, %b |
637 br i1 %cmp, label %if.end, label %if.then | 637 br i1 %cmp, label %if.end, label %if.then |
638 | 638 |
639 if.then: ; preds = %entry | 639 if.then: ; preds = %entry |
640 call void @func() | 640 call void @func() |
641 br label %if.end | 641 br label %if.end |
642 | 642 |
643 if.end: ; preds = %entry, %if.then | 643 if.end: ; preds = %entry, %if.then |
644 %cmp1 = fcmp ult double %c, %d | 644 %cmp1 = fcmp ult double %c, %d |
645 br i1 %cmp1, label %if.end3, label %if.then2 | 645 br i1 %cmp1, label %if.end3, label %if.then2 |
646 | 646 |
647 if.then2: ; preds = %if.end | 647 if.then2: ; preds = %if.end |
648 call void @func() | 648 call void @func() |
649 br label %if.end3 | 649 br label %if.end3 |
650 | 650 |
651 if.end3: ; preds = %if.end, %if.then2 | 651 if.end3: ; preds = %if.end, %if.then2 |
652 ret void | 652 ret void |
653 } | 653 } |
654 ; CHECK: fcmpGe: | 654 ; CHECK-LABEL: fcmpGe |
655 ; CHECK: ucomiss | 655 ; CHECK: ucomiss |
656 ; CHECK: jb . | 656 ; CHECK: jb . |
657 ; CHECK: call func | 657 ; CHECK: call func |
658 ; CHECK: ucomisd | 658 ; CHECK: ucomisd |
659 ; CHECK: jb . | 659 ; CHECK: jb . |
660 ; CHECK: call func | 660 ; CHECK: call func |
661 | 661 |
662 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { | 662 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { |
663 entry: | 663 entry: |
664 %cmp = fcmp olt float %a, %b | 664 %cmp = fcmp olt float %a, %b |
665 br i1 %cmp, label %if.then, label %if.end | 665 br i1 %cmp, label %if.then, label %if.end |
666 | 666 |
667 if.then: ; preds = %entry | 667 if.then: ; preds = %entry |
668 call void @func() | 668 call void @func() |
669 br label %if.end | 669 br label %if.end |
670 | 670 |
671 if.end: ; preds = %if.then, %entry | 671 if.end: ; preds = %if.then, %entry |
672 %cmp1 = fcmp olt double %c, %d | 672 %cmp1 = fcmp olt double %c, %d |
673 br i1 %cmp1, label %if.then2, label %if.end3 | 673 br i1 %cmp1, label %if.then2, label %if.end3 |
674 | 674 |
675 if.then2: ; preds = %if.end | 675 if.then2: ; preds = %if.end |
676 call void @func() | 676 call void @func() |
677 br label %if.end3 | 677 br label %if.end3 |
678 | 678 |
679 if.end3: ; preds = %if.then2, %if.end | 679 if.end3: ; preds = %if.then2, %if.end |
680 ret void | 680 ret void |
681 } | 681 } |
682 ; CHECK: fcmpLt: | 682 ; CHECK-LABEL: fcmpLt |
683 ; CHECK: ucomiss | 683 ; CHECK: ucomiss |
684 ; CHECK: ja . | 684 ; CHECK: ja . |
685 ; CHECK: call func | 685 ; CHECK: call func |
686 ; CHECK: ucomisd | 686 ; CHECK: ucomisd |
687 ; CHECK: ja . | 687 ; CHECK: ja . |
688 ; CHECK: call func | 688 ; CHECK: call func |
689 | 689 |
690 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { | 690 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { |
691 entry: | 691 entry: |
692 %cmp = fcmp ugt float %a, %b | 692 %cmp = fcmp ugt float %a, %b |
693 br i1 %cmp, label %if.end, label %if.then | 693 br i1 %cmp, label %if.end, label %if.then |
694 | 694 |
695 if.then: ; preds = %entry | 695 if.then: ; preds = %entry |
696 call void @func() | 696 call void @func() |
697 br label %if.end | 697 br label %if.end |
698 | 698 |
699 if.end: ; preds = %entry, %if.then | 699 if.end: ; preds = %entry, %if.then |
700 %cmp1 = fcmp ugt double %c, %d | 700 %cmp1 = fcmp ugt double %c, %d |
701 br i1 %cmp1, label %if.end3, label %if.then2 | 701 br i1 %cmp1, label %if.end3, label %if.then2 |
702 | 702 |
703 if.then2: ; preds = %if.end | 703 if.then2: ; preds = %if.end |
704 call void @func() | 704 call void @func() |
705 br label %if.end3 | 705 br label %if.end3 |
706 | 706 |
707 if.end3: ; preds = %if.end, %if.then2 | 707 if.end3: ; preds = %if.end, %if.then2 |
708 ret void | 708 ret void |
709 } | 709 } |
710 ; CHECK: fcmpLe: | 710 ; CHECK-LABEL: fcmpLe |
711 ; CHECK: ucomiss | 711 ; CHECK: ucomiss |
712 ; CHECK: jb . | 712 ; CHECK: jb . |
713 ; CHECK: call func | 713 ; CHECK: call func |
714 ; CHECK: ucomisd | 714 ; CHECK: ucomisd |
715 ; CHECK: jb . | 715 ; CHECK: jb . |
716 ; CHECK: call func | 716 ; CHECK: call func |
717 | 717 |
718 define internal i32 @fcmpFalseFloat(float %a, float %b) { | 718 define internal i32 @fcmpFalseFloat(float %a, float %b) { |
719 entry: | 719 entry: |
720 %cmp = fcmp false float %a, %b | 720 %cmp = fcmp false float %a, %b |
721 %cmp.ret_ext = zext i1 %cmp to i32 | 721 %cmp.ret_ext = zext i1 %cmp to i32 |
722 ret i32 %cmp.ret_ext | 722 ret i32 %cmp.ret_ext |
723 } | 723 } |
724 ; CHECK: fcmpFalseFloat: | 724 ; CHECK-LABEL: fcmpFalseFloat |
725 ; CHECK: mov {{.*}}, 0 | 725 ; CHECK: mov {{.*}}, 0 |
726 | 726 |
727 define internal i32 @fcmpFalseDouble(double %a, double %b) { | 727 define internal i32 @fcmpFalseDouble(double %a, double %b) { |
728 entry: | 728 entry: |
729 %cmp = fcmp false double %a, %b | 729 %cmp = fcmp false double %a, %b |
730 %cmp.ret_ext = zext i1 %cmp to i32 | 730 %cmp.ret_ext = zext i1 %cmp to i32 |
731 ret i32 %cmp.ret_ext | 731 ret i32 %cmp.ret_ext |
732 } | 732 } |
733 ; CHECK: fcmpFalseDouble: | 733 ; CHECK-LABEL: fcmpFalseDouble |
734 ; CHECK: mov {{.*}}, 0 | 734 ; CHECK: mov {{.*}}, 0 |
735 | 735 |
736 define internal i32 @fcmpOeqFloat(float %a, float %b) { | 736 define internal i32 @fcmpOeqFloat(float %a, float %b) { |
737 entry: | 737 entry: |
738 %cmp = fcmp oeq float %a, %b | 738 %cmp = fcmp oeq float %a, %b |
739 %cmp.ret_ext = zext i1 %cmp to i32 | 739 %cmp.ret_ext = zext i1 %cmp to i32 |
740 ret i32 %cmp.ret_ext | 740 ret i32 %cmp.ret_ext |
741 } | 741 } |
742 ; CHECK: fcmpOeqFloat: | 742 ; CHECK-LABEL: fcmpOeqFloat |
743 ; CHECK: ucomiss | 743 ; CHECK: ucomiss |
744 ; CHECK: jne . | 744 ; CHECK: jne . |
745 ; CHECK: jp . | 745 ; CHECK: jp . |
746 | 746 |
747 define internal i32 @fcmpOeqDouble(double %a, double %b) { | 747 define internal i32 @fcmpOeqDouble(double %a, double %b) { |
748 entry: | 748 entry: |
749 %cmp = fcmp oeq double %a, %b | 749 %cmp = fcmp oeq double %a, %b |
750 %cmp.ret_ext = zext i1 %cmp to i32 | 750 %cmp.ret_ext = zext i1 %cmp to i32 |
751 ret i32 %cmp.ret_ext | 751 ret i32 %cmp.ret_ext |
752 } | 752 } |
753 ; CHECK: fcmpOeqDouble: | 753 ; CHECK-LABEL: fcmpOeqDouble |
754 ; CHECK: ucomisd | 754 ; CHECK: ucomisd |
755 ; CHECK: jne . | 755 ; CHECK: jne . |
756 ; CHECK: jp . | 756 ; CHECK: jp . |
757 | 757 |
758 define internal i32 @fcmpOgtFloat(float %a, float %b) { | 758 define internal i32 @fcmpOgtFloat(float %a, float %b) { |
759 entry: | 759 entry: |
760 %cmp = fcmp ogt float %a, %b | 760 %cmp = fcmp ogt float %a, %b |
761 %cmp.ret_ext = zext i1 %cmp to i32 | 761 %cmp.ret_ext = zext i1 %cmp to i32 |
762 ret i32 %cmp.ret_ext | 762 ret i32 %cmp.ret_ext |
763 } | 763 } |
764 ; CHECK: fcmpOgtFloat: | 764 ; CHECK-LABEL: fcmpOgtFloat |
765 ; CHECK: ucomiss | 765 ; CHECK: ucomiss |
766 ; CHECK: ja . | 766 ; CHECK: ja . |
767 | 767 |
768 define internal i32 @fcmpOgtDouble(double %a, double %b) { | 768 define internal i32 @fcmpOgtDouble(double %a, double %b) { |
769 entry: | 769 entry: |
770 %cmp = fcmp ogt double %a, %b | 770 %cmp = fcmp ogt double %a, %b |
771 %cmp.ret_ext = zext i1 %cmp to i32 | 771 %cmp.ret_ext = zext i1 %cmp to i32 |
772 ret i32 %cmp.ret_ext | 772 ret i32 %cmp.ret_ext |
773 } | 773 } |
774 ; CHECK: fcmpOgtDouble: | 774 ; CHECK-LABEL: fcmpOgtDouble |
775 ; CHECK: ucomisd | 775 ; CHECK: ucomisd |
776 ; CHECK: ja . | 776 ; CHECK: ja . |
777 | 777 |
778 define internal i32 @fcmpOgeFloat(float %a, float %b) { | 778 define internal i32 @fcmpOgeFloat(float %a, float %b) { |
779 entry: | 779 entry: |
780 %cmp = fcmp oge float %a, %b | 780 %cmp = fcmp oge float %a, %b |
781 %cmp.ret_ext = zext i1 %cmp to i32 | 781 %cmp.ret_ext = zext i1 %cmp to i32 |
782 ret i32 %cmp.ret_ext | 782 ret i32 %cmp.ret_ext |
783 } | 783 } |
784 ; CHECK: fcmpOgeFloat: | 784 ; CHECK-LABEL: fcmpOgeFloat |
785 ; CHECK: ucomiss | 785 ; CHECK: ucomiss |
786 ; CHECK: jae . | 786 ; CHECK: jae . |
787 | 787 |
788 define internal i32 @fcmpOgeDouble(double %a, double %b) { | 788 define internal i32 @fcmpOgeDouble(double %a, double %b) { |
789 entry: | 789 entry: |
790 %cmp = fcmp oge double %a, %b | 790 %cmp = fcmp oge double %a, %b |
791 %cmp.ret_ext = zext i1 %cmp to i32 | 791 %cmp.ret_ext = zext i1 %cmp to i32 |
792 ret i32 %cmp.ret_ext | 792 ret i32 %cmp.ret_ext |
793 } | 793 } |
794 ; CHECK: fcmpOgeDouble: | 794 ; CHECK-LABEL: fcmpOgeDouble |
795 ; CHECK: ucomisd | 795 ; CHECK: ucomisd |
796 ; CHECK: jae . | 796 ; CHECK: jae . |
797 | 797 |
798 define internal i32 @fcmpOltFloat(float %a, float %b) { | 798 define internal i32 @fcmpOltFloat(float %a, float %b) { |
799 entry: | 799 entry: |
800 %cmp = fcmp olt float %a, %b | 800 %cmp = fcmp olt float %a, %b |
801 %cmp.ret_ext = zext i1 %cmp to i32 | 801 %cmp.ret_ext = zext i1 %cmp to i32 |
802 ret i32 %cmp.ret_ext | 802 ret i32 %cmp.ret_ext |
803 } | 803 } |
804 ; CHECK: fcmpOltFloat: | 804 ; CHECK-LABEL: fcmpOltFloat |
805 ; CHECK: ucomiss | 805 ; CHECK: ucomiss |
806 ; CHECK: ja . | 806 ; CHECK: ja . |
807 | 807 |
808 define internal i32 @fcmpOltDouble(double %a, double %b) { | 808 define internal i32 @fcmpOltDouble(double %a, double %b) { |
809 entry: | 809 entry: |
810 %cmp = fcmp olt double %a, %b | 810 %cmp = fcmp olt double %a, %b |
811 %cmp.ret_ext = zext i1 %cmp to i32 | 811 %cmp.ret_ext = zext i1 %cmp to i32 |
812 ret i32 %cmp.ret_ext | 812 ret i32 %cmp.ret_ext |
813 } | 813 } |
814 ; CHECK: fcmpOltDouble: | 814 ; CHECK-LABEL: fcmpOltDouble |
815 ; CHECK: ucomisd | 815 ; CHECK: ucomisd |
816 ; CHECK: ja . | 816 ; CHECK: ja . |
817 | 817 |
818 define internal i32 @fcmpOleFloat(float %a, float %b) { | 818 define internal i32 @fcmpOleFloat(float %a, float %b) { |
819 entry: | 819 entry: |
820 %cmp = fcmp ole float %a, %b | 820 %cmp = fcmp ole float %a, %b |
821 %cmp.ret_ext = zext i1 %cmp to i32 | 821 %cmp.ret_ext = zext i1 %cmp to i32 |
822 ret i32 %cmp.ret_ext | 822 ret i32 %cmp.ret_ext |
823 } | 823 } |
824 ; CHECK: fcmpOleFloat: | 824 ; CHECK-LABEL: fcmpOleFloat |
825 ; CHECK: ucomiss | 825 ; CHECK: ucomiss |
826 ; CHECK: jae . | 826 ; CHECK: jae . |
827 | 827 |
828 define internal i32 @fcmpOleDouble(double %a, double %b) { | 828 define internal i32 @fcmpOleDouble(double %a, double %b) { |
829 entry: | 829 entry: |
830 %cmp = fcmp ole double %a, %b | 830 %cmp = fcmp ole double %a, %b |
831 %cmp.ret_ext = zext i1 %cmp to i32 | 831 %cmp.ret_ext = zext i1 %cmp to i32 |
832 ret i32 %cmp.ret_ext | 832 ret i32 %cmp.ret_ext |
833 } | 833 } |
834 ; CHECK: fcmpOleDouble: | 834 ; CHECK-LABEL: fcmpOleDouble |
835 ; CHECK: ucomisd | 835 ; CHECK: ucomisd |
836 ; CHECK: jae . | 836 ; CHECK: jae . |
837 | 837 |
838 define internal i32 @fcmpOneFloat(float %a, float %b) { | 838 define internal i32 @fcmpOneFloat(float %a, float %b) { |
839 entry: | 839 entry: |
840 %cmp = fcmp one float %a, %b | 840 %cmp = fcmp one float %a, %b |
841 %cmp.ret_ext = zext i1 %cmp to i32 | 841 %cmp.ret_ext = zext i1 %cmp to i32 |
842 ret i32 %cmp.ret_ext | 842 ret i32 %cmp.ret_ext |
843 } | 843 } |
844 ; CHECK: fcmpOneFloat: | 844 ; CHECK-LABEL: fcmpOneFloat |
845 ; CHECK: ucomiss | 845 ; CHECK: ucomiss |
846 ; CHECK: jne . | 846 ; CHECK: jne . |
847 | 847 |
848 define internal i32 @fcmpOneDouble(double %a, double %b) { | 848 define internal i32 @fcmpOneDouble(double %a, double %b) { |
849 entry: | 849 entry: |
850 %cmp = fcmp one double %a, %b | 850 %cmp = fcmp one double %a, %b |
851 %cmp.ret_ext = zext i1 %cmp to i32 | 851 %cmp.ret_ext = zext i1 %cmp to i32 |
852 ret i32 %cmp.ret_ext | 852 ret i32 %cmp.ret_ext |
853 } | 853 } |
854 ; CHECK: fcmpOneDouble: | 854 ; CHECK-LABEL: fcmpOneDouble |
855 ; CHECK: ucomisd | 855 ; CHECK: ucomisd |
856 ; CHECK: jne . | 856 ; CHECK: jne . |
857 | 857 |
858 define internal i32 @fcmpOrdFloat(float %a, float %b) { | 858 define internal i32 @fcmpOrdFloat(float %a, float %b) { |
859 entry: | 859 entry: |
860 %cmp = fcmp ord float %a, %b | 860 %cmp = fcmp ord float %a, %b |
861 %cmp.ret_ext = zext i1 %cmp to i32 | 861 %cmp.ret_ext = zext i1 %cmp to i32 |
862 ret i32 %cmp.ret_ext | 862 ret i32 %cmp.ret_ext |
863 } | 863 } |
864 ; CHECK: fcmpOrdFloat: | 864 ; CHECK-LABEL: fcmpOrdFloat |
865 ; CHECK: ucomiss | 865 ; CHECK: ucomiss |
866 ; CHECK: jnp . | 866 ; CHECK: jnp . |
867 | 867 |
868 define internal i32 @fcmpOrdDouble(double %a, double %b) { | 868 define internal i32 @fcmpOrdDouble(double %a, double %b) { |
869 entry: | 869 entry: |
870 %cmp = fcmp ord double %a, %b | 870 %cmp = fcmp ord double %a, %b |
871 %cmp.ret_ext = zext i1 %cmp to i32 | 871 %cmp.ret_ext = zext i1 %cmp to i32 |
872 ret i32 %cmp.ret_ext | 872 ret i32 %cmp.ret_ext |
873 } | 873 } |
874 ; CHECK: fcmpOrdDouble: | 874 ; CHECK-LABEL: fcmpOrdDouble |
875 ; CHECK: ucomisd | 875 ; CHECK: ucomisd |
876 ; CHECK: jnp . | 876 ; CHECK: jnp . |
877 | 877 |
878 define internal i32 @fcmpUeqFloat(float %a, float %b) { | 878 define internal i32 @fcmpUeqFloat(float %a, float %b) { |
879 entry: | 879 entry: |
880 %cmp = fcmp ueq float %a, %b | 880 %cmp = fcmp ueq float %a, %b |
881 %cmp.ret_ext = zext i1 %cmp to i32 | 881 %cmp.ret_ext = zext i1 %cmp to i32 |
882 ret i32 %cmp.ret_ext | 882 ret i32 %cmp.ret_ext |
883 } | 883 } |
884 ; CHECK: fcmpUeqFloat: | 884 ; CHECK-LABEL: fcmpUeqFloat |
885 ; CHECK: ucomiss | 885 ; CHECK: ucomiss |
886 ; CHECK: je . | 886 ; CHECK: je . |
887 | 887 |
888 define internal i32 @fcmpUeqDouble(double %a, double %b) { | 888 define internal i32 @fcmpUeqDouble(double %a, double %b) { |
889 entry: | 889 entry: |
890 %cmp = fcmp ueq double %a, %b | 890 %cmp = fcmp ueq double %a, %b |
891 %cmp.ret_ext = zext i1 %cmp to i32 | 891 %cmp.ret_ext = zext i1 %cmp to i32 |
892 ret i32 %cmp.ret_ext | 892 ret i32 %cmp.ret_ext |
893 } | 893 } |
894 ; CHECK: fcmpUeqDouble: | 894 ; CHECK-LABEL: fcmpUeqDouble |
895 ; CHECK: ucomisd | 895 ; CHECK: ucomisd |
896 ; CHECK: je . | 896 ; CHECK: je . |
897 | 897 |
898 define internal i32 @fcmpUgtFloat(float %a, float %b) { | 898 define internal i32 @fcmpUgtFloat(float %a, float %b) { |
899 entry: | 899 entry: |
900 %cmp = fcmp ugt float %a, %b | 900 %cmp = fcmp ugt float %a, %b |
901 %cmp.ret_ext = zext i1 %cmp to i32 | 901 %cmp.ret_ext = zext i1 %cmp to i32 |
902 ret i32 %cmp.ret_ext | 902 ret i32 %cmp.ret_ext |
903 } | 903 } |
904 ; CHECK: fcmpUgtFloat: | 904 ; CHECK-LABEL: fcmpUgtFloat |
905 ; CHECK: ucomiss | 905 ; CHECK: ucomiss |
906 ; CHECK: jb . | 906 ; CHECK: jb . |
907 | 907 |
908 define internal i32 @fcmpUgtDouble(double %a, double %b) { | 908 define internal i32 @fcmpUgtDouble(double %a, double %b) { |
909 entry: | 909 entry: |
910 %cmp = fcmp ugt double %a, %b | 910 %cmp = fcmp ugt double %a, %b |
911 %cmp.ret_ext = zext i1 %cmp to i32 | 911 %cmp.ret_ext = zext i1 %cmp to i32 |
912 ret i32 %cmp.ret_ext | 912 ret i32 %cmp.ret_ext |
913 } | 913 } |
914 ; CHECK: fcmpUgtDouble: | 914 ; CHECK-LABEL: fcmpUgtDouble |
915 ; CHECK: ucomisd | 915 ; CHECK: ucomisd |
916 ; CHECK: jb . | 916 ; CHECK: jb . |
917 | 917 |
918 define internal i32 @fcmpUgeFloat(float %a, float %b) { | 918 define internal i32 @fcmpUgeFloat(float %a, float %b) { |
919 entry: | 919 entry: |
920 %cmp = fcmp uge float %a, %b | 920 %cmp = fcmp uge float %a, %b |
921 %cmp.ret_ext = zext i1 %cmp to i32 | 921 %cmp.ret_ext = zext i1 %cmp to i32 |
922 ret i32 %cmp.ret_ext | 922 ret i32 %cmp.ret_ext |
923 } | 923 } |
924 ; CHECK: fcmpUgeFloat: | 924 ; CHECK-LABEL: fcmpUgeFloat |
925 ; CHECK: ucomiss | 925 ; CHECK: ucomiss |
926 ; CHECK: jbe . | 926 ; CHECK: jbe . |
927 | 927 |
928 define internal i32 @fcmpUgeDouble(double %a, double %b) { | 928 define internal i32 @fcmpUgeDouble(double %a, double %b) { |
929 entry: | 929 entry: |
930 %cmp = fcmp uge double %a, %b | 930 %cmp = fcmp uge double %a, %b |
931 %cmp.ret_ext = zext i1 %cmp to i32 | 931 %cmp.ret_ext = zext i1 %cmp to i32 |
932 ret i32 %cmp.ret_ext | 932 ret i32 %cmp.ret_ext |
933 } | 933 } |
934 ; CHECK: fcmpUgeDouble: | 934 ; CHECK-LABEL: fcmpUgeDouble |
935 ; CHECK: ucomisd | 935 ; CHECK: ucomisd |
936 ; CHECK: jbe . | 936 ; CHECK: jbe . |
937 | 937 |
938 define internal i32 @fcmpUltFloat(float %a, float %b) { | 938 define internal i32 @fcmpUltFloat(float %a, float %b) { |
939 entry: | 939 entry: |
940 %cmp = fcmp ult float %a, %b | 940 %cmp = fcmp ult float %a, %b |
941 %cmp.ret_ext = zext i1 %cmp to i32 | 941 %cmp.ret_ext = zext i1 %cmp to i32 |
942 ret i32 %cmp.ret_ext | 942 ret i32 %cmp.ret_ext |
943 } | 943 } |
944 ; CHECK: fcmpUltFloat: | 944 ; CHECK-LABEL: fcmpUltFloat |
945 ; CHECK: ucomiss | 945 ; CHECK: ucomiss |
946 ; CHECK: jb . | 946 ; CHECK: jb . |
947 | 947 |
948 define internal i32 @fcmpUltDouble(double %a, double %b) { | 948 define internal i32 @fcmpUltDouble(double %a, double %b) { |
949 entry: | 949 entry: |
950 %cmp = fcmp ult double %a, %b | 950 %cmp = fcmp ult double %a, %b |
951 %cmp.ret_ext = zext i1 %cmp to i32 | 951 %cmp.ret_ext = zext i1 %cmp to i32 |
952 ret i32 %cmp.ret_ext | 952 ret i32 %cmp.ret_ext |
953 } | 953 } |
954 ; CHECK: fcmpUltDouble: | 954 ; CHECK-LABEL: fcmpUltDouble |
955 ; CHECK: ucomisd | 955 ; CHECK: ucomisd |
956 ; CHECK: jb . | 956 ; CHECK: jb . |
957 | 957 |
958 define internal i32 @fcmpUleFloat(float %a, float %b) { | 958 define internal i32 @fcmpUleFloat(float %a, float %b) { |
959 entry: | 959 entry: |
960 %cmp = fcmp ule float %a, %b | 960 %cmp = fcmp ule float %a, %b |
961 %cmp.ret_ext = zext i1 %cmp to i32 | 961 %cmp.ret_ext = zext i1 %cmp to i32 |
962 ret i32 %cmp.ret_ext | 962 ret i32 %cmp.ret_ext |
963 } | 963 } |
964 ; CHECK: fcmpUleFloat: | 964 ; CHECK-LABEL: fcmpUleFloat |
965 ; CHECK: ucomiss | 965 ; CHECK: ucomiss |
966 ; CHECK: jbe . | 966 ; CHECK: jbe . |
967 | 967 |
968 define internal i32 @fcmpUleDouble(double %a, double %b) { | 968 define internal i32 @fcmpUleDouble(double %a, double %b) { |
969 entry: | 969 entry: |
970 %cmp = fcmp ule double %a, %b | 970 %cmp = fcmp ule double %a, %b |
971 %cmp.ret_ext = zext i1 %cmp to i32 | 971 %cmp.ret_ext = zext i1 %cmp to i32 |
972 ret i32 %cmp.ret_ext | 972 ret i32 %cmp.ret_ext |
973 } | 973 } |
974 ; CHECK: fcmpUleDouble: | 974 ; CHECK-LABEL: fcmpUleDouble |
975 ; CHECK: ucomisd | 975 ; CHECK: ucomisd |
976 ; CHECK: jbe . | 976 ; CHECK: jbe . |
977 | 977 |
978 define internal i32 @fcmpUneFloat(float %a, float %b) { | 978 define internal i32 @fcmpUneFloat(float %a, float %b) { |
979 entry: | 979 entry: |
980 %cmp = fcmp une float %a, %b | 980 %cmp = fcmp une float %a, %b |
981 %cmp.ret_ext = zext i1 %cmp to i32 | 981 %cmp.ret_ext = zext i1 %cmp to i32 |
982 ret i32 %cmp.ret_ext | 982 ret i32 %cmp.ret_ext |
983 } | 983 } |
984 ; CHECK: fcmpUneFloat: | 984 ; CHECK-LABEL: fcmpUneFloat |
985 ; CHECK: ucomiss | 985 ; CHECK: ucomiss |
986 ; CHECK: jne . | 986 ; CHECK: jne . |
987 ; CHECK: jp . | 987 ; CHECK: jp . |
988 | 988 |
989 define internal i32 @fcmpUneDouble(double %a, double %b) { | 989 define internal i32 @fcmpUneDouble(double %a, double %b) { |
990 entry: | 990 entry: |
991 %cmp = fcmp une double %a, %b | 991 %cmp = fcmp une double %a, %b |
992 %cmp.ret_ext = zext i1 %cmp to i32 | 992 %cmp.ret_ext = zext i1 %cmp to i32 |
993 ret i32 %cmp.ret_ext | 993 ret i32 %cmp.ret_ext |
994 } | 994 } |
995 ; CHECK: fcmpUneDouble: | 995 ; CHECK-LABEL: fcmpUneDouble |
996 ; CHECK: ucomisd | 996 ; CHECK: ucomisd |
997 ; CHECK: jne . | 997 ; CHECK: jne . |
998 ; CHECK: jp . | 998 ; CHECK: jp . |
999 | 999 |
1000 define internal i32 @fcmpUnoFloat(float %a, float %b) { | 1000 define internal i32 @fcmpUnoFloat(float %a, float %b) { |
1001 entry: | 1001 entry: |
1002 %cmp = fcmp uno float %a, %b | 1002 %cmp = fcmp uno float %a, %b |
1003 %cmp.ret_ext = zext i1 %cmp to i32 | 1003 %cmp.ret_ext = zext i1 %cmp to i32 |
1004 ret i32 %cmp.ret_ext | 1004 ret i32 %cmp.ret_ext |
1005 } | 1005 } |
1006 ; CHECK: fcmpUnoFloat: | 1006 ; CHECK-LABEL: fcmpUnoFloat |
1007 ; CHECK: ucomiss | 1007 ; CHECK: ucomiss |
1008 ; CHECK: jp . | 1008 ; CHECK: jp . |
1009 | 1009 |
1010 define internal i32 @fcmpUnoDouble(double %a, double %b) { | 1010 define internal i32 @fcmpUnoDouble(double %a, double %b) { |
1011 entry: | 1011 entry: |
1012 %cmp = fcmp uno double %a, %b | 1012 %cmp = fcmp uno double %a, %b |
1013 %cmp.ret_ext = zext i1 %cmp to i32 | 1013 %cmp.ret_ext = zext i1 %cmp to i32 |
1014 ret i32 %cmp.ret_ext | 1014 ret i32 %cmp.ret_ext |
1015 } | 1015 } |
1016 ; CHECK: fcmpUnoDouble: | 1016 ; CHECK-LABEL: fcmpUnoDouble |
1017 ; CHECK: ucomisd | 1017 ; CHECK: ucomisd |
1018 ; CHECK: jp . | 1018 ; CHECK: jp . |
1019 | 1019 |
1020 define internal i32 @fcmpTrueFloat(float %a, float %b) { | 1020 define internal i32 @fcmpTrueFloat(float %a, float %b) { |
1021 entry: | 1021 entry: |
1022 %cmp = fcmp true float %a, %b | 1022 %cmp = fcmp true float %a, %b |
1023 %cmp.ret_ext = zext i1 %cmp to i32 | 1023 %cmp.ret_ext = zext i1 %cmp to i32 |
1024 ret i32 %cmp.ret_ext | 1024 ret i32 %cmp.ret_ext |
1025 } | 1025 } |
1026 ; CHECK: fcmpTrueFloat: | 1026 ; CHECK-LABEL: fcmpTrueFloat |
1027 ; CHECK: mov {{.*}}, 1 | 1027 ; CHECK: mov {{.*}}, 1 |
1028 | 1028 |
1029 define internal i32 @fcmpTrueDouble(double %a, double %b) { | 1029 define internal i32 @fcmpTrueDouble(double %a, double %b) { |
1030 entry: | 1030 entry: |
1031 %cmp = fcmp true double %a, %b | 1031 %cmp = fcmp true double %a, %b |
1032 %cmp.ret_ext = zext i1 %cmp to i32 | 1032 %cmp.ret_ext = zext i1 %cmp to i32 |
1033 ret i32 %cmp.ret_ext | 1033 ret i32 %cmp.ret_ext |
1034 } | 1034 } |
1035 ; CHECK: fcmpTrueDouble: | 1035 ; CHECK-LABEL: fcmpTrueDouble |
1036 ; CHECK: mov {{.*}}, 1 | 1036 ; CHECK: mov {{.*}}, 1 |
1037 | 1037 |
1038 define internal float @loadFloat(i32 %a) { | 1038 define internal float @loadFloat(i32 %a) { |
1039 entry: | 1039 entry: |
1040 %__1 = inttoptr i32 %a to float* | 1040 %__1 = inttoptr i32 %a to float* |
1041 %v0 = load float* %__1, align 4 | 1041 %v0 = load float* %__1, align 4 |
1042 ret float %v0 | 1042 ret float %v0 |
1043 } | 1043 } |
1044 ; CHECK: loadFloat: | 1044 ; CHECK-LABEL: loadFloat |
1045 ; CHECK: movss | 1045 ; CHECK: movss |
1046 ; CHECK: fld | 1046 ; CHECK: fld |
1047 | 1047 |
1048 define internal double @loadDouble(i32 %a) { | 1048 define internal double @loadDouble(i32 %a) { |
1049 entry: | 1049 entry: |
1050 %__1 = inttoptr i32 %a to double* | 1050 %__1 = inttoptr i32 %a to double* |
1051 %v0 = load double* %__1, align 8 | 1051 %v0 = load double* %__1, align 8 |
1052 ret double %v0 | 1052 ret double %v0 |
1053 } | 1053 } |
1054 ; CHECK: loadDouble: | 1054 ; CHECK-LABEL: loadDouble |
1055 ; CHECK: movsd | 1055 ; CHECK: movsd |
1056 ; CHECK: fld | 1056 ; CHECK: fld |
1057 | 1057 |
1058 define internal void @storeFloat(i32 %a, float %value) { | 1058 define internal void @storeFloat(i32 %a, float %value) { |
1059 entry: | 1059 entry: |
1060 %__2 = inttoptr i32 %a to float* | 1060 %__2 = inttoptr i32 %a to float* |
1061 store float %value, float* %__2, align 4 | 1061 store float %value, float* %__2, align 4 |
1062 ret void | 1062 ret void |
1063 } | 1063 } |
1064 ; CHECK: storeFloat: | 1064 ; CHECK-LABEL: storeFloat: |
| 1065 ; CHECK: movss |
1065 ; CHECK: movss | 1066 ; CHECK: movss |
1066 | 1067 |
1067 define internal void @storeDouble(i32 %a, double %value) { | 1068 define internal void @storeDouble(i32 %a, double %value) { |
1068 entry: | 1069 entry: |
1069 %__2 = inttoptr i32 %a to double* | 1070 %__2 = inttoptr i32 %a to double* |
1070 store double %value, double* %__2, align 8 | 1071 store double %value, double* %__2, align 8 |
1071 ret void | 1072 ret void |
1072 } | 1073 } |
1073 ; CHECK: storeDouble: | 1074 ; CHECK-LABEL: storeDouble: |
| 1075 ; CHECK: movsd |
1074 ; CHECK: movsd | 1076 ; CHECK: movsd |
1075 | 1077 |
1076 define internal void @storeFloatConst(i32 %a) { | 1078 define internal void @storeFloatConst(i32 %a) { |
1077 entry: | 1079 entry: |
1078 %a.asptr = inttoptr i32 %a to float* | 1080 %a.asptr = inttoptr i32 %a to float* |
1079 store float 0x3FF3AE1480000000, float* %a.asptr, align 4 | 1081 store float 0x3FF3AE1480000000, float* %a.asptr, align 4 |
1080 ret void | 1082 ret void |
1081 } | 1083 } |
1082 ; CHECK: storeFloatConst: | 1084 ; CHECK-LABEL: storeFloatConst |
1083 ; CHECK: mov | 1085 ; CHECK: movss |
1084 ; CHECK: mov | 1086 ; CHECK: movss |
1085 | 1087 |
1086 define internal void @storeDoubleConst(i32 %a) { | 1088 define internal void @storeDoubleConst(i32 %a) { |
1087 entry: | 1089 entry: |
1088 %a.asptr = inttoptr i32 %a to double* | 1090 %a.asptr = inttoptr i32 %a to double* |
1089 store double 1.230000e+00, double* %a.asptr, align 8 | 1091 store double 1.230000e+00, double* %a.asptr, align 8 |
1090 ret void | 1092 ret void |
1091 } | 1093 } |
1092 ; CHECK: storeDoubleConst: | 1094 ; CHECK-LABEL: storeDoubleConst |
1093 ; CHECK: mov | 1095 ; CHECK: movsd |
1094 ; CHECK: mov | 1096 ; CHECK: movsd |
1095 | 1097 |
1096 define internal float @selectFloatVarVar(float %a, float %b) { | 1098 define internal float @selectFloatVarVar(float %a, float %b) { |
1097 entry: | 1099 entry: |
1098 %cmp = fcmp olt float %a, %b | 1100 %cmp = fcmp olt float %a, %b |
1099 %cond = select i1 %cmp, float %a, float %b | 1101 %cond = select i1 %cmp, float %a, float %b |
1100 ret float %cond | 1102 ret float %cond |
1101 } | 1103 } |
1102 ; CHECK: selectFloatVarVar: | 1104 ; CHECK-LABEL: selectFloatVarVar |
1103 ; CHECK: ucomiss | 1105 ; CHECK: ucomiss |
1104 ; CHECK: ja . | 1106 ; CHECK: ja . |
1105 ; CHECK: fld | 1107 ; CHECK: fld |
1106 | 1108 |
1107 define internal double @selectDoubleVarVar(double %a, double %b) { | 1109 define internal double @selectDoubleVarVar(double %a, double %b) { |
1108 entry: | 1110 entry: |
1109 %cmp = fcmp olt double %a, %b | 1111 %cmp = fcmp olt double %a, %b |
1110 %cond = select i1 %cmp, double %a, double %b | 1112 %cond = select i1 %cmp, double %a, double %b |
1111 ret double %cond | 1113 ret double %cond |
1112 } | 1114 } |
1113 ; CHECK: selectDoubleVarVar: | 1115 ; CHECK-LABEL: selectDoubleVarVar |
1114 ; CHECK: ucomisd | 1116 ; CHECK: ucomisd |
1115 ; CHECK: ja . | 1117 ; CHECK: ja . |
1116 ; CHECK: fld | 1118 ; CHECK: fld |
1117 | 1119 |
1118 ; ERRORS-NOT: ICE translation error | 1120 ; ERRORS-NOT: ICE translation error |
1119 ; DUMP-NOT: SZ | 1121 ; DUMP-NOT: SZ |
OLD | NEW |