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 ; TODO(jvoung): fix extra "CALLTARGETS" run. The llvm-objdump symbolizer | 6 ; TODO(jvoung): fix extra "CALLTARGETS" run. The llvm-objdump symbolizer |
7 ; doesn't know how to symbolize non-section-local functions. | 7 ; doesn't know how to symbolize non-section-local functions. |
8 ; The newer LLVM 3.6 one does work, but watch out for other bugs. | 8 ; The newer LLVM 3.6 one does work, but watch out for other bugs. |
9 | 9 |
10 ; RUN: %llvm2ice -O2 --verbose none %s \ | 10 ; RUN: %llvm2ice -O2 --verbose none %s \ |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 ; CALLTARGETS-LABEL: floatToUnsigned64 | 264 ; CALLTARGETS-LABEL: floatToUnsigned64 |
265 ; CHECK: call -4 | 265 ; CHECK: call -4 |
266 ; CALLTARGETS: call cvtftoui64 | 266 ; CALLTARGETS: call cvtftoui64 |
267 | 267 |
268 define internal i32 @doubleToSigned32(double %a) { | 268 define internal i32 @doubleToSigned32(double %a) { |
269 entry: | 269 entry: |
270 %conv = fptosi double %a to i32 | 270 %conv = fptosi double %a to i32 |
271 ret i32 %conv | 271 ret i32 %conv |
272 } | 272 } |
273 ; CHECK-LABEL: doubleToSigned32 | 273 ; CHECK-LABEL: doubleToSigned32 |
274 ; CHECK: cvtsd2si | 274 ; CHECK: cvttsd2si |
275 | 275 |
276 define internal i32 @floatToSigned32(float %a) { | 276 define internal i32 @floatToSigned32(float %a) { |
277 entry: | 277 entry: |
278 %conv = fptosi float %a to i32 | 278 %conv = fptosi float %a to i32 |
279 ret i32 %conv | 279 ret i32 %conv |
280 } | 280 } |
281 ; CHECK-LABEL: floatToSigned32 | 281 ; CHECK-LABEL: floatToSigned32 |
282 ; CHECK: cvtss2si | 282 ; CHECK: cvttss2si |
283 | 283 |
284 define internal i32 @doubleToUnsigned32(double %a) { | 284 define internal i32 @doubleToUnsigned32(double %a) { |
285 entry: | 285 entry: |
286 %conv = fptoui double %a to i32 | 286 %conv = fptoui double %a to i32 |
287 ret i32 %conv | 287 ret i32 %conv |
288 } | 288 } |
289 ; CHECK-LABEL: doubleToUnsigned32 | 289 ; CHECK-LABEL: doubleToUnsigned32 |
290 ; CALLTARGETS-LABEL: doubleToUnsigned32 | 290 ; CALLTARGETS-LABEL: doubleToUnsigned32 |
291 ; CHECK: call -4 | 291 ; CHECK: call -4 |
292 ; CALLTARGETS: call cvtdtoui32 | 292 ; CALLTARGETS: call cvtdtoui32 |
293 | 293 |
294 define internal i32 @floatToUnsigned32(float %a) { | 294 define internal i32 @floatToUnsigned32(float %a) { |
295 entry: | 295 entry: |
296 %conv = fptoui float %a to i32 | 296 %conv = fptoui float %a to i32 |
297 ret i32 %conv | 297 ret i32 %conv |
298 } | 298 } |
299 ; CHECK-LABEL: floatToUnsigned32 | 299 ; CHECK-LABEL: floatToUnsigned32 |
300 ; CALLTARGETS-LABEL: floatToUnsigned32 | 300 ; CALLTARGETS-LABEL: floatToUnsigned32 |
301 ; CHECK: call -4 | 301 ; CHECK: call -4 |
302 ; CALLTARGETS: call cvtftoui32 | 302 ; CALLTARGETS: call cvtftoui32 |
303 | 303 |
304 | 304 |
305 define internal i32 @doubleToSigned16(double %a) { | 305 define internal i32 @doubleToSigned16(double %a) { |
306 entry: | 306 entry: |
307 %conv = fptosi double %a to i16 | 307 %conv = fptosi double %a to i16 |
308 %conv.ret_ext = sext i16 %conv to i32 | 308 %conv.ret_ext = sext i16 %conv to i32 |
309 ret i32 %conv.ret_ext | 309 ret i32 %conv.ret_ext |
310 } | 310 } |
311 ; CHECK-LABEL: doubleToSigned16 | 311 ; CHECK-LABEL: doubleToSigned16 |
312 ; CHECK: cvtsd2si | 312 ; CHECK: cvttsd2si |
313 ; CHECK: movsx | 313 ; CHECK: movsx |
314 | 314 |
315 define internal i32 @floatToSigned16(float %a) { | 315 define internal i32 @floatToSigned16(float %a) { |
316 entry: | 316 entry: |
317 %conv = fptosi float %a to i16 | 317 %conv = fptosi float %a to i16 |
318 %conv.ret_ext = sext i16 %conv to i32 | 318 %conv.ret_ext = sext i16 %conv to i32 |
319 ret i32 %conv.ret_ext | 319 ret i32 %conv.ret_ext |
320 } | 320 } |
321 ; CHECK-LABEL: floatToSigned16 | 321 ; CHECK-LABEL: floatToSigned16 |
322 ; CHECK: cvtss2si | 322 ; CHECK: cvttss2si |
323 ; CHECK: movsx | 323 ; CHECK: movsx |
324 | 324 |
325 define internal i32 @doubleToUnsigned16(double %a) { | 325 define internal i32 @doubleToUnsigned16(double %a) { |
326 entry: | 326 entry: |
327 %conv = fptoui double %a to i16 | 327 %conv = fptoui double %a to i16 |
328 %conv.ret_ext = zext i16 %conv to i32 | 328 %conv.ret_ext = zext i16 %conv to i32 |
329 ret i32 %conv.ret_ext | 329 ret i32 %conv.ret_ext |
330 } | 330 } |
331 ; CHECK-LABEL: doubleToUnsigned16 | 331 ; CHECK-LABEL: doubleToUnsigned16 |
332 ; CHECK: cvtsd2si | 332 ; CHECK: cvttsd2si |
333 ; CHECK: movzx | 333 ; CHECK: movzx |
334 | 334 |
335 define internal i32 @floatToUnsigned16(float %a) { | 335 define internal i32 @floatToUnsigned16(float %a) { |
336 entry: | 336 entry: |
337 %conv = fptoui float %a to i16 | 337 %conv = fptoui float %a to i16 |
338 %conv.ret_ext = zext i16 %conv to i32 | 338 %conv.ret_ext = zext i16 %conv to i32 |
339 ret i32 %conv.ret_ext | 339 ret i32 %conv.ret_ext |
340 } | 340 } |
341 ; CHECK-LABEL: floatToUnsigned16 | 341 ; CHECK-LABEL: floatToUnsigned16 |
342 ; CHECK: cvtss2si | 342 ; CHECK: cvttss2si |
343 ; CHECK: movzx | 343 ; CHECK: movzx |
344 | 344 |
345 define internal i32 @doubleToSigned8(double %a) { | 345 define internal i32 @doubleToSigned8(double %a) { |
346 entry: | 346 entry: |
347 %conv = fptosi double %a to i8 | 347 %conv = fptosi double %a to i8 |
348 %conv.ret_ext = sext i8 %conv to i32 | 348 %conv.ret_ext = sext i8 %conv to i32 |
349 ret i32 %conv.ret_ext | 349 ret i32 %conv.ret_ext |
350 } | 350 } |
351 ; CHECK-LABEL: doubleToSigned8 | 351 ; CHECK-LABEL: doubleToSigned8 |
352 ; CHECK: cvtsd2si | 352 ; CHECK: cvttsd2si |
353 ; CHECK: movsx | 353 ; CHECK: movsx |
354 | 354 |
355 define internal i32 @floatToSigned8(float %a) { | 355 define internal i32 @floatToSigned8(float %a) { |
356 entry: | 356 entry: |
357 %conv = fptosi float %a to i8 | 357 %conv = fptosi float %a to i8 |
358 %conv.ret_ext = sext i8 %conv to i32 | 358 %conv.ret_ext = sext i8 %conv to i32 |
359 ret i32 %conv.ret_ext | 359 ret i32 %conv.ret_ext |
360 } | 360 } |
361 ; CHECK-LABEL: floatToSigned8 | 361 ; CHECK-LABEL: floatToSigned8 |
362 ; CHECK: cvtss2si | 362 ; CHECK: cvttss2si |
363 ; CHECK: movsx | 363 ; CHECK: movsx |
364 | 364 |
365 define internal i32 @doubleToUnsigned8(double %a) { | 365 define internal i32 @doubleToUnsigned8(double %a) { |
366 entry: | 366 entry: |
367 %conv = fptoui double %a to i8 | 367 %conv = fptoui double %a to i8 |
368 %conv.ret_ext = zext i8 %conv to i32 | 368 %conv.ret_ext = zext i8 %conv to i32 |
369 ret i32 %conv.ret_ext | 369 ret i32 %conv.ret_ext |
370 } | 370 } |
371 ; CHECK-LABEL: doubleToUnsigned8 | 371 ; CHECK-LABEL: doubleToUnsigned8 |
372 ; CHECK: cvtsd2si | 372 ; CHECK: cvttsd2si |
373 ; CHECK: movzx | 373 ; CHECK: movzx |
374 | 374 |
375 define internal i32 @floatToUnsigned8(float %a) { | 375 define internal i32 @floatToUnsigned8(float %a) { |
376 entry: | 376 entry: |
377 %conv = fptoui float %a to i8 | 377 %conv = fptoui float %a to i8 |
378 %conv.ret_ext = zext i8 %conv to i32 | 378 %conv.ret_ext = zext i8 %conv to i32 |
379 ret i32 %conv.ret_ext | 379 ret i32 %conv.ret_ext |
380 } | 380 } |
381 ; CHECK-LABEL: floatToUnsigned8 | 381 ; CHECK-LABEL: floatToUnsigned8 |
382 ; CHECK: cvtss2si | 382 ; CHECK: cvttss2si |
383 ; CHECK: movzx | 383 ; CHECK: movzx |
384 | 384 |
385 define internal i32 @doubleToUnsigned1(double %a) { | 385 define internal i32 @doubleToUnsigned1(double %a) { |
386 entry: | 386 entry: |
387 %tobool = fptoui double %a to i1 | 387 %tobool = fptoui double %a to i1 |
388 %tobool.ret_ext = zext i1 %tobool to i32 | 388 %tobool.ret_ext = zext i1 %tobool to i32 |
389 ret i32 %tobool.ret_ext | 389 ret i32 %tobool.ret_ext |
390 } | 390 } |
391 ; CHECK-LABEL: doubleToUnsigned1 | 391 ; CHECK-LABEL: doubleToUnsigned1 |
392 ; CHECK: cvtsd2si | 392 ; CHECK: cvttsd2si |
393 ; CHECK: and eax, 1 | 393 ; CHECK: and eax, 1 |
394 | 394 |
395 define internal i32 @floatToUnsigned1(float %a) { | 395 define internal i32 @floatToUnsigned1(float %a) { |
396 entry: | 396 entry: |
397 %tobool = fptoui float %a to i1 | 397 %tobool = fptoui float %a to i1 |
398 %tobool.ret_ext = zext i1 %tobool to i32 | 398 %tobool.ret_ext = zext i1 %tobool to i32 |
399 ret i32 %tobool.ret_ext | 399 ret i32 %tobool.ret_ext |
400 } | 400 } |
401 ; CHECK-LABEL: floatToUnsigned1 | 401 ; CHECK-LABEL: floatToUnsigned1 |
402 ; CHECK: cvtss2si | 402 ; CHECK: cvttss2si |
403 ; CHECK: and eax, 1 | 403 ; CHECK: and eax, 1 |
404 | 404 |
405 define internal double @signed64ToDouble(i64 %a) { | 405 define internal double @signed64ToDouble(i64 %a) { |
406 entry: | 406 entry: |
407 %conv = sitofp i64 %a to double | 407 %conv = sitofp i64 %a to double |
408 ret double %conv | 408 ret double %conv |
409 } | 409 } |
410 ; CHECK-LABEL: signed64ToDouble | 410 ; CHECK-LABEL: signed64ToDouble |
411 ; CALLTARGETS-LABEL: signed64ToDouble | 411 ; CALLTARGETS-LABEL: signed64ToDouble |
412 ; CHECK: call -4 | 412 ; CHECK: call -4 |
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1173 %cond = select i1 %cmp, double %a, double %b | 1173 %cond = select i1 %cmp, double %a, double %b |
1174 ret double %cond | 1174 ret double %cond |
1175 } | 1175 } |
1176 ; CHECK-LABEL: selectDoubleVarVar | 1176 ; CHECK-LABEL: selectDoubleVarVar |
1177 ; CHECK: ucomisd | 1177 ; CHECK: ucomisd |
1178 ; CHECK: ja {{[0-9]}} | 1178 ; CHECK: ja {{[0-9]}} |
1179 ; CHECK: fld | 1179 ; CHECK: fld |
1180 | 1180 |
1181 ; ERRORS-NOT: ICE translation error | 1181 ; ERRORS-NOT: ICE translation error |
1182 ; DUMP-NOT: SZ | 1182 ; DUMP-NOT: SZ |
OLD | NEW |