[LV] Remove hard-coded VPValue numbers in test check lines. (NFC)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-neon-scalar-by-elem-mul.ll
blob091cda89bfe4037e099c8c158a2b2b64bdef91d6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc < %s -verify-machineinstrs -mtriple=arm64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s
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
15 define float @test_fmul_lane_ss2S_1(float %a, <2 x float> %v) {
16 ; CHECK-LABEL: test_fmul_lane_ss2S_1:
17 ; CHECK:       // %bb.0:
18 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
19 ; CHECK-NEXT:    fmul s0, s0, v1.s[1]
20 ; CHECK-NEXT:    ret
21   %tmp1 = extractelement <2 x float> %v, i32 1
22   %tmp2 = fmul float %a, %tmp1;
23   ret float %tmp2;
26 define float @test_fmul_lane_ss2S_1_swap(float %a, <2 x float> %v) {
27 ; CHECK-LABEL: test_fmul_lane_ss2S_1_swap:
28 ; CHECK:       // %bb.0:
29 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
30 ; CHECK-NEXT:    fmul s0, s0, v1.s[1]
31 ; CHECK-NEXT:    ret
32   %tmp1 = extractelement <2 x float> %v, i32 1
33   %tmp2 = fmul float %tmp1, %a;
34   ret float %tmp2;
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
47 define float @test_fmul_lane_ss4S_3(float %a, <4 x float> %v) {
48 ; CHECK-LABEL: test_fmul_lane_ss4S_3:
49 ; CHECK:       // %bb.0:
50 ; CHECK-NEXT:    fmul s0, s0, v1.s[3]
51 ; CHECK-NEXT:    ret
52   %tmp1 = extractelement <4 x float> %v, i32 3
53   %tmp2 = fmul float %a, %tmp1;
54   ret float %tmp2;
57 define float @test_fmul_lane_ss4S_3_swap(float %a, <4 x float> %v) {
58 ; CHECK-LABEL: test_fmul_lane_ss4S_3_swap:
59 ; CHECK:       // %bb.0:
60 ; CHECK-NEXT:    fmul s0, s0, v1.s[3]
61 ; CHECK-NEXT:    ret
62   %tmp1 = extractelement <4 x float> %v, i32 3
63   %tmp2 = fmul float %tmp1, %a;
64   ret float %tmp2;
68 define double @test_fmul_lane_ddD(double %a, <1 x double> %v) {
69 ; CHECK-LABEL: test_fmul_lane_ddD:
70 ; CHECK:       // %bb.0:
71 ; CHECK-NEXT:    fmul d0, d0, d1
72 ; CHECK-NEXT:    ret
73   %tmp1 = extractelement <1 x double> %v, i32 0
74   %tmp2 = fmul double %a, %tmp1;
75   ret double %tmp2;
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
89 define double @test_fmul_lane_dd2D_1(double %a, <2 x double> %v) {
90 ; CHECK-LABEL: test_fmul_lane_dd2D_1:
91 ; CHECK:       // %bb.0:
92 ; CHECK-NEXT:    fmul d0, d0, v1.d[1]
93 ; CHECK-NEXT:    ret
94   %tmp1 = extractelement <2 x double> %v, i32 1
95   %tmp2 = fmul double %a, %tmp1;
96   ret double %tmp2;
100 define double @test_fmul_lane_dd2D_1_swap(double %a, <2 x double> %v) {
101 ; CHECK-LABEL: test_fmul_lane_dd2D_1_swap:
102 ; CHECK:       // %bb.0:
103 ; CHECK-NEXT:    fmul d0, d0, v1.d[1]
104 ; CHECK-NEXT:    ret
105   %tmp1 = extractelement <2 x double> %v, i32 1
106   %tmp2 = fmul double %tmp1, %a;
107   ret double %tmp2;
110 declare float @llvm.aarch64.neon.fmulx.f32(float, float)
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;
123 define float @test_fmulx_lane_f32_1(float %a, <2 x float> %v) {
124 ; CHECK-LABEL: test_fmulx_lane_f32_1:
125 ; CHECK:       // %bb.0:
126 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
127 ; CHECK-NEXT:    fmulx s0, s0, v1.s[1]
128 ; CHECK-NEXT:    ret
129   %tmp1 = extractelement <2 x float> %v, i32 1
130   %tmp2 = call float @llvm.aarch64.neon.fmulx.f32(float %a, float %tmp1)
131   ret float %tmp2;
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;
144 define float @test_fmulx_laneq_f32_3(float %a, <4 x float> %v) {
145 ; CHECK-LABEL: test_fmulx_laneq_f32_3:
146 ; CHECK:       // %bb.0:
147 ; CHECK-NEXT:    fmulx s0, s0, v1.s[3]
148 ; CHECK-NEXT:    ret
149   %tmp1 = extractelement <4 x float> %v, i32 3
150   %tmp2 = call float @llvm.aarch64.neon.fmulx.f32(float %a, float %tmp1)
151   ret float %tmp2;
154 define float @test_fmulx_laneq_f32_3_swap(float %a, <4 x float> %v) {
155 ; CHECK-LABEL: test_fmulx_laneq_f32_3_swap:
156 ; CHECK:       // %bb.0:
157 ; CHECK-NEXT:    fmulx s0, s0, v1.s[3]
158 ; CHECK-NEXT:    ret
159   %tmp1 = extractelement <4 x float> %v, i32 3
160   %tmp2 = call float @llvm.aarch64.neon.fmulx.f32(float %tmp1, float %a)
161   ret float %tmp2;
164 declare double @llvm.aarch64.neon.fmulx.f64(double, double)
166 define double @test_fmulx_lane_f64(double %a, <1 x double> %v) {
167 ; CHECK-LABEL: test_fmulx_lane_f64:
168 ; CHECK:       // %bb.0:
169 ; CHECK-NEXT:    fmulx d0, d0, d1
170 ; CHECK-NEXT:    ret
171   %tmp1 = extractelement <1 x double> %v, i32 0
172   %tmp2 = call double @llvm.aarch64.neon.fmulx.f64(double %a, double %tmp1)
173   ret double %tmp2;
176 define double @test_fmulx_laneq_f64_0(double %a, <2 x double> %v) {
177 ; CHECK-LABEL: test_fmulx_laneq_f64_0:
178 ; CHECK:       // %bb.0:
179 ; CHECK-NEXT:    fmulx d0, d0, d1
180 ; CHECK-NEXT:    ret
181   %tmp1 = extractelement <2 x double> %v, i32 0
182   %tmp2 = call double @llvm.aarch64.neon.fmulx.f64(double %a, double %tmp1)
183   ret double %tmp2;
187 define double @test_fmulx_laneq_f64_1(double %a, <2 x double> %v) {
188 ; CHECK-LABEL: test_fmulx_laneq_f64_1:
189 ; CHECK:       // %bb.0:
190 ; CHECK-NEXT:    fmulx d0, d0, v1.d[1]
191 ; CHECK-NEXT:    ret
192   %tmp1 = extractelement <2 x double> %v, i32 1
193   %tmp2 = call double @llvm.aarch64.neon.fmulx.f64(double %a, double %tmp1)
194   ret double %tmp2;
197 define double @test_fmulx_laneq_f64_1_swap(double %a, <2 x double> %v) {
198 ; CHECK-LABEL: test_fmulx_laneq_f64_1_swap:
199 ; CHECK:       // %bb.0:
200 ; CHECK-NEXT:    fmulx d0, d0, v1.d[1]
201 ; CHECK-NEXT:    ret
202   %tmp1 = extractelement <2 x double> %v, i32 1
203   %tmp2 = call double @llvm.aarch64.neon.fmulx.f64(double %tmp1, double %a)
204   ret double %tmp2;
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
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