brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.9 KiB · fa96093 Raw
566 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512bw -mattr=+avx512vl -mattr=+avx512dq  | FileCheck %s  --check-prefix=CHECK --check-prefix=SKX3; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f -mattr=+fma | FileCheck %s --check-prefix=CHECK --check-prefix=KNL4 5; This test checks combinations of FNEG and FMA intrinsics on AVX-512 target6; PR288927 8declare <8 x float> @llvm.fma.v8f32(<8 x float>, <8 x float>, <8 x float>)9declare <16 x float> @llvm.fma.v16f32(<16 x float>, <16 x float>, <16 x float>)10declare <16 x float> @llvm.x86.avx512.vfmadd.ps.512(<16 x float>, <16 x float>, <16 x float>, i32)11declare <16 x float> @llvm.x86.avx512.mask.vfnmadd.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)12declare <16 x float> @llvm.x86.avx512.mask.vfnmsub.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)13declare <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float>, <8 x float>, <8 x float>)14declare <8 x double> @llvm.x86.avx512.vfmadd.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %c, i32)15declare <2 x double> @llvm.x86.avx512.mask.vfmadd.sd(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8, i32)16declare <4 x float> @llvm.x86.avx512.mask3.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>, i8, i32)17declare <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>, i8, i32)18declare <16 x float> @llvm.x86.avx512.vfmaddsub.ps.512(<16 x float>, <16 x float>, <16 x float>, i32)19declare <8 x double> @llvm.x86.avx512.vfmaddsub.pd.512(<8 x double>, <8 x double>, <8 x double>, i32)20 21define <16 x float> @test1(<16 x float> %a, <16 x float> %b, <16 x float> %c)  {22; CHECK-LABEL: test1:23; CHECK:       # %bb.0:24; CHECK-NEXT:    vfmsub213ps {{.*#+}} zmm0 = (zmm1 * zmm0) - zmm225; CHECK-NEXT:    retq26  %sub.i = fneg <16 x float> %c27  %t0 = tail call <16 x float> @llvm.x86.avx512.vfmadd.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %sub.i, i32 4)28  ret <16 x float> %t029}30 31define <16 x float> @test2(<16 x float> %a, <16 x float> %b, <16 x float> %c) {32; SKX-LABEL: test2:33; SKX:       # %bb.0:34; SKX-NEXT:    vfmadd213ps {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm235; SKX-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm036; SKX-NEXT:    retq37;38; KNL-LABEL: test2:39; KNL:       # %bb.0:40; KNL-NEXT:    vfmadd213ps {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm241; KNL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm042; KNL-NEXT:    retq43  %fma = call <16 x float> @llvm.fma.v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %c)44  %neg = fneg <16 x float> %fma45  ret <16 x float> %neg46}47 48define <16 x float> @test2_nsz(<16 x float> %a, <16 x float> %b, <16 x float> %c) {49; CHECK-LABEL: test2_nsz:50; CHECK:       # %bb.0:51; CHECK-NEXT:    vfnmsub213ps {{.*#+}} zmm0 = -(zmm1 * zmm0) - zmm252; CHECK-NEXT:    retq53  %fma = call nsz <16 x float> @llvm.fma.v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %c)54  %neg = fneg <16 x float> %fma55  ret <16 x float> %neg56}57 58define <16 x float> @test3(<16 x float> %a, <16 x float> %b, <16 x float> %c)  {59; SKX-LABEL: test3:60; SKX:       # %bb.0:61; SKX-NEXT:    vfnmadd213ps {{.*#+}} zmm0 = -(zmm1 * zmm0) + zmm262; SKX-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm063; SKX-NEXT:    retq64;65; KNL-LABEL: test3:66; KNL:       # %bb.0:67; KNL-NEXT:    vfnmadd213ps {{.*#+}} zmm0 = -(zmm1 * zmm0) + zmm268; KNL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm069; KNL-NEXT:    retq70  %t0 = fneg <16 x float> %b71  %t1 = call <16 x float> @llvm.fma.v16f32(<16 x float> %a, <16 x float> %t0, <16 x float> %c)72  %sub.i = fneg <16 x float> %t173  ret <16 x float> %sub.i74}75 76define <16 x float> @test3_nsz(<16 x float> %a, <16 x float> %b, <16 x float> %c)  {77; CHECK-LABEL: test3_nsz:78; CHECK:       # %bb.0:79; CHECK-NEXT:    vfmsub213ps {{.*#+}} zmm0 = (zmm1 * zmm0) - zmm280; CHECK-NEXT:    retq81  %t0 = fneg <16 x float> %b82  %t1 = call nsz <16 x float> @llvm.fma.v16f32(<16 x float> %a, <16 x float> %t0, <16 x float> %c)83  %sub.i = fneg <16 x float> %t184  ret <16 x float> %sub.i85}86 87define <16 x float> @test4(<16 x float> %a, <16 x float> %b, <16 x float> %c) {88; SKX-LABEL: test4:89; SKX:       # %bb.0:90; SKX-NEXT:    vfnmsub213ps {{.*#+}} zmm0 = -(zmm1 * zmm0) - zmm291; SKX-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm092; SKX-NEXT:    retq93;94; KNL-LABEL: test4:95; KNL:       # %bb.0:96; KNL-NEXT:    vfnmsub213ps {{.*#+}} zmm0 = -(zmm1 * zmm0) - zmm297; KNL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm098; KNL-NEXT:    retq99  %t0 = fneg <16 x float> %b100  %t1 = fneg <16 x float> %c101  %t2 = call <16 x float> @llvm.fma.v16f32(<16 x float> %a, <16 x float> %t0, <16 x float> %t1)102  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %t2103  ret <16 x float> %sub.i104}105 106define <16 x float> @test4_nsz(<16 x float> %a, <16 x float> %b, <16 x float> %c) {107; CHECK-LABEL: test4_nsz:108; CHECK:       # %bb.0:109; CHECK-NEXT:    vfmadd213ps {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm2110; CHECK-NEXT:    retq111  %t0 = fneg <16 x float> %b112  %t1 = fneg <16 x float> %c113  %t2 = call nsz <16 x float> @llvm.fma.v16f32(<16 x float> %a, <16 x float> %t0, <16 x float> %t1)114  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %t2115  ret <16 x float> %sub.i116}117 118define <16 x float> @test5(<16 x float> %a, <16 x float> %b, <16 x float> %c) {119; CHECK-LABEL: test5:120; CHECK:       # %bb.0: # %entry121; CHECK-NEXT:    vfmsub213ps {ru-sae}, %zmm2, %zmm1, %zmm0122; CHECK-NEXT:    retq123entry:124  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %c125  %0 = tail call <16 x float> @llvm.x86.avx512.vfmadd.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %sub.i, i32 10) #2126  ret <16 x float> %0127}128 129define <16 x float> @test6(<16 x float> %a, <16 x float> %b, <16 x float> %c) {130; SKX-LABEL: test6:131; SKX:       # %bb.0:132; SKX-NEXT:    vfnmsub213ps {ru-sae}, %zmm2, %zmm1, %zmm0133; SKX-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0134; SKX-NEXT:    retq135;136; KNL-LABEL: test6:137; KNL:       # %bb.0:138; KNL-NEXT:    vfnmsub213ps {ru-sae}, %zmm2, %zmm1, %zmm0139; KNL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0140; KNL-NEXT:    retq141  %t0 = fneg <16 x float> %b142  %t1 = fneg <16 x float> %c143  %t2 = call <16 x float> @llvm.x86.avx512.vfmadd.ps.512(<16 x float> %a, <16 x float> %t0, <16 x float> %t1, i32 10)144  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %t2145  ret <16 x float> %sub.i146}147 148define <16 x float> @test6_nsz(<16 x float> %a, <16 x float> %b, <16 x float> %c) {149; CHECK-LABEL: test6_nsz:150; CHECK:       # %bb.0:151; CHECK-NEXT:    vfmadd213ps {ru-sae}, %zmm2, %zmm1, %zmm0152; CHECK-NEXT:    retq153  %t0 = fneg <16 x float> %b154  %t1 = fneg <16 x float> %c155  %t2 = call nsz <16 x float> @llvm.x86.avx512.vfmadd.ps.512(<16 x float> %a, <16 x float> %t0, <16 x float> %t1, i32 10)156  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %t2157  ret <16 x float> %sub.i158}159 160define <8 x float> @test7(<8 x float> %a, <8 x float> %b, <8 x float> %c) {161; SKX-LABEL: test7:162; SKX:       # %bb.0:163; SKX-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - ymm2164; SKX-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0165; SKX-NEXT:    retq166;167; KNL-LABEL: test7:168; KNL:       # %bb.0:169; KNL-NEXT:    vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - ymm2170; KNL-NEXT:    vbroadcastss {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]171; KNL-NEXT:    vxorps %ymm1, %ymm0, %ymm0172; KNL-NEXT:    retq173  %t0 = fneg <8 x float> %c174  %t1 = call <8 x float> @llvm.fma.v8f32(<8 x float> %a, <8 x float> %b, <8 x float> %t0)175  %sub.i = fsub <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %t1176  ret <8 x float> %sub.i177}178 179define <8 x float> @test7_nsz(<8 x float> %a, <8 x float> %b, <8 x float> %c) {180; CHECK-LABEL: test7_nsz:181; CHECK:       # %bb.0:182; CHECK-NEXT:    vfnmadd213ps {{.*#+}} ymm0 = -(ymm1 * ymm0) + ymm2183; CHECK-NEXT:    retq184  %t0 = fneg <8 x float> %c185  %t1 = call nsz <8 x float> @llvm.fma.v8f32(<8 x float> %a, <8 x float> %b, <8 x float> %t0)186  %sub.i = fsub <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %t1187  ret <8 x float> %sub.i188}189 190define <8 x float> @test8(<8 x float> %a, <8 x float> %b, <8 x float> %c) {191; CHECK-LABEL: test8:192; CHECK:       # %bb.0: # %entry193; CHECK-NEXT:    vfmadd213ps {{.*#+}} ymm0 = (ymm1 * ymm0) + ymm2194; CHECK-NEXT:    retq195entry:196  %sub.c = fsub <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %c197  %0 = tail call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %sub.c) #2198  ret <8 x float> %0199}200 201define <8 x double> @test9(<8 x double> %a, <8 x double> %b, <8 x double> %c) {202; SKX-LABEL: test9:203; SKX:       # %bb.0:204; SKX-NEXT:    vfmadd213pd {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm2205; SKX-NEXT:    vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0206; SKX-NEXT:    retq207;208; KNL-LABEL: test9:209; KNL:       # %bb.0:210; KNL-NEXT:    vfmadd213pd {{.*#+}} zmm0 = (zmm1 * zmm0) + zmm2211; KNL-NEXT:    vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0212; KNL-NEXT:    retq213  %t0 = tail call <8 x double> @llvm.x86.avx512.vfmadd.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %c, i32 4)214  %sub.i = fneg <8 x double> %t0215  ret <8 x double> %sub.i216}217 218define <8 x double> @test9_nsz(<8 x double> %a, <8 x double> %b, <8 x double> %c) {219; CHECK-LABEL: test9_nsz:220; CHECK:       # %bb.0:221; CHECK-NEXT:    vfnmsub213pd {{.*#+}} zmm0 = -(zmm1 * zmm0) - zmm2222; CHECK-NEXT:    retq223  %t0 = tail call nsz <8 x double> @llvm.x86.avx512.vfmadd.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %c, i32 4)224  %sub.i = fneg <8 x double> %t0225  ret <8 x double> %sub.i226}227 228define <2 x double> @test10(<2 x double> %a, <2 x double> %b, <2 x double> %c) {229; SKX-LABEL: test10:230; SKX:       # %bb.0: # %entry231; SKX-NEXT:    vfmadd213sd {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2232; SKX-NEXT:    vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0233; SKX-NEXT:    retq234;235; KNL-LABEL: test10:236; KNL:       # %bb.0: # %entry237; KNL-NEXT:    vfmadd213sd {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2238; KNL-NEXT:    vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0239; KNL-NEXT:    retq240entry:241  %0 = tail call <2 x double> @llvm.x86.avx512.mask.vfmadd.sd(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 -1, i32 4) #2242  %sub.i = fsub <2 x double> <double -0.0, double -0.0>, %0243  ret <2 x double> %sub.i244}245 246define <4 x float> @test11(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {247; SKX-LABEL: test11:248; SKX:       # %bb.0: # %entry249; SKX-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm3250; SKX-NEXT:    vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2251; SKX-NEXT:    kmovd %edi, %k1252; SKX-NEXT:    vmovss %xmm0, %xmm3, %xmm3 {%k1}253; SKX-NEXT:    vmovaps %xmm3, %xmm0254; SKX-NEXT:    retq255;256; KNL-LABEL: test11:257; KNL:       # %bb.0: # %entry258; KNL-NEXT:    vbroadcastss {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]259; KNL-NEXT:    vxorps %xmm3, %xmm2, %xmm3260; KNL-NEXT:    vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2261; KNL-NEXT:    kmovw %edi, %k1262; KNL-NEXT:    vmovss %xmm0, %xmm3, %xmm3 {%k1}263; KNL-NEXT:    vmovaps %xmm3, %xmm0264; KNL-NEXT:    retq265entry:266  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %c267  %0 = tail call <4 x float> @llvm.x86.avx512.mask3.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %sub.i, i8 %mask, i32 4) #10268  ret <4 x float> %0269}270 271define <4 x float> @test11b(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {272; SKX-LABEL: test11b:273; SKX:       # %bb.0: # %entry274; SKX-NEXT:    kmovd %edi, %k1275; SKX-NEXT:    vfmsub213ss {{.*#+}} xmm0 {%k1} = (xmm1 * xmm0) - xmm2276; SKX-NEXT:    retq277;278; KNL-LABEL: test11b:279; KNL:       # %bb.0: # %entry280; KNL-NEXT:    kmovw %edi, %k1281; KNL-NEXT:    vfmsub213ss {{.*#+}} xmm0 {%k1} = (xmm1 * xmm0) - xmm2282; KNL-NEXT:    retq283entry:284  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %c285  %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %sub.i, i8 %mask, i32 4) #10286  ret <4 x float> %0287}288 289define <8 x double> @test12(<8 x double> %a, <8 x double> %b, <8 x double> %c, i8 %mask) {290; SKX-LABEL: test12:291; SKX:       # %bb.0: # %entry292; SKX-NEXT:    kmovd %edi, %k1293; SKX-NEXT:    vfmadd132pd {{.*#+}} zmm0 {%k1} = (zmm0 * zmm1) + zmm2294; SKX-NEXT:    vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0295; SKX-NEXT:    retq296;297; KNL-LABEL: test12:298; KNL:       # %bb.0: # %entry299; KNL-NEXT:    kmovw %edi, %k1300; KNL-NEXT:    vfmadd132pd {{.*#+}} zmm0 {%k1} = (zmm0 * zmm1) + zmm2301; KNL-NEXT:    vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0302; KNL-NEXT:    retq303entry:304  %0 = tail call <8 x double> @llvm.x86.avx512.vfmadd.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %c, i32 4) #2305  %bc = bitcast i8 %mask to <8 x i1>306  %sel = select <8 x i1> %bc, <8 x double> %0, <8 x double> %a307  %sub.i = fsub <8 x double> <double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0>, %sel308  ret <8 x double> %sub.i309}310 311define <2 x double> @test13(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 %mask) {312; SKX-LABEL: test13:313; SKX:       # %bb.0: # %entry314; SKX-NEXT:    vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm3315; SKX-NEXT:    vfnmadd213sd {{.*#+}} xmm1 = -(xmm0 * xmm1) + xmm2316; SKX-NEXT:    kmovd %edi, %k1317; SKX-NEXT:    vmovsd %xmm1, %xmm3, %xmm3 {%k1}318; SKX-NEXT:    vmovapd %xmm3, %xmm0319; SKX-NEXT:    retq320;321; KNL-LABEL: test13:322; KNL:       # %bb.0: # %entry323; KNL-NEXT:    vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3324; KNL-NEXT:    vfnmadd213sd {{.*#+}} xmm1 = -(xmm0 * xmm1) + xmm2325; KNL-NEXT:    kmovw %edi, %k1326; KNL-NEXT:    vmovsd %xmm1, %xmm3, %xmm3 {%k1}327; KNL-NEXT:    vmovapd %xmm3, %xmm0328; KNL-NEXT:    retq329entry:330  %sub.i = fsub <2 x double> <double -0.0, double -0.0>, %a331  %0 = tail call <2 x double> @llvm.x86.avx512.mask.vfmadd.sd(<2 x double> %sub.i, <2 x double> %b, <2 x double> %c, i8 %mask, i32 4)332  ret <2 x double> %0333}334 335define <16 x float> @test14(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 %mask) {336; SKX-LABEL: test14:337; SKX:       # %bb.0: # %entry338; SKX-NEXT:    kmovd %edi, %k1339; SKX-NEXT:    vfnmsub132ps {ru-sae}, %zmm1, %zmm2, %zmm0 {%k1}340; SKX-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0341; SKX-NEXT:    retq342;343; KNL-LABEL: test14:344; KNL:       # %bb.0: # %entry345; KNL-NEXT:    kmovw %edi, %k1346; KNL-NEXT:    vfnmsub132ps {ru-sae}, %zmm1, %zmm2, %zmm0 {%k1}347; KNL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0348; KNL-NEXT:    retq349entry:350  %0 = tail call <16 x float> @llvm.x86.avx512.mask.vfnmsub.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 %mask, i32 10) #2351  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %0352  ret <16 x float> %sub.i353}354 355define <16 x float> @test15(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 %mask)  {356; SKX-LABEL: test15:357; SKX:       # %bb.0: # %entry358; SKX-NEXT:    kmovd %edi, %k1359; SKX-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm3360; SKX-NEXT:    vfnmadd213ps {ru-sae}, %zmm2, %zmm0, %zmm1361; SKX-NEXT:    vmovaps %zmm1, %zmm3 {%k1}362; SKX-NEXT:    vfnmadd132ps {rd-sae}, %zmm0, %zmm2, %zmm3 {%k1}363; SKX-NEXT:    vmovaps %zmm3, %zmm0364; SKX-NEXT:    retq365;366; KNL-LABEL: test15:367; KNL:       # %bb.0: # %entry368; KNL-NEXT:    kmovw %edi, %k1369; KNL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm3370; KNL-NEXT:    vfnmadd213ps {ru-sae}, %zmm2, %zmm0, %zmm1371; KNL-NEXT:    vmovaps %zmm1, %zmm3 {%k1}372; KNL-NEXT:    vfnmadd132ps {rd-sae}, %zmm0, %zmm2, %zmm3 {%k1}373; KNL-NEXT:    vmovaps %zmm3, %zmm0374; KNL-NEXT:    retq375entry:376  %bc = bitcast i16 %mask to <16 x i1>377  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %a378  %0 = tail call <16 x float> @llvm.x86.avx512.vfmadd.ps.512(<16 x float> %sub.i, <16 x float> %b, <16 x float> %c, i32 10)379  %sel = select <16 x i1> %bc, <16 x float> %0, <16 x float> %sub.i380  %1 = tail call <16 x float> @llvm.x86.avx512.vfmadd.ps.512(<16 x float> %sel, <16 x float> %sub.i, <16 x float> %c, i32 9)381  %sel2 = select <16 x i1> %bc, <16 x float> %1, <16 x float> %sel382  ret <16 x float> %sel2383}384 385define <16 x float> @test16(<16 x float> %a, <16 x float> %b, <16 x float> %c, i16 %mask) {386; SKX-LABEL: test16:387; SKX:       # %bb.0:388; SKX-NEXT:    kmovd %edi, %k1389; SKX-NEXT:    vfmsubadd132ps {rd-sae}, %zmm1, %zmm2, %zmm0 {%k1}390; SKX-NEXT:    retq391;392; KNL-LABEL: test16:393; KNL:       # %bb.0:394; KNL-NEXT:    kmovw %edi, %k1395; KNL-NEXT:    vfmsubadd132ps {rd-sae}, %zmm1, %zmm2, %zmm0 {%k1}396; KNL-NEXT:    retq397  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %c398  %res = call <16 x float> @llvm.x86.avx512.vfmaddsub.ps.512(<16 x float> %a, <16 x float> %b, <16 x float> %sub.i, i32 9)399  %bc = bitcast i16 %mask to <16 x i1>400  %sel = select <16 x i1> %bc, <16 x float> %res, <16 x float> %a401  ret <16 x float> %sel402}403 404define <8 x double> @test17(<8 x double> %a, <8 x double> %b, <8 x double> %c, i8 %mask) {405; SKX-LABEL: test17:406; SKX:       # %bb.0:407; SKX-NEXT:    kmovd %edi, %k1408; SKX-NEXT:    vfmsubadd132pd {{.*#+}} zmm0 {%k1} = (zmm0 * zmm1) -/+ zmm2409; SKX-NEXT:    retq410;411; KNL-LABEL: test17:412; KNL:       # %bb.0:413; KNL-NEXT:    kmovw %edi, %k1414; KNL-NEXT:    vfmsubadd132pd {{.*#+}} zmm0 {%k1} = (zmm0 * zmm1) -/+ zmm2415; KNL-NEXT:    retq416  %sub.i = fsub <8 x double> <double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0>, %c417  %res = call <8 x double> @llvm.x86.avx512.vfmaddsub.pd.512(<8 x double> %a, <8 x double> %b, <8 x double> %sub.i, i32 4)418  %bc = bitcast i8 %mask to <8 x i1>419  %sel = select <8 x i1> %bc, <8 x double> %res, <8 x double> %a420  ret <8 x double> %sel421}422 423define <4 x float> @test18(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {424; SKX-LABEL: test18:425; SKX:       # %bb.0: # %entry426; SKX-NEXT:    kmovd %edi, %k1427; SKX-NEXT:    vfnmadd213ss {{.*#+}} xmm0 {%k1} = -(xmm1 * xmm0) + xmm2428; SKX-NEXT:    retq429;430; KNL-LABEL: test18:431; KNL:       # %bb.0: # %entry432; KNL-NEXT:    kmovw %edi, %k1433; KNL-NEXT:    vfnmadd213ss {{.*#+}} xmm0 {%k1} = -(xmm1 * xmm0) + xmm2434; KNL-NEXT:    retq435entry:436  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %b437  %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %c, i8 %mask, i32 4) #10438  ret <4 x float> %0439}440 441define <4 x float> @test19(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {442; SKX-LABEL: test19:443; SKX:       # %bb.0: # %entry444; SKX-NEXT:    kmovd %edi, %k1445; SKX-NEXT:    vfnmsub213ss {{.*#+}} xmm0 {%k1} = -(xmm1 * xmm0) - xmm2446; SKX-NEXT:    retq447;448; KNL-LABEL: test19:449; KNL:       # %bb.0: # %entry450; KNL-NEXT:    kmovw %edi, %k1451; KNL-NEXT:    vfnmsub213ss {{.*#+}} xmm0 {%k1} = -(xmm1 * xmm0) - xmm2452; KNL-NEXT:    retq453entry:454  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %b455  %sub.i.2 = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %c456  %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %sub.i.2, i8 %mask, i32 4) #10457  ret <4 x float> %0458}459 460define <4 x float> @test20(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {461; SKX-LABEL: test20:462; SKX:       # %bb.0: # %entry463; SKX-NEXT:    kmovd %edi, %k1464; SKX-NEXT:    vfnmadd231ss {{.*#+}} xmm2 {%k1} = -(xmm0 * xmm1) + xmm2465; SKX-NEXT:    vmovaps %xmm2, %xmm0466; SKX-NEXT:    retq467;468; KNL-LABEL: test20:469; KNL:       # %bb.0: # %entry470; KNL-NEXT:    kmovw %edi, %k1471; KNL-NEXT:    vfnmadd231ss {{.*#+}} xmm2 {%k1} = -(xmm0 * xmm1) + xmm2472; KNL-NEXT:    vmovaps %xmm2, %xmm0473; KNL-NEXT:    retq474entry:475  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %b476  %0 = tail call <4 x float> @llvm.x86.avx512.mask3.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %c, i8 %mask, i32 4) #10477  ret <4 x float> %0478}479 480define <4 x float> @test21(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {481; SKX-LABEL: test21:482; SKX:       # %bb.0: # %entry483; SKX-NEXT:    kmovd %edi, %k1484; SKX-NEXT:    vfnmadd213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}485; SKX-NEXT:    retq486;487; KNL-LABEL: test21:488; KNL:       # %bb.0: # %entry489; KNL-NEXT:    kmovw %edi, %k1490; KNL-NEXT:    vfnmadd213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}491; KNL-NEXT:    retq492entry:493  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %b494  %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %c, i8 %mask, i32 8) #10495  ret <4 x float> %0496}497 498define <4 x float> @test22(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {499; SKX-LABEL: test22:500; SKX:       # %bb.0: # %entry501; SKX-NEXT:    kmovd %edi, %k1502; SKX-NEXT:    vfnmsub213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}503; SKX-NEXT:    retq504;505; KNL-LABEL: test22:506; KNL:       # %bb.0: # %entry507; KNL-NEXT:    kmovw %edi, %k1508; KNL-NEXT:    vfnmsub213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}509; KNL-NEXT:    retq510entry:511  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %b512  %sub.i.2 = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %c513  %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %sub.i.2, i8 %mask, i32 8) #10514  ret <4 x float> %0515}516 517define <4 x float> @test23(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {518; SKX-LABEL: test23:519; SKX:       # %bb.0: # %entry520; SKX-NEXT:    kmovd %edi, %k1521; SKX-NEXT:    vfnmadd231ss {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}522; SKX-NEXT:    vmovaps %xmm2, %xmm0523; SKX-NEXT:    retq524;525; KNL-LABEL: test23:526; KNL:       # %bb.0: # %entry527; KNL-NEXT:    kmovw %edi, %k1528; KNL-NEXT:    vfnmadd231ss {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}529; KNL-NEXT:    vmovaps %xmm2, %xmm0530; KNL-NEXT:    retq531entry:532  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %b533  %0 = tail call <4 x float> @llvm.x86.avx512.mask3.vfmadd.ss(<4 x float> %a, <4 x float> %sub.i, <4 x float> %c, i8 %mask, i32 8) #10534  ret <4 x float> %0535}536 537define <4 x float> @test24(<4 x float> %a, <4 x float> %b, <4 x float> %c, i8 zeroext %mask) local_unnamed_addr #0 {538; SKX-LABEL: test24:539; SKX:       # %bb.0: # %entry540; SKX-NEXT:    kmovd %edi, %k1541; SKX-NEXT:    vfmsub213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}542; SKX-NEXT:    retq543;544; KNL-LABEL: test24:545; KNL:       # %bb.0: # %entry546; KNL-NEXT:    kmovw %edi, %k1547; KNL-NEXT:    vfmsub213ss {rn-sae}, %xmm2, %xmm1, %xmm0 {%k1}548; KNL-NEXT:    retq549entry:550  %sub.i = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %c551  %0 = tail call <4 x float> @llvm.x86.avx512.mask.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %sub.i, i8 %mask, i32 8) #10552  ret <4 x float> %0553}554 555define <16 x float> @test25(<16 x float> %a, <16 x float> %b, <16 x float> %c)  {556; CHECK-LABEL: test25:557; CHECK:       # %bb.0: # %entry558; CHECK-NEXT:    vfnmsub213ps {rn-sae}, %zmm2, %zmm1, %zmm0559; CHECK-NEXT:    retq560entry:561  %sub.i = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %b562  %sub.i.2 = fsub <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %c563  %0 = tail call <16 x float> @llvm.x86.avx512.vfmadd.ps.512(<16 x float> %a, <16 x float> %sub.i, <16 x float> %sub.i.2, i32 8) #2564  ret <16 x float> %0565}566