340 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -ppc-gpr-icmps=all -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 -mattr=-crbits -disable-ppc-cmp-opt=0 | FileCheck %s3; RUN: llc -ppc-gpr-icmps=all -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2 -mattr=-crbits -disable-ppc-cmp-opt=0 -mattr=-isel | FileCheck --check-prefix=CHECK-NO-ISEL %s4 5target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"6target triple = "powerpc64-unknown-linux-gnu"7 8define signext i32 @foo(i32 signext %a, i32 signext %b, ptr nocapture %c) #0 {9; CHECK-LABEL: foo:10; CHECK: # %bb.0: # %entry11; CHECK-NEXT: cmpw 3, 412; CHECK-NEXT: sub 6, 3, 413; CHECK-NEXT: iselgt 3, 3, 414; CHECK-NEXT: stw 6, 0(5)15; CHECK-NEXT: blr16;17; CHECK-NO-ISEL-LABEL: foo:18; CHECK-NO-ISEL: # %bb.0: # %entry19; CHECK-NO-ISEL-NEXT: sub 6, 3, 420; CHECK-NO-ISEL-NEXT: cmpw 3, 421; CHECK-NO-ISEL-NEXT: stw 6, 0(5)22; CHECK-NO-ISEL-NEXT: bgtlr 023; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry24; CHECK-NO-ISEL-NEXT: mr 3, 425; CHECK-NO-ISEL-NEXT: blr26entry:27 %sub = sub nsw i32 %a, %b28 store i32 %sub, ptr %c, align 429 %cmp = icmp sgt i32 %a, %b30 %cond = select i1 %cmp, i32 %a, i32 %b31 ret i32 %cond32}33 34define signext i32 @foo2(i32 signext %a, i32 signext %b, ptr nocapture %c) #0 {35; CHECK-LABEL: foo2:36; CHECK: # %bb.0: # %entry37; CHECK-NEXT: slw 4, 3, 438; CHECK-NEXT: li 6, 039; CHECK-NEXT: li 3, 140; CHECK-NEXT: cmpwi 4, 041; CHECK-NEXT: stw 4, 0(5)42; CHECK-NEXT: iselgt 3, 3, 643; CHECK-NEXT: blr44;45; CHECK-NO-ISEL-LABEL: foo2:46; CHECK-NO-ISEL: # %bb.0: # %entry47; CHECK-NO-ISEL-NEXT: mr 6, 348; CHECK-NO-ISEL-NEXT: li 3, 149; CHECK-NO-ISEL-NEXT: slw 4, 6, 450; CHECK-NO-ISEL-NEXT: cmpwi 4, 051; CHECK-NO-ISEL-NEXT: stw 4, 0(5)52; CHECK-NO-ISEL-NEXT: bgtlr 053; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry54; CHECK-NO-ISEL-NEXT: li 3, 055; CHECK-NO-ISEL-NEXT: blr56entry:57 %shl = shl i32 %a, %b58 store i32 %shl, ptr %c, align 459 %cmp = icmp sgt i32 %shl, 060 %conv = zext i1 %cmp to i3261 ret i32 %conv62}63 64define i64 @fool(i64 %a, i64 %b, ptr nocapture %c) #0 {65; CHECK-LABEL: fool:66; CHECK: # %bb.0: # %entry67; CHECK-NEXT: sub. 6, 3, 468; CHECK-NEXT: iselgt 3, 3, 469; CHECK-NEXT: std 6, 0(5)70; CHECK-NEXT: blr71;72; CHECK-NO-ISEL-LABEL: fool:73; CHECK-NO-ISEL: # %bb.0: # %entry74; CHECK-NO-ISEL-NEXT: sub. 6, 3, 475; CHECK-NO-ISEL-NEXT: std 6, 0(5)76; CHECK-NO-ISEL-NEXT: bgtlr 077; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry78; CHECK-NO-ISEL-NEXT: mr 3, 479; CHECK-NO-ISEL-NEXT: blr80entry:81 %sub = sub nsw i64 %a, %b82 store i64 %sub, ptr %c, align 883 %cmp = icmp sgt i64 %a, %b84 %cond = select i1 %cmp, i64 %a, i64 %b85 ret i64 %cond86}87 88define i64 @foolb(i64 %a, i64 %b, ptr nocapture %c) #0 {89; CHECK-LABEL: foolb:90; CHECK: # %bb.0: # %entry91; CHECK-NEXT: sub. 6, 3, 492; CHECK-NEXT: iselgt 3, 4, 393; CHECK-NEXT: std 6, 0(5)94; CHECK-NEXT: blr95;96; CHECK-NO-ISEL-LABEL: foolb:97; CHECK-NO-ISEL: # %bb.0: # %entry98; CHECK-NO-ISEL-NEXT: sub. 6, 3, 499; CHECK-NO-ISEL-NEXT: std 6, 0(5)100; CHECK-NO-ISEL-NEXT: blelr 0101; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry102; CHECK-NO-ISEL-NEXT: mr 3, 4103; CHECK-NO-ISEL-NEXT: blr104entry:105 %sub = sub nsw i64 %a, %b106 store i64 %sub, ptr %c, align 8107 %cmp = icmp sle i64 %a, %b108 %cond = select i1 %cmp, i64 %a, i64 %b109 ret i64 %cond110}111 112define i64 @foolc(i64 %a, i64 %b, ptr nocapture %c) #0 {113; CHECK-LABEL: foolc:114; CHECK: # %bb.0: # %entry115; CHECK-NEXT: sub. 6, 4, 3116; CHECK-NEXT: isellt 3, 3, 4117; CHECK-NEXT: std 6, 0(5)118; CHECK-NEXT: blr119;120; CHECK-NO-ISEL-LABEL: foolc:121; CHECK-NO-ISEL: # %bb.0: # %entry122; CHECK-NO-ISEL-NEXT: sub. 6, 4, 3123; CHECK-NO-ISEL-NEXT: std 6, 0(5)124; CHECK-NO-ISEL-NEXT: bltlr 0125; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry126; CHECK-NO-ISEL-NEXT: mr 3, 4127; CHECK-NO-ISEL-NEXT: blr128entry:129 %sub = sub nsw i64 %b, %a130 store i64 %sub, ptr %c, align 8131 %cmp = icmp sgt i64 %a, %b132 %cond = select i1 %cmp, i64 %a, i64 %b133 ret i64 %cond134}135 136define i64 @foold(i64 %a, i64 %b, ptr nocapture %c) #0 {137; CHECK-LABEL: foold:138; CHECK: # %bb.0: # %entry139; CHECK-NEXT: sub. 6, 4, 3140; CHECK-NEXT: iselgt 3, 3, 4141; CHECK-NEXT: std 6, 0(5)142; CHECK-NEXT: blr143;144; CHECK-NO-ISEL-LABEL: foold:145; CHECK-NO-ISEL: # %bb.0: # %entry146; CHECK-NO-ISEL-NEXT: sub. 6, 4, 3147; CHECK-NO-ISEL-NEXT: std 6, 0(5)148; CHECK-NO-ISEL-NEXT: bgtlr 0149; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry150; CHECK-NO-ISEL-NEXT: mr 3, 4151; CHECK-NO-ISEL-NEXT: blr152entry:153 %sub = sub nsw i64 %b, %a154 store i64 %sub, ptr %c, align 8155 %cmp = icmp slt i64 %a, %b156 %cond = select i1 %cmp, i64 %a, i64 %b157 ret i64 %cond158}159 160define i64 @foold2(i64 %a, i64 %b, ptr nocapture %c) #0 {161; CHECK-LABEL: foold2:162; CHECK: # %bb.0: # %entry163; CHECK-NEXT: sub. 6, 3, 4164; CHECK-NEXT: isellt 3, 3, 4165; CHECK-NEXT: std 6, 0(5)166; CHECK-NEXT: blr167;168; CHECK-NO-ISEL-LABEL: foold2:169; CHECK-NO-ISEL: # %bb.0: # %entry170; CHECK-NO-ISEL-NEXT: sub. 6, 3, 4171; CHECK-NO-ISEL-NEXT: std 6, 0(5)172; CHECK-NO-ISEL-NEXT: bltlr 0173; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry174; CHECK-NO-ISEL-NEXT: mr 3, 4175; CHECK-NO-ISEL-NEXT: blr176entry:177 %sub = sub nsw i64 %a, %b178 store i64 %sub, ptr %c, align 8179 %cmp = icmp slt i64 %a, %b180 %cond = select i1 %cmp, i64 %a, i64 %b181 ret i64 %cond182}183 184define i64 @foo2l(i64 %a, i64 %b, ptr nocapture %c) #0 {185; CHECK-LABEL: foo2l:186; CHECK: # %bb.0: # %entry187; CHECK-NEXT: sld 4, 3, 4188; CHECK-NEXT: addi 3, 4, -1189; CHECK-NEXT: std 4, 0(5)190; CHECK-NEXT: nor 3, 3, 4191; CHECK-NEXT: rldicl 3, 3, 1, 63192; CHECK-NEXT: blr193;194; CHECK-NO-ISEL-LABEL: foo2l:195; CHECK-NO-ISEL: # %bb.0: # %entry196; CHECK-NO-ISEL-NEXT: sld 4, 3, 4197; CHECK-NO-ISEL-NEXT: addi 3, 4, -1198; CHECK-NO-ISEL-NEXT: std 4, 0(5)199; CHECK-NO-ISEL-NEXT: nor 3, 3, 4200; CHECK-NO-ISEL-NEXT: rldicl 3, 3, 1, 63201; CHECK-NO-ISEL-NEXT: blr202entry:203 %shl = shl i64 %a, %b204 store i64 %shl, ptr %c, align 8205 %cmp = icmp sgt i64 %shl, 0206 %conv1 = zext i1 %cmp to i64207 ret i64 %conv1208}209 210define double @food(double %a, double %b, ptr nocapture %c) #0 {211; CHECK-LABEL: food:212; CHECK: # %bb.0: # %entry213; CHECK-NEXT: fsub 0, 1, 2214; CHECK-NEXT: fcmpu 0, 1, 2215; CHECK-NEXT: stfd 0, 0(5)216; CHECK-NEXT: bgtlr 0217; CHECK-NEXT: # %bb.1: # %entry218; CHECK-NEXT: fmr 1, 2219; CHECK-NEXT: blr220;221; CHECK-NO-ISEL-LABEL: food:222; CHECK-NO-ISEL: # %bb.0: # %entry223; CHECK-NO-ISEL-NEXT: fsub 0, 1, 2224; CHECK-NO-ISEL-NEXT: fcmpu 0, 1, 2225; CHECK-NO-ISEL-NEXT: stfd 0, 0(5)226; CHECK-NO-ISEL-NEXT: bgtlr 0227; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry228; CHECK-NO-ISEL-NEXT: fmr 1, 2229; CHECK-NO-ISEL-NEXT: blr230entry:231 %sub = fsub double %a, %b232 store double %sub, ptr %c, align 8233 %cmp = fcmp ogt double %a, %b234 %cond = select i1 %cmp, double %a, double %b235 ret double %cond236}237 238define float @foof(float %a, float %b, ptr nocapture %c) #0 {239; CHECK-LABEL: foof:240; CHECK: # %bb.0: # %entry241; CHECK-NEXT: fsubs 0, 1, 2242; CHECK-NEXT: fcmpu 0, 1, 2243; CHECK-NEXT: stfs 0, 0(5)244; CHECK-NEXT: bgtlr 0245; CHECK-NEXT: # %bb.1: # %entry246; CHECK-NEXT: fmr 1, 2247; CHECK-NEXT: blr248;249; CHECK-NO-ISEL-LABEL: foof:250; CHECK-NO-ISEL: # %bb.0: # %entry251; CHECK-NO-ISEL-NEXT: fsubs 0, 1, 2252; CHECK-NO-ISEL-NEXT: fcmpu 0, 1, 2253; CHECK-NO-ISEL-NEXT: stfs 0, 0(5)254; CHECK-NO-ISEL-NEXT: bgtlr 0255; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry256; CHECK-NO-ISEL-NEXT: fmr 1, 2257; CHECK-NO-ISEL-NEXT: blr258entry:259 %sub = fsub float %a, %b260 store float %sub, ptr %c, align 4261 %cmp = fcmp ogt float %a, %b262 %cond = select i1 %cmp, float %a, float %b263 ret float %cond264}265 266declare i64 @llvm.ctpop.i64(i64);267 268define signext i64 @fooct(i64 signext %a, i64 signext %b, ptr nocapture %c) #0 {269; CHECK-LABEL: fooct:270; CHECK: # %bb.0: # %entry271; CHECK-NEXT: lis 6, 21845272; CHECK-NEXT: sub 7, 3, 4273; CHECK-NEXT: ori 6, 6, 21845274; CHECK-NEXT: lis 9, 13107275; CHECK-NEXT: rotldi 8, 7, 63276; CHECK-NEXT: rldimi 6, 6, 32, 0277; CHECK-NEXT: and 6, 8, 6278; CHECK-NEXT: ori 8, 9, 13107279; CHECK-NEXT: sub 6, 7, 6280; CHECK-NEXT: rldimi 8, 8, 32, 0281; CHECK-NEXT: lis 9, 257282; CHECK-NEXT: rotldi 7, 6, 62283; CHECK-NEXT: and 6, 6, 8284; CHECK-NEXT: ori 9, 9, 257285; CHECK-NEXT: and 7, 7, 8286; CHECK-NEXT: lis 8, 3855287; CHECK-NEXT: add 6, 6, 7288; CHECK-NEXT: ori 7, 8, 3855289; CHECK-NEXT: rldicl 8, 6, 60, 4290; CHECK-NEXT: rldimi 7, 7, 32, 0291; CHECK-NEXT: rldimi 9, 9, 32, 0292; CHECK-NEXT: add 6, 6, 8293; CHECK-NEXT: and 6, 6, 7294; CHECK-NEXT: mulld 6, 6, 9295; CHECK-NEXT: rldicl. 6, 6, 8, 56296; CHECK-NEXT: iselgt 3, 3, 4297; CHECK-NEXT: std 6, 0(5)298; CHECK-NEXT: blr299;300; CHECK-NO-ISEL-LABEL: fooct:301; CHECK-NO-ISEL: # %bb.0: # %entry302; CHECK-NO-ISEL-NEXT: lis 6, 21845303; CHECK-NO-ISEL-NEXT: sub 7, 3, 4304; CHECK-NO-ISEL-NEXT: ori 6, 6, 21845305; CHECK-NO-ISEL-NEXT: lis 9, 13107306; CHECK-NO-ISEL-NEXT: rotldi 8, 7, 63307; CHECK-NO-ISEL-NEXT: rldimi 6, 6, 32, 0308; CHECK-NO-ISEL-NEXT: and 6, 8, 6309; CHECK-NO-ISEL-NEXT: ori 8, 9, 13107310; CHECK-NO-ISEL-NEXT: sub 6, 7, 6311; CHECK-NO-ISEL-NEXT: rldimi 8, 8, 32, 0312; CHECK-NO-ISEL-NEXT: lis 9, 257313; CHECK-NO-ISEL-NEXT: rotldi 7, 6, 62314; CHECK-NO-ISEL-NEXT: and 6, 6, 8315; CHECK-NO-ISEL-NEXT: ori 9, 9, 257316; CHECK-NO-ISEL-NEXT: and 7, 7, 8317; CHECK-NO-ISEL-NEXT: lis 8, 3855318; CHECK-NO-ISEL-NEXT: add 6, 6, 7319; CHECK-NO-ISEL-NEXT: ori 7, 8, 3855320; CHECK-NO-ISEL-NEXT: rldicl 8, 6, 60, 4321; CHECK-NO-ISEL-NEXT: rldimi 7, 7, 32, 0322; CHECK-NO-ISEL-NEXT: rldimi 9, 9, 32, 0323; CHECK-NO-ISEL-NEXT: add 6, 6, 8324; CHECK-NO-ISEL-NEXT: and 6, 6, 7325; CHECK-NO-ISEL-NEXT: mulld 6, 6, 9326; CHECK-NO-ISEL-NEXT: rldicl. 6, 6, 8, 56327; CHECK-NO-ISEL-NEXT: std 6, 0(5)328; CHECK-NO-ISEL-NEXT: bgtlr 0329; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry330; CHECK-NO-ISEL-NEXT: mr 3, 4331; CHECK-NO-ISEL-NEXT: blr332entry:333 %sub = sub nsw i64 %a, %b334 %subc = call i64 @llvm.ctpop.i64(i64 %sub)335 store i64 %subc, ptr %c, align 4336 %cmp = icmp sgt i64 %subc, 0337 %cond = select i1 %cmp, i64 %a, i64 %b338 ret i64 %cond339}340