294 lines · c
1// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +fma -emit-llvm -o - -Wall -Werror | FileCheck %s2// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +fma -emit-llvm -o - -Wall -Werror | FileCheck %s3// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +fma -emit-llvm -o - -Wall -Werror | FileCheck %s4// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +fma -emit-llvm -o - -Wall -Werror | FileCheck %s5 6// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +fma -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s7// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +fma -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s8// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +fma -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s9// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +fma -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s10 11 12#include <immintrin.h>13#include "builtin_test_helpers.h"14 15__m128 test_mm_fmadd_ps(__m128 a, __m128 b, __m128 c) {16 // CHECK-LABEL: test_mm_fmadd_ps17 // CHECK: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})18 return _mm_fmadd_ps(a, b, c);19}20TEST_CONSTEXPR(match_m128(_mm_fmadd_ps((__m128){ 0.0f, 1.0f, -2.0f, -4.0f }, (__m128){ -0.0f, 4.0f, 2.0f, 1.0f }, (__m128){ -0.0f, -4.0f, 2.0f, 1.0f }), -0.0f, 0.0f, -2.0f, -3.0f));21 22__m128d test_mm_fmadd_pd(__m128d a, __m128d b, __m128d c) {23 // CHECK-LABEL: test_mm_fmadd_pd24 // CHECK: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})25 return _mm_fmadd_pd(a, b, c);26}27TEST_CONSTEXPR(match_m128d(_mm_fmadd_pd((__m128d){ 0.0, -4.0 }, (__m128d){ -0.0, 1.0 }, (__m128d){ -0.0, 1.0 }), -0.0, -3.0));28 29__m128 test_mm_fmadd_ss(__m128 a, __m128 b, __m128 c) {30 // CHECK-LABEL: test_mm_fmadd_ss31 // CHECK: extractelement <4 x float> %{{.*}}, i32 032 // CHECK: extractelement <4 x float> %{{.*}}, i32 033 // CHECK: extractelement <4 x float> %{{.*}}, i32 034 // CHECK: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float %{{.*}})35 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 036 return _mm_fmadd_ss(a, b, c);37}38TEST_CONSTEXPR(match_m128(_mm_fmadd_ss((__m128){ -4.0f, 1.0f, -2.0f, -0.0f }, (__m128){ 2.0f, 4.0f, 2.0f, -0.0f }, (__m128){ 1.0f, -4.0f, 2.0f, 1.0f }), -7.0f, 1.0f, -2.0f, -0.0f));39 40__m128d test_mm_fmadd_sd(__m128d a, __m128d b, __m128d c) {41 // CHECK-LABEL: test_mm_fmadd_sd42 // CHECK: extractelement <2 x double> %{{.*}}, i32 043 // CHECK: extractelement <2 x double> %{{.*}}, i32 044 // CHECK: extractelement <2 x double> %{{.*}}, i32 045 // CHECK: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})46 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 047 return _mm_fmadd_sd(a, b, c);48}49TEST_CONSTEXPR(match_m128d(_mm_fmadd_sd((__m128d){ -4.0, 1.0 }, (__m128d){ 1.0, 2.0 }, (__m128d){ -8.0, 3.0 }), -12.0, 1.0));50 51__m128 test_mm_fmsub_ps(__m128 a, __m128 b, __m128 c) {52 // CHECK-LABEL: test_mm_fmsub_ps53 // CHECK: [[NEG:%.+]] = fneg <4 x float> %{{.+}}54 // CHECK: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})55 return _mm_fmsub_ps(a, b, c);56}57TEST_CONSTEXPR(match_m128(_mm_fmsub_ps((__m128){ 0.0f, 1.0f, -2.0f, -4.0f }, (__m128){ -0.0f, 4.0f, 2.0f, 1.0f }, (__m128){ -0.0f, -4.0f, 2.0f, 1.0f }), 0.0f, 8.0f, -6.0f, -5.0f));58 59__m128d test_mm_fmsub_pd(__m128d a, __m128d b, __m128d c) {60 // CHECK-LABEL: test_mm_fmsub_pd61 // CHECK: [[NEG:%.+]] = fneg <2 x double> %{{.+}}62 // CHECK: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})63 return _mm_fmsub_pd(a, b, c);64}65TEST_CONSTEXPR(match_m128d(_mm_fmsub_pd((__m128d){ 0.0, -4.0 }, (__m128d){ -0.0, 1.0 }, (__m128d){ -0.0, 1.0 }), 0.0, -5.0));66 67__m128 test_mm_fmsub_ss(__m128 a, __m128 b, __m128 c) {68 // CHECK-LABEL: test_mm_fmsub_ss69 // CHECK: extractelement <4 x float> %{{.*}}, i32 070 // CHECK: extractelement <4 x float> %{{.*}}, i32 071 // CHECK: extractelement <4 x float> %{{.*}}, i32 072 // CHECK: [[NEG:%.+]] = fneg float %{{.+}}73 // CHECK: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float [[NEG]])74 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 075 return _mm_fmsub_ss(a, b, c);76}77TEST_CONSTEXPR(match_m128(_mm_fmsub_ss((__m128){ -4.0f, 1.0f, -2.0f, -0.0f }, (__m128){ 2.0f, 4.0f, 2.0f, -0.0f }, (__m128){ 1.0f, -4.0f, 2.0f, 1.0f }), -9.0f, 1.0f, -2.0f, -0.0f));78 79__m128d test_mm_fmsub_sd(__m128d a, __m128d b, __m128d c) {80 // CHECK-LABEL: test_mm_fmsub_sd81 // CHECK: extractelement <2 x double> %{{.*}}, i32 082 // CHECK: extractelement <2 x double> %{{.*}}, i32 083 // CHECK: extractelement <2 x double> %{{.*}}, i32 084 // CHECK: [[NEG:%.+]] = fneg double %{{.+}}85 // CHECK: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double [[NEG]])86 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 087 return _mm_fmsub_sd(a, b, c);88}89TEST_CONSTEXPR(match_m128d(_mm_fmsub_sd((__m128d){ -4.0, 1.0 }, (__m128d){ 1.0, 2.0 }, (__m128d){ -8.0, 3.0 }), 4.0, 1.0));90 91__m128 test_mm_fnmadd_ps(__m128 a, __m128 b, __m128 c) {92 // CHECK-LABEL: test_mm_fnmadd_ps93 // CHECK: [[NEG:%.+]] = fneg <4 x float> %{{.+}}94 // CHECK: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})95 return _mm_fnmadd_ps(a, b, c);96}97TEST_CONSTEXPR(match_m128(_mm_fnmadd_ps((__m128){ 0.0f, 1.0f, -2.0f, -4.0f }, (__m128){ -0.0f, 4.0f, 2.0f, 1.0f }, (__m128){ -0.0f, -4.0f, 2.0f, 1.0f }), 0.0f, -8.0f, 6.0f, 5.0f));98 99__m128d test_mm_fnmadd_pd(__m128d a, __m128d b, __m128d c) {100 // CHECK-LABEL: test_mm_fnmadd_pd101 // CHECK: [[NEG:%.+]] = fneg <2 x double> %{{.+}}102 // CHECK: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})103 return _mm_fnmadd_pd(a, b, c);104}105TEST_CONSTEXPR(match_m128d(_mm_fnmadd_pd((__m128d){ 0.0, -4.0 }, (__m128d){ -0.0, 1.0 }, (__m128d){ -0.0, 1.0 }), 0.0, 5.0));106 107__m128 test_mm_fnmadd_ss(__m128 a, __m128 b, __m128 c) {108 // CHECK-LABEL: test_mm_fnmadd_ss109 // CHECK: extractelement <4 x float> %{{.*}}, i32 0110 // CHECK: extractelement <4 x float> %{{.*}}, i32 0111 // CHECK: [[NEG:%.+]] = fneg float %{{.+}}112 // CHECK: extractelement <4 x float> %{{.*}}, i32 0113 // CHECK: call float @llvm.fma.f32(float %{{.*}}, float [[NEG]], float %{{.*}})114 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0115 return _mm_fnmadd_ss(a, b, c);116}117TEST_CONSTEXPR(match_m128(_mm_fnmadd_ss((__m128){ -4.0f, 1.0f, -2.0f, -0.0f }, (__m128){ 2.0f, 4.0f, 2.0f, -0.0f }, (__m128){ 1.0f, -4.0f, 2.0f, 1.0f }), 9.0f, 1.0f, -2.0f, -0.0f));118 119__m128d test_mm_fnmadd_sd(__m128d a, __m128d b, __m128d c) {120 // CHECK-LABEL: test_mm_fnmadd_sd121 // CHECK: extractelement <2 x double> %{{.*}}, i32 0122 // CHECK: extractelement <2 x double> %{{.*}}, i32 0123 // CHECK: [[NEG:%.+]] = fneg double %{{.+}}124 // CHECK: extractelement <2 x double> %{{.*}}, i32 0125 // CHECK: call double @llvm.fma.f64(double %{{.*}}, double [[NEG]], double %{{.*}})126 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0127 return _mm_fnmadd_sd(a, b, c);128}129TEST_CONSTEXPR(match_m128d(_mm_fnmadd_sd((__m128d){ -4.0, 1.0 }, (__m128d){ 1.0, 2.0 }, (__m128d){ -8.0, 3.0 }), -4.0, 1.0));130 131__m128 test_mm_fnmsub_ps(__m128 a, __m128 b, __m128 c) {132 // CHECK-LABEL: test_mm_fnmsub_ps133 // CHECK: [[NEG:%.+]] = fneg <4 x float> %{{.+}}134 // CHECK: [[NEG2:%.+]] = fneg <4 x float> %{{.+}}135 // CHECK: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})136 return _mm_fnmsub_ps(a, b, c);137}138TEST_CONSTEXPR(match_m128(_mm_fnmsub_ps((__m128){ 0.0f, 1.0f, -2.0f, -4.0f }, (__m128){ -0.0f, 4.0f, 2.0f, 1.0f }, (__m128){ -0.0f, -4.0f, 2.0f, 1.0f }), 0.0f, 0.0f, 2.0f, 3.0f));139 140__m128d test_mm_fnmsub_pd(__m128d a, __m128d b, __m128d c) {141 // CHECK-LABEL: test_mm_fnmsub_pd142 // CHECK: [[NEG:%.+]] = fneg <2 x double> %{{.+}}143 // CHECK: [[NEG2:%.+]] = fneg <2 x double> %{{.+}}144 // CHECK: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})145 return _mm_fnmsub_pd(a, b, c);146}147TEST_CONSTEXPR(match_m128d(_mm_fnmsub_pd((__m128d){ 0.0, -4.0 }, (__m128d){ -0.0, 1.0 }, (__m128d){ -0.0, 1.0 }), 0.0, 3.0));148 149__m128 test_mm_fnmsub_ss(__m128 a, __m128 b, __m128 c) {150 // CHECK-LABEL: test_mm_fnmsub_ss151 // CHECK: extractelement <4 x float> %{{.*}}, i32 0152 // CHECK: extractelement <4 x float> %{{.*}}, i32 0153 // CHECK: [[NEG:%.+]] = fneg float %{{.+}}154 // CHECK: extractelement <4 x float> %{{.*}}, i32 0155 // CHECK: [[NEG2:%.+]] = fneg float %{{.+}}156 // CHECK: call float @llvm.fma.f32(float %{{.*}}, float [[NEG]], float [[NEG2]])157 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0158 return _mm_fnmsub_ss(a, b, c);159}160TEST_CONSTEXPR(match_m128(_mm_fnmsub_ss((__m128){ -4.0f, 1.0f, -2.0f, -0.0f }, (__m128){ 2.0f, 4.0f, 2.0f, -0.0f }, (__m128){ 1.0f, -4.0f, 2.0f, 1.0f }), 7.0f, 1.0f, -2.0f, -0.0f));161 162__m128d test_mm_fnmsub_sd(__m128d a, __m128d b, __m128d c) {163 // CHECK-LABEL: test_mm_fnmsub_sd164 // CHECK: extractelement <2 x double> %{{.*}}, i32 0165 // CHECK: extractelement <2 x double> %{{.*}}, i32 0166 // CHECK: [[NEG:%.+]] = fneg double %{{.+}}167 // CHECK: extractelement <2 x double> %{{.*}}, i32 0168 // CHECK: [[NEG2:%.+]] = fneg double %{{.+}}169 // CHECK: call double @llvm.fma.f64(double %{{.*}}, double [[NEG]], double [[NEG2]])170 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0171 return _mm_fnmsub_sd(a, b, c);172}173TEST_CONSTEXPR(match_m128d(_mm_fnmsub_sd((__m128d){ -4.0, 1.0 }, (__m128d){ 1.0, 2.0 }, (__m128d){ -8.0, 3.0 }), 12.0, 1.0));174 175__m128 test_mm_fmaddsub_ps(__m128 a, __m128 b, __m128 c) {176 // CHECK-LABEL: test_mm_fmaddsub_ps177 // CHECK-NOT: fneg178 // CHECK: call {{.*}}<4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})179 return _mm_fmaddsub_ps(a, b, c);180}181 182__m128d test_mm_fmaddsub_pd(__m128d a, __m128d b, __m128d c) {183 // CHECK-LABEL: test_mm_fmaddsub_pd184 // CHECK-NOT: fneg185 // CHECK: call {{.*}}<2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})186 return _mm_fmaddsub_pd(a, b, c);187}188 189__m128 test_mm_fmsubadd_ps(__m128 a, __m128 b, __m128 c) {190 // CHECK-LABEL: test_mm_fmsubadd_ps191 // CHECK: [[NEG:%.+]] = fneg <4 x float> %{{.+}}192 // CHECK: call {{.*}}<4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]])193 return _mm_fmsubadd_ps(a, b, c);194}195 196__m128d test_mm_fmsubadd_pd(__m128d a, __m128d b, __m128d c) {197 // CHECK-LABEL: test_mm_fmsubadd_pd198 // CHECK: [[NEG:%.+]] = fneg <2 x double> %{{.+}}199 // CHECK: call {{.*}}<2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]])200 return _mm_fmsubadd_pd(a, b, c);201}202 203__m256 test_mm256_fmadd_ps(__m256 a, __m256 b, __m256 c) {204 // CHECK-LABEL: test_mm256_fmadd_ps205 // CHECK: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})206 return _mm256_fmadd_ps(a, b, c);207}208TEST_CONSTEXPR(match_m256(_mm256_fmadd_ps((__m256){ 0.0f, 1.0f, -2.0f, -4.0f, -8.0f, -16.0f, 32.0f, 64.0f }, (__m256){ -0.0f, 64.0f, 32.0f, 16.0f, -8.0f, -4.0f, -2.0f, -1.0f }, (__m256){ -0.0f, -4.0f, 2.0f, 1.0f, -8.0f, -16.0f, 32.0f, 64.0f }), -0.0f, 60.0f, -62.0f, -63.0f, +56.0f, +48.0f, -32.0f, 0.0f));209 210__m256d test_mm256_fmadd_pd(__m256d a, __m256d b, __m256d c) {211 // CHECK-LABEL: test_mm256_fmadd_pd212 // CHECK: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})213 return _mm256_fmadd_pd(a, b, c);214}215TEST_CONSTEXPR(match_m256d(_mm256_fmadd_pd((__m256d){ 0.0, 1.0, -2.0, -4.0 }, (__m256d){ -0.0, 4.0, 2.0, 1.0 }, (__m256d){ -0.0, -4.0, 2.0, 1.0 }), -0.0, 0.0, -2.0, -3.0));216 217__m256 test_mm256_fmsub_ps(__m256 a, __m256 b, __m256 c) {218 // CHECK-LABEL: test_mm256_fmsub_ps219 // CHECK: [[NEG:%.+]] = fneg <8 x float> %{{.*}}220 // CHECK: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})221 return _mm256_fmsub_ps(a, b, c);222}223TEST_CONSTEXPR(match_m256(_mm256_fmsub_ps((__m256){ 0.0f, 1.0f, -2.0f, -4.0f, -8.0f, -16.0f, 32.0f, 64.0f }, (__m256){ -0.0f, 64.0f, 32.0f, 16.0f, -8.0f, -4.0f, -2.0f, -1.0f }, (__m256){ -0.0f, -4.0f, 2.0f, 1.0f, -8.0f, -16.0f, 32.0f, 64.0f }), 0.0f, 68.0f, -66.0f, -65.0f, 72.0f, 80.0f, -96.0f, -128.0f));224 225__m256d test_mm256_fmsub_pd(__m256d a, __m256d b, __m256d c) {226 // CHECK-LABEL: test_mm256_fmsub_pd227 // CHECK: [[NEG:%.+]] = fneg <4 x double> %{{.+}}228 // CHECK: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})229 return _mm256_fmsub_pd(a, b, c);230}231TEST_CONSTEXPR(match_m256d(_mm256_fmsub_pd((__m256d){ 0.0, 1.0, -2.0, -4.0 }, (__m256d){ -0.0, 4.0, 2.0, 1.0 }, (__m256d){ -0.0, -4.0, 2.0, 1.0 }), 0.0, 8.0, -6.0, -5.0));232 233__m256 test_mm256_fnmadd_ps(__m256 a, __m256 b, __m256 c) {234 // CHECK-LABEL: test_mm256_fnmadd_ps235 // CHECK: [[NEG:%.+]] = fneg <8 x float> %{{.*}}236 // CHECK: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})237 return _mm256_fnmadd_ps(a, b, c);238}239TEST_CONSTEXPR(match_m256(_mm256_fnmadd_ps((__m256){ 0.0f, 1.0f, -2.0f, -4.0f, -8.0f, -16.0f, 32.0f, 64.0f }, (__m256){ -0.0f, 64.0f, 32.0f, 16.0f, -8.0f, -4.0f, -2.0f, -1.0f }, (__m256){ -0.0f, -4.0f, 2.0f, 1.0f, -8.0f, -16.0f, 32.0f, 64.0f }), 0.0f, -68.0f, 66.0f, 65.0f, -72.0f, -80.0f, 96.0f, 128.0f));240 241__m256d test_mm256_fnmadd_pd(__m256d a, __m256d b, __m256d c) {242 // CHECK-LABEL: test_mm256_fnmadd_pd243 // CHECK: [[NEG:%.+]] = fneg <4 x double> %{{.+}}244 // CHECK: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})245 return _mm256_fnmadd_pd(a, b, c);246}247TEST_CONSTEXPR(match_m256d(_mm256_fnmadd_pd((__m256d){ 0.0, 1.0, -2.0, -4.0 }, (__m256d){ -0.0, 4.0, 2.0, 1.0 }, (__m256d){ -0.0, -4.0, 2.0, 1.0 }), 0.0, -8.0, 6.0, 5.0));248 249__m256 test_mm256_fnmsub_ps(__m256 a, __m256 b, __m256 c) {250 // CHECK-LABEL: test_mm256_fnmsub_ps251 // CHECK: [[NEG:%.+]] = fneg <8 x float> %{{.*}}252 // CHECK: [[NEG2:%.+]] = fneg <8 x float> %{{.*}}253 // CHECK: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})254 return _mm256_fnmsub_ps(a, b, c);255}256TEST_CONSTEXPR(match_m256(_mm256_fnmsub_ps((__m256){ 0.0f, 1.0f, -2.0f, -4.0f, -8.0f, -16.0f, 32.0f, 64.0f }, (__m256){ -0.0f, 64.0f, 32.0f, 16.0f, -8.0f, -4.0f, -2.0f, -1.0f }, (__m256){ -0.0f, -4.0f, 2.0f, 1.0f, -8.0f, -16.0f, 32.0f, 64.0f }), 0.0f, -60.0f, 62.0f, 63.0f, -56.0f, -48.0f, 32.0f, 0.0f));257 258__m256d test_mm256_fnmsub_pd(__m256d a, __m256d b, __m256d c) {259 // CHECK-LABEL: test_mm256_fnmsub_pd260 // CHECK: [[NEG:%.+]] = fneg <4 x double> %{{.+}}261 // CHECK: [[NEG2:%.+]] = fneg <4 x double> %{{.+}}262 // CHECK: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})263 return _mm256_fnmsub_pd(a, b, c);264}265TEST_CONSTEXPR(match_m256d(_mm256_fnmsub_pd((__m256d){ 0.0, 1.0, -2.0, -4.0 }, (__m256d){ -0.0, 4.0, 2.0, 1.0 }, (__m256d){ -0.0, -4.0, 2.0, 1.0 }), 0.0, 0.0, 2.0, 3.0));266 267__m256 test_mm256_fmaddsub_ps(__m256 a, __m256 b, __m256 c) {268 // CHECK-LABEL: test_mm256_fmaddsub_ps269 // CHECK-NOT: fneg270 // CHECK: call {{.*}}<8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})271 return _mm256_fmaddsub_ps(a, b, c);272}273 274__m256d test_mm256_fmaddsub_pd(__m256d a, __m256d b, __m256d c) {275 // CHECK-LABEL: test_mm256_fmaddsub_pd276 // CHECK-NOT: fneg277 // CHECK: call {{.*}}<4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})278 return _mm256_fmaddsub_pd(a, b, c);279}280 281__m256 test_mm256_fmsubadd_ps(__m256 a, __m256 b, __m256 c) {282 // CHECK-LABEL: test_mm256_fmsubadd_ps283 // CHECK: [[NEG:%.+]] = fneg <8 x float> %{{.+}}284 // CHECK: call {{.*}}<8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> [[NEG]])285 return _mm256_fmsubadd_ps(a, b, c);286}287 288__m256d test_mm256_fmsubadd_pd(__m256d a, __m256d b, __m256d c) {289 // CHECK-LABEL: test_mm256_fmsubadd_pd290 // CHECK: [[NEG:%.+]] = fneg <4 x double> %{{.+}}291 // CHECK: call {{.*}}<4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> [[NEG]])292 return _mm256_fmsubadd_pd(a, b, c);293}294