1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2
2
; RUN: llc < %s -verify-machineinstrs -mtriple=arm64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s
3
3
4
- define float @test_fmul_lane_ss2S (float %a , <2 x float > %v ) {
5
- ; CHECK-LABEL: test_fmul_lane_ss2S:
4
+ define float @test_fmul_lane_ss2S_0 (float %a , <2 x float > %v ) {
5
+ ; CHECK-LABEL: test_fmul_lane_ss2S_0:
6
+ ; CHECK: // %bb.0:
7
+ ; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
8
+ ; CHECK-NEXT: fmul s0, s0, s1
9
+ ; CHECK-NEXT: ret
10
+ %tmp1 = extractelement <2 x float > %v , i32 0
11
+ %tmp2 = fmul float %a , %tmp1
12
+ ret float %tmp2
13
+ }
14
+
15
+ define float @test_fmul_lane_ss2S_1 (float %a , <2 x float > %v ) {
16
+ ; CHECK-LABEL: test_fmul_lane_ss2S_1:
6
17
; CHECK: // %bb.0:
7
18
; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
8
19
; CHECK-NEXT: fmul s0, s0, v1.s[1]
@@ -12,8 +23,8 @@ define float @test_fmul_lane_ss2S(float %a, <2 x float> %v) {
12
23
ret float %tmp2 ;
13
24
}
14
25
15
- define float @test_fmul_lane_ss2S_swap (float %a , <2 x float > %v ) {
16
- ; CHECK-LABEL: test_fmul_lane_ss2S_swap :
26
+ define float @test_fmul_lane_ss2S_1_swap (float %a , <2 x float > %v ) {
27
+ ; CHECK-LABEL: test_fmul_lane_ss2S_1_swap :
17
28
; CHECK: // %bb.0:
18
29
; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
19
30
; CHECK-NEXT: fmul s0, s0, v1.s[1]
@@ -23,9 +34,18 @@ define float @test_fmul_lane_ss2S_swap(float %a, <2 x float> %v) {
23
34
ret float %tmp2 ;
24
35
}
25
36
37
+ define float @test_fmul_lane_ss4S_0 (float %a , <4 x float > %v ) {
38
+ ; CHECK-LABEL: test_fmul_lane_ss4S_0:
39
+ ; CHECK: // %bb.0:
40
+ ; CHECK-NEXT: fmul s0, s0, s1
41
+ ; CHECK-NEXT: ret
42
+ %tmp1 = extractelement <4 x float > %v , i32 0
43
+ %tmp2 = fmul float %a , %tmp1
44
+ ret float %tmp2
45
+ }
26
46
27
- define float @test_fmul_lane_ss4S (float %a , <4 x float > %v ) {
28
- ; CHECK-LABEL: test_fmul_lane_ss4S :
47
+ define float @test_fmul_lane_ss4S_3 (float %a , <4 x float > %v ) {
48
+ ; CHECK-LABEL: test_fmul_lane_ss4S_3 :
29
49
; CHECK: // %bb.0:
30
50
; CHECK-NEXT: fmul s0, s0, v1.s[3]
31
51
; CHECK-NEXT: ret
@@ -34,8 +54,8 @@ define float @test_fmul_lane_ss4S(float %a, <4 x float> %v) {
34
54
ret float %tmp2 ;
35
55
}
36
56
37
- define float @test_fmul_lane_ss4S_swap (float %a , <4 x float > %v ) {
38
- ; CHECK-LABEL: test_fmul_lane_ss4S_swap :
57
+ define float @test_fmul_lane_ss4S_3_swap (float %a , <4 x float > %v ) {
58
+ ; CHECK-LABEL: test_fmul_lane_ss4S_3_swap :
39
59
; CHECK: // %bb.0:
40
60
; CHECK-NEXT: fmul s0, s0, v1.s[3]
41
61
; CHECK-NEXT: ret
@@ -56,9 +76,18 @@ define double @test_fmul_lane_ddD(double %a, <1 x double> %v) {
56
76
}
57
77
58
78
79
+ define double @test_fmul_lane_dd2D_0 (double %a , <2 x double > %v ) {
80
+ ; CHECK-LABEL: test_fmul_lane_dd2D_0:
81
+ ; CHECK: // %bb.0:
82
+ ; CHECK-NEXT: fmul d0, d0, d1
83
+ ; CHECK-NEXT: ret
84
+ %tmp1 = extractelement <2 x double > %v , i32 0
85
+ %tmp2 = fmul double %a , %tmp1
86
+ ret double %tmp2
87
+ }
59
88
60
- define double @test_fmul_lane_dd2D (double %a , <2 x double > %v ) {
61
- ; CHECK-LABEL: test_fmul_lane_dd2D :
89
+ define double @test_fmul_lane_dd2D_1 (double %a , <2 x double > %v ) {
90
+ ; CHECK-LABEL: test_fmul_lane_dd2D_1 :
62
91
; CHECK: // %bb.0:
63
92
; CHECK-NEXT: fmul d0, d0, v1.d[1]
64
93
; CHECK-NEXT: ret
@@ -68,8 +97,8 @@ define double @test_fmul_lane_dd2D(double %a, <2 x double> %v) {
68
97
}
69
98
70
99
71
- define double @test_fmul_lane_dd2D_swap (double %a , <2 x double > %v ) {
72
- ; CHECK-LABEL: test_fmul_lane_dd2D_swap :
100
+ define double @test_fmul_lane_dd2D_1_swap (double %a , <2 x double > %v ) {
101
+ ; CHECK-LABEL: test_fmul_lane_dd2D_1_swap :
73
102
; CHECK: // %bb.0:
74
103
; CHECK-NEXT: fmul d0, d0, v1.d[1]
75
104
; CHECK-NEXT: ret
@@ -80,8 +109,19 @@ define double @test_fmul_lane_dd2D_swap(double %a, <2 x double> %v) {
80
109
81
110
declare float @llvm.aarch64.neon.fmulx.f32 (float , float )
82
111
83
- define float @test_fmulx_lane_f32 (float %a , <2 x float > %v ) {
84
- ; CHECK-LABEL: test_fmulx_lane_f32:
112
+ define float @test_fmulx_lane_f32_0 (float %a , <2 x float > %v ) {
113
+ ; CHECK-LABEL: test_fmulx_lane_f32_0:
114
+ ; CHECK: // %bb.0:
115
+ ; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
116
+ ; CHECK-NEXT: fmulx s0, s0, s1
117
+ ; CHECK-NEXT: ret
118
+ %tmp1 = extractelement <2 x float > %v , i32 0
119
+ %tmp2 = call float @llvm.aarch64.neon.fmulx.f32 (float %a , float %tmp1 )
120
+ ret float %tmp2 ;
121
+ }
122
+
123
+ define float @test_fmulx_lane_f32_1 (float %a , <2 x float > %v ) {
124
+ ; CHECK-LABEL: test_fmulx_lane_f32_1:
85
125
; CHECK: // %bb.0:
86
126
; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
87
127
; CHECK-NEXT: fmulx s0, s0, v1.s[1]
@@ -91,8 +131,18 @@ define float @test_fmulx_lane_f32(float %a, <2 x float> %v) {
91
131
ret float %tmp2 ;
92
132
}
93
133
94
- define float @test_fmulx_laneq_f32 (float %a , <4 x float > %v ) {
95
- ; CHECK-LABEL: test_fmulx_laneq_f32:
134
+ define float @test_fmulx_laneq_f32_0 (float %a , <4 x float > %v ) {
135
+ ; CHECK-LABEL: test_fmulx_laneq_f32_0:
136
+ ; CHECK: // %bb.0:
137
+ ; CHECK-NEXT: fmulx s0, s0, s1
138
+ ; CHECK-NEXT: ret
139
+ %tmp1 = extractelement <4 x float > %v , i32 0
140
+ %tmp2 = call float @llvm.aarch64.neon.fmulx.f32 (float %a , float %tmp1 )
141
+ ret float %tmp2 ;
142
+ }
143
+
144
+ define float @test_fmulx_laneq_f32_3 (float %a , <4 x float > %v ) {
145
+ ; CHECK-LABEL: test_fmulx_laneq_f32_3:
96
146
; CHECK: // %bb.0:
97
147
; CHECK-NEXT: fmulx s0, s0, v1.s[3]
98
148
; CHECK-NEXT: ret
@@ -101,8 +151,8 @@ define float @test_fmulx_laneq_f32(float %a, <4 x float> %v) {
101
151
ret float %tmp2 ;
102
152
}
103
153
104
- define float @test_fmulx_laneq_f32_swap (float %a , <4 x float > %v ) {
105
- ; CHECK-LABEL: test_fmulx_laneq_f32_swap :
154
+ define float @test_fmulx_laneq_f32_3_swap (float %a , <4 x float > %v ) {
155
+ ; CHECK-LABEL: test_fmulx_laneq_f32_3_swap :
106
156
; CHECK: // %bb.0:
107
157
; CHECK-NEXT: fmulx s0, s0, v1.s[3]
108
158
; CHECK-NEXT: ret
@@ -126,7 +176,7 @@ define double @test_fmulx_lane_f64(double %a, <1 x double> %v) {
126
176
define double @test_fmulx_laneq_f64_0 (double %a , <2 x double > %v ) {
127
177
; CHECK-LABEL: test_fmulx_laneq_f64_0:
128
178
; CHECK: // %bb.0:
129
- ; CHECK-NEXT: fmulx d0, d0, v1.d[0]
179
+ ; CHECK-NEXT: fmulx d0, d0, d1
130
180
; CHECK-NEXT: ret
131
181
%tmp1 = extractelement <2 x double > %v , i32 0
132
182
%tmp2 = call double @llvm.aarch64.neon.fmulx.f64 (double %a , double %tmp1 )
@@ -154,3 +204,27 @@ define double @test_fmulx_laneq_f64_1_swap(double %a, <2 x double> %v) {
154
204
ret double %tmp2 ;
155
205
}
156
206
207
+ define float @test_fmulx_horizontal_f32 (<2 x float > %v ) {
208
+ ; CHECK-LABEL: test_fmulx_horizontal_f32:
209
+ ; CHECK: // %bb.0: // %entry
210
+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
211
+ ; CHECK-NEXT: fmulx s0, s0, v0.s[1]
212
+ ; CHECK-NEXT: ret
213
+ entry:
214
+ %0 = extractelement <2 x float > %v , i32 0
215
+ %1 = extractelement <2 x float > %v , i32 1
216
+ %2 = call float @llvm.aarch64.neon.fmulx.f32 (float %0 , float %1 )
217
+ ret float %2
218
+ }
219
+
220
+ define double @test_fmulx_horizontal_f64 (<2 x double > %v ) {
221
+ ; CHECK-LABEL: test_fmulx_horizontal_f64:
222
+ ; CHECK: // %bb.0: // %entry
223
+ ; CHECK-NEXT: fmulx d0, d0, v0.d[1]
224
+ ; CHECK-NEXT: ret
225
+ entry:
226
+ %0 = extractelement <2 x double > %v , i32 0
227
+ %1 = extractelement <2 x double > %v , i32 1
228
+ %2 = call double @llvm.aarch64.neon.fmulx.f64 (double %0 , double %1 )
229
+ ret double %2
230
+ }
0 commit comments