Mercurial > hg > CbC > CbC_llvm
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 |