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