1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2 -recip=!divf,!vec-divf | FileCheck %s --check-prefix=NORECIP 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx -recip=divf,vec-divf | FileCheck %s --check-prefix=RECIP 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx -recip=divf:2,vec-divf:2 | FileCheck %s --check-prefix=REFINE 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; If the target's divss/divps instructions are substantially 6*9880d681SAndroid Build Coastguard Worker; slower than rcpss/rcpps with a Newton-Raphson refinement, 7*9880d681SAndroid Build Coastguard Worker; we should generate the estimate sequence. 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; See PR21385 ( http://llvm.org/bugs/show_bug.cgi?id=21385 ) 10*9880d681SAndroid Build Coastguard Worker; for details about the accuracy, speed, and implementation 11*9880d681SAndroid Build Coastguard Worker; differences of x86 reciprocal estimates. 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine float @reciprocal_estimate(float %x) #0 { 14*9880d681SAndroid Build Coastguard Worker %div = fdiv fast float 1.0, %x 15*9880d681SAndroid Build Coastguard Worker ret float %div 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; NORECIP-LABEL: reciprocal_estimate: 18*9880d681SAndroid Build Coastguard Worker; NORECIP: movss 19*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: divss 20*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: movaps 21*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: retq 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; RECIP-LABEL: reciprocal_estimate: 24*9880d681SAndroid Build Coastguard Worker; RECIP: vrcpss 25*9880d681SAndroid Build Coastguard Worker; RECIP: vmulss 26*9880d681SAndroid Build Coastguard Worker; RECIP: vsubss 27*9880d681SAndroid Build Coastguard Worker; RECIP: vmulss 28*9880d681SAndroid Build Coastguard Worker; RECIP: vaddss 29*9880d681SAndroid Build Coastguard Worker; RECIP-NEXT: retq 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; REFINE-LABEL: reciprocal_estimate: 32*9880d681SAndroid Build Coastguard Worker; REFINE: vrcpss 33*9880d681SAndroid Build Coastguard Worker; REFINE: vmulss 34*9880d681SAndroid Build Coastguard Worker; REFINE: vsubss 35*9880d681SAndroid Build Coastguard Worker; REFINE: vmulss 36*9880d681SAndroid Build Coastguard Worker; REFINE: vaddss 37*9880d681SAndroid Build Coastguard Worker; REFINE: vmulss 38*9880d681SAndroid Build Coastguard Worker; REFINE: vsubss 39*9880d681SAndroid Build Coastguard Worker; REFINE: vmulss 40*9880d681SAndroid Build Coastguard Worker; REFINE: vaddss 41*9880d681SAndroid Build Coastguard Worker; REFINE-NEXT: retq 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @reciprocal_estimate_v4f32(<4 x float> %x) #0 { 45*9880d681SAndroid Build Coastguard Worker %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x 46*9880d681SAndroid Build Coastguard Worker ret <4 x float> %div 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; NORECIP-LABEL: reciprocal_estimate_v4f32: 49*9880d681SAndroid Build Coastguard Worker; NORECIP: movaps 50*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: divps 51*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: movaps 52*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: retq 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; RECIP-LABEL: reciprocal_estimate_v4f32: 55*9880d681SAndroid Build Coastguard Worker; RECIP: vrcpps 56*9880d681SAndroid Build Coastguard Worker; RECIP: vmulps 57*9880d681SAndroid Build Coastguard Worker; RECIP: vsubps 58*9880d681SAndroid Build Coastguard Worker; RECIP: vmulps 59*9880d681SAndroid Build Coastguard Worker; RECIP: vaddps 60*9880d681SAndroid Build Coastguard Worker; RECIP-NEXT: retq 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; REFINE-LABEL: reciprocal_estimate_v4f32: 63*9880d681SAndroid Build Coastguard Worker; REFINE: vrcpps 64*9880d681SAndroid Build Coastguard Worker; REFINE: vmulps 65*9880d681SAndroid Build Coastguard Worker; REFINE: vsubps 66*9880d681SAndroid Build Coastguard Worker; REFINE: vmulps 67*9880d681SAndroid Build Coastguard Worker; REFINE: vaddps 68*9880d681SAndroid Build Coastguard Worker; REFINE: vmulps 69*9880d681SAndroid Build Coastguard Worker; REFINE: vsubps 70*9880d681SAndroid Build Coastguard Worker; REFINE: vmulps 71*9880d681SAndroid Build Coastguard Worker; REFINE: vaddps 72*9880d681SAndroid Build Coastguard Worker; REFINE-NEXT: retq 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @reciprocal_estimate_v8f32(<8 x float> %x) #0 { 76*9880d681SAndroid Build Coastguard Worker %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x 77*9880d681SAndroid Build Coastguard Worker ret <8 x float> %div 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker; NORECIP-LABEL: reciprocal_estimate_v8f32: 80*9880d681SAndroid Build Coastguard Worker; NORECIP: movaps 81*9880d681SAndroid Build Coastguard Worker; NORECIP: movaps 82*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: divps 83*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: divps 84*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: movaps 85*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: movaps 86*9880d681SAndroid Build Coastguard Worker; NORECIP-NEXT: retq 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; RECIP-LABEL: reciprocal_estimate_v8f32: 89*9880d681SAndroid Build Coastguard Worker; RECIP: vrcpps 90*9880d681SAndroid Build Coastguard Worker; RECIP: vmulps 91*9880d681SAndroid Build Coastguard Worker; RECIP: vsubps 92*9880d681SAndroid Build Coastguard Worker; RECIP: vmulps 93*9880d681SAndroid Build Coastguard Worker; RECIP: vaddps 94*9880d681SAndroid Build Coastguard Worker; RECIP-NEXT: retq 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; REFINE-LABEL: reciprocal_estimate_v8f32: 97*9880d681SAndroid Build Coastguard Worker; REFINE: vrcpps 98*9880d681SAndroid Build Coastguard Worker; REFINE: vmulps 99*9880d681SAndroid Build Coastguard Worker; REFINE: vsubps 100*9880d681SAndroid Build Coastguard Worker; REFINE: vmulps 101*9880d681SAndroid Build Coastguard Worker; REFINE: vaddps 102*9880d681SAndroid Build Coastguard Worker; REFINE: vmulps 103*9880d681SAndroid Build Coastguard Worker; REFINE: vsubps 104*9880d681SAndroid Build Coastguard Worker; REFINE: vmulps 105*9880d681SAndroid Build Coastguard Worker; REFINE: vaddps 106*9880d681SAndroid Build Coastguard Worker; REFINE-NEXT: retq 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerattributes #0 = { "unsafe-fp-math"="true" } 110