1; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon | FileCheck %s
2
3define float @frecp0(float %x) #0 {
4  %div = fdiv fast float 1.0, %x
5  ret float %div
6
7; CHECK-LABEL: frecp0:
8; CHECK-NEXT: BB#0
9; CHECK-NEXT: fmov
10; CHECK-NEXT: fdiv
11}
12
13define float @frecp1(float %x) #1 {
14  %div = fdiv fast float 1.0, %x
15  ret float %div
16
17; CHECK-LABEL: frecp1:
18; CHECK-NEXT: BB#0
19; CHECK-NEXT: frecpe [[R:s[0-7]]]
20; CHECK-NEXT: frecps {{s[0-7](, s[0-7])?}}, [[R]]
21}
22
23define <2 x float> @f2recp0(<2 x float> %x) #0 {
24  %div = fdiv fast <2 x float> <float 1.0, float 1.0>, %x
25  ret <2 x float> %div
26
27; CHECK-LABEL: f2recp0:
28; CHECK-NEXT: BB#0
29; CHECK-NEXT: fmov
30; CHECK-NEXT: fdiv
31}
32
33define <2 x float> @f2recp1(<2 x float> %x) #1 {
34  %div = fdiv fast <2 x float> <float 1.0, float 1.0>, %x
35  ret <2 x float> %div
36
37; CHECK-LABEL: f2recp1:
38; CHECK-NEXT: BB#0
39; CHECK-NEXT: frecpe [[R:v[0-7]\.2s]]
40; CHECK-NEXT: frecps {{v[0-7]\.2s(, v[0-7].2s)?}}, [[R]]
41}
42
43define <4 x float> @f4recp0(<4 x float> %x) #0 {
44  %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x
45  ret <4 x float> %div
46
47; CHECK-LABEL: f4recp0:
48; CHECK-NEXT: BB#0
49; CHECK-NEXT: fmov
50; CHECK-NEXT: fdiv
51}
52
53define <4 x float> @f4recp1(<4 x float> %x) #1 {
54  %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x
55  ret <4 x float> %div
56
57; CHECK-LABEL: f4recp1:
58; CHECK-NEXT: BB#0
59; CHECK-NEXT: frecpe [[R:v[0-7]\.4s]]
60; CHECK-NEXT: frecps {{v[0-7]\.4s(, v[0-7].4s)?}}, [[R]]
61}
62
63define <8 x float> @f8recp0(<8 x float> %x) #0 {
64  %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
65  ret <8 x float> %div
66
67; CHECK-LABEL: f8recp0:
68; CHECK-NEXT: BB#0
69; CHECK-NEXT: fmov
70; CHECK-NEXT: fdiv
71; CHECK-NEXT: fdiv
72}
73
74define <8 x float> @f8recp1(<8 x float> %x) #1 {
75  %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
76  ret <8 x float> %div
77
78; CHECK-LABEL: f8recp1:
79; CHECK-NEXT: BB#0
80; CHECK-NEXT: frecpe [[RA:v[0-7]\.4s]]
81; CHECK-NEXT: frecpe [[RB:v[0-7]\.4s]]
82; CHECK-NEXT: frecps {{v[0-7]\.4s(, v[0-7].4s)?}}, [[RA]]
83; CHECK: frecps {{v[0-7]\.4s(, v[0-7].4s)?}}, [[RB]]
84}
85
86define double @drecp0(double %x) #0 {
87  %div = fdiv fast double 1.0, %x
88  ret double %div
89
90; CHECK-LABEL: drecp0:
91; CHECK-NEXT: BB#0
92; CHECK-NEXT: fmov
93; CHECK-NEXT: fdiv
94}
95
96define double @drecp1(double %x) #1 {
97  %div = fdiv fast double 1.0, %x
98  ret double %div
99
100; CHECK-LABEL: drecp1:
101; CHECK-NEXT: BB#0
102; CHECK-NEXT: frecpe [[R:d[0-7]]]
103; CHECK-NEXT: frecps {{d[0-7](, d[0-7])?}}, [[R]]
104}
105
106define <2 x double> @d2recp0(<2 x double> %x) #0 {
107  %div = fdiv fast <2 x double> <double 1.0, double 1.0>, %x
108  ret <2 x double> %div
109
110; CHECK-LABEL: d2recp0:
111; CHECK-NEXT: BB#0
112; CHECK-NEXT: fmov
113; CHECK-NEXT: fdiv
114}
115
116define <2 x double> @d2recp1(<2 x double> %x) #1 {
117  %div = fdiv fast <2 x double> <double 1.0, double 1.0>, %x
118  ret <2 x double> %div
119
120; CHECK-LABEL: d2recp1:
121; CHECK-NEXT: BB#0
122; CHECK-NEXT: frecpe [[R:v[0-7]\.2d]]
123; CHECK-NEXT: frecps {{v[0-7]\.2d(, v[0-7].2d)?}}, [[R]]
124}
125
126define <4 x double> @d4recp0(<4 x double> %x) #0 {
127  %div = fdiv fast <4 x double> <double 1.0, double 1.0, double 1.0, double 1.0>, %x
128  ret <4 x double> %div
129
130; CHECK-LABEL: d4recp0:
131; CHECK-NEXT: BB#0
132; CHECK-NEXT: fmov
133; CHECK-NEXT: fdiv
134; CHECK-NEXT: fdiv
135}
136
137define <4 x double> @d4recp1(<4 x double> %x) #1 {
138  %div = fdiv fast <4 x double> <double 1.0, double 1.0, double 1.0, double 1.0>, %x
139  ret <4 x double> %div
140
141; CHECK-LABEL: d4recp1:
142; CHECK-NEXT: BB#0
143; CHECK-NEXT: frecpe [[RA:v[0-7]\.2d]]
144; CHECK-NEXT: frecpe [[RB:v[0-7]\.2d]]
145; CHECK-NEXT: frecps {{v[0-7]\.2d(, v[0-7].2d)?}}, [[RA]]
146; CHECK: frecps {{v[0-7]\.2d(, v[0-7].2d)?}}, [[RB]]
147}
148
149attributes #0 = { nounwind "unsafe-fp-math"="true" }
150attributes #1 = { nounwind "unsafe-fp-math"="true" "reciprocal-estimates"="div,vec-div" }
151