1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -enable-unsafe-fp-math | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine double @exact(double %x) { 5*9880d681SAndroid Build Coastguard Worker; Exact division by a constant converted to multiplication. 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exact: 7*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mulsd {{.*}}(%rip), %xmm0 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 10*9880d681SAndroid Build Coastguard Worker %div = fdiv double %x, 2.0 11*9880d681SAndroid Build Coastguard Worker ret double %div 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine double @inexact(double %x) { 15*9880d681SAndroid Build Coastguard Worker; Inexact division by a constant converted to multiplication. 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inexact: 17*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mulsd {{.*}}(%rip), %xmm0 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 20*9880d681SAndroid Build Coastguard Worker %div = fdiv double %x, 0x41DFFFFFFFC00000 21*9880d681SAndroid Build Coastguard Worker ret double %div 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine double @funky(double %x) { 25*9880d681SAndroid Build Coastguard Worker; No conversion to multiplication if too funky. 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: funky: 27*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorpd %xmm1, %xmm1 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: divsd %xmm1, %xmm0 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 31*9880d681SAndroid Build Coastguard Worker %div = fdiv double %x, 0.0 32*9880d681SAndroid Build Coastguard Worker ret double %div 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine double @denormal1(double %x) { 36*9880d681SAndroid Build Coastguard Worker; Don't generate multiplication by a denormal. 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: denormal1: 38*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: divsd {{.*}}(%rip), %xmm0 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 41*9880d681SAndroid Build Coastguard Worker %div = fdiv double %x, 0x7FD0000000000001 42*9880d681SAndroid Build Coastguard Worker ret double %div 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine double @denormal2(double %x) { 46*9880d681SAndroid Build Coastguard Worker; Don't generate multiplication by a denormal. 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: denormal2: 48*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: divsd {{.*}}(%rip), %xmm0 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 51*9880d681SAndroid Build Coastguard Worker %div = fdiv double %x, 0x7FEFFFFFFFFFFFFF 52*9880d681SAndroid Build Coastguard Worker ret double %div 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Deleting the negates does not require unsafe-fp-math. 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine float @double_negative(float %x, float %y) #0 { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: double_negative: 59*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: divss %xmm1, %xmm0 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 62*9880d681SAndroid Build Coastguard Worker %neg1 = fsub float -0.0, %x 63*9880d681SAndroid Build Coastguard Worker %neg2 = fsub float -0.0, %y 64*9880d681SAndroid Build Coastguard Worker %div = fdiv float %neg1, %neg2 65*9880d681SAndroid Build Coastguard Worker ret float %div 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerattributes #0 = { "unsafe-fp-math"="false" } 69*9880d681SAndroid Build Coastguard Worker 70