xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/recip-fastmath.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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