919 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fma | FileCheck %s3 4define <2 x double> @fmaddsubpd_loop_128(i32 %iter, <2 x double> %a, <2 x double> %b, <2 x double> %c) {5; CHECK-LABEL: fmaddsubpd_loop_128:6; CHECK: # %bb.0: # %entry7; CHECK-NEXT: xorl %eax, %eax8; CHECK-NEXT: cmpl %edi, %eax9; CHECK-NEXT: jge .LBB0_310; CHECK-NEXT: .p2align 411; CHECK-NEXT: .LBB0_2: # %for.body12; CHECK-NEXT: # =>This Inner Loop Header: Depth=113; CHECK-NEXT: vfmaddsub231pd {{.*#+}} xmm2 = (xmm0 * xmm1) +/- xmm214; CHECK-NEXT: incl %eax15; CHECK-NEXT: cmpl %edi, %eax16; CHECK-NEXT: jl .LBB0_217; CHECK-NEXT: .LBB0_3: # %for.end18; CHECK-NEXT: vmovapd %xmm2, %xmm019; CHECK-NEXT: retq20entry:21 br label %for.cond22 23for.cond:24 %c.addr.0 = phi <2 x double> [ %c, %entry ], [ %0, %for.inc ]25 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]26 %cmp = icmp slt i32 %i.0, %iter27 br i1 %cmp, label %for.body, label %for.end28 29for.body:30 br label %for.inc31 32for.inc:33 %0 = call <2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double> %a, <2 x double> %b, <2 x double> %c.addr.0)34 %inc = add nsw i32 %i.0, 135 br label %for.cond36 37for.end:38 ret <2 x double> %c.addr.039}40 41define <2 x double> @fmsubaddpd_loop_128(i32 %iter, <2 x double> %a, <2 x double> %b, <2 x double> %c) {42; CHECK-LABEL: fmsubaddpd_loop_128:43; CHECK: # %bb.0: # %entry44; CHECK-NEXT: xorl %eax, %eax45; CHECK-NEXT: cmpl %edi, %eax46; CHECK-NEXT: jge .LBB1_347; CHECK-NEXT: .p2align 448; CHECK-NEXT: .LBB1_2: # %for.body49; CHECK-NEXT: # =>This Inner Loop Header: Depth=150; CHECK-NEXT: vfmsubadd231pd {{.*#+}} xmm2 = (xmm0 * xmm1) -/+ xmm251; CHECK-NEXT: incl %eax52; CHECK-NEXT: cmpl %edi, %eax53; CHECK-NEXT: jl .LBB1_254; CHECK-NEXT: .LBB1_3: # %for.end55; CHECK-NEXT: vmovapd %xmm2, %xmm056; CHECK-NEXT: retq57entry:58 br label %for.cond59 60for.cond:61 %c.addr.0 = phi <2 x double> [ %c, %entry ], [ %0, %for.inc ]62 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]63 %cmp = icmp slt i32 %i.0, %iter64 br i1 %cmp, label %for.body, label %for.end65 66for.body:67 br label %for.inc68 69for.inc:70 %0 = call <2 x double> @llvm.x86.fma.vfmsubadd.pd(<2 x double> %a, <2 x double> %b, <2 x double> %c.addr.0)71 %inc = add nsw i32 %i.0, 172 br label %for.cond73 74for.end:75 ret <2 x double> %c.addr.076}77 78define <2 x double> @fmaddpd_loop_128(i32 %iter, <2 x double> %a, <2 x double> %b, <2 x double> %c) {79; CHECK-LABEL: fmaddpd_loop_128:80; CHECK: # %bb.0: # %entry81; CHECK-NEXT: xorl %eax, %eax82; CHECK-NEXT: cmpl %edi, %eax83; CHECK-NEXT: jge .LBB2_384; CHECK-NEXT: .p2align 485; CHECK-NEXT: .LBB2_2: # %for.body86; CHECK-NEXT: # =>This Inner Loop Header: Depth=187; CHECK-NEXT: vfmadd231pd {{.*#+}} xmm2 = (xmm0 * xmm1) + xmm288; CHECK-NEXT: incl %eax89; CHECK-NEXT: cmpl %edi, %eax90; CHECK-NEXT: jl .LBB2_291; CHECK-NEXT: .LBB2_3: # %for.end92; CHECK-NEXT: vmovapd %xmm2, %xmm093; CHECK-NEXT: retq94entry:95 br label %for.cond96 97for.cond:98 %c.addr.0 = phi <2 x double> [ %c, %entry ], [ %0, %for.inc ]99 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]100 %cmp = icmp slt i32 %i.0, %iter101 br i1 %cmp, label %for.body, label %for.end102 103for.body:104 br label %for.inc105 106for.inc:107 %0 = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %a, <2 x double> %b, <2 x double> %c.addr.0)108 %inc = add nsw i32 %i.0, 1109 br label %for.cond110 111for.end:112 ret <2 x double> %c.addr.0113}114 115define <2 x double> @fmsubpd_loop_128(i32 %iter, <2 x double> %a, <2 x double> %b, <2 x double> %c) {116; CHECK-LABEL: fmsubpd_loop_128:117; CHECK: # %bb.0: # %entry118; CHECK-NEXT: xorl %eax, %eax119; CHECK-NEXT: cmpl %edi, %eax120; CHECK-NEXT: jge .LBB3_3121; CHECK-NEXT: .p2align 4122; CHECK-NEXT: .LBB3_2: # %for.body123; CHECK-NEXT: # =>This Inner Loop Header: Depth=1124; CHECK-NEXT: vfmsub231pd {{.*#+}} xmm2 = (xmm0 * xmm1) - xmm2125; CHECK-NEXT: incl %eax126; CHECK-NEXT: cmpl %edi, %eax127; CHECK-NEXT: jl .LBB3_2128; CHECK-NEXT: .LBB3_3: # %for.end129; CHECK-NEXT: vmovapd %xmm2, %xmm0130; CHECK-NEXT: retq131entry:132 br label %for.cond133 134for.cond:135 %c.addr.0 = phi <2 x double> [ %c, %entry ], [ %0, %for.inc ]136 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]137 %cmp = icmp slt i32 %i.0, %iter138 br i1 %cmp, label %for.body, label %for.end139 140for.body:141 br label %for.inc142 143for.inc:144 %0 = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %a, <2 x double> %b, <2 x double> %c.addr.0)145 %inc = add nsw i32 %i.0, 1146 br label %for.cond147 148for.end:149 ret <2 x double> %c.addr.0150}151 152define <2 x double> @fnmaddpd_loop_128(i32 %iter, <2 x double> %a, <2 x double> %b, <2 x double> %c) {153; CHECK-LABEL: fnmaddpd_loop_128:154; CHECK: # %bb.0: # %entry155; CHECK-NEXT: xorl %eax, %eax156; CHECK-NEXT: cmpl %edi, %eax157; CHECK-NEXT: jge .LBB4_3158; CHECK-NEXT: .p2align 4159; CHECK-NEXT: .LBB4_2: # %for.body160; CHECK-NEXT: # =>This Inner Loop Header: Depth=1161; CHECK-NEXT: vfnmadd231pd {{.*#+}} xmm2 = -(xmm0 * xmm1) + xmm2162; CHECK-NEXT: incl %eax163; CHECK-NEXT: cmpl %edi, %eax164; CHECK-NEXT: jl .LBB4_2165; CHECK-NEXT: .LBB4_3: # %for.end166; CHECK-NEXT: vmovapd %xmm2, %xmm0167; CHECK-NEXT: retq168entry:169 br label %for.cond170 171for.cond:172 %c.addr.0 = phi <2 x double> [ %c, %entry ], [ %0, %for.inc ]173 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]174 %cmp = icmp slt i32 %i.0, %iter175 br i1 %cmp, label %for.body, label %for.end176 177for.body:178 br label %for.inc179 180for.inc:181 %0 = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %a, <2 x double> %b, <2 x double> %c.addr.0)182 %inc = add nsw i32 %i.0, 1183 br label %for.cond184 185for.end:186 ret <2 x double> %c.addr.0187}188 189define <2 x double> @fnmsubpd_loop_128(i32 %iter, <2 x double> %a, <2 x double> %b, <2 x double> %c) {190; CHECK-LABEL: fnmsubpd_loop_128:191; CHECK: # %bb.0: # %entry192; CHECK-NEXT: xorl %eax, %eax193; CHECK-NEXT: cmpl %edi, %eax194; CHECK-NEXT: jge .LBB5_3195; CHECK-NEXT: .p2align 4196; CHECK-NEXT: .LBB5_2: # %for.body197; CHECK-NEXT: # =>This Inner Loop Header: Depth=1198; CHECK-NEXT: vfnmsub231pd {{.*#+}} xmm2 = -(xmm0 * xmm1) - xmm2199; CHECK-NEXT: incl %eax200; CHECK-NEXT: cmpl %edi, %eax201; CHECK-NEXT: jl .LBB5_2202; CHECK-NEXT: .LBB5_3: # %for.end203; CHECK-NEXT: vmovapd %xmm2, %xmm0204; CHECK-NEXT: retq205entry:206 br label %for.cond207 208for.cond:209 %c.addr.0 = phi <2 x double> [ %c, %entry ], [ %0, %for.inc ]210 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]211 %cmp = icmp slt i32 %i.0, %iter212 br i1 %cmp, label %for.body, label %for.end213 214for.body:215 br label %for.inc216 217for.inc:218 %0 = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %a, <2 x double> %b, <2 x double> %c.addr.0)219 %inc = add nsw i32 %i.0, 1220 br label %for.cond221 222for.end:223 ret <2 x double> %c.addr.0224}225 226declare <2 x double> @llvm.x86.fma.vfmaddsub.pd(<2 x double>, <2 x double>, <2 x double>)227declare <2 x double> @llvm.x86.fma.vfmsubadd.pd(<2 x double>, <2 x double>, <2 x double>)228declare <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double>, <2 x double>, <2 x double>)229declare <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double>, <2 x double>, <2 x double>)230declare <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double>, <2 x double>, <2 x double>)231declare <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double>, <2 x double>, <2 x double>)232 233define <4 x float> @fmaddsubps_loop_128(i32 %iter, <4 x float> %a, <4 x float> %b, <4 x float> %c) {234; CHECK-LABEL: fmaddsubps_loop_128:235; CHECK: # %bb.0: # %entry236; CHECK-NEXT: xorl %eax, %eax237; CHECK-NEXT: cmpl %edi, %eax238; CHECK-NEXT: jge .LBB6_3239; CHECK-NEXT: .p2align 4240; CHECK-NEXT: .LBB6_2: # %for.body241; CHECK-NEXT: # =>This Inner Loop Header: Depth=1242; CHECK-NEXT: vfmaddsub231ps {{.*#+}} xmm2 = (xmm0 * xmm1) +/- xmm2243; CHECK-NEXT: incl %eax244; CHECK-NEXT: cmpl %edi, %eax245; CHECK-NEXT: jl .LBB6_2246; CHECK-NEXT: .LBB6_3: # %for.end247; CHECK-NEXT: vmovaps %xmm2, %xmm0248; CHECK-NEXT: retq249entry:250 br label %for.cond251 252for.cond:253 %c.addr.0 = phi <4 x float> [ %c, %entry ], [ %0, %for.inc ]254 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]255 %cmp = icmp slt i32 %i.0, %iter256 br i1 %cmp, label %for.body, label %for.end257 258for.body:259 br label %for.inc260 261for.inc:262 %0 = call <4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float> %a, <4 x float> %b, <4 x float> %c.addr.0)263 %inc = add nsw i32 %i.0, 1264 br label %for.cond265 266for.end:267 ret <4 x float> %c.addr.0268}269 270define <4 x float> @fmsubaddps_loop_128(i32 %iter, <4 x float> %a, <4 x float> %b, <4 x float> %c) {271; CHECK-LABEL: fmsubaddps_loop_128:272; CHECK: # %bb.0: # %entry273; CHECK-NEXT: xorl %eax, %eax274; CHECK-NEXT: cmpl %edi, %eax275; CHECK-NEXT: jge .LBB7_3276; CHECK-NEXT: .p2align 4277; CHECK-NEXT: .LBB7_2: # %for.body278; CHECK-NEXT: # =>This Inner Loop Header: Depth=1279; CHECK-NEXT: vfmsubadd231ps {{.*#+}} xmm2 = (xmm0 * xmm1) -/+ xmm2280; CHECK-NEXT: incl %eax281; CHECK-NEXT: cmpl %edi, %eax282; CHECK-NEXT: jl .LBB7_2283; CHECK-NEXT: .LBB7_3: # %for.end284; CHECK-NEXT: vmovaps %xmm2, %xmm0285; CHECK-NEXT: retq286entry:287 br label %for.cond288 289for.cond:290 %c.addr.0 = phi <4 x float> [ %c, %entry ], [ %0, %for.inc ]291 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]292 %cmp = icmp slt i32 %i.0, %iter293 br i1 %cmp, label %for.body, label %for.end294 295for.body:296 br label %for.inc297 298for.inc:299 %0 = call <4 x float> @llvm.x86.fma.vfmsubadd.ps(<4 x float> %a, <4 x float> %b, <4 x float> %c.addr.0)300 %inc = add nsw i32 %i.0, 1301 br label %for.cond302 303for.end:304 ret <4 x float> %c.addr.0305}306 307define <4 x float> @fmaddps_loop_128(i32 %iter, <4 x float> %a, <4 x float> %b, <4 x float> %c) {308; CHECK-LABEL: fmaddps_loop_128:309; CHECK: # %bb.0: # %entry310; CHECK-NEXT: xorl %eax, %eax311; CHECK-NEXT: cmpl %edi, %eax312; CHECK-NEXT: jge .LBB8_3313; CHECK-NEXT: .p2align 4314; CHECK-NEXT: .LBB8_2: # %for.body315; CHECK-NEXT: # =>This Inner Loop Header: Depth=1316; CHECK-NEXT: vfmadd231ps {{.*#+}} xmm2 = (xmm0 * xmm1) + xmm2317; CHECK-NEXT: incl %eax318; CHECK-NEXT: cmpl %edi, %eax319; CHECK-NEXT: jl .LBB8_2320; CHECK-NEXT: .LBB8_3: # %for.end321; CHECK-NEXT: vmovaps %xmm2, %xmm0322; CHECK-NEXT: retq323entry:324 br label %for.cond325 326for.cond:327 %c.addr.0 = phi <4 x float> [ %c, %entry ], [ %0, %for.inc ]328 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]329 %cmp = icmp slt i32 %i.0, %iter330 br i1 %cmp, label %for.body, label %for.end331 332for.body:333 br label %for.inc334 335for.inc:336 %0 = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %a, <4 x float> %b, <4 x float> %c.addr.0)337 %inc = add nsw i32 %i.0, 1338 br label %for.cond339 340for.end:341 ret <4 x float> %c.addr.0342}343 344define <4 x float> @fmsubps_loop_128(i32 %iter, <4 x float> %a, <4 x float> %b, <4 x float> %c) {345; CHECK-LABEL: fmsubps_loop_128:346; CHECK: # %bb.0: # %entry347; CHECK-NEXT: xorl %eax, %eax348; CHECK-NEXT: cmpl %edi, %eax349; CHECK-NEXT: jge .LBB9_3350; CHECK-NEXT: .p2align 4351; CHECK-NEXT: .LBB9_2: # %for.body352; CHECK-NEXT: # =>This Inner Loop Header: Depth=1353; CHECK-NEXT: vfmsub231ps {{.*#+}} xmm2 = (xmm0 * xmm1) - xmm2354; CHECK-NEXT: incl %eax355; CHECK-NEXT: cmpl %edi, %eax356; CHECK-NEXT: jl .LBB9_2357; CHECK-NEXT: .LBB9_3: # %for.end358; CHECK-NEXT: vmovaps %xmm2, %xmm0359; CHECK-NEXT: retq360entry:361 br label %for.cond362 363for.cond:364 %c.addr.0 = phi <4 x float> [ %c, %entry ], [ %0, %for.inc ]365 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]366 %cmp = icmp slt i32 %i.0, %iter367 br i1 %cmp, label %for.body, label %for.end368 369for.body:370 br label %for.inc371 372for.inc:373 %0 = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %a, <4 x float> %b, <4 x float> %c.addr.0)374 %inc = add nsw i32 %i.0, 1375 br label %for.cond376 377for.end:378 ret <4 x float> %c.addr.0379}380 381define <4 x float> @fnmaddps_loop_128(i32 %iter, <4 x float> %a, <4 x float> %b, <4 x float> %c) {382; CHECK-LABEL: fnmaddps_loop_128:383; CHECK: # %bb.0: # %entry384; CHECK-NEXT: xorl %eax, %eax385; CHECK-NEXT: cmpl %edi, %eax386; CHECK-NEXT: jge .LBB10_3387; CHECK-NEXT: .p2align 4388; CHECK-NEXT: .LBB10_2: # %for.body389; CHECK-NEXT: # =>This Inner Loop Header: Depth=1390; CHECK-NEXT: vfnmadd231ps {{.*#+}} xmm2 = -(xmm0 * xmm1) + xmm2391; CHECK-NEXT: incl %eax392; CHECK-NEXT: cmpl %edi, %eax393; CHECK-NEXT: jl .LBB10_2394; CHECK-NEXT: .LBB10_3: # %for.end395; CHECK-NEXT: vmovaps %xmm2, %xmm0396; CHECK-NEXT: retq397entry:398 br label %for.cond399 400for.cond:401 %c.addr.0 = phi <4 x float> [ %c, %entry ], [ %0, %for.inc ]402 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]403 %cmp = icmp slt i32 %i.0, %iter404 br i1 %cmp, label %for.body, label %for.end405 406for.body:407 br label %for.inc408 409for.inc:410 %0 = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %a, <4 x float> %b, <4 x float> %c.addr.0)411 %inc = add nsw i32 %i.0, 1412 br label %for.cond413 414for.end:415 ret <4 x float> %c.addr.0416}417 418define <4 x float> @fnmsubps_loop_128(i32 %iter, <4 x float> %a, <4 x float> %b, <4 x float> %c) {419; CHECK-LABEL: fnmsubps_loop_128:420; CHECK: # %bb.0: # %entry421; CHECK-NEXT: xorl %eax, %eax422; CHECK-NEXT: cmpl %edi, %eax423; CHECK-NEXT: jge .LBB11_3424; CHECK-NEXT: .p2align 4425; CHECK-NEXT: .LBB11_2: # %for.body426; CHECK-NEXT: # =>This Inner Loop Header: Depth=1427; CHECK-NEXT: vfnmsub231ps {{.*#+}} xmm2 = -(xmm0 * xmm1) - xmm2428; CHECK-NEXT: incl %eax429; CHECK-NEXT: cmpl %edi, %eax430; CHECK-NEXT: jl .LBB11_2431; CHECK-NEXT: .LBB11_3: # %for.end432; CHECK-NEXT: vmovaps %xmm2, %xmm0433; CHECK-NEXT: retq434entry:435 br label %for.cond436 437for.cond:438 %c.addr.0 = phi <4 x float> [ %c, %entry ], [ %0, %for.inc ]439 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]440 %cmp = icmp slt i32 %i.0, %iter441 br i1 %cmp, label %for.body, label %for.end442 443for.body:444 br label %for.inc445 446for.inc:447 %0 = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %a, <4 x float> %b, <4 x float> %c.addr.0)448 %inc = add nsw i32 %i.0, 1449 br label %for.cond450 451for.end:452 ret <4 x float> %c.addr.0453}454 455declare <4 x float> @llvm.x86.fma.vfmaddsub.ps(<4 x float>, <4 x float>, <4 x float>)456declare <4 x float> @llvm.x86.fma.vfmsubadd.ps(<4 x float>, <4 x float>, <4 x float>)457declare <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float>, <4 x float>, <4 x float>)458declare <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float>, <4 x float>, <4 x float>)459declare <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float>, <4 x float>, <4 x float>)460declare <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float>, <4 x float>, <4 x float>)461 462define <4 x double> @fmaddsubpd_loop_256(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {463; CHECK-LABEL: fmaddsubpd_loop_256:464; CHECK: # %bb.0: # %entry465; CHECK-NEXT: xorl %eax, %eax466; CHECK-NEXT: cmpl %edi, %eax467; CHECK-NEXT: jge .LBB12_3468; CHECK-NEXT: .p2align 4469; CHECK-NEXT: .LBB12_2: # %for.body470; CHECK-NEXT: # =>This Inner Loop Header: Depth=1471; CHECK-NEXT: vfmaddsub231pd {{.*#+}} ymm2 = (ymm0 * ymm1) +/- ymm2472; CHECK-NEXT: incl %eax473; CHECK-NEXT: cmpl %edi, %eax474; CHECK-NEXT: jl .LBB12_2475; CHECK-NEXT: .LBB12_3: # %for.end476; CHECK-NEXT: vmovapd %ymm2, %ymm0477; CHECK-NEXT: retq478entry:479 br label %for.cond480 481for.cond:482 %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]483 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]484 %cmp = icmp slt i32 %i.0, %iter485 br i1 %cmp, label %for.body, label %for.end486 487for.body:488 br label %for.inc489 490for.inc:491 %0 = call <4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)492 %inc = add nsw i32 %i.0, 1493 br label %for.cond494 495for.end:496 ret <4 x double> %c.addr.0497}498 499define <4 x double> @fmsubaddpd_loop_256(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {500; CHECK-LABEL: fmsubaddpd_loop_256:501; CHECK: # %bb.0: # %entry502; CHECK-NEXT: xorl %eax, %eax503; CHECK-NEXT: cmpl %edi, %eax504; CHECK-NEXT: jge .LBB13_3505; CHECK-NEXT: .p2align 4506; CHECK-NEXT: .LBB13_2: # %for.body507; CHECK-NEXT: # =>This Inner Loop Header: Depth=1508; CHECK-NEXT: vfmsubadd231pd {{.*#+}} ymm2 = (ymm0 * ymm1) -/+ ymm2509; CHECK-NEXT: incl %eax510; CHECK-NEXT: cmpl %edi, %eax511; CHECK-NEXT: jl .LBB13_2512; CHECK-NEXT: .LBB13_3: # %for.end513; CHECK-NEXT: vmovapd %ymm2, %ymm0514; CHECK-NEXT: retq515entry:516 br label %for.cond517 518for.cond:519 %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]520 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]521 %cmp = icmp slt i32 %i.0, %iter522 br i1 %cmp, label %for.body, label %for.end523 524for.body:525 br label %for.inc526 527for.inc:528 %0 = call <4 x double> @llvm.x86.fma.vfmsubadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)529 %inc = add nsw i32 %i.0, 1530 br label %for.cond531 532for.end:533 ret <4 x double> %c.addr.0534}535 536define <4 x double> @fmaddpd_loop_256(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {537; CHECK-LABEL: fmaddpd_loop_256:538; CHECK: # %bb.0: # %entry539; CHECK-NEXT: xorl %eax, %eax540; CHECK-NEXT: cmpl %edi, %eax541; CHECK-NEXT: jge .LBB14_3542; CHECK-NEXT: .p2align 4543; CHECK-NEXT: .LBB14_2: # %for.body544; CHECK-NEXT: # =>This Inner Loop Header: Depth=1545; CHECK-NEXT: vfmadd231pd {{.*#+}} ymm2 = (ymm0 * ymm1) + ymm2546; CHECK-NEXT: incl %eax547; CHECK-NEXT: cmpl %edi, %eax548; CHECK-NEXT: jl .LBB14_2549; CHECK-NEXT: .LBB14_3: # %for.end550; CHECK-NEXT: vmovapd %ymm2, %ymm0551; CHECK-NEXT: retq552entry:553 br label %for.cond554 555for.cond:556 %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]557 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]558 %cmp = icmp slt i32 %i.0, %iter559 br i1 %cmp, label %for.body, label %for.end560 561for.body:562 br label %for.inc563 564for.inc:565 %0 = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)566 %inc = add nsw i32 %i.0, 1567 br label %for.cond568 569for.end:570 ret <4 x double> %c.addr.0571}572 573define <4 x double> @fmsubpd_loop_256(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {574; CHECK-LABEL: fmsubpd_loop_256:575; CHECK: # %bb.0: # %entry576; CHECK-NEXT: xorl %eax, %eax577; CHECK-NEXT: cmpl %edi, %eax578; CHECK-NEXT: jge .LBB15_3579; CHECK-NEXT: .p2align 4580; CHECK-NEXT: .LBB15_2: # %for.body581; CHECK-NEXT: # =>This Inner Loop Header: Depth=1582; CHECK-NEXT: vfmsub231pd {{.*#+}} ymm2 = (ymm0 * ymm1) - ymm2583; CHECK-NEXT: incl %eax584; CHECK-NEXT: cmpl %edi, %eax585; CHECK-NEXT: jl .LBB15_2586; CHECK-NEXT: .LBB15_3: # %for.end587; CHECK-NEXT: vmovapd %ymm2, %ymm0588; CHECK-NEXT: retq589entry:590 br label %for.cond591 592for.cond:593 %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]594 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]595 %cmp = icmp slt i32 %i.0, %iter596 br i1 %cmp, label %for.body, label %for.end597 598for.body:599 br label %for.inc600 601for.inc:602 %0 = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)603 %inc = add nsw i32 %i.0, 1604 br label %for.cond605 606for.end:607 ret <4 x double> %c.addr.0608}609 610define <4 x double> @fnmaddpd_loop_256(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {611; CHECK-LABEL: fnmaddpd_loop_256:612; CHECK: # %bb.0: # %entry613; CHECK-NEXT: xorl %eax, %eax614; CHECK-NEXT: cmpl %edi, %eax615; CHECK-NEXT: jge .LBB16_3616; CHECK-NEXT: .p2align 4617; CHECK-NEXT: .LBB16_2: # %for.body618; CHECK-NEXT: # =>This Inner Loop Header: Depth=1619; CHECK-NEXT: vfnmadd231pd {{.*#+}} ymm2 = -(ymm0 * ymm1) + ymm2620; CHECK-NEXT: incl %eax621; CHECK-NEXT: cmpl %edi, %eax622; CHECK-NEXT: jl .LBB16_2623; CHECK-NEXT: .LBB16_3: # %for.end624; CHECK-NEXT: vmovapd %ymm2, %ymm0625; CHECK-NEXT: retq626entry:627 br label %for.cond628 629for.cond:630 %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]631 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]632 %cmp = icmp slt i32 %i.0, %iter633 br i1 %cmp, label %for.body, label %for.end634 635for.body:636 br label %for.inc637 638for.inc:639 %0 = call <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)640 %inc = add nsw i32 %i.0, 1641 br label %for.cond642 643for.end:644 ret <4 x double> %c.addr.0645}646 647define <4 x double> @fnmsubpd_loop_256(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {648; CHECK-LABEL: fnmsubpd_loop_256:649; CHECK: # %bb.0: # %entry650; CHECK-NEXT: xorl %eax, %eax651; CHECK-NEXT: cmpl %edi, %eax652; CHECK-NEXT: jge .LBB17_3653; CHECK-NEXT: .p2align 4654; CHECK-NEXT: .LBB17_2: # %for.body655; CHECK-NEXT: # =>This Inner Loop Header: Depth=1656; CHECK-NEXT: vfnmsub231pd {{.*#+}} ymm2 = -(ymm0 * ymm1) - ymm2657; CHECK-NEXT: incl %eax658; CHECK-NEXT: cmpl %edi, %eax659; CHECK-NEXT: jl .LBB17_2660; CHECK-NEXT: .LBB17_3: # %for.end661; CHECK-NEXT: vmovapd %ymm2, %ymm0662; CHECK-NEXT: retq663entry:664 br label %for.cond665 666for.cond:667 %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]668 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]669 %cmp = icmp slt i32 %i.0, %iter670 br i1 %cmp, label %for.body, label %for.end671 672for.body:673 br label %for.inc674 675for.inc:676 %0 = call <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)677 %inc = add nsw i32 %i.0, 1678 br label %for.cond679 680for.end:681 ret <4 x double> %c.addr.0682}683 684declare <4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double>, <4 x double>, <4 x double>)685declare <4 x double> @llvm.x86.fma.vfmsubadd.pd.256(<4 x double>, <4 x double>, <4 x double>)686declare <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double>, <4 x double>, <4 x double>)687declare <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double>, <4 x double>, <4 x double>)688declare <4 x double> @llvm.x86.fma.vfnmadd.pd.256(<4 x double>, <4 x double>, <4 x double>)689declare <4 x double> @llvm.x86.fma.vfnmsub.pd.256(<4 x double>, <4 x double>, <4 x double>)690 691define <8 x float> @fmaddsubps_loop_256(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {692; CHECK-LABEL: fmaddsubps_loop_256:693; CHECK: # %bb.0: # %entry694; CHECK-NEXT: xorl %eax, %eax695; CHECK-NEXT: cmpl %edi, %eax696; CHECK-NEXT: jge .LBB18_3697; CHECK-NEXT: .p2align 4698; CHECK-NEXT: .LBB18_2: # %for.body699; CHECK-NEXT: # =>This Inner Loop Header: Depth=1700; CHECK-NEXT: vfmaddsub231ps {{.*#+}} ymm2 = (ymm0 * ymm1) +/- ymm2701; CHECK-NEXT: incl %eax702; CHECK-NEXT: cmpl %edi, %eax703; CHECK-NEXT: jl .LBB18_2704; CHECK-NEXT: .LBB18_3: # %for.end705; CHECK-NEXT: vmovaps %ymm2, %ymm0706; CHECK-NEXT: retq707entry:708 br label %for.cond709 710for.cond:711 %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]712 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]713 %cmp = icmp slt i32 %i.0, %iter714 br i1 %cmp, label %for.body, label %for.end715 716for.body:717 br label %for.inc718 719for.inc:720 %0 = call <8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)721 %inc = add nsw i32 %i.0, 1722 br label %for.cond723 724for.end:725 ret <8 x float> %c.addr.0726}727 728define <8 x float> @fmsubaddps_loop_256(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {729; CHECK-LABEL: fmsubaddps_loop_256:730; CHECK: # %bb.0: # %entry731; CHECK-NEXT: xorl %eax, %eax732; CHECK-NEXT: cmpl %edi, %eax733; CHECK-NEXT: jge .LBB19_3734; CHECK-NEXT: .p2align 4735; CHECK-NEXT: .LBB19_2: # %for.body736; CHECK-NEXT: # =>This Inner Loop Header: Depth=1737; CHECK-NEXT: vfmsubadd231ps {{.*#+}} ymm2 = (ymm0 * ymm1) -/+ ymm2738; CHECK-NEXT: incl %eax739; CHECK-NEXT: cmpl %edi, %eax740; CHECK-NEXT: jl .LBB19_2741; CHECK-NEXT: .LBB19_3: # %for.end742; CHECK-NEXT: vmovaps %ymm2, %ymm0743; CHECK-NEXT: retq744entry:745 br label %for.cond746 747for.cond:748 %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]749 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]750 %cmp = icmp slt i32 %i.0, %iter751 br i1 %cmp, label %for.body, label %for.end752 753for.body:754 br label %for.inc755 756for.inc:757 %0 = call <8 x float> @llvm.x86.fma.vfmsubadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)758 %inc = add nsw i32 %i.0, 1759 br label %for.cond760 761for.end:762 ret <8 x float> %c.addr.0763}764 765define <8 x float> @fmaddps_loop_256(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {766; CHECK-LABEL: fmaddps_loop_256:767; CHECK: # %bb.0: # %entry768; CHECK-NEXT: xorl %eax, %eax769; CHECK-NEXT: cmpl %edi, %eax770; CHECK-NEXT: jge .LBB20_3771; CHECK-NEXT: .p2align 4772; CHECK-NEXT: .LBB20_2: # %for.body773; CHECK-NEXT: # =>This Inner Loop Header: Depth=1774; CHECK-NEXT: vfmadd231ps {{.*#+}} ymm2 = (ymm0 * ymm1) + ymm2775; CHECK-NEXT: incl %eax776; CHECK-NEXT: cmpl %edi, %eax777; CHECK-NEXT: jl .LBB20_2778; CHECK-NEXT: .LBB20_3: # %for.end779; CHECK-NEXT: vmovaps %ymm2, %ymm0780; CHECK-NEXT: retq781entry:782 br label %for.cond783 784for.cond:785 %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]786 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]787 %cmp = icmp slt i32 %i.0, %iter788 br i1 %cmp, label %for.body, label %for.end789 790for.body:791 br label %for.inc792 793for.inc:794 %0 = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)795 %inc = add nsw i32 %i.0, 1796 br label %for.cond797 798for.end:799 ret <8 x float> %c.addr.0800}801 802define <8 x float> @fmsubps_loop_256(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {803; CHECK-LABEL: fmsubps_loop_256:804; CHECK: # %bb.0: # %entry805; CHECK-NEXT: xorl %eax, %eax806; CHECK-NEXT: cmpl %edi, %eax807; CHECK-NEXT: jge .LBB21_3808; CHECK-NEXT: .p2align 4809; CHECK-NEXT: .LBB21_2: # %for.body810; CHECK-NEXT: # =>This Inner Loop Header: Depth=1811; CHECK-NEXT: vfmsub231ps {{.*#+}} ymm2 = (ymm0 * ymm1) - ymm2812; CHECK-NEXT: incl %eax813; CHECK-NEXT: cmpl %edi, %eax814; CHECK-NEXT: jl .LBB21_2815; CHECK-NEXT: .LBB21_3: # %for.end816; CHECK-NEXT: vmovaps %ymm2, %ymm0817; CHECK-NEXT: retq818entry:819 br label %for.cond820 821for.cond:822 %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]823 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]824 %cmp = icmp slt i32 %i.0, %iter825 br i1 %cmp, label %for.body, label %for.end826 827for.body:828 br label %for.inc829 830for.inc:831 %0 = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)832 %inc = add nsw i32 %i.0, 1833 br label %for.cond834 835for.end:836 ret <8 x float> %c.addr.0837}838 839define <8 x float> @fnmaddps_loop_256(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {840; CHECK-LABEL: fnmaddps_loop_256:841; CHECK: # %bb.0: # %entry842; CHECK-NEXT: xorl %eax, %eax843; CHECK-NEXT: cmpl %edi, %eax844; CHECK-NEXT: jge .LBB22_3845; CHECK-NEXT: .p2align 4846; CHECK-NEXT: .LBB22_2: # %for.body847; CHECK-NEXT: # =>This Inner Loop Header: Depth=1848; CHECK-NEXT: vfnmadd231ps {{.*#+}} ymm2 = -(ymm0 * ymm1) + ymm2849; CHECK-NEXT: incl %eax850; CHECK-NEXT: cmpl %edi, %eax851; CHECK-NEXT: jl .LBB22_2852; CHECK-NEXT: .LBB22_3: # %for.end853; CHECK-NEXT: vmovaps %ymm2, %ymm0854; CHECK-NEXT: retq855entry:856 br label %for.cond857 858for.cond:859 %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]860 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]861 %cmp = icmp slt i32 %i.0, %iter862 br i1 %cmp, label %for.body, label %for.end863 864for.body:865 br label %for.inc866 867for.inc:868 %0 = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)869 %inc = add nsw i32 %i.0, 1870 br label %for.cond871 872for.end:873 ret <8 x float> %c.addr.0874}875 876define <8 x float> @fnmsubps_loop_256(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {877; CHECK-LABEL: fnmsubps_loop_256:878; CHECK: # %bb.0: # %entry879; CHECK-NEXT: xorl %eax, %eax880; CHECK-NEXT: cmpl %edi, %eax881; CHECK-NEXT: jge .LBB23_3882; CHECK-NEXT: .p2align 4883; CHECK-NEXT: .LBB23_2: # %for.body884; CHECK-NEXT: # =>This Inner Loop Header: Depth=1885; CHECK-NEXT: vfnmsub231ps {{.*#+}} ymm2 = -(ymm0 * ymm1) - ymm2886; CHECK-NEXT: incl %eax887; CHECK-NEXT: cmpl %edi, %eax888; CHECK-NEXT: jl .LBB23_2889; CHECK-NEXT: .LBB23_3: # %for.end890; CHECK-NEXT: vmovaps %ymm2, %ymm0891; CHECK-NEXT: retq892entry:893 br label %for.cond894 895for.cond:896 %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]897 %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]898 %cmp = icmp slt i32 %i.0, %iter899 br i1 %cmp, label %for.body, label %for.end900 901for.body:902 br label %for.inc903 904for.inc:905 %0 = call <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)906 %inc = add nsw i32 %i.0, 1907 br label %for.cond908 909for.end:910 ret <8 x float> %c.addr.0911}912 913declare <8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float>, <8 x float>, <8 x float>)914declare <8 x float> @llvm.x86.fma.vfmsubadd.ps.256(<8 x float>, <8 x float>, <8 x float>)915declare <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float>, <8 x float>, <8 x float>)916declare <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float>, <8 x float>, <8 x float>)917declare <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float>, <8 x float>, <8 x float>)918declare <8 x float> @llvm.x86.fma.vfnmsub.ps.256(<8 x float>, <8 x float>, <8 x float>)919