brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.7 KiB · ea93bca Raw
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