comparison test/CodeGen/X86/fdiv.ll @ 95:afa8332a0e37 LLVM3.8

LLVM 3.8
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Tue, 13 Oct 2015 17:48:58 +0900
parents 95c75e76d11b
children 7d135dc70f03
comparison
equal deleted inserted replaced
84:f3e34b893a5f 95:afa8332a0e37
1 ; RUN: llc < %s -march=x86-64 -enable-unsafe-fp-math | FileCheck %s 1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -enable-unsafe-fp-math | FileCheck %s
2 2
3 define double @exact(double %x) { 3 define double @exact(double %x) {
4 ; Exact division by a constant converted to multiplication. 4 ; Exact division by a constant converted to multiplication.
5 ; CHECK: @exact 5 ; CHECK-LABEL: exact:
6 ; CHECK: mulsd 6 ; CHECK: # BB#0:
7 ; CHECK-NEXT: mulsd {{.*}}(%rip), %xmm0
8 ; CHECK-NEXT: retq
7 %div = fdiv double %x, 2.0 9 %div = fdiv double %x, 2.0
8 ret double %div 10 ret double %div
9 } 11 }
10 12
11 define double @inexact(double %x) { 13 define double @inexact(double %x) {
12 ; Inexact division by a constant converted to multiplication. 14 ; Inexact division by a constant converted to multiplication.
13 ; CHECK: @inexact 15 ; CHECK-LABEL: inexact:
14 ; CHECK: mulsd 16 ; CHECK: # BB#0:
15 %div = fdiv double %x, 0x41DFFFFFFFC00000 17 ; CHECK-NEXT: mulsd {{.*}}(%rip), %xmm0
18 ; CHECK-NEXT: retq
19 %div = fdiv double %x, 0x41DFFFFFFFC00000
16 ret double %div 20 ret double %div
17 } 21 }
18 22
19 define double @funky(double %x) { 23 define double @funky(double %x) {
20 ; No conversion to multiplication if too funky. 24 ; No conversion to multiplication if too funky.
21 ; CHECK: @funky 25 ; CHECK-LABEL: funky:
22 ; CHECK: divsd 26 ; CHECK: # BB#0:
27 ; CHECK-NEXT: xorpd %xmm1, %xmm1
28 ; CHECK-NEXT: divsd %xmm1, %xmm0
29 ; CHECK-NEXT: retq
23 %div = fdiv double %x, 0.0 30 %div = fdiv double %x, 0.0
24 ret double %div 31 ret double %div
25 } 32 }
26 33
27 define double @denormal1(double %x) { 34 define double @denormal1(double %x) {
28 ; Don't generate multiplication by a denormal. 35 ; Don't generate multiplication by a denormal.
29 ; CHECK: @denormal1 36 ; CHECK-LABEL: denormal1:
30 ; CHECK: divsd 37 ; CHECK: # BB#0:
38 ; CHECK-NEXT: divsd {{.*}}(%rip), %xmm0
39 ; CHECK-NEXT: retq
31 %div = fdiv double %x, 0x7FD0000000000001 40 %div = fdiv double %x, 0x7FD0000000000001
32 ret double %div 41 ret double %div
33 } 42 }
34 43
35 define double @denormal2(double %x) { 44 define double @denormal2(double %x) {
36 ; Don't generate multiplication by a denormal. 45 ; Don't generate multiplication by a denormal.
37 ; CHECK: @denormal 46 ; CHECK-LABEL: denormal2:
38 ; CHECK: divsd 47 ; CHECK: # BB#0:
48 ; CHECK-NEXT: divsd {{.*}}(%rip), %xmm0
49 ; CHECK-NEXT: retq
39 %div = fdiv double %x, 0x7FEFFFFFFFFFFFFF 50 %div = fdiv double %x, 0x7FEFFFFFFFFFFFFF
40 ret double %div 51 ret double %div
41 } 52 }
53
54 ; Deleting the negates does not require unsafe-fp-math.
55
56 define float @double_negative(float %x, float %y) #0 {
57 ; CHECK-LABEL: double_negative:
58 ; CHECK: # BB#0:
59 ; CHECK-NEXT: divss %xmm1, %xmm0
60 ; CHECK-NEXT: retq
61 %neg1 = fsub float -0.0, %x
62 %neg2 = fsub float -0.0, %y
63 %div = fdiv float %neg1, %neg2
64 ret float %div
65 }
66
67 attributes #0 = { "unsafe-fp-math"="false" }
68