11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2- ; RUN: llc -mtriple=aarch64-unknown-unknown < %s | FileCheck %s
2+ ; RUN: llc -mtriple=aarch64-unknown-unknown < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+ ; RUN: llc -mtriple=aarch64-unknown-unknown < %s -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4+
5+ ; CHECK-GI: warning: Instruction selection used fallback path for splat_fdiv_nxv4f32
6+ ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for splat_three_fdiv_nxv4f32
7+ ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for splat_fdiv_nxv2f64
8+ ; CHECK-GI-NEXT: warning: Instruction selection used fallback path for splat_two_fdiv_nxv2f64
39
410; Following test cases check:
511; a / D; b / D; c / D;
612; =>
713; recip = 1.0 / D; a * recip; b * recip; c * recip;
814define void @three_fdiv_float (float %D , float %a , float %b , float %c ) #0 {
9- ; CHECK-LABEL: three_fdiv_float:
10- ; CHECK: // %bb.0:
11- ; CHECK-NEXT: fmov s4, #1.00000000
12- ; CHECK-NEXT: fdiv s4, s4, s0
13- ; CHECK-NEXT: fmul s0, s1, s4
14- ; CHECK-NEXT: fmul s1, s2, s4
15- ; CHECK-NEXT: fmul s2, s3, s4
16- ; CHECK-NEXT: b foo_3f
15+ ; CHECK-SD-LABEL: three_fdiv_float:
16+ ; CHECK-SD: // %bb.0:
17+ ; CHECK-SD-NEXT: fmov s4, #1.00000000
18+ ; CHECK-SD-NEXT: fdiv s4, s4, s0
19+ ; CHECK-SD-NEXT: fmul s0, s1, s4
20+ ; CHECK-SD-NEXT: fmul s1, s2, s4
21+ ; CHECK-SD-NEXT: fmul s2, s3, s4
22+ ; CHECK-SD-NEXT: b foo_3f
23+ ;
24+ ; CHECK-GI-LABEL: three_fdiv_float:
25+ ; CHECK-GI: // %bb.0:
26+ ; CHECK-GI-NEXT: fdiv s4, s1, s0
27+ ; CHECK-GI-NEXT: fdiv s1, s2, s0
28+ ; CHECK-GI-NEXT: fdiv s2, s3, s0
29+ ; CHECK-GI-NEXT: fmov s0, s4
30+ ; CHECK-GI-NEXT: b foo_3f
1731 %div = fdiv float %a , %D
1832 %div1 = fdiv float %b , %D
1933 %div2 = fdiv float %c , %D
@@ -22,14 +36,22 @@ define void @three_fdiv_float(float %D, float %a, float %b, float %c) #0 {
2236}
2337
2438define void @three_fdiv_double (double %D , double %a , double %b , double %c ) #0 {
25- ; CHECK-LABEL: three_fdiv_double:
26- ; CHECK: // %bb.0:
27- ; CHECK-NEXT: fmov d4, #1.00000000
28- ; CHECK-NEXT: fdiv d4, d4, d0
29- ; CHECK-NEXT: fmul d0, d1, d4
30- ; CHECK-NEXT: fmul d1, d2, d4
31- ; CHECK-NEXT: fmul d2, d3, d4
32- ; CHECK-NEXT: b foo_3d
39+ ; CHECK-SD-LABEL: three_fdiv_double:
40+ ; CHECK-SD: // %bb.0:
41+ ; CHECK-SD-NEXT: fmov d4, #1.00000000
42+ ; CHECK-SD-NEXT: fdiv d4, d4, d0
43+ ; CHECK-SD-NEXT: fmul d0, d1, d4
44+ ; CHECK-SD-NEXT: fmul d1, d2, d4
45+ ; CHECK-SD-NEXT: fmul d2, d3, d4
46+ ; CHECK-SD-NEXT: b foo_3d
47+ ;
48+ ; CHECK-GI-LABEL: three_fdiv_double:
49+ ; CHECK-GI: // %bb.0:
50+ ; CHECK-GI-NEXT: fdiv d4, d1, d0
51+ ; CHECK-GI-NEXT: fdiv d1, d2, d0
52+ ; CHECK-GI-NEXT: fdiv d2, d3, d0
53+ ; CHECK-GI-NEXT: fmov d0, d4
54+ ; CHECK-GI-NEXT: b foo_3d
3355 %div = fdiv double %a , %D
3456 %div1 = fdiv double %b , %D
3557 %div2 = fdiv double %c , %D
@@ -38,14 +60,22 @@ define void @three_fdiv_double(double %D, double %a, double %b, double %c) #0 {
3860}
3961
4062define void @three_fdiv_4xfloat (<4 x float > %D , <4 x float > %a , <4 x float > %b , <4 x float > %c ) #0 {
41- ; CHECK-LABEL: three_fdiv_4xfloat:
42- ; CHECK: // %bb.0:
43- ; CHECK-NEXT: fmov v4.4s, #1.00000000
44- ; CHECK-NEXT: fdiv v4.4s, v4.4s, v0.4s
45- ; CHECK-NEXT: fmul v0.4s, v1.4s, v4.4s
46- ; CHECK-NEXT: fmul v1.4s, v2.4s, v4.4s
47- ; CHECK-NEXT: fmul v2.4s, v3.4s, v4.4s
48- ; CHECK-NEXT: b foo_3_4xf
63+ ; CHECK-SD-LABEL: three_fdiv_4xfloat:
64+ ; CHECK-SD: // %bb.0:
65+ ; CHECK-SD-NEXT: fmov v4.4s, #1.00000000
66+ ; CHECK-SD-NEXT: fdiv v4.4s, v4.4s, v0.4s
67+ ; CHECK-SD-NEXT: fmul v0.4s, v1.4s, v4.4s
68+ ; CHECK-SD-NEXT: fmul v1.4s, v2.4s, v4.4s
69+ ; CHECK-SD-NEXT: fmul v2.4s, v3.4s, v4.4s
70+ ; CHECK-SD-NEXT: b foo_3_4xf
71+ ;
72+ ; CHECK-GI-LABEL: three_fdiv_4xfloat:
73+ ; CHECK-GI: // %bb.0:
74+ ; CHECK-GI-NEXT: fdiv v4.4s, v1.4s, v0.4s
75+ ; CHECK-GI-NEXT: fdiv v1.4s, v2.4s, v0.4s
76+ ; CHECK-GI-NEXT: fdiv v2.4s, v3.4s, v0.4s
77+ ; CHECK-GI-NEXT: mov v0.16b, v4.16b
78+ ; CHECK-GI-NEXT: b foo_3_4xf
4979 %div = fdiv <4 x float > %a , %D
5080 %div1 = fdiv <4 x float > %b , %D
5181 %div2 = fdiv <4 x float > %c , %D
@@ -54,14 +84,22 @@ define void @three_fdiv_4xfloat(<4 x float> %D, <4 x float> %a, <4 x float> %b,
5484}
5585
5686define void @three_fdiv_2xdouble (<2 x double > %D , <2 x double > %a , <2 x double > %b , <2 x double > %c ) #0 {
57- ; CHECK-LABEL: three_fdiv_2xdouble:
58- ; CHECK: // %bb.0:
59- ; CHECK-NEXT: fmov v4.2d, #1.00000000
60- ; CHECK-NEXT: fdiv v4.2d, v4.2d, v0.2d
61- ; CHECK-NEXT: fmul v0.2d, v1.2d, v4.2d
62- ; CHECK-NEXT: fmul v1.2d, v2.2d, v4.2d
63- ; CHECK-NEXT: fmul v2.2d, v3.2d, v4.2d
64- ; CHECK-NEXT: b foo_3_2xd
87+ ; CHECK-SD-LABEL: three_fdiv_2xdouble:
88+ ; CHECK-SD: // %bb.0:
89+ ; CHECK-SD-NEXT: fmov v4.2d, #1.00000000
90+ ; CHECK-SD-NEXT: fdiv v4.2d, v4.2d, v0.2d
91+ ; CHECK-SD-NEXT: fmul v0.2d, v1.2d, v4.2d
92+ ; CHECK-SD-NEXT: fmul v1.2d, v2.2d, v4.2d
93+ ; CHECK-SD-NEXT: fmul v2.2d, v3.2d, v4.2d
94+ ; CHECK-SD-NEXT: b foo_3_2xd
95+ ;
96+ ; CHECK-GI-LABEL: three_fdiv_2xdouble:
97+ ; CHECK-GI: // %bb.0:
98+ ; CHECK-GI-NEXT: fdiv v4.2d, v1.2d, v0.2d
99+ ; CHECK-GI-NEXT: fdiv v1.2d, v2.2d, v0.2d
100+ ; CHECK-GI-NEXT: fdiv v2.2d, v3.2d, v0.2d
101+ ; CHECK-GI-NEXT: mov v0.16b, v4.16b
102+ ; CHECK-GI-NEXT: b foo_3_2xd
65103 %div = fdiv <2 x double > %a , %D
66104 %div1 = fdiv <2 x double > %b , %D
67105 %div2 = fdiv <2 x double > %c , %D
@@ -98,16 +136,25 @@ define void @two_fdiv_double(double %D, double %a, double %b) #0 {
98136}
99137
100138define void @splat_three_fdiv_4xfloat (float %D , <4 x float > %a , <4 x float > %b , <4 x float > %c ) #0 {
101- ; CHECK-LABEL: splat_three_fdiv_4xfloat:
102- ; CHECK: // %bb.0:
103- ; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
104- ; CHECK-NEXT: fmov v4.4s, #1.00000000
105- ; CHECK-NEXT: dup v0.4s, v0.s[0]
106- ; CHECK-NEXT: fdiv v4.4s, v4.4s, v0.4s
107- ; CHECK-NEXT: fmul v0.4s, v1.4s, v4.4s
108- ; CHECK-NEXT: fmul v1.4s, v2.4s, v4.4s
109- ; CHECK-NEXT: fmul v2.4s, v3.4s, v4.4s
110- ; CHECK-NEXT: b foo_3_4xf
139+ ; CHECK-SD-LABEL: splat_three_fdiv_4xfloat:
140+ ; CHECK-SD: // %bb.0:
141+ ; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
142+ ; CHECK-SD-NEXT: fmov v4.4s, #1.00000000
143+ ; CHECK-SD-NEXT: dup v0.4s, v0.s[0]
144+ ; CHECK-SD-NEXT: fdiv v4.4s, v4.4s, v0.4s
145+ ; CHECK-SD-NEXT: fmul v0.4s, v1.4s, v4.4s
146+ ; CHECK-SD-NEXT: fmul v1.4s, v2.4s, v4.4s
147+ ; CHECK-SD-NEXT: fmul v2.4s, v3.4s, v4.4s
148+ ; CHECK-SD-NEXT: b foo_3_4xf
149+ ;
150+ ; CHECK-GI-LABEL: splat_three_fdiv_4xfloat:
151+ ; CHECK-GI: // %bb.0:
152+ ; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
153+ ; CHECK-GI-NEXT: dup v4.4s, v0.s[0]
154+ ; CHECK-GI-NEXT: fdiv v0.4s, v1.4s, v4.4s
155+ ; CHECK-GI-NEXT: fdiv v1.4s, v2.4s, v4.4s
156+ ; CHECK-GI-NEXT: fdiv v2.4s, v3.4s, v4.4s
157+ ; CHECK-GI-NEXT: b foo_3_4xf
111158 %D.ins = insertelement <4 x float > poison, float %D , i64 0
112159 %splat = shufflevector <4 x float > %D.ins , <4 x float > poison, <4 x i32 > zeroinitializer
113160 %div = fdiv <4 x float > %a , %splat
@@ -118,14 +165,21 @@ define void @splat_three_fdiv_4xfloat(float %D, <4 x float> %a, <4 x float> %b,
118165}
119166
120167define <4 x float > @splat_fdiv_v4f32 (float %D , <4 x float > %a ) #1 {
121- ; CHECK-LABEL: splat_fdiv_v4f32:
122- ; CHECK: // %bb.0: // %entry
123- ; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
124- ; CHECK-NEXT: fmov v2.4s, #1.00000000
125- ; CHECK-NEXT: dup v0.4s, v0.s[0]
126- ; CHECK-NEXT: fdiv v0.4s, v2.4s, v0.4s
127- ; CHECK-NEXT: fmul v0.4s, v1.4s, v0.4s
128- ; CHECK-NEXT: ret
168+ ; CHECK-SD-LABEL: splat_fdiv_v4f32:
169+ ; CHECK-SD: // %bb.0: // %entry
170+ ; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
171+ ; CHECK-SD-NEXT: fmov v2.4s, #1.00000000
172+ ; CHECK-SD-NEXT: dup v0.4s, v0.s[0]
173+ ; CHECK-SD-NEXT: fdiv v0.4s, v2.4s, v0.4s
174+ ; CHECK-SD-NEXT: fmul v0.4s, v1.4s, v0.4s
175+ ; CHECK-SD-NEXT: ret
176+ ;
177+ ; CHECK-GI-LABEL: splat_fdiv_v4f32:
178+ ; CHECK-GI: // %bb.0: // %entry
179+ ; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
180+ ; CHECK-GI-NEXT: dup v0.4s, v0.s[0]
181+ ; CHECK-GI-NEXT: fdiv v0.4s, v1.4s, v0.4s
182+ ; CHECK-GI-NEXT: ret
129183entry:
130184 %D.ins = insertelement <4 x float > poison, float %D , i64 0
131185 %splat = shufflevector <4 x float > %D.ins , <4 x float > poison, <4 x i32 > zeroinitializer
0 commit comments