1
1
; 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
3
9
4
10
; Following test cases check:
5
11
; a / D; b / D; c / D;
6
12
; =>
7
13
; recip = 1.0 / D; a * recip; b * recip; c * recip;
8
14
define 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
17
31
%div = fdiv float %a , %D
18
32
%div1 = fdiv float %b , %D
19
33
%div2 = fdiv float %c , %D
@@ -22,14 +36,22 @@ define void @three_fdiv_float(float %D, float %a, float %b, float %c) #0 {
22
36
}
23
37
24
38
define 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
33
55
%div = fdiv double %a , %D
34
56
%div1 = fdiv double %b , %D
35
57
%div2 = fdiv double %c , %D
@@ -38,14 +60,22 @@ define void @three_fdiv_double(double %D, double %a, double %b, double %c) #0 {
38
60
}
39
61
40
62
define 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
49
79
%div = fdiv <4 x float > %a , %D
50
80
%div1 = fdiv <4 x float > %b , %D
51
81
%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,
54
84
}
55
85
56
86
define 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
65
103
%div = fdiv <2 x double > %a , %D
66
104
%div1 = fdiv <2 x double > %b , %D
67
105
%div2 = fdiv <2 x double > %c , %D
@@ -98,16 +136,25 @@ define void @two_fdiv_double(double %D, double %a, double %b) #0 {
98
136
}
99
137
100
138
define 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
111
158
%D.ins = insertelement <4 x float > poison, float %D , i64 0
112
159
%splat = shufflevector <4 x float > %D.ins , <4 x float > poison, <4 x i32 > zeroinitializer
113
160
%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,
118
165
}
119
166
120
167
define <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
129
183
entry:
130
184
%D.ins = insertelement <4 x float > poison, float %D , i64 0
131
185
%splat = shufflevector <4 x float > %D.ins , <4 x float > poison, <4 x i32 > zeroinitializer
0 commit comments