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