468 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -ppc-gpr-icmps=all -mtriple=powerpc64-unknown-linux-gnu \3; RUN: -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s4; RUN: llc -ppc-gpr-icmps=all -mtriple=powerpc64-unknown-linux-gnu \5; RUN: -verify-machineinstrs -mcpu=pwr7 -mattr=-isel < %s | \6; RUN: FileCheck --check-prefix=CHECK-NO-ISEL %s7; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -O2 \8; RUN: -ppc-asm-full-reg-names -mcpu=pwr10 -ppc-gpr-icmps=none < %s | \9; RUN: FileCheck %s --check-prefix=CHECK-P1010; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -O2 \11; RUN: -ppc-asm-full-reg-names -mcpu=pwr10 -ppc-gpr-icmps=none < %s | \12; RUN: FileCheck %s --check-prefix=CHECK-P1013 14; Function Attrs: nounwind readnone15define zeroext i1 @test1(float %v1, float %v2) #0 {16; CHECK-LABEL: test1:17; CHECK: # %bb.0: # %entry18; CHECK-NEXT: fcmpu 0, 1, 219; CHECK-NEXT: xxlxor 0, 0, 020; CHECK-NEXT: li 3, 121; CHECK-NEXT: fcmpu 1, 2, 222; CHECK-NEXT: crnor 20, 3, 023; CHECK-NEXT: fcmpu 0, 2, 024; CHECK-NEXT: crnor 21, 7, 125; CHECK-NEXT: crnand 20, 20, 2126; CHECK-NEXT: isel 3, 0, 3, 2027; CHECK-NEXT: blr28;29; CHECK-NO-ISEL-LABEL: test1:30; CHECK-NO-ISEL: # %bb.0: # %entry31; CHECK-NO-ISEL-NEXT: fcmpu 0, 1, 232; CHECK-NO-ISEL-NEXT: xxlxor 0, 0, 033; CHECK-NO-ISEL-NEXT: li 3, 034; CHECK-NO-ISEL-NEXT: fcmpu 1, 2, 235; CHECK-NO-ISEL-NEXT: crnor 20, 3, 036; CHECK-NO-ISEL-NEXT: fcmpu 0, 2, 037; CHECK-NO-ISEL-NEXT: bclr 4, 20, 038; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry39; CHECK-NO-ISEL-NEXT: crnor 20, 7, 140; CHECK-NO-ISEL-NEXT: bclr 4, 20, 041; CHECK-NO-ISEL-NEXT: # %bb.2: # %entry42; CHECK-NO-ISEL-NEXT: li 3, 143; CHECK-NO-ISEL-NEXT: blr44;45; CHECK-P10-LABEL: test1:46; CHECK-P10: # %bb.0: # %entry47; CHECK-P10-NEXT: fcmpu cr0, f1, f248; CHECK-P10-NEXT: xxlxor f0, f0, f049; CHECK-P10-NEXT: fcmpu cr1, f2, f250; CHECK-P10-NEXT: crnor 4*cr5+lt, un, lt51; CHECK-P10-NEXT: fcmpu cr0, f2, f052; CHECK-P10-NEXT: crnor 4*cr5+gt, 4*cr1+un, gt53; CHECK-P10-NEXT: crand 4*cr5+lt, 4*cr5+lt, 4*cr5+gt54; CHECK-P10-NEXT: setbc r3, 4*cr5+lt55; CHECK-P10-NEXT: blr56entry:57 %cmp = fcmp oge float %v1, %v258 %cmp2 = fcmp ole float %v2, 0.000000e+0059 %and5 = and i1 %cmp, %cmp260 ret i1 %and561 62 63}64 65; Function Attrs: nounwind readnone66define zeroext i1 @test2(float %v1, float %v2) #0 {67; CHECK-LABEL: test2:68; CHECK: # %bb.0: # %entry69; CHECK-NEXT: fcmpu 0, 1, 270; CHECK-NEXT: xxlxor 0, 0, 071; CHECK-NEXT: li 3, 172; CHECK-NEXT: fcmpu 1, 2, 273; CHECK-NEXT: crnor 20, 3, 074; CHECK-NEXT: fcmpu 0, 2, 075; CHECK-NEXT: crnor 21, 7, 176; CHECK-NEXT: creqv 20, 20, 2177; CHECK-NEXT: isel 3, 0, 3, 2078; CHECK-NEXT: blr79;80; CHECK-NO-ISEL-LABEL: test2:81; CHECK-NO-ISEL: # %bb.0: # %entry82; CHECK-NO-ISEL-NEXT: fcmpu 0, 1, 283; CHECK-NO-ISEL-NEXT: xxlxor 0, 0, 084; CHECK-NO-ISEL-NEXT: li 3, 085; CHECK-NO-ISEL-NEXT: fcmpu 1, 2, 286; CHECK-NO-ISEL-NEXT: crnor 20, 3, 087; CHECK-NO-ISEL-NEXT: fcmpu 0, 2, 088; CHECK-NO-ISEL-NEXT: crnor 21, 7, 189; CHECK-NO-ISEL-NEXT: creqv 20, 20, 2190; CHECK-NO-ISEL-NEXT: bclr 12, 20, 091; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry92; CHECK-NO-ISEL-NEXT: li 3, 193; CHECK-NO-ISEL-NEXT: blr94;95; CHECK-P10-LABEL: test2:96; CHECK-P10: # %bb.0: # %entry97; CHECK-P10-NEXT: fcmpu cr0, f1, f298; CHECK-P10-NEXT: xxlxor f0, f0, f099; CHECK-P10-NEXT: fcmpu cr1, f2, f2100; CHECK-P10-NEXT: crnor 4*cr5+lt, un, lt101; CHECK-P10-NEXT: fcmpu cr0, f2, f0102; CHECK-P10-NEXT: crnor 4*cr5+gt, 4*cr1+un, gt103; CHECK-P10-NEXT: crxor 4*cr5+lt, 4*cr5+lt, 4*cr5+gt104; CHECK-P10-NEXT: setbc r3, 4*cr5+lt105; CHECK-P10-NEXT: blr106entry:107 %cmp = fcmp oge float %v1, %v2108 %cmp2 = fcmp ole float %v2, 0.000000e+00109 %xor5 = xor i1 %cmp, %cmp2110 ret i1 %xor5111 112 113}114 115; Function Attrs: nounwind readnone116define zeroext i1 @test3(float %v1, float %v2, i32 signext %x) #0 {117; CHECK-LABEL: test3:118; CHECK: # %bb.0: # %entry119; CHECK-NEXT: fcmpu 0, 1, 2120; CHECK-NEXT: xxlxor 0, 0, 0121; CHECK-NEXT: li 3, 1122; CHECK-NEXT: fcmpu 1, 2, 2123; CHECK-NEXT: crnor 20, 3, 0124; CHECK-NEXT: fcmpu 0, 2, 0125; CHECK-NEXT: crnor 21, 7, 1126; CHECK-NEXT: cmpwi 5, -2127; CHECK-NEXT: crandc 21, 21, 2128; CHECK-NEXT: creqv 20, 20, 21129; CHECK-NEXT: isel 3, 0, 3, 20130; CHECK-NEXT: blr131;132; CHECK-NO-ISEL-LABEL: test3:133; CHECK-NO-ISEL: # %bb.0: # %entry134; CHECK-NO-ISEL-NEXT: fcmpu 0, 1, 2135; CHECK-NO-ISEL-NEXT: xxlxor 0, 0, 0136; CHECK-NO-ISEL-NEXT: li 3, 0137; CHECK-NO-ISEL-NEXT: fcmpu 1, 2, 2138; CHECK-NO-ISEL-NEXT: crnor 20, 3, 0139; CHECK-NO-ISEL-NEXT: fcmpu 0, 2, 0140; CHECK-NO-ISEL-NEXT: crnor 21, 7, 1141; CHECK-NO-ISEL-NEXT: cmpwi 5, -2142; CHECK-NO-ISEL-NEXT: crandc 21, 21, 2143; CHECK-NO-ISEL-NEXT: creqv 20, 20, 21144; CHECK-NO-ISEL-NEXT: bclr 12, 20, 0145; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry146; CHECK-NO-ISEL-NEXT: li 3, 1147; CHECK-NO-ISEL-NEXT: blr148;149; CHECK-P10-LABEL: test3:150; CHECK-P10: # %bb.0: # %entry151; CHECK-P10-NEXT: fcmpu cr0, f1, f2152; CHECK-P10-NEXT: xxlxor f0, f0, f0153; CHECK-P10-NEXT: fcmpu cr1, f2, f2154; CHECK-P10-NEXT: crnor 4*cr5+lt, un, lt155; CHECK-P10-NEXT: fcmpu cr0, f2, f0156; CHECK-P10-NEXT: crnor 4*cr5+gt, 4*cr1+un, gt157; CHECK-P10-NEXT: cmpwi r5, -2158; CHECK-P10-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq159; CHECK-P10-NEXT: crxor 4*cr5+lt, 4*cr5+lt, 4*cr5+gt160; CHECK-P10-NEXT: setbc r3, 4*cr5+lt161; CHECK-P10-NEXT: blr162entry:163 %cmp = fcmp oge float %v1, %v2164 %cmp2 = fcmp ole float %v2, 0.000000e+00165 %cmp4 = icmp ne i32 %x, -2166 %and7 = and i1 %cmp2, %cmp4167 %xor8 = xor i1 %cmp, %and7168 ret i1 %xor8169 170 171}172 173; Function Attrs: nounwind readnone174define zeroext i1 @test4(i1 zeroext %v1, i1 zeroext %v2, i1 zeroext %v3) #0 {175; CHECK-LABEL: test4:176; CHECK: # %bb.0: # %entry177; CHECK-NEXT: and 3, 3, 4178; CHECK-NEXT: or 3, 3, 5179; CHECK-NEXT: blr180;181; CHECK-NO-ISEL-LABEL: test4:182; CHECK-NO-ISEL: # %bb.0: # %entry183; CHECK-NO-ISEL-NEXT: and 3, 3, 4184; CHECK-NO-ISEL-NEXT: or 3, 3, 5185; CHECK-NO-ISEL-NEXT: blr186;187; CHECK-P10-LABEL: test4:188; CHECK-P10: # %bb.0: # %entry189; CHECK-P10-NEXT: and r3, r3, r4190; CHECK-P10-NEXT: or r3, r3, r5191; CHECK-P10-NEXT: blr192entry:193 %and8 = and i1 %v1, %v2194 %or9 = or i1 %and8, %v3195 ret i1 %or9196 197}198 199; Function Attrs: nounwind readnone200define zeroext i1 @test5(i1 zeroext %v1, i1 zeroext %v2, i32 signext %v3) #0 {201; CHECK-LABEL: test5:202; CHECK: # %bb.0: # %entry203; CHECK-NEXT: and 3, 3, 4204; CHECK-NEXT: li 4, -2205; CHECK-NEXT: xor 4, 5, 4206; CHECK-NEXT: clrldi 3, 3, 63207; CHECK-NEXT: cntlzw 4, 4208; CHECK-NEXT: srwi 4, 4, 5209; CHECK-NEXT: xori 4, 4, 1210; CHECK-NEXT: or 3, 3, 4211; CHECK-NEXT: blr212;213; CHECK-NO-ISEL-LABEL: test5:214; CHECK-NO-ISEL: # %bb.0: # %entry215; CHECK-NO-ISEL-NEXT: and 3, 3, 4216; CHECK-NO-ISEL-NEXT: li 4, -2217; CHECK-NO-ISEL-NEXT: xor 4, 5, 4218; CHECK-NO-ISEL-NEXT: clrldi 3, 3, 63219; CHECK-NO-ISEL-NEXT: cntlzw 4, 4220; CHECK-NO-ISEL-NEXT: srwi 4, 4, 5221; CHECK-NO-ISEL-NEXT: xori 4, 4, 1222; CHECK-NO-ISEL-NEXT: or 3, 3, 4223; CHECK-NO-ISEL-NEXT: blr224;225; CHECK-P10-LABEL: test5:226; CHECK-P10: # %bb.0: # %entry227; CHECK-P10-NEXT: and r3, r3, r4228; CHECK-P10-NEXT: cmpwi cr1, r5, -2229; CHECK-P10-NEXT: andi. r3, r3, 1230; CHECK-P10-NEXT: crorc 4*cr5+lt, gt, 4*cr1+eq231; CHECK-P10-NEXT: setbc r3, 4*cr5+lt232; CHECK-P10-NEXT: blr233entry:234 %and6 = and i1 %v1, %v2235 %cmp = icmp ne i32 %v3, -2236 %or7 = or i1 %and6, %cmp237 ret i1 %or7238 239 240}241 242; Function Attrs: nounwind readnone243define zeroext i1 @test6(i1 zeroext %v1, i1 zeroext %v2, i32 signext %v3) #0 {244; CHECK-LABEL: test6:245; CHECK: # %bb.0: # %entry246; CHECK-NEXT: li 6, -2247; CHECK-NEXT: clrldi 4, 4, 63248; CHECK-NEXT: clrldi 3, 3, 63249; CHECK-NEXT: xor 5, 5, 6250; CHECK-NEXT: cntlzw 5, 5251; CHECK-NEXT: srwi 5, 5, 5252; CHECK-NEXT: xori 5, 5, 1253; CHECK-NEXT: or 4, 5, 4254; CHECK-NEXT: and 3, 4, 3255; CHECK-NEXT: blr256;257; CHECK-NO-ISEL-LABEL: test6:258; CHECK-NO-ISEL: # %bb.0: # %entry259; CHECK-NO-ISEL-NEXT: li 6, -2260; CHECK-NO-ISEL-NEXT: clrldi 4, 4, 63261; CHECK-NO-ISEL-NEXT: clrldi 3, 3, 63262; CHECK-NO-ISEL-NEXT: xor 5, 5, 6263; CHECK-NO-ISEL-NEXT: cntlzw 5, 5264; CHECK-NO-ISEL-NEXT: srwi 5, 5, 5265; CHECK-NO-ISEL-NEXT: xori 5, 5, 1266; CHECK-NO-ISEL-NEXT: or 4, 5, 4267; CHECK-NO-ISEL-NEXT: and 3, 4, 3268; CHECK-NO-ISEL-NEXT: blr269;270; CHECK-P10-LABEL: test6:271; CHECK-P10: # %bb.0: # %entry272; CHECK-P10-NEXT: andi. r3, r3, 1273; CHECK-P10-NEXT: cmpwi cr1, r5, -2274; CHECK-P10-NEXT: crmove 4*cr5+lt, gt275; CHECK-P10-NEXT: andi. r3, r4, 1276; CHECK-P10-NEXT: crorc 4*cr5+gt, gt, 4*cr1+eq277; CHECK-P10-NEXT: crand 4*cr5+lt, 4*cr5+gt, 4*cr5+lt278; CHECK-P10-NEXT: setbc r3, 4*cr5+lt279; CHECK-P10-NEXT: blr280entry:281 %cmp = icmp ne i32 %v3, -2282 %or6 = or i1 %cmp, %v2283 %and7 = and i1 %or6, %v1284 ret i1 %and7285 286 287}288 289; Function Attrs: nounwind readnone290define signext i32 @test7(i1 zeroext %v2, i32 signext %i1, i32 signext %i2) #0 {291; CHECK-LABEL: test7:292; CHECK: # %bb.0: # %entry293; CHECK-NEXT: andi. 3, 3, 1294; CHECK-NEXT: iselgt 3, 4, 5295; CHECK-NEXT: blr296;297; CHECK-NO-ISEL-LABEL: test7:298; CHECK-NO-ISEL: # %bb.0: # %entry299; CHECK-NO-ISEL-NEXT: andi. 3, 3, 1300; CHECK-NO-ISEL-NEXT: bc 12, 1, .LBB6_2301; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry302; CHECK-NO-ISEL-NEXT: mr 4, 5303; CHECK-NO-ISEL-NEXT: .LBB6_2: # %entry304; CHECK-NO-ISEL-NEXT: mr 3, 4305; CHECK-NO-ISEL-NEXT: blr306;307; CHECK-P10-LABEL: test7:308; CHECK-P10: # %bb.0: # %entry309; CHECK-P10-NEXT: andi. r3, r3, 1310; CHECK-P10-NEXT: iselgt r3, r4, r5311; CHECK-P10-NEXT: blr312entry:313 %cond = select i1 %v2, i32 %i1, i32 %i2314 ret i32 %cond315 316}317 318define signext i32 @exttest7(i32 signext %a) #0 {319; CHECK-LABEL: exttest7:320; CHECK: # %bb.0: # %entry321; CHECK-NEXT: cmplwi 3, 5322; CHECK-NEXT: li 3, 8323; CHECK-NEXT: li 4, 7324; CHECK-NEXT: iseleq 3, 4, 3325; CHECK-NEXT: blr326;327; CHECK-NO-ISEL-LABEL: exttest7:328; CHECK-NO-ISEL: # %bb.0: # %entry329; CHECK-NO-ISEL-NEXT: cmplwi 3, 5330; CHECK-NO-ISEL-NEXT: li 3, 7331; CHECK-NO-ISEL-NEXT: beqlr 0332; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry333; CHECK-NO-ISEL-NEXT: li 3, 8334; CHECK-NO-ISEL-NEXT: blr335;336; CHECK-P10-LABEL: exttest7:337; CHECK-P10: # %bb.0: # %entry338; CHECK-P10-NEXT: cmplwi r3, 5339; CHECK-P10-NEXT: li r3, 8340; CHECK-P10-NEXT: li r4, 7341; CHECK-P10-NEXT: iseleq r3, r4, r3342; CHECK-P10-NEXT: blr343entry:344 %cmp = icmp eq i32 %a, 5345 %cond = select i1 %cmp, i32 7, i32 8346 ret i32 %cond347 348}349 350define zeroext i32 @exttest8() #0 {351; CHECK-LABEL: exttest8:352; CHECK: # %bb.0: # %entry353; CHECK-NEXT: ld 3, 0(3)354; CHECK-NEXT: subfic 3, 3, 80355; CHECK-NEXT: rldicl 3, 3, 63, 1356; CHECK-NEXT: cmplwi 3, 80357; CHECK-NEXT: iselgt 3, 0, 3358; CHECK-NEXT: clrldi 3, 3, 32359; CHECK-NEXT: blr360;361; CHECK-NO-ISEL-LABEL: exttest8:362; CHECK-NO-ISEL: # %bb.0: # %entry363; CHECK-NO-ISEL-NEXT: ld 3, 0(3)364; CHECK-NO-ISEL-NEXT: li 4, 0365; CHECK-NO-ISEL-NEXT: subfic 3, 3, 80366; CHECK-NO-ISEL-NEXT: rldicl 3, 3, 63, 1367; CHECK-NO-ISEL-NEXT: cmplwi 3, 80368; CHECK-NO-ISEL-NEXT: bgt 0, .LBB8_2369; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry370; CHECK-NO-ISEL-NEXT: mr 4, 3371; CHECK-NO-ISEL-NEXT: .LBB8_2: # %entry372; CHECK-NO-ISEL-NEXT: clrldi 3, 4, 32373; CHECK-NO-ISEL-NEXT: blr374;375; CHECK-P10-LABEL: exttest8:376; CHECK-P10: # %bb.0: # %entry377; CHECK-P10-NEXT: ld r3, 0(r3)378; CHECK-P10-NEXT: subfic r3, r3, 80379; CHECK-P10-NEXT: rldicl r3, r3, 63, 1380; CHECK-P10-NEXT: cmplwi r3, 80381; CHECK-P10-NEXT: iselgt r3, 0, r3382; CHECK-P10-NEXT: clrldi r3, r3, 32383; CHECK-P10-NEXT: blr384entry:385 %v0 = load i64, ptr undef, align 8386 %sub = sub i64 80, %v0387 %div = lshr i64 %sub, 1388 %conv13 = trunc i64 %div to i32389 %cmp14 = icmp ugt i32 %conv13, 80390 %.conv13 = select i1 %cmp14, i32 0, i32 %conv13391 ret i32 %.conv13392; This is a don't-crash test: %conv13 is both one of the possible select output393; values and also an input to the conditional feeding it.394}395 396; Function Attrs: nounwind readnone397define float @test8(i1 zeroext %v2, float %v1, float %v3) #0 {398; CHECK-LABEL: test8:399; CHECK: # %bb.0: # %entry400; CHECK-NEXT: andi. 3, 3, 1401; CHECK-NEXT: bclr 12, 1, 0402; CHECK-NEXT: # %bb.1: # %entry403; CHECK-NEXT: fmr 1, 2404; CHECK-NEXT: blr405;406; CHECK-NO-ISEL-LABEL: test8:407; CHECK-NO-ISEL: # %bb.0: # %entry408; CHECK-NO-ISEL-NEXT: andi. 3, 3, 1409; CHECK-NO-ISEL-NEXT: bclr 12, 1, 0410; CHECK-NO-ISEL-NEXT: # %bb.1: # %entry411; CHECK-NO-ISEL-NEXT: fmr 1, 2412; CHECK-NO-ISEL-NEXT: blr413;414; CHECK-P10-LABEL: test8:415; CHECK-P10: # %bb.0: # %entry416; CHECK-P10-NEXT: andi. r3, r3, 1417; CHECK-P10-NEXT: bclr 12, gt, 0418; CHECK-P10-NEXT: # %bb.1: # %entry419; CHECK-P10-NEXT: fmr f1, f2420; CHECK-P10-NEXT: blr421entry:422 %cond = select i1 %v2, float %v1, float %v3423 ret float %cond424 425}426 427; Function Attrs: nounwind readnone428define signext i32 @test10(i32 signext %v1, i32 signext %v2) #0 {429; CHECK-LABEL: test10:430; CHECK: # %bb.0: # %entry431; CHECK-NEXT: cntlzw 3, 3432; CHECK-NEXT: cntlzw 4, 4433; CHECK-NEXT: srwi 3, 3, 5434; CHECK-NEXT: srwi 4, 4, 5435; CHECK-NEXT: xori 3, 3, 1436; CHECK-NEXT: and 3, 3, 4437; CHECK-NEXT: blr438;439; CHECK-NO-ISEL-LABEL: test10:440; CHECK-NO-ISEL: # %bb.0: # %entry441; CHECK-NO-ISEL-NEXT: cntlzw 3, 3442; CHECK-NO-ISEL-NEXT: cntlzw 4, 4443; CHECK-NO-ISEL-NEXT: srwi 3, 3, 5444; CHECK-NO-ISEL-NEXT: srwi 4, 4, 5445; CHECK-NO-ISEL-NEXT: xori 3, 3, 1446; CHECK-NO-ISEL-NEXT: and 3, 3, 4447; CHECK-NO-ISEL-NEXT: blr448;449; CHECK-P10-LABEL: test10:450; CHECK-P10: # %bb.0: # %entry451; CHECK-P10-NEXT: cmpwi r3, 0452; CHECK-P10-NEXT: cmpwi cr1, r4, 0453; CHECK-P10-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq454; CHECK-P10-NEXT: setbc r3, 4*cr5+lt455; CHECK-P10-NEXT: blr456entry:457 %tobool = icmp ne i32 %v1, 0458 %lnot = icmp eq i32 %v2, 0459 %and3 = and i1 %tobool, %lnot460 %and = zext i1 %and3 to i32461 ret i32 %and462 463 464}465 466attributes #0 = { nounwind readnone }467 468