331 lines · c
1// REQUIRES: x86-registered-target2// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O2 -emit-llvm -o - | FileCheck %s --check-prefixes=COMMON,COMMONIR,UNCONSTRAINED3// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -ffp-exception-behavior=maytrap -DSTRICT=1 -O2 -emit-llvm -o - | FileCheck %s --check-prefixes=COMMON,COMMONIR,CONSTRAINED4// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O2 -S -o - | FileCheck %s --check-prefixes=COMMON,CHECK-ASM5// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O2 -ffp-exception-behavior=maytrap -DSTRICT=1 -S -o - | FileCheck %s --check-prefixes=COMMON,CHECK-ASM6// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O2 -emit-llvm -o - | FileCheck %s --check-prefixes=COMMON,COMMONIR,UNCONSTRAINED7// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -ffp-exception-behavior=maytrap -DSTRICT=1 -O2 -emit-llvm -o - | FileCheck %s --check-prefixes=COMMON,COMMONIR,CONSTRAINED8// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O2 -S -o - | FileCheck %s --check-prefixes=COMMON,CHECK-ASM9// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=x86_64-unknown-linux-gnu -target-feature +fma -O2 -ffp-exception-behavior=maytrap -DSTRICT=1 -S -o - | FileCheck %s --check-prefixes=COMMON,CHECK-ASM10 11#ifdef STRICT12// Test that the constrained intrinsics are picking up the exception13// metadata from the AST instead of the global default from the command line.14 15#pragma float_control(except, on)16#endif17 18#include <immintrin.h>19 20__m128 test_mm_fmadd_ps(__m128 a, __m128 b, __m128 c) {21 // COMMON-LABEL: test_mm_fmadd_ps22 // UNCONSTRAINED: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})23 // CONSTRAINED: call {{.*}}<4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})24 // CHECK-ASM: vfmadd213ps25 return _mm_fmadd_ps(a, b, c);26}27 28__m128d test_mm_fmadd_pd(__m128d a, __m128d b, __m128d c) {29 // COMMON-LABEL: test_mm_fmadd_pd30 // UNCONSTRAINED: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})31 // CONSTRAINED: call {{.*}}<2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})32 // CHECK-ASM: vfmadd213pd33 return _mm_fmadd_pd(a, b, c);34}35 36__m128 test_mm_fmadd_ss(__m128 a, __m128 b, __m128 c) {37 // COMMON-LABEL: test_mm_fmadd_ss38 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 039 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 040 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 041 // UNCONSTRAINED: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})42 // CONSTRAINED: call float @llvm.experimental.constrained.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, metadata !{{.*}})43 // CHECK-ASM: vfmadd213ss44 // COMMONIR: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 045 return _mm_fmadd_ss(a, b, c);46}47 48__m128d test_mm_fmadd_sd(__m128d a, __m128d b, __m128d c) {49 // COMMON-LABEL: test_mm_fmadd_sd50 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 051 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 052 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 053 // UNCONSTRAINED: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})54 // CONSTRAINED: call double @llvm.experimental.constrained.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}}, metadata !{{.*}})55 // CHECK-ASM: vfmadd213sd56 // COMMONIR: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 057 return _mm_fmadd_sd(a, b, c);58}59 60__m128 test_mm_fmsub_ps(__m128 a, __m128 b, __m128 c) {61 // COMMON-LABEL: test_mm_fmsub_ps62 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}63 // UNCONSTRAINED: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})64 // CONSTRAINED: call {{.*}}<4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})65 // CHECK-ASM: vfmsub213ps66 return _mm_fmsub_ps(a, b, c);67}68 69__m128d test_mm_fmsub_pd(__m128d a, __m128d b, __m128d c) {70 // COMMON-LABEL: test_mm_fmsub_pd71 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}72 // UNCONSTRAINED: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})73 // CONSTRAINED: call {{.*}}<2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})74 // CHECK-ASM: vfmsub213pd75 return _mm_fmsub_pd(a, b, c);76}77 78__m128 test_mm_fmsub_ss(__m128 a, __m128 b, __m128 c) {79 // COMMON-LABEL: test_mm_fmsub_ss80 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 081 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 082 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 083 // COMMONIR: [[NEG:%.+]] = fneg float %{{.+}}84 // UNCONSTRAINED: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})85 // CONSTRAINED: call float @llvm.experimental.constrained.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, metadata !{{.*}})86 // CHECK-ASM: vfmsub213ss87 // COMMONIR: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 088 return _mm_fmsub_ss(a, b, c);89}90 91__m128d test_mm_fmsub_sd(__m128d a, __m128d b, __m128d c) {92 // COMMON-LABEL: test_mm_fmsub_sd93 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 094 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 095 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 096 // COMMONIR: [[NEG:%.+]] = fneg double %{{.+}}97 // UNCONSTRAINED: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})98 // CONSTRAINED: call double @llvm.experimental.constrained.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}}, metadata !{{.*}})99 // CHECK-ASM: vfmsub213sd100 // COMMONIR: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0101 return _mm_fmsub_sd(a, b, c);102}103 104__m128 test_mm_fnmadd_ps(__m128 a, __m128 b, __m128 c) {105 // COMMON-LABEL: test_mm_fnmadd_ps106 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}107 // UNCONSTRAINED: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})108 // CONSTRAINED: call {{.*}}<4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})109 // CHECK-ASM: vfnmadd213ps110 return _mm_fnmadd_ps(a, b, c);111}112 113__m128d test_mm_fnmadd_pd(__m128d a, __m128d b, __m128d c) {114 // COMMON-LABEL: test_mm_fnmadd_pd115 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}116 // UNCONSTRAINED: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})117 // CONSTRAINED: call {{.*}}<2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})118 // CHECK-ASM: vfnmadd213pd119 return _mm_fnmadd_pd(a, b, c);120}121 122__m128 test_mm_fnmadd_ss(__m128 a, __m128 b, __m128 c) {123 // COMMON-LABEL: test_mm_fnmadd_ss124 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0125 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0126 // COMMONIR: [[NEG:%.+]] = fneg float %{{.+}}127 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0128 // UNCONSTRAINED: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})129 // CONSTRAINED: call float @llvm.experimental.constrained.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, metadata !{{.*}})130 // CHECK-ASM: vfnmadd213ss131 // COMMONIR: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0132 return _mm_fnmadd_ss(a, b, c);133}134 135__m128d test_mm_fnmadd_sd(__m128d a, __m128d b, __m128d c) {136 // COMMON-LABEL: test_mm_fnmadd_sd137 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0138 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0139 // COMMONIR: [[NEG:%.+]] = fneg double %{{.+}}140 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0141 // UNCONSTRAINED: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})142 // CONSTRAINED: call double @llvm.experimental.constrained.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}}, metadata !{{.*}})143 // CHECK-ASM: vfnmadd213sd144 // COMMONIR: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0145 return _mm_fnmadd_sd(a, b, c);146}147 148__m128 test_mm_fnmsub_ps(__m128 a, __m128 b, __m128 c) {149 // COMMON-LABEL: test_mm_fnmsub_ps150 // COMMONIR: [[NEG:%.+]] = fneg <4 x float> %{{.+}}151 // COMMONIR: [[NEG2:%.+]] = fneg <4 x float> %{{.+}}152 // UNCONSTRAINED: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})153 // CONSTRAINED: call {{.*}}<4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})154 // CHECK-ASM: vfnmsub213ps155 return _mm_fnmsub_ps(a, b, c);156}157 158__m128d test_mm_fnmsub_pd(__m128d a, __m128d b, __m128d c) {159 // COMMON-LABEL: test_mm_fnmsub_pd160 // COMMONIR: [[NEG:%.+]] = fneg <2 x double> %{{.+}}161 // COMMONIR: [[NEG2:%.+]] = fneg <2 x double> %{{.+}}162 // UNCONSTRAINED: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})163 // CONSTRAINED: call {{.*}}<2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})164 // CHECK-ASM: vfnmsub213pd165 return _mm_fnmsub_pd(a, b, c);166}167 168__m128 test_mm_fnmsub_ss(__m128 a, __m128 b, __m128 c) {169 // COMMON-LABEL: test_mm_fnmsub_ss170 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0171 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0172 // COMMONIR: [[NEG:%.+]] = fneg float %{{.+}}173 // COMMONIR: extractelement <4 x float> %{{.*}}, i64 0174 // COMMONIR: [[NEG2:%.+]] = fneg float %{{.+}}175 // UNCONSTRAINED: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})176 // CONSTRAINED: call float @llvm.experimental.constrained.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}}, metadata !{{.*}})177 // CHECK-ASM: vfnmsub213ss178 // COMMONIR: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0179 return _mm_fnmsub_ss(a, b, c);180}181 182__m128d test_mm_fnmsub_sd(__m128d a, __m128d b, __m128d c) {183 // COMMON-LABEL: test_mm_fnmsub_sd184 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0185 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0186 // COMMONIR: [[NEG:%.+]] = fneg double %{{.+}}187 // COMMONIR: extractelement <2 x double> %{{.*}}, i64 0188 // COMMONIR: [[NEG2:%.+]] = fneg double %{{.+}}189 // UNCONSTRAINED: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})190 // CONSTRAINED: call double @llvm.experimental.constrained.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}}, metadata !{{.*}})191 // CHECK-ASM: vfnmsub213sd192 // COMMONIR: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0193 return _mm_fnmsub_sd(a, b, c);194}195 196__m128 test_mm_fmaddsub_ps(__m128 a, __m128 b, __m128 c) {197 // COMMON-LABEL: test_mm_fmaddsub_ps198 // COMMONIR-NOT: fneg199 // COMMONIR: tail call {{.*}}<4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})200 // CHECK-ASM: vfmaddsub213ps201 return _mm_fmaddsub_ps(a, b, c);202}203 204__m128d test_mm_fmaddsub_pd(__m128d a, __m128d b, __m128d c) {205 // COMMON-LABEL: test_mm_fmaddsub_pd206 // COMMONIR-NOT: fneg207 // COMMONIR: tail call {{.*}}<2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})208 // CHECK-ASM: vfmaddsub213pd209 return _mm_fmaddsub_pd(a, b, c);210}211 212__m128 test_mm_fmsubadd_ps(__m128 a, __m128 b, __m128 c) {213 // COMMON-LABEL: test_mm_fmsubadd_ps214 // COMMONIR: [[FNEG:%.+]] = fneg <4 x float> %{{.*}}215 // COMMONIR: tail call {{.*}}<4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[FNEG]])216 // CHECK-ASM: vfmsubadd213ps217 return _mm_fmsubadd_ps(a, b, c);218}219 220__m128d test_mm_fmsubadd_pd(__m128d a, __m128d b, __m128d c) {221 // COMMON-LABEL: test_mm_fmsubadd_pd222 // COMMONIR: [[FNEG:%.+]] = fneg <2 x double> %{{.*}}223 // COMMONIR: tail call {{.*}}<2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[FNEG]])224 // CHECK-ASM: vfmsubadd213pd225 return _mm_fmsubadd_pd(a, b, c);226}227 228__m256 test_mm256_fmadd_ps(__m256 a, __m256 b, __m256 c) {229 // COMMON-LABEL: test_mm256_fmadd_ps230 // UNCONSTRAINED: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})231 // CONSTRAINED: call {{.*}}<8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})232 // CHECK-ASM: vfmadd213ps233 return _mm256_fmadd_ps(a, b, c);234}235 236__m256d test_mm256_fmadd_pd(__m256d a, __m256d b, __m256d c) {237 // COMMON-LABEL: test_mm256_fmadd_pd238 // UNCONSTRAINED: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})239 // CONSTRAINED: call {{.*}}<4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})240 // CHECK-ASM: vfmadd213pd241 return _mm256_fmadd_pd(a, b, c);242}243 244__m256 test_mm256_fmsub_ps(__m256 a, __m256 b, __m256 c) {245 // COMMON-LABEL: test_mm256_fmsub_ps246 // COMMONIR: [[NEG:%.+]] = fneg <8 x float> %{{.*}}247 // UNCONSTRAINED: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})248 // CONSTRAINED: call {{.*}}<8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})249 // CHECK-ASM: vfmsub213ps250 return _mm256_fmsub_ps(a, b, c);251}252 253__m256d test_mm256_fmsub_pd(__m256d a, __m256d b, __m256d c) {254 // COMMON-LABEL: test_mm256_fmsub_pd255 // COMMONIR: [[NEG:%.+]] = fneg <4 x double> %{{.+}}256 // UNCONSTRAINED: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})257 // CONSTRAINED: call {{.*}}<4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})258 // CHECK-ASM: vfmsub213pd259 return _mm256_fmsub_pd(a, b, c);260}261 262__m256 test_mm256_fnmadd_ps(__m256 a, __m256 b, __m256 c) {263 // COMMON-LABEL: test_mm256_fnmadd_ps264 // COMMONIR: [[NEG:%.+]] = fneg <8 x float> %{{.*}}265 // UNCONSTRAINED: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})266 // CONSTRAINED: call {{.*}}<8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})267 // CHECK-ASM: vfnmadd213ps268 return _mm256_fnmadd_ps(a, b, c);269}270 271__m256d test_mm256_fnmadd_pd(__m256d a, __m256d b, __m256d c) {272 // COMMON-LABEL: test_mm256_fnmadd_pd273 // COMMONIR: [[NEG:%.+]] = fneg <4 x double> %{{.+}}274 // UNCONSTRAINED: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})275 // CONSTRAINED: call {{.*}}<4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})276 // CHECK-ASM: vfnmadd213pd277 return _mm256_fnmadd_pd(a, b, c);278}279 280__m256 test_mm256_fnmsub_ps(__m256 a, __m256 b, __m256 c) {281 // COMMON-LABEL: test_mm256_fnmsub_ps282 // COMMONIR: [[NEG:%.+]] = fneg <8 x float> %{{.*}}283 // COMMONIR: [[NEG2:%.+]] = fneg <8 x float> %{{.*}}284 // UNCONSTRAINED: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})285 // CONSTRAINED: call {{.*}}<8 x float> @llvm.experimental.constrained.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}}, metadata !{{.*}})286 // CHECK-ASM: vfnmsub213ps287 return _mm256_fnmsub_ps(a, b, c);288}289 290__m256d test_mm256_fnmsub_pd(__m256d a, __m256d b, __m256d c) {291 // COMMON-LABEL: test_mm256_fnmsub_pd292 // COMMONIR: [[NEG:%.+]] = fneg <4 x double> %{{.+}}293 // COMMONIR: [[NEG2:%.+]] = fneg <4 x double> %{{.+}}294 // UNCONSTRAINED: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})295 // CONSTRAINED: call {{.*}}<4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}}, metadata !{{.*}})296 // CHECK-ASM: vfnmsub213pd297 return _mm256_fnmsub_pd(a, b, c);298}299 300__m256 test_mm256_fmaddsub_ps(__m256 a, __m256 b, __m256 c) {301 // COMMON-LABEL: test_mm256_fmaddsub_ps302 // COMMONIR-NOT: fneg303 // COMMONIR: tail call {{.*}}<8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})304 // CHECK-ASM: vfmaddsub213ps305 return _mm256_fmaddsub_ps(a, b, c);306}307 308__m256d test_mm256_fmaddsub_pd(__m256d a, __m256d b, __m256d c) {309 // COMMON-LABEL: test_mm256_fmaddsub_pd310 // COMMONIR-NOT: fneg311 // COMMONIR: tail call {{.*}}<4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})312 // CHECK-ASM: vfmaddsub213pd313 return _mm256_fmaddsub_pd(a, b, c);314}315 316__m256 test_mm256_fmsubadd_ps(__m256 a, __m256 b, __m256 c) {317 // COMMON-LABEL: test_mm256_fmsubadd_ps318 // COMMONIR: [[FNEG:%.+]] = fneg <8 x float> %{{.*}}319 // COMMONIR: tail call {{.*}}<8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> [[FNEG]])320 // CHECK-ASM: vfmsubadd213ps321 return _mm256_fmsubadd_ps(a, b, c);322}323 324__m256d test_mm256_fmsubadd_pd(__m256d a, __m256d b, __m256d c) {325 // COMMON-LABEL: test_mm256_fmsubadd_pd326 // COMMONIR: [[FNEG:%.+]] = fneg <4 x double> %{{.*}}327 // COMMONIR: tail call {{.*}}<4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> [[FNEG]])328 // CHECK-ASM: vfmsubadd213pd329 return _mm256_fmsubadd_pd(a, b, c);330}331