brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.8 KiB · 9495198 Raw
310 lines · c
1// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +fma4 -emit-llvm -o - -Wall -Werror | FileCheck %s2// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +fma4 -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 +fma4 -emit-llvm -o - -Wall -Werror | FileCheck %s4// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +fma4 -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 +fma4 -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 +fma4 -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 +fma4 -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 +fma4 -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s10 11 12#include <x86intrin.h>13#include "builtin_test_helpers.h"14 15__m128 test_mm_macc_ps(__m128 a, __m128 b, __m128 c) {16  // CHECK-LABEL: test_mm_macc_ps17  // CHECK: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})18  return _mm_macc_ps(a, b, c);19}20TEST_CONSTEXPR(match_m128(_mm_macc_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_macc_pd(__m128d a, __m128d b, __m128d c) {23  // CHECK-LABEL: test_mm_macc_pd24  // CHECK: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})25  return _mm_macc_pd(a, b, c);26}27TEST_CONSTEXPR(match_m128d(_mm_macc_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_macc_ss(__m128 a, __m128 b, __m128 c) {30  // CHECK-LABEL: test_mm_macc_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> poison, float %{{.*}}, i32 036  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 137  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 238  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 339  return _mm_macc_ss(a, b, c);40}41TEST_CONSTEXPR(match_m128(_mm_macc_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, 0.0f, 0.0f, 0.0f));42 43__m128d test_mm_macc_sd(__m128d a, __m128d b, __m128d c) {44  // CHECK-LABEL: test_mm_macc_sd45  // CHECK: extractelement <2 x double> %{{.*}}, i32 046  // CHECK: extractelement <2 x double> %{{.*}}, i32 047  // CHECK: extractelement <2 x double> %{{.*}}, i32 048  // CHECK: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double %{{.*}})49  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 050  // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 151  return _mm_macc_sd(a, b, c);52}53TEST_CONSTEXPR(match_m128d(_mm_macc_sd((__m128d){ -4.0, 1.0 }, (__m128d){ 1.0, 2.0 }, (__m128d){ -8.0, 3.0 }), -12.0, 0.0));54 55__m128 test_mm_msub_ps(__m128 a, __m128 b, __m128 c) {56  // CHECK-LABEL: test_mm_msub_ps57  // CHECK: [[NEG:%.+]] = fneg <4 x float> %{{.+}}58  // CHECK: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})59  return _mm_msub_ps(a, b, c);60}61TEST_CONSTEXPR(match_m128(_mm_msub_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));62 63__m128d test_mm_msub_pd(__m128d a, __m128d b, __m128d c) {64  // CHECK-LABEL: test_mm_msub_pd65  // CHECK: [[NEG:%.+]] = fneg <2 x double> %{{.+}}66  // CHECK: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})67  return _mm_msub_pd(a, b, c);68}69TEST_CONSTEXPR(match_m128d(_mm_msub_pd((__m128d){ 0.0, -4.0 }, (__m128d){ -0.0, 1.0 }, (__m128d){ -0.0, 1.0 }), 0.0, -5.0));70 71__m128 test_mm_msub_ss(__m128 a, __m128 b, __m128 c) {72  // CHECK-LABEL: test_mm_msub_ss73  // CHECK: extractelement <4 x float> %{{.*}}, i32 074  // CHECK: extractelement <4 x float> %{{.*}}, i32 075  // CHECK: extractelement <4 x float> %{{.*}}, i32 076  // CHECK: [[NEG:%.+]] = fneg float %{{.+}}77  // CHECK: call float @llvm.fma.f32(float %{{.*}}, float %{{.*}}, float [[NEG]])78  // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 079  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 180  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 281  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 382  return _mm_msub_ss(a, b, c);83}84TEST_CONSTEXPR(match_m128(_mm_msub_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, 0.0f, 0.0f, 0.0f));85 86__m128d test_mm_msub_sd(__m128d a, __m128d b, __m128d c) {87  // CHECK-LABEL: test_mm_msub_sd88  // CHECK: extractelement <2 x double> %{{.*}}, i32 089  // CHECK: extractelement <2 x double> %{{.*}}, i32 090  // CHECK: extractelement <2 x double> %{{.*}}, i32 091  // CHECK: [[NEG:%.+]] = fneg double %{{.+}}92  // CHECK: call double @llvm.fma.f64(double %{{.*}}, double %{{.*}}, double [[NEG]])93  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 094  // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 195  return _mm_msub_sd(a, b, c);96}97TEST_CONSTEXPR(match_m128d(_mm_msub_sd((__m128d){ -4.0, 1.0 }, (__m128d){ 1.0, 2.0 }, (__m128d){ -8.0, 3.0 }), 4.0, 0.0));98 99__m128 test_mm_nmacc_ps(__m128 a, __m128 b, __m128 c) {100  // CHECK-LABEL: test_mm_nmacc_ps101  // CHECK: [[NEG:%.+]] = fneg <4 x float> %{{.+}}102  // CHECK: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})103  return _mm_nmacc_ps(a, b, c);104}105TEST_CONSTEXPR(match_m128(_mm_nmacc_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));106 107__m128d test_mm_nmacc_pd(__m128d a, __m128d b, __m128d c) {108  // CHECK-LABEL: test_mm_nmacc_pd109  // CHECK: [[NEG:%.+]] = fneg <2 x double> %{{.+}}110  // CHECK: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})111  return _mm_nmacc_pd(a, b, c);112}113TEST_CONSTEXPR(match_m128d(_mm_nmacc_pd((__m128d){ 0.0, -4.0 }, (__m128d){ -0.0, 1.0 }, (__m128d){ -0.0, 1.0 }), 0.0, 5.0));114 115__m128 test_mm_nmacc_ss(__m128 a, __m128 b, __m128 c) {116  // CHECK-LABEL: test_mm_nmacc_ss117  // CHECK: extractelement <4 x float> %{{.*}}, i32 0118  // CHECK: [[NEG:%.+]] = fneg float %{{.+}}119  // CHECK: extractelement <4 x float> %{{.*}}, i32 0120  // CHECK: extractelement <4 x float> %{{.*}}, i32 0121  // CHECK: call float @llvm.fma.f32(float [[NEG]], float %{{.*}}, float %{{.*}})122  // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 0123  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 1124  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 2125  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 3126  return _mm_nmacc_ss(a, b, c);127}128TEST_CONSTEXPR(match_m128(_mm_nmacc_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, 0.0f, 0.0f, 0.0f));129 130__m128d test_mm_nmacc_sd(__m128d a, __m128d b, __m128d c) {131  // CHECK-LABEL: test_mm_nmacc_sd132  // CHECK: extractelement <2 x double> %{{.*}}, i32 0133  // CHECK: [[NEG:%.+]] = fneg double %{{.+}}134  // CHECK: extractelement <2 x double> %{{.*}}, i32 0135  // CHECK: extractelement <2 x double> %{{.*}}, i32 0136  // CHECK: call double @llvm.fma.f64(double [[NEG]], double %{{.*}}, double %{{.*}})137  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0138  // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 1139  return _mm_nmacc_sd(a, b, c);140}141TEST_CONSTEXPR(match_m128d(_mm_nmacc_sd((__m128d){ -4.0, 1.0 }, (__m128d){ 1.0, 2.0 }, (__m128d){ -8.0, 3.0 }), -4.0, 0.0));142 143__m128 test_mm_nmsub_ps(__m128 a, __m128 b, __m128 c) {144  // CHECK-LABEL: test_mm_nmsub_ps145  // CHECK: [[NEG:%.+]] = fneg <4 x float> %{{.+}}146  // CHECK: [[NEG2:%.+]] = fneg <4 x float> %{{.+}}147  // CHECK: call {{.*}}<4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})148  return _mm_nmsub_ps(a, b, c);149}150TEST_CONSTEXPR(match_m128(_mm_nmsub_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));151 152__m128d test_mm_nmsub_pd(__m128d a, __m128d b, __m128d c) {153  // CHECK-LABEL: test_mm_nmsub_pd154  // CHECK: [[NEG:%.+]] = fneg <2 x double> %{{.+}}155  // CHECK: [[NEG2:%.+]] = fneg <2 x double> %{{.+}}156  // CHECK: call {{.*}}<2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})157  return _mm_nmsub_pd(a, b, c);158}159TEST_CONSTEXPR(match_m128d(_mm_nmsub_pd((__m128d){ 0.0, -4.0 }, (__m128d){ -0.0, 1.0 }, (__m128d){ -0.0, 1.0 }), 0.0, 3.0));160 161__m128 test_mm_nmsub_ss(__m128 a, __m128 b, __m128 c) {162  // CHECK-LABEL: test_mm_nmsub_ss163  // CHECK: extractelement <4 x float> %{{.*}}, i32 0164  // CHECK: [[NEG:%.+]] = fneg float %{{.+}}165  // CHECK: extractelement <4 x float> %{{.*}}, i32 0166  // CHECK: extractelement <4 x float> %{{.*}}, i32 0167  // CHECK: [[NEG2:%.+]] = fneg float %{{.+}}168  // CHECK: call float @llvm.fma.f32(float [[NEG]], float %{{.*}}, float [[NEG2]])169  // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 0170  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 1171  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 2172  // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i32 3173  return _mm_nmsub_ss(a, b, c);174}175TEST_CONSTEXPR(match_m128(_mm_nmsub_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, 0.0f, 0.0f, 0.0f));176 177__m128d test_mm_nmsub_sd(__m128d a, __m128d b, __m128d c) {178  // CHECK-LABEL: test_mm_nmsub_sd179  // CHECK: extractelement <2 x double> %{{.*}}, i32 0180  // CHECK: [[NEG:%.+]] = fneg double %{{.+}}181  // CHECK: extractelement <2 x double> %{{.*}}, i32 0182  // CHECK: extractelement <2 x double> %{{.*}}, i32 0183  // CHECK: [[NEG2:%.+]] = fneg double %{{.+}}184  // CHECK: call double @llvm.fma.f64(double [[NEG]], double %{{.*}}, double [[NEG2]])185  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 0186  // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i32 1187  return _mm_nmsub_sd(a, b, c);188}189TEST_CONSTEXPR(match_m128d(_mm_nmsub_sd((__m128d){ -4.0, 1.0 }, (__m128d){ 1.0, 2.0 }, (__m128d){ -8.0, 3.0 }), 12.0, 0.0));190 191__m128 test_mm_maddsub_ps(__m128 a, __m128 b, __m128 c) {192  // CHECK-LABEL: test_mm_maddsub_ps193  // CHECK-NOT: fneg194  // CHECK: call {{.*}}<4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})195  return _mm_maddsub_ps(a, b, c);196}197 198__m128d test_mm_maddsub_pd(__m128d a, __m128d b, __m128d c) {199  // CHECK-LABEL: test_mm_maddsub_pd200  // CHECK-NOT: fneg201  // CHECK: call {{.*}}<2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})202  return _mm_maddsub_pd(a, b, c);203}204 205__m128 test_mm_msubadd_ps(__m128 a, __m128 b, __m128 c) {206  // CHECK-LABEL: test_mm_msubadd_ps207  // CHECK: [[NEG:%.+]] = fneg <4 x float> %{{.+}}208  // CHECK: call {{.*}}<4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]])209  return _mm_msubadd_ps(a, b, c);210}211 212__m128d test_mm_msubadd_pd(__m128d a, __m128d b, __m128d c) {213  // CHECK-LABEL: test_mm_msubadd_pd214  // CHECK: [[NEG:%.+]] = fneg <2 x double> %{{.+}}215  // CHECK: call {{.*}}<2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]])216  return _mm_msubadd_pd(a, b, c);217}218 219__m256 test_mm256_macc_ps(__m256 a, __m256 b, __m256 c) {220  // CHECK-LABEL: test_mm256_macc_ps221  // CHECK: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})222  return _mm256_macc_ps(a, b, c);223}224TEST_CONSTEXPR(match_m256(_mm256_macc_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));225 226__m256d test_mm256_macc_pd(__m256d a, __m256d b, __m256d c) {227  // CHECK-LABEL: test_mm256_macc_pd228  // CHECK: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})229  return _mm256_macc_pd(a, b, c);230}231TEST_CONSTEXPR(match_m256d(_mm256_macc_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));232 233__m256 test_mm256_msub_ps(__m256 a, __m256 b, __m256 c) {234  // CHECK-LABEL: test_mm256_msub_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_msub_ps(a, b, c);238}239TEST_CONSTEXPR(match_m256(_mm256_msub_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_msub_pd(__m256d a, __m256d b, __m256d c) {242  // CHECK-LABEL: test_mm256_msub_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_msub_pd(a, b, c);246}247TEST_CONSTEXPR(match_m256d(_mm256_msub_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_nmacc_ps(__m256 a, __m256 b, __m256 c) {250  // CHECK-LABEL: test_mm256_nmacc_ps251  // CHECK: [[NEG:%.+]] = fneg <8 x float> %{{.*}}252  // CHECK: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})253  return _mm256_nmacc_ps(a, b, c);254}255TEST_CONSTEXPR(match_m256(_mm256_nmacc_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));256 257__m256d test_mm256_nmacc_pd(__m256d a, __m256d b, __m256d c) {258  // CHECK-LABEL: test_mm256_nmacc_pd259  // CHECK: [[NEG:%.+]] = fneg <4 x double> %{{.+}}260  // CHECK: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})261  return _mm256_nmacc_pd(a, b, c);262}263TEST_CONSTEXPR(match_m256d(_mm256_nmacc_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));264 265__m256 test_mm256_nmsub_ps(__m256 a, __m256 b, __m256 c) {266  // CHECK-LABEL: test_mm256_nmsub_ps267  // CHECK: [[NEG:%.+]] = fneg <8 x float> %{{.*}}268  // CHECK: [[NEG2:%.+]] = fneg <8 x float> %{{.*}}269  // CHECK: call {{.*}}<8 x float> @llvm.fma.v8f32(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})270  return _mm256_nmsub_ps(a, b, c);271}272TEST_CONSTEXPR(match_m256(_mm256_nmsub_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));273 274__m256d test_mm256_nmsub_pd(__m256d a, __m256d b, __m256d c) {275  // CHECK-LABEL: test_mm256_nmsub_pd276  // CHECK: [[NEG:%.+]] = fneg <4 x double> %{{.+}}277  // CHECK: [[NEG2:%.+]] = fneg <4 x double> %{{.+}}278  // CHECK: call {{.*}}<4 x double> @llvm.fma.v4f64(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})279  return _mm256_nmsub_pd(a, b, c);280}281TEST_CONSTEXPR(match_m256d(_mm256_nmsub_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));282 283__m256 test_mm256_maddsub_ps(__m256 a, __m256 b, __m256 c) {284  // CHECK-LABEL: test_mm256_maddsub_ps285  // CHECK-NOT: fneg286  // CHECK: call {{.*}}<8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> %{{.*}})287  return _mm256_maddsub_ps(a, b, c);288}289 290__m256d test_mm256_maddsub_pd(__m256d a, __m256d b, __m256d c) {291  // CHECK-LABEL: test_mm256_maddsub_pd292  // CHECK-NOT: fneg293  // CHECK: call {{.*}}<4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> %{{.*}})294  return _mm256_maddsub_pd(a, b, c);295}296 297__m256 test_mm256_msubadd_ps(__m256 a, __m256 b, __m256 c) {298  // CHECK-LABEL: test_mm256_msubadd_ps299  // CHECK: [[NEG:%.+]] = fneg <8 x float> %{{.*}}300  // CHECK: call {{.*}}<8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x float> [[NEG]])301  return _mm256_msubadd_ps(a, b, c);302}303 304__m256d test_mm256_msubadd_pd(__m256d a, __m256d b, __m256d c) {305  // CHECK-LABEL: test_mm256_msubadd_pd306  // CHECK: [[NEG:%.+]] = fneg <4 x double> {{.+}}307  // CHECK: call {{.*}}<4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x double> [[NEG]])308  return _mm256_msubadd_pd(a, b, c);309}310