blob: fe5b946fe6404cd10126c82a15a674d7aa0b88f3 [file] [log] [blame]
Craig Topper96400ae2020-02-06 16:23:54 -08001// REQUIRES: x86-registered-target
2// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O -emit-llvm -o - | FileCheck --check-prefix=COMMON --check-prefix=COMMONIR --check-prefix=UNCONSTRAINED %s
3// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -ffp-exception-behavior=strict -O -emit-llvm -o - | FileCheck --check-prefix=COMMON --check-prefix=COMMONIR --check-prefix=CONSTRAINED %s
4// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O -S -o - | FileCheck --check-prefix=COMMON --check-prefix=CHECK-ASM --check-prefix=CHECK-ASM-UNCONSTRAINED %s
5// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O -ffp-exception-behavior=strict -S -o - | FileCheck --check-prefix=COMMON --check-prefix=CHECK-ASM --check-prefix=CHECK-ASM-CONSTRAINED %s
6
7#include <immintrin.h>
8
9__m128 test_mm_fmadd_ps(__m128 a, __m128 b, __m128 c) {
10 // COMMON-LABEL: test_mm_fmadd_ps
11 // UNCONSTRAINED: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})
12 // CONSTRAINED: call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})
13 // CHECK-ASM: vfmadd213ps
14 return _mm_fmadd_ps(a, b, c);
15}
16
17__m128d test_mm_fmadd_pd(__m128d a, __m128d b, __m128d c) {
18 // COMMON-LABEL: test_mm_fmadd_pd
19 // UNCONSTRAINED: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})
20 // CONSTRAINED: call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})
21 // CHECK-ASM: vfmadd213pd
22 return _mm_fmadd_pd(a, b, c);
23}
24
25__m128 test_mm_fmadd_ss(__m128 a, __m128 b, __m128 c) {
26 // COMMON-LABEL: test_mm_fmadd_ss
27 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
28 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
29 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
30 // UNCONSTRAINED: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})
31 // CONSTRAINED: call float @llvm.experimental.constrained.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, metadata !{{.*}})
32 // CHECK-ASM: vfmadd213ss
33 // COMMONIR: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
34 return _mm_fmadd_ss(a, b, c);
35}
36
37__m128d test_mm_fmadd_sd(__m128d a, __m128d b, __m128d c) {
38 // COMMON-LABEL: test_mm_fmadd_sd
39 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
40 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
41 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
42 // UNCONSTRAINED: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})
43 // CONSTRAINED: call double @llvm.experimental.constrained.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}}, metadata !{{.*}})
44 // CHECK-ASM: vfmadd213sd
45 // COMMONIR: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
46 return _mm_fmadd_sd(a, b, c);
47}
48
49__m128 test_mm_fmsub_ps(__m128 a, __m128 b, __m128 c) {
50 // COMMON-LABEL: test_mm_fmsub_ps
51 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}
52 // UNCONSTRAINED: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})
53 // CONSTRAINED: call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})
54 // CHECK-ASM: vfmsub213ps
55 return _mm_fmsub_ps(a, b, c);
56}
57
58__m128d test_mm_fmsub_pd(__m128d a, __m128d b, __m128d c) {
59 // COMMON-LABEL: test_mm_fmsub_pd
60 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}
61 // UNCONSTRAINED: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})
62 // CONSTRAINED: call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})
63 // CHECK-ASM: vfmsub213pd
64 return _mm_fmsub_pd(a, b, c);
65}
66
67__m128 test_mm_fmsub_ss(__m128 a, __m128 b, __m128 c) {
68 // COMMON-LABEL: test_mm_fmsub_ss
69 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}
70 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
71 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
72 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
73 // UNCONSTRAINED: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})
74 // CONSTRAINED: call float @llvm.experimental.constrained.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, metadata !{{.*}})
75 // CHECK-ASM: vfmsub213ss
76 // COMMONIR: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
77 return _mm_fmsub_ss(a, b, c);
78}
79
80__m128d test_mm_fmsub_sd(__m128d a, __m128d b, __m128d c) {
81 // COMMON-LABEL: test_mm_fmsub_sd
82 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}
83 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
84 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
85 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
86 // UNCONSTRAINED: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})
87 // CONSTRAINED: call double @llvm.experimental.constrained.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}}, metadata !{{.*}})
88 // CHECK-ASM: vfmsub213sd
89 // COMMONIR: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
90 return _mm_fmsub_sd(a, b, c);
91}
92
93__m128 test_mm_fnmadd_ps(__m128 a, __m128 b, __m128 c) {
94 // COMMON-LABEL: test_mm_fnmadd_ps
95 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}
96 // UNCONSTRAINED: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})
97 // CONSTRAINED: call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})
98 // CHECK-ASM: vfnmadd213ps
99 return _mm_fnmadd_ps(a, b, c);
100}
101
102__m128d test_mm_fnmadd_pd(__m128d a, __m128d b, __m128d c) {
103 // COMMON-LABEL: test_mm_fnmadd_pd
104 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}
105 // UNCONSTRAINED: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})
106 // CONSTRAINED: call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})
107 // CHECK-ASM: vfnmadd213pd
108 return _mm_fnmadd_pd(a, b, c);
109}
110
111__m128 test_mm_fnmadd_ss(__m128 a, __m128 b, __m128 c) {
112 // COMMON-LABEL: test_mm_fnmadd_ss
113 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}
114 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
115 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
116 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
117 // UNCONSTRAINED: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})
118 // CONSTRAINED: call float @llvm.experimental.constrained.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, metadata !{{.*}})
119 // CHECK-ASM: vfnmadd213ss
120 // COMMONIR: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
121 return _mm_fnmadd_ss(a, b, c);
122}
123
124__m128d test_mm_fnmadd_sd(__m128d a, __m128d b, __m128d c) {
125 // COMMON-LABEL: test_mm_fnmadd_sd
126 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}
127 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
128 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
129 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
130 // UNCONSTRAINED: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})
131 // CONSTRAINED: call double @llvm.experimental.constrained.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}}, metadata !{{.*}})
132 // CHECK-ASM: vfnmadd213sd
133 // COMMONIR: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
134 return _mm_fnmadd_sd(a, b, c);
135}
136
137__m128 test_mm_fnmsub_ps(__m128 a, __m128 b, __m128 c) {
138 // COMMON-LABEL: test_mm_fnmsub_ps
139 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}
140 // COMMONIR: [[NEG2:%.+]] = fneg <4 x float> %{{.+}}
141 // UNCONSTRAINED: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})
142 // CONSTRAINED: call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})
143 // CHECK-ASM: vfnmsub213ps
144 return _mm_fnmsub_ps(a, b, c);
145}
146
147__m128d test_mm_fnmsub_pd(__m128d a, __m128d b, __m128d c) {
148 // COMMON-LABEL: test_mm_fnmsub_pd
149 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}
150 // COMMONIR: [[NEG2:%.+]] = fneg <2 x double> %{{.+}}
151 // UNCONSTRAINED: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})
152 // CONSTRAINED: call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})
153 // CHECK-ASM: vfnmsub213pd
154 return _mm_fnmsub_pd(a, b, c);
155}
156
157__m128 test_mm_fnmsub_ss(__m128 a, __m128 b, __m128 c) {
158 // COMMON-LABEL: test_mm_fnmsub_ss
159 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}
160 // COMMONIR: [[NEG2:%.+]] = fneg <4 x float> %{{.+}}
161 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
162 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
163 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0
164 // UNCONSTRAINED: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})
165 // CONSTRAINED: call float @llvm.experimental.constrained.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, metadata !{{.*}})
166 // CHECK-ASM: vfnmsub213ss
167 // COMMONIR: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
168 return _mm_fnmsub_ss(a, b, c);
169}
170
171__m128d test_mm_fnmsub_sd(__m128d a, __m128d b, __m128d c) {
172 // COMMON-LABEL: test_mm_fnmsub_sd
173 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}
174 // COMMONIR: [[NEG2:%.+]] = fneg <2 x double> %{{.+}}
175 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
176 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
177 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0
178 // UNCONSTRAINED: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})
179 // CONSTRAINED: call double @llvm.experimental.constrained.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}}, metadata !{{.*}})
180 // CHECK-ASM: vfnmsub213sd
181 // COMMONIR: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
182 return _mm_fnmsub_sd(a, b, c);
183}
184
185__m128 test_mm_fmaddsub_ps(__m128 a, __m128 b, __m128 c) {
186 // COMMON-LABEL: test_mm_fmaddsub_ps
187 // UNCONSTRAINED: [[ADD:%.+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})
188 // CONSTRAINED: [[ADD:%.+]] = tail call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})
189 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}
190 // UNCONSTRAINED: [[SUB:%.+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]])
191 // CONSTRAINED: [[SUB:%.+]] = tail call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]], metadata !{{.*}})
192 // CHECK-ASM-UNCONSTRAINED: vfmaddsub213ps
193 // CHECK-ASM-CONSTRAINED-NOT: vfmaddsub213ps
194 // COMMONIR: shufflevector <4 x float> [[SUB]], <4 x float> [[ADD]], <4 x i32> <i32 0, i32 5, i32 2, i32 7>
195 return _mm_fmaddsub_ps(a, b, c);
196}
197
198__m128d test_mm_fmaddsub_pd(__m128d a, __m128d b, __m128d c) {
199 // COMMON-LABEL: test_mm_fmaddsub_pd
200 // UNCONSTRAINED: [[ADD:%.+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})
201 // CONSTRAINED: [[ADD:%.+]] = tail call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})
202 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}
203 // UNCONSTRAINED: [[SUB:%.+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]])
204 // CONSTRAINED: [[SUB:%.+]] = tail call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]], metadata !{{.*}})
205 // CHECK-ASM-UNCONSTRAINED: vfmaddsub213pd
206 // CHECK-ASM-CONSTRAINED-NOT: vfmaddsub213pd
207 // COMMONIR: shufflevector <2 x double> [[SUB]], <2 x double> [[ADD]], <2 x i32> <i32 0, i32 3>
208 return _mm_fmaddsub_pd(a, b, c);
209}
210
211__m128 test_mm_fmsubadd_ps(__m128 a, __m128 b, __m128 c) {
212 // COMMON-LABEL: test_mm_fmsubadd_ps
213 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}
214 // UNCONSTRAINED: [[SUB:%.+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]]
215 // CONSTRAINED: [[SUB:%.+]] = tail call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]], metadata !{{.*}})
216 // UNCONSTRAINED: [[ADD:%.+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})
217 // CONSTRAINED: [[ADD:%.+]] = tail call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})
218 // CHECK-ASM-UNCONSTRAINED: vfmsubadd213ps
219 // CHECK-ASM-CONSTRAINED-NOT: vfmsubadd213ps
220 // COMMONIR: shufflevector <4 x float> [[ADD]], <4 x float> [[SUB]], <4 x i32> <i32 0, i32 5, i32 2, i32 7>
221 return _mm_fmsubadd_ps(a, b, c);
222}
223
224__m128d test_mm_fmsubadd_pd(__m128d a, __m128d b, __m128d c) {
225 // COMMON-LABEL: test_mm_fmsubadd_pd
226 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}
227 // UNCONSTRAINED: [[SUB:%.+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]])
228 // CONSTRAINED: [[SUB:%.+]] = tail call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]], metadata !{{.*}})
229 // UNCONSTRAINED: [[ADD:%.+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})
230 // CONSTRAINED: [[ADD:%.+]] = tail call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})
231 // CHECK-ASM-UNCONSTRAINED: vfmsubadd213pd
232 // CHECK-ASM-CONSTRAINED-NOT: vfmsubadd213pd
233 // COMMONIR: shufflevector <2 x double> [[ADD]], <2 x double> [[SUB]], <2 x i32> <i32 0, i32 3>
234 return _mm_fmsubadd_pd(a, b, c);
235}
236
237__m256 test_mm256_fmadd_ps(__m256 a, __m256 b, __m256 c) {
238 // COMMON-LABEL: test_mm256_fmadd_ps
239 // UNCONSTRAINED: call <8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})
240 // CONSTRAINED: call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})
241 // CHECK-ASM: vfmadd213ps
242 return _mm256_fmadd_ps(a, b, c);
243}
244
245__m256d test_mm256_fmadd_pd(__m256d a, __m256d b, __m256d c) {
246 // COMMON-LABEL: test_mm256_fmadd_pd
247 // UNCONSTRAINED: call <4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})
248 // CONSTRAINED: call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})
249 // CHECK-ASM: vfmadd213pd
250 return _mm256_fmadd_pd(a, b, c);
251}
252
253__m256 test_mm256_fmsub_ps(__m256 a, __m256 b, __m256 c) {
254 // COMMON-LABEL: test_mm256_fmsub_ps
255 // COMMONIR: [[NEG:%.+]] = fneg <8 x float> %{{.*}}
256 // UNCONSTRAINED: call <8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})
257 // CONSTRAINED: call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})
258 // CHECK-ASM: vfmsub213ps
259 return _mm256_fmsub_ps(a, b, c);
260}
261
262__m256d test_mm256_fmsub_pd(__m256d a, __m256d b, __m256d c) {
263 // COMMON-LABEL: test_mm256_fmsub_pd
264 // COMMONIR: [[NEG:%.+]] = fneg <4 x double> %{{.+}}
265 // UNCONSTRAINED: call <4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})
266 // CONSTRAINED: call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})
267 // CHECK-ASM: vfmsub213pd
268 return _mm256_fmsub_pd(a, b, c);
269}
270
271__m256 test_mm256_fnmadd_ps(__m256 a, __m256 b, __m256 c) {
272 // COMMON-LABEL: test_mm256_fnmadd_ps
273 // COMMONIR: [[NEG:%.+]] = fneg <8 x float> %{{.*}}
274 // UNCONSTRAINED: call <8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})
275 // CONSTRAINED: call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})
276 // CHECK-ASM: vfnmadd213ps
277 return _mm256_fnmadd_ps(a, b, c);
278}
279
280__m256d test_mm256_fnmadd_pd(__m256d a, __m256d b, __m256d c) {
281 // COMMON-LABEL: test_mm256_fnmadd_pd
282 // COMMONIR: [[NEG:%.+]] = fneg <4 x double> %{{.+}}
283 // UNCONSTRAINED: call <4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})
284 // CONSTRAINED: call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})
285 // CHECK-ASM: vfnmadd213pd
286 return _mm256_fnmadd_pd(a, b, c);
287}
288
289__m256 test_mm256_fnmsub_ps(__m256 a, __m256 b, __m256 c) {
290 // COMMON-LABEL: test_mm256_fnmsub_ps
291 // COMMONIR: [[NEG:%.+]] = fneg <8 x float> %{{.*}}
292 // COMMONIR: [[NEG2:%.+]] = fneg <8 x float> %{{.*}}
293 // UNCONSTRAINED: call <8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})
294 // CONSTRAINED: call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})
295 // CHECK-ASM: vfnmsub213ps
296 return _mm256_fnmsub_ps(a, b, c);
297}
298
299__m256d test_mm256_fnmsub_pd(__m256d a, __m256d b, __m256d c) {
300 // COMMON-LABEL: test_mm256_fnmsub_pd
301 // COMMONIR: [[NEG:%.+]] = fneg <4 x double> %{{.+}}
302 // COMMONIR: [[NEG2:%.+]] = fneg <4 x double> %{{.+}}
303 // UNCONSTRAINED: call <4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})
304 // CONSTRAINED: call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})
305 // CHECK-ASM: vfnmsub213pd
306 return _mm256_fnmsub_pd(a, b, c);
307}
308
309__m256 test_mm256_fmaddsub_ps(__m256 a, __m256 b, __m256 c) {
310 // COMMON-LABEL: test_mm256_fmaddsub_ps
311 // UNCONSTRAINED: [[ADD:%.+]] = tail call <8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})
312 // CONSTRAINED: [[ADD:%.+]] = tail call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})
313 // COMMONIR: [[NEG:%.+]] = fneg <8 x float> %{{.*}}
314 // UNCONSTRAINED: [[SUB:%.+]] = tail call <8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> [[NEG]])
315 // CONSTRAINED: [[SUB:%.+]] = tail call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> [[NEG]], metadata !{{.*}})
316 // CHECK-ASM-UNCONSTRAINED: vfmaddsub213ps
317 // CHECK-ASM-CONSTRAINED-NOT: vfmaddsub213ps
318 // COMMONIR: shufflevector <8 x float> [[SUB]], <8 x float> [[ADD]], <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
319 return _mm256_fmaddsub_ps(a, b, c);
320}
321
322__m256d test_mm256_fmaddsub_pd(__m256d a, __m256d b, __m256d c) {
323 // COMMON-LABEL: test_mm256_fmaddsub_pd
324 // UNCONSTRAINED: [[ADD:%.+]] = tail call <4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})
325 // CONSTRAINED: [[ADD:%.+]] = tail call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})
326 // COMMONIR: [[NEG:%.+]] = fneg <4 x double> %{{.+}}
327 // UNCONSTRAINED: [[SUB:%.+]] = tail call <4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})
328 // CONSTRAINED: [[SUB:%.+]] = tail call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})
329 // CHECK-ASM-UNCONSTRAINED: vfmaddsub213pd
330 // CHECK-ASM-CONSTRAINED-NOT: vfmaddsub213pd
331 // COMMONIR: shufflevector <4 x double> [[SUB]], <4 x double> [[ADD]], <4 x i32> <i32 0, i32 5, i32 2, i32 7>
332 return _mm256_fmaddsub_pd(a, b, c);
333}
334
335__m256 test_mm256_fmsubadd_ps(__m256 a, __m256 b, __m256 c) {
336 // COMMON-LABEL: test_mm256_fmsubadd_ps
337 // COMMONIR: [[NEG:%.+]] = fneg <8 x float> %{{.*}}
338 // UNCONSTRAINED: [[SUB:%.+]] = tail call <8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> [[NEG]])
339 // CONSTRAINED: [[SUB:%.+]] = tail call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> [[NEG]], metadata !{{.*}})
340 // UNCONSTRAINED: [[ADD:%.+]] = tail call <8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})
341 // CONSTRAINED: [[ADD:%.+]] = tail call <8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})
342 // CHECK-ASM-UNCONSTRAINED: vfmsubadd213ps
343 // CHECK-ASM-CONSTRAINED-NOT: vfmsubadd213ps
344 // COMMONIR: shufflevector <8 x float> [[ADD]], <8 x float> [[SUB]], <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
345 return _mm256_fmsubadd_ps(a, b, c);
346}
347
348__m256d test_mm256_fmsubadd_pd(__m256d a, __m256d b, __m256d c) {
349 // COMMON-LABEL: test_mm256_fmsubadd_pd
350 // COMMONIR: [[NEG:%.+]] = fneg <4 x double> %{{.+}}
351 // UNCONSTRAINED: [[SUB:%.+]] = tail call <4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> [[NEG]])
352 // CONSTRAINED: [[SUB:%.+]] = tail call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> [[NEG]], metadata !{{.*}})
353 // UNCONSTRAINED: [[ADD:%.+]] = tail call <4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})
354 // CONSTRAINED: [[ADD:%.+]] = tail call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})
355 // CHECK-ASM-UNCONSTRAINED: vfmsubadd213pd
356 // CHECK-ASM-CONSTRAINED-NOT: vfmsubadd213pd
357 // COMMONIR: shufflevector <4 x double> [[ADD]], <4 x double> [[SUB]], <4 x i32> <i32 0, i32 5, i32 2, i32 7>
358 return _mm256_fmsubadd_pd(a, b, c);
359}