1414 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \3; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s4; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \5; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=CHECK-PWR8 \6; RUN: -implicit-check-not "\<setb\>"7 8; Test different patterns with type i649 10; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setlt11define i64 @setb1(i64 %a, i64 %b) {12; CHECK-LABEL: setb1:13; CHECK: # %bb.0:14; CHECK-NEXT: cmpd r3, r415; CHECK-NEXT: setb r3, cr016; CHECK-NEXT: blr17;18; CHECK-PWR8-LABEL: setb1:19; CHECK-PWR8: # %bb.0:20; CHECK-PWR8-NEXT: xor r5, r3, r421; CHECK-PWR8-NEXT: cmpd r3, r422; CHECK-PWR8-NEXT: li r3, -123; CHECK-PWR8-NEXT: addic r6, r5, -124; CHECK-PWR8-NEXT: subfe r5, r6, r525; CHECK-PWR8-NEXT: isellt r3, r3, r526; CHECK-PWR8-NEXT: blr27 %t1 = icmp slt i64 %a, %b28 %t2 = icmp ne i64 %a, %b29 %t3 = zext i1 %t2 to i6430 %t4 = select i1 %t1, i64 -1, i64 %t331 ret i64 %t432}33 34; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setgt35define i64 @setb2(i64 %a, i64 %b) {36; CHECK-LABEL: setb2:37; CHECK: # %bb.0:38; CHECK-NEXT: cmpd r3, r439; CHECK-NEXT: setb r3, cr040; CHECK-NEXT: blr41;42; CHECK-PWR8-LABEL: setb2:43; CHECK-PWR8: # %bb.0:44; CHECK-PWR8-NEXT: xor r5, r3, r445; CHECK-PWR8-NEXT: cmpd r4, r346; CHECK-PWR8-NEXT: li r3, -147; CHECK-PWR8-NEXT: addic r6, r5, -148; CHECK-PWR8-NEXT: subfe r5, r6, r549; CHECK-PWR8-NEXT: iselgt r3, r3, r550; CHECK-PWR8-NEXT: blr51 %t1 = icmp sgt i64 %b, %a52 %t2 = icmp ne i64 %a, %b53 %t3 = zext i1 %t2 to i6454 %t4 = select i1 %t1, i64 -1, i64 %t355 ret i64 %t456}57 58; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setlt59define i64 @setb3(i64 %a, i64 %b) {60; CHECK-LABEL: setb3:61; CHECK: # %bb.0:62; CHECK-NEXT: cmpd r3, r463; CHECK-NEXT: setb r3, cr064; CHECK-NEXT: blr65;66; CHECK-PWR8-LABEL: setb3:67; CHECK-PWR8: # %bb.0:68; CHECK-PWR8-NEXT: xor r5, r4, r369; CHECK-PWR8-NEXT: cmpd r3, r470; CHECK-PWR8-NEXT: li r3, -171; CHECK-PWR8-NEXT: addic r6, r5, -172; CHECK-PWR8-NEXT: subfe r5, r6, r573; CHECK-PWR8-NEXT: isellt r3, r3, r574; CHECK-PWR8-NEXT: blr75 %t1 = icmp slt i64 %a, %b76 %t2 = icmp ne i64 %b, %a77 %t3 = zext i1 %t2 to i6478 %t4 = select i1 %t1, i64 -1, i64 %t379 ret i64 %t480}81 82; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setgt83define i64 @setb4(i64 %a, i64 %b) {84; CHECK-LABEL: setb4:85; CHECK: # %bb.0:86; CHECK-NEXT: cmpd r3, r487; CHECK-NEXT: setb r3, cr088; CHECK-NEXT: blr89;90; CHECK-PWR8-LABEL: setb4:91; CHECK-PWR8: # %bb.0:92; CHECK-PWR8-NEXT: xor r5, r4, r393; CHECK-PWR8-NEXT: cmpd r4, r394; CHECK-PWR8-NEXT: li r3, -195; CHECK-PWR8-NEXT: addic r6, r5, -196; CHECK-PWR8-NEXT: subfe r5, r6, r597; CHECK-PWR8-NEXT: iselgt r3, r3, r598; CHECK-PWR8-NEXT: blr99 %t1 = icmp sgt i64 %b, %a100 %t2 = icmp ne i64 %b, %a101 %t3 = zext i1 %t2 to i64102 %t4 = select i1 %t1, i64 -1, i64 %t3103 ret i64 %t4104}105 106; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setgt)), setlt107define i64 @setb5(i64 %a, i64 %b) {108; CHECK-LABEL: setb5:109; CHECK: # %bb.0:110; CHECK-NEXT: cmpd r3, r4111; CHECK-NEXT: setb r3, cr0112; CHECK-NEXT: blr113;114; CHECK-PWR8-LABEL: setb5:115; CHECK-PWR8: # %bb.0:116; CHECK-PWR8-NEXT: sradi r5, r4, 63117; CHECK-PWR8-NEXT: rldicl r6, r3, 1, 63118; CHECK-PWR8-NEXT: subc r7, r4, r3119; CHECK-PWR8-NEXT: adde r5, r6, r5120; CHECK-PWR8-NEXT: cmpd r3, r4121; CHECK-PWR8-NEXT: li r3, -1122; CHECK-PWR8-NEXT: xori r5, r5, 1123; CHECK-PWR8-NEXT: isellt r3, r3, r5124; CHECK-PWR8-NEXT: blr125 %t1 = icmp slt i64 %a, %b126 %t2 = icmp sgt i64 %a, %b127 %t3 = zext i1 %t2 to i64128 %t4 = select i1 %t1, i64 -1, i64 %t3129 ret i64 %t4130}131 132; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setgt)), setgt133define i64 @setb6(i64 %a, i64 %b) {134; CHECK-LABEL: setb6:135; CHECK: # %bb.0:136; CHECK-NEXT: cmpd r3, r4137; CHECK-NEXT: setb r3, cr0138; CHECK-NEXT: blr139;140; CHECK-PWR8-LABEL: setb6:141; CHECK-PWR8: # %bb.0:142; CHECK-PWR8-NEXT: sradi r5, r4, 63143; CHECK-PWR8-NEXT: rldicl r6, r3, 1, 63144; CHECK-PWR8-NEXT: subc r7, r4, r3145; CHECK-PWR8-NEXT: adde r5, r6, r5146; CHECK-PWR8-NEXT: cmpd r4, r3147; CHECK-PWR8-NEXT: li r3, -1148; CHECK-PWR8-NEXT: xori r5, r5, 1149; CHECK-PWR8-NEXT: iselgt r3, r3, r5150; CHECK-PWR8-NEXT: blr151 %t1 = icmp sgt i64 %b, %a152 %t2 = icmp sgt i64 %a, %b153 %t3 = zext i1 %t2 to i64154 %t4 = select i1 %t1, i64 -1, i64 %t3155 ret i64 %t4156}157 158; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setlt)), setlt159define i64 @setb7(i64 %a, i64 %b) {160; CHECK-LABEL: setb7:161; CHECK: # %bb.0:162; CHECK-NEXT: cmpd r3, r4163; CHECK-NEXT: setb r3, cr0164; CHECK-NEXT: blr165;166; CHECK-PWR8-LABEL: setb7:167; CHECK-PWR8: # %bb.0:168; CHECK-PWR8-NEXT: sradi r5, r4, 63169; CHECK-PWR8-NEXT: rldicl r6, r3, 1, 63170; CHECK-PWR8-NEXT: subc r7, r4, r3171; CHECK-PWR8-NEXT: adde r5, r6, r5172; CHECK-PWR8-NEXT: cmpd r3, r4173; CHECK-PWR8-NEXT: li r3, -1174; CHECK-PWR8-NEXT: xori r5, r5, 1175; CHECK-PWR8-NEXT: isellt r3, r3, r5176; CHECK-PWR8-NEXT: blr177 %t1 = icmp slt i64 %a, %b178 %t2 = icmp slt i64 %b, %a179 %t3 = zext i1 %t2 to i64180 %t4 = select i1 %t1, i64 -1, i64 %t3181 ret i64 %t4182}183 184; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setlt)), setgt185define i64 @setb8(i64 %a, i64 %b) {186; CHECK-LABEL: setb8:187; CHECK: # %bb.0:188; CHECK-NEXT: cmpd r3, r4189; CHECK-NEXT: setb r3, cr0190; CHECK-NEXT: blr191;192; CHECK-PWR8-LABEL: setb8:193; CHECK-PWR8: # %bb.0:194; CHECK-PWR8-NEXT: sradi r5, r4, 63195; CHECK-PWR8-NEXT: rldicl r6, r3, 1, 63196; CHECK-PWR8-NEXT: subc r7, r4, r3197; CHECK-PWR8-NEXT: adde r5, r6, r5198; CHECK-PWR8-NEXT: cmpd r4, r3199; CHECK-PWR8-NEXT: li r3, -1200; CHECK-PWR8-NEXT: xori r5, r5, 1201; CHECK-PWR8-NEXT: iselgt r3, r3, r5202; CHECK-PWR8-NEXT: blr203 %t1 = icmp sgt i64 %b, %a204 %t2 = icmp slt i64 %b, %a205 %t3 = zext i1 %t2 to i64206 %t4 = select i1 %t1, i64 -1, i64 %t3207 ret i64 %t4208}209 210; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setne)), setgt211define i64 @setb9(i64 %a, i64 %b) {212; CHECK-LABEL: setb9:213; CHECK: # %bb.0:214; CHECK-NEXT: cmpd r3, r4215; CHECK-NEXT: setb r3, cr0216; CHECK-NEXT: blr217;218; CHECK-PWR8-LABEL: setb9:219; CHECK-PWR8: # %bb.0:220; CHECK-PWR8-NEXT: xor r5, r3, r4221; CHECK-PWR8-NEXT: cmpd r3, r4222; CHECK-PWR8-NEXT: li r3, 1223; CHECK-PWR8-NEXT: subfic r5, r5, 0224; CHECK-PWR8-NEXT: subfe r5, r5, r5225; CHECK-PWR8-NEXT: iselgt r3, r3, r5226; CHECK-PWR8-NEXT: blr227 %t1 = icmp sgt i64 %a, %b228 %t2 = icmp ne i64 %a, %b229 %t3 = sext i1 %t2 to i64230 %t4 = select i1 %t1, i64 1, i64 %t3231 ret i64 %t4232}233 234; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setne)), setlt235define i64 @setb10(i64 %a, i64 %b) {236; CHECK-LABEL: setb10:237; CHECK: # %bb.0:238; CHECK-NEXT: cmpd r3, r4239; CHECK-NEXT: setb r3, cr0240; CHECK-NEXT: blr241;242; CHECK-PWR8-LABEL: setb10:243; CHECK-PWR8: # %bb.0:244; CHECK-PWR8-NEXT: xor r5, r3, r4245; CHECK-PWR8-NEXT: cmpd r4, r3246; CHECK-PWR8-NEXT: li r3, 1247; CHECK-PWR8-NEXT: subfic r5, r5, 0248; CHECK-PWR8-NEXT: subfe r5, r5, r5249; CHECK-PWR8-NEXT: isellt r3, r3, r5250; CHECK-PWR8-NEXT: blr251 %t1 = icmp slt i64 %b, %a252 %t2 = icmp ne i64 %a, %b253 %t3 = sext i1 %t2 to i64254 %t4 = select i1 %t1, i64 1, i64 %t3255 ret i64 %t4256}257 258; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setne)), setgt259define i64 @setb11(i64 %a, i64 %b) {260; CHECK-LABEL: setb11:261; CHECK: # %bb.0:262; CHECK-NEXT: cmpd r3, r4263; CHECK-NEXT: setb r3, cr0264; CHECK-NEXT: blr265;266; CHECK-PWR8-LABEL: setb11:267; CHECK-PWR8: # %bb.0:268; CHECK-PWR8-NEXT: xor r5, r4, r3269; CHECK-PWR8-NEXT: cmpd r3, r4270; CHECK-PWR8-NEXT: li r3, 1271; CHECK-PWR8-NEXT: subfic r5, r5, 0272; CHECK-PWR8-NEXT: subfe r5, r5, r5273; CHECK-PWR8-NEXT: iselgt r3, r3, r5274; CHECK-PWR8-NEXT: blr275 %t1 = icmp sgt i64 %a, %b276 %t2 = icmp ne i64 %b, %a277 %t3 = sext i1 %t2 to i64278 %t4 = select i1 %t1, i64 1, i64 %t3279 ret i64 %t4280}281 282; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setne)), setlt283define i64 @setb12(i64 %a, i64 %b) {284; CHECK-LABEL: setb12:285; CHECK: # %bb.0:286; CHECK-NEXT: cmpd r3, r4287; CHECK-NEXT: setb r3, cr0288; CHECK-NEXT: blr289;290; CHECK-PWR8-LABEL: setb12:291; CHECK-PWR8: # %bb.0:292; CHECK-PWR8-NEXT: xor r5, r4, r3293; CHECK-PWR8-NEXT: cmpd r4, r3294; CHECK-PWR8-NEXT: li r3, 1295; CHECK-PWR8-NEXT: subfic r5, r5, 0296; CHECK-PWR8-NEXT: subfe r5, r5, r5297; CHECK-PWR8-NEXT: isellt r3, r3, r5298; CHECK-PWR8-NEXT: blr299 %t1 = icmp slt i64 %b, %a300 %t2 = icmp ne i64 %b, %a301 %t3 = sext i1 %t2 to i64302 %t4 = select i1 %t1, i64 1, i64 %t3303 ret i64 %t4304}305 306; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setlt)), setgt307define i64 @setb13(i64 %a, i64 %b) {308; CHECK-LABEL: setb13:309; CHECK: # %bb.0:310; CHECK-NEXT: cmpd r3, r4311; CHECK-NEXT: setb r3, cr0312; CHECK-NEXT: blr313;314; CHECK-PWR8-LABEL: setb13:315; CHECK-PWR8: # %bb.0:316; CHECK-PWR8-NEXT: sradi r5, r3, 63317; CHECK-PWR8-NEXT: rldicl r6, r4, 1, 63318; CHECK-PWR8-NEXT: subc r7, r3, r4319; CHECK-PWR8-NEXT: adde r5, r6, r5320; CHECK-PWR8-NEXT: cmpd r3, r4321; CHECK-PWR8-NEXT: li r3, 1322; CHECK-PWR8-NEXT: xori r5, r5, 1323; CHECK-PWR8-NEXT: neg r5, r5324; CHECK-PWR8-NEXT: iselgt r3, r3, r5325; CHECK-PWR8-NEXT: blr326 %t1 = icmp sgt i64 %a, %b327 %t2 = icmp slt i64 %a, %b328 %t3 = sext i1 %t2 to i64329 %t4 = select i1 %t1, i64 1, i64 %t3330 ret i64 %t4331}332 333; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setlt)), setlt334define i64 @setb14(i64 %a, i64 %b) {335; CHECK-LABEL: setb14:336; CHECK: # %bb.0:337; CHECK-NEXT: cmpd r3, r4338; CHECK-NEXT: setb r3, cr0339; CHECK-NEXT: blr340;341; CHECK-PWR8-LABEL: setb14:342; CHECK-PWR8: # %bb.0:343; CHECK-PWR8-NEXT: sradi r5, r3, 63344; CHECK-PWR8-NEXT: rldicl r6, r4, 1, 63345; CHECK-PWR8-NEXT: subc r7, r3, r4346; CHECK-PWR8-NEXT: adde r5, r6, r5347; CHECK-PWR8-NEXT: cmpd r4, r3348; CHECK-PWR8-NEXT: li r3, 1349; CHECK-PWR8-NEXT: xori r5, r5, 1350; CHECK-PWR8-NEXT: neg r5, r5351; CHECK-PWR8-NEXT: isellt r3, r3, r5352; CHECK-PWR8-NEXT: blr353 %t1 = icmp slt i64 %b, %a354 %t2 = icmp slt i64 %a, %b355 %t3 = sext i1 %t2 to i64356 %t4 = select i1 %t1, i64 1, i64 %t3357 ret i64 %t4358}359 360; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setgt)), setgt361define i64 @setb15(i64 %a, i64 %b) {362; CHECK-LABEL: setb15:363; CHECK: # %bb.0:364; CHECK-NEXT: cmpd r3, r4365; CHECK-NEXT: setb r3, cr0366; CHECK-NEXT: blr367;368; CHECK-PWR8-LABEL: setb15:369; CHECK-PWR8: # %bb.0:370; CHECK-PWR8-NEXT: sradi r5, r3, 63371; CHECK-PWR8-NEXT: rldicl r6, r4, 1, 63372; CHECK-PWR8-NEXT: subc r7, r3, r4373; CHECK-PWR8-NEXT: adde r5, r6, r5374; CHECK-PWR8-NEXT: cmpd r3, r4375; CHECK-PWR8-NEXT: li r3, 1376; CHECK-PWR8-NEXT: xori r5, r5, 1377; CHECK-PWR8-NEXT: neg r5, r5378; CHECK-PWR8-NEXT: iselgt r3, r3, r5379; CHECK-PWR8-NEXT: blr380 %t1 = icmp sgt i64 %a, %b381 %t2 = icmp sgt i64 %b, %a382 %t3 = sext i1 %t2 to i64383 %t4 = select i1 %t1, i64 1, i64 %t3384 ret i64 %t4385}386 387; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setgt)), setlt388define i64 @setb16(i64 %a, i64 %b) {389; CHECK-LABEL: setb16:390; CHECK: # %bb.0:391; CHECK-NEXT: cmpd r3, r4392; CHECK-NEXT: setb r3, cr0393; CHECK-NEXT: blr394;395; CHECK-PWR8-LABEL: setb16:396; CHECK-PWR8: # %bb.0:397; CHECK-PWR8-NEXT: sradi r5, r3, 63398; CHECK-PWR8-NEXT: rldicl r6, r4, 1, 63399; CHECK-PWR8-NEXT: subc r7, r3, r4400; CHECK-PWR8-NEXT: adde r5, r6, r5401; CHECK-PWR8-NEXT: cmpd r4, r3402; CHECK-PWR8-NEXT: li r3, 1403; CHECK-PWR8-NEXT: xori r5, r5, 1404; CHECK-PWR8-NEXT: neg r5, r5405; CHECK-PWR8-NEXT: isellt r3, r3, r5406; CHECK-PWR8-NEXT: blr407 %t1 = icmp slt i64 %b, %a408 %t2 = icmp sgt i64 %b, %a409 %t3 = sext i1 %t2 to i64410 %t4 = select i1 %t1, i64 1, i64 %t3411 ret i64 %t4412}413 414; select_cc lhs, rhs, 0, (select_cc lhs, rhs, 1, -1, setgt), seteq415define i64 @setb17(i64 %a, i64 %b) {416; CHECK-LABEL: setb17:417; CHECK: # %bb.0:418; CHECK-NEXT: cmpd r3, r4419; CHECK-NEXT: setb r3, cr0420; CHECK-NEXT: blr421;422; CHECK-PWR8-LABEL: setb17:423; CHECK-PWR8: # %bb.0:424; CHECK-PWR8-NEXT: cmpd r3, r4425; CHECK-PWR8-NEXT: li r5, -1426; CHECK-PWR8-NEXT: li r6, 1427; CHECK-PWR8-NEXT: iselgt r5, r6, r5428; CHECK-PWR8-NEXT: cmpld r3, r4429; CHECK-PWR8-NEXT: iseleq r3, 0, r5430; CHECK-PWR8-NEXT: blr431 %t1 = icmp eq i64 %a, %b432 %t2 = icmp sgt i64 %a, %b433 %t3 = select i1 %t2, i64 1, i64 -1434 %t4 = select i1 %t1, i64 0, i64 %t3435 ret i64 %t4436}437 438; select_cc lhs, rhs, 0, (select_cc rhs, lhs, 1, -1, setgt), seteq439define i64 @setb18(i64 %a, i64 %b) {440; CHECK-LABEL: setb18:441; CHECK: # %bb.0:442; CHECK-NEXT: cmpd r3, r4443; CHECK-NEXT: setb r3, cr0444; CHECK-NEXT: blr445;446; CHECK-PWR8-LABEL: setb18:447; CHECK-PWR8: # %bb.0:448; CHECK-PWR8-NEXT: cmpd r3, r4449; CHECK-PWR8-NEXT: li r5, -1450; CHECK-PWR8-NEXT: li r6, 1451; CHECK-PWR8-NEXT: iselgt r5, r6, r5452; CHECK-PWR8-NEXT: cmpld r4, r3453; CHECK-PWR8-NEXT: iseleq r3, 0, r5454; CHECK-PWR8-NEXT: blr455 %t1 = icmp eq i64 %b, %a456 %t2 = icmp sgt i64 %a, %b457 %t3 = select i1 %t2, i64 1, i64 -1458 %t4 = select i1 %t1, i64 0, i64 %t3459 ret i64 %t4460}461 462; select_cc lhs, rhs, 0, (select_cc rhs, lhs, 1, -1, setlt), seteq463define i64 @setb19(i64 %a, i64 %b) {464; CHECK-LABEL: setb19:465; CHECK: # %bb.0:466; CHECK-NEXT: cmpd r3, r4467; CHECK-NEXT: setb r3, cr0468; CHECK-NEXT: blr469;470; CHECK-PWR8-LABEL: setb19:471; CHECK-PWR8: # %bb.0:472; CHECK-PWR8-NEXT: cmpd r4, r3473; CHECK-PWR8-NEXT: li r5, -1474; CHECK-PWR8-NEXT: li r6, 1475; CHECK-PWR8-NEXT: isellt r5, r6, r5476; CHECK-PWR8-NEXT: cmpld r3, r4477; CHECK-PWR8-NEXT: iseleq r3, 0, r5478; CHECK-PWR8-NEXT: blr479 %t1 = icmp eq i64 %a, %b480 %t2 = icmp slt i64 %b, %a481 %t3 = select i1 %t2, i64 1, i64 -1482 %t4 = select i1 %t1, i64 0, i64 %t3483 ret i64 %t4484}485 486; select_cc lhs, rhs, 0, (select_cc lhs, rhs, 1, -1, setlt), seteq487define i64 @setb20(i64 %a, i64 %b) {488; CHECK-LABEL: setb20:489; CHECK: # %bb.0:490; CHECK-NEXT: cmpd r3, r4491; CHECK-NEXT: setb r3, cr0492; CHECK-NEXT: blr493;494; CHECK-PWR8-LABEL: setb20:495; CHECK-PWR8: # %bb.0:496; CHECK-PWR8-NEXT: cmpd r4, r3497; CHECK-PWR8-NEXT: li r5, -1498; CHECK-PWR8-NEXT: li r6, 1499; CHECK-PWR8-NEXT: isellt r5, r6, r5500; CHECK-PWR8-NEXT: cmpld r4, r3501; CHECK-PWR8-NEXT: iseleq r3, 0, r5502; CHECK-PWR8-NEXT: blr503 %t1 = icmp eq i64 %b, %a504 %t2 = icmp slt i64 %b, %a505 %t3 = select i1 %t2, i64 1, i64 -1506 %t4 = select i1 %t1, i64 0, i64 %t3507 ret i64 %t4508}509 510; select_cc lhs, rhs, 0, (select_cc lhs, rhs, -1, 1, setlt), seteq511define i64 @setb21(i64 %a, i64 %b) {512; CHECK-LABEL: setb21:513; CHECK: # %bb.0:514; CHECK-NEXT: cmpd r3, r4515; CHECK-NEXT: setb r3, cr0516; CHECK-NEXT: blr517;518; CHECK-PWR8-LABEL: setb21:519; CHECK-PWR8: # %bb.0:520; CHECK-PWR8-NEXT: cmpd r3, r4521; CHECK-PWR8-NEXT: li r5, 1522; CHECK-PWR8-NEXT: li r6, -1523; CHECK-PWR8-NEXT: isellt r5, r6, r5524; CHECK-PWR8-NEXT: cmpld r3, r4525; CHECK-PWR8-NEXT: iseleq r3, 0, r5526; CHECK-PWR8-NEXT: blr527 %t1 = icmp eq i64 %a, %b528 %t2 = icmp slt i64 %a, %b529 %t3 = select i1 %t2, i64 -1, i64 1530 %t4 = select i1 %t1, i64 0, i64 %t3531 ret i64 %t4532}533 534; select_cc lhs, rhs, 0, (select_cc rhs, lhs, -1, 1, setlt), seteq535define i64 @setb22(i64 %a, i64 %b) {536; CHECK-LABEL: setb22:537; CHECK: # %bb.0:538; CHECK-NEXT: cmpd r3, r4539; CHECK-NEXT: setb r3, cr0540; CHECK-NEXT: blr541;542; CHECK-PWR8-LABEL: setb22:543; CHECK-PWR8: # %bb.0:544; CHECK-PWR8-NEXT: cmpd r3, r4545; CHECK-PWR8-NEXT: li r5, 1546; CHECK-PWR8-NEXT: li r6, -1547; CHECK-PWR8-NEXT: isellt r5, r6, r5548; CHECK-PWR8-NEXT: cmpld r4, r3549; CHECK-PWR8-NEXT: iseleq r3, 0, r5550; CHECK-PWR8-NEXT: blr551 %t1 = icmp eq i64 %b, %a552 %t2 = icmp slt i64 %a, %b553 %t3 = select i1 %t2, i64 -1, i64 1554 %t4 = select i1 %t1, i64 0, i64 %t3555 ret i64 %t4556}557 558; select_cc lhs, rhs, 0, (select_cc rhs, lhs, -1, 1, setgt), seteq559define i64 @setb23(i64 %a, i64 %b) {560; CHECK-LABEL: setb23:561; CHECK: # %bb.0:562; CHECK-NEXT: cmpd r3, r4563; CHECK-NEXT: setb r3, cr0564; CHECK-NEXT: blr565;566; CHECK-PWR8-LABEL: setb23:567; CHECK-PWR8: # %bb.0:568; CHECK-PWR8-NEXT: cmpd r4, r3569; CHECK-PWR8-NEXT: li r5, 1570; CHECK-PWR8-NEXT: li r6, -1571; CHECK-PWR8-NEXT: iselgt r5, r6, r5572; CHECK-PWR8-NEXT: cmpld r3, r4573; CHECK-PWR8-NEXT: iseleq r3, 0, r5574; CHECK-PWR8-NEXT: blr575 %t1 = icmp eq i64 %a, %b576 %t2 = icmp sgt i64 %b, %a577 %t3 = select i1 %t2, i64 -1, i64 1578 %t4 = select i1 %t1, i64 0, i64 %t3579 ret i64 %t4580}581 582; select_cc lhs, rhs, 0, (select_cc lhs, rhs, -1, 1, setgt), seteq583define i64 @setb24(i64 %a, i64 %b) {584; CHECK-LABEL: setb24:585; CHECK: # %bb.0:586; CHECK-NEXT: cmpd r3, r4587; CHECK-NEXT: setb r3, cr0588; CHECK-NEXT: blr589;590; CHECK-PWR8-LABEL: setb24:591; CHECK-PWR8: # %bb.0:592; CHECK-PWR8-NEXT: cmpd r4, r3593; CHECK-PWR8-NEXT: li r5, 1594; CHECK-PWR8-NEXT: li r6, -1595; CHECK-PWR8-NEXT: iselgt r5, r6, r5596; CHECK-PWR8-NEXT: cmpld r4, r3597; CHECK-PWR8-NEXT: iseleq r3, 0, r5598; CHECK-PWR8-NEXT: blr599 %t1 = icmp eq i64 %b, %a600 %t2 = icmp sgt i64 %b, %a601 %t3 = select i1 %t2, i64 -1, i64 1602 %t4 = select i1 %t1, i64 0, i64 %t3603 ret i64 %t4604}605; end all patterns testing for i64606 607; Test with swapping the input parameters608 609; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setlt610define i64 @setb25(i64 %a, i64 %b) {611; CHECK-LABEL: setb25:612; CHECK: # %bb.0:613; CHECK-NEXT: cmpd r4, r3614; CHECK-NEXT: setb r3, cr0615; CHECK-NEXT: blr616;617; CHECK-PWR8-LABEL: setb25:618; CHECK-PWR8: # %bb.0:619; CHECK-PWR8-NEXT: xor r5, r4, r3620; CHECK-PWR8-NEXT: cmpd r4, r3621; CHECK-PWR8-NEXT: li r3, -1622; CHECK-PWR8-NEXT: addic r6, r5, -1623; CHECK-PWR8-NEXT: subfe r5, r6, r5624; CHECK-PWR8-NEXT: isellt r3, r3, r5625; CHECK-PWR8-NEXT: blr626 %t1 = icmp slt i64 %b, %a627 %t2 = icmp ne i64 %b, %a628 %t3 = zext i1 %t2 to i64629 %t4 = select i1 %t1, i64 -1, i64 %t3630 ret i64 %t4631}632 633; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setgt634define i64 @setb26(i64 %a, i64 %b) {635; CHECK-LABEL: setb26:636; CHECK: # %bb.0:637; CHECK-NEXT: cmpd r4, r3638; CHECK-NEXT: setb r3, cr0639; CHECK-NEXT: blr640;641; CHECK-PWR8-LABEL: setb26:642; CHECK-PWR8: # %bb.0:643; CHECK-PWR8-NEXT: xor r5, r4, r3644; CHECK-PWR8-NEXT: cmpd r3, r4645; CHECK-PWR8-NEXT: li r3, -1646; CHECK-PWR8-NEXT: addic r6, r5, -1647; CHECK-PWR8-NEXT: subfe r5, r6, r5648; CHECK-PWR8-NEXT: iselgt r3, r3, r5649; CHECK-PWR8-NEXT: blr650 %t1 = icmp sgt i64 %a, %b651 %t2 = icmp ne i64 %b, %a652 %t3 = zext i1 %t2 to i64653 %t4 = select i1 %t1, i64 -1, i64 %t3654 ret i64 %t4655}656 657; Test with different scalar integer type for selected value658; i32/i16/i8 rather than i64 above659 660; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setlt661define i64 @setb27(i64 %a, i64 %b) {662; CHECK-LABEL: setb27:663; CHECK: # %bb.0:664; CHECK-NEXT: cmpd r3, r4665; CHECK-NEXT: setb r3, cr0666; CHECK-NEXT: blr667;668; CHECK-PWR8-LABEL: setb27:669; CHECK-PWR8: # %bb.0:670; CHECK-PWR8-NEXT: xor r5, r4, r3671; CHECK-PWR8-NEXT: cmpd r3, r4672; CHECK-PWR8-NEXT: li r3, -1673; CHECK-PWR8-NEXT: addic r6, r5, -1674; CHECK-PWR8-NEXT: subfe r5, r6, r5675; CHECK-PWR8-NEXT: isellt r3, r3, r5676; CHECK-PWR8-NEXT: extsw r3, r3677; CHECK-PWR8-NEXT: blr678 %t1 = icmp slt i64 %a, %b679 %t2 = icmp ne i64 %b, %a680 %t3 = zext i1 %t2 to i32681 %t4 = select i1 %t1, i32 -1, i32 %t3682 %t5 = sext i32 %t4 to i64683 ret i64 %t5684}685 686; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setgt687define i64 @setb28(i64 %a, i64 %b) {688; CHECK-LABEL: setb28:689; CHECK: # %bb.0:690; CHECK-NEXT: cmpd r3, r4691; CHECK-NEXT: setb r3, cr0692; CHECK-NEXT: blr693;694; CHECK-PWR8-LABEL: setb28:695; CHECK-PWR8: # %bb.0:696; CHECK-PWR8-NEXT: xor r5, r4, r3697; CHECK-PWR8-NEXT: cmpd r4, r3698; CHECK-PWR8-NEXT: li r3, -1699; CHECK-PWR8-NEXT: addic r6, r5, -1700; CHECK-PWR8-NEXT: subfe r5, r6, r5701; CHECK-PWR8-NEXT: iselgt r3, r3, r5702; CHECK-PWR8-NEXT: extsw r3, r3703; CHECK-PWR8-NEXT: blr704 %t1 = icmp sgt i64 %b, %a705 %t2 = icmp ne i64 %b, %a706 %t3 = zext i1 %t2 to i16707 %t4 = select i1 %t1, i16 -1, i16 %t3708 %t5 = sext i16 %t4 to i64709 ret i64 %t5710}711 712; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setgt)), setlt713define i64 @setb29(i64 %a, i64 %b) {714; CHECK-LABEL: setb29:715; CHECK: # %bb.0:716; CHECK-NEXT: cmpd r3, r4717; CHECK-NEXT: setb r3, cr0718; CHECK-NEXT: clrldi r3, r3, 56719; CHECK-NEXT: blr720;721; CHECK-PWR8-LABEL: setb29:722; CHECK-PWR8: # %bb.0:723; CHECK-PWR8-NEXT: sradi r5, r4, 63724; CHECK-PWR8-NEXT: rldicl r6, r3, 1, 63725; CHECK-PWR8-NEXT: subc r7, r4, r3726; CHECK-PWR8-NEXT: adde r5, r6, r5727; CHECK-PWR8-NEXT: cmpd r3, r4728; CHECK-PWR8-NEXT: li r3, -1729; CHECK-PWR8-NEXT: xori r5, r5, 1730; CHECK-PWR8-NEXT: isellt r3, r3, r5731; CHECK-PWR8-NEXT: clrldi r3, r3, 56732; CHECK-PWR8-NEXT: blr733 %t1 = icmp slt i64 %a, %b734 %t2 = icmp sgt i64 %a, %b735 %t3 = zext i1 %t2 to i8736 %t4 = select i1 %t1, i8 -1, i8 %t3737 %t5 = zext i8 %t4 to i64738 ret i64 %t5739}740 741; Testings to cover different comparison opcodes742; Test with integer type i32/i16/i8 for input parameter743 744; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setlt745define i64 @setbsw1(i32 %a, i32 %b) {746; CHECK-LABEL: setbsw1:747; CHECK: # %bb.0:748; CHECK-NEXT: cmpw r3, r4749; CHECK-NEXT: setb r3, cr0750; CHECK-NEXT: blr751;752; CHECK-PWR8-LABEL: setbsw1:753; CHECK-PWR8: # %bb.0:754; CHECK-PWR8-NEXT: xor r5, r3, r4755; CHECK-PWR8-NEXT: cmpw r3, r4756; CHECK-PWR8-NEXT: li r3, -1757; CHECK-PWR8-NEXT: cntlzw r5, r5758; CHECK-PWR8-NEXT: srwi r5, r5, 5759; CHECK-PWR8-NEXT: xori r5, r5, 1760; CHECK-PWR8-NEXT: isellt r3, r3, r5761; CHECK-PWR8-NEXT: blr762 %t1 = icmp slt i32 %a, %b763 %t2 = icmp ne i32 %a, %b764 %t3 = zext i1 %t2 to i64765 %t4 = select i1 %t1, i64 -1, i64 %t3766 ret i64 %t4767}768 769; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setgt770define i64 @setbsw2(i32 %a, i32 %b) {771; CHECK-LABEL: setbsw2:772; CHECK: # %bb.0:773; CHECK-NEXT: cmpw r3, r4774; CHECK-NEXT: setb r3, cr0775; CHECK-NEXT: blr776;777; CHECK-PWR8-LABEL: setbsw2:778; CHECK-PWR8: # %bb.0:779; CHECK-PWR8-NEXT: xor r5, r3, r4780; CHECK-PWR8-NEXT: cmpw r4, r3781; CHECK-PWR8-NEXT: li r3, -1782; CHECK-PWR8-NEXT: cntlzw r5, r5783; CHECK-PWR8-NEXT: srwi r5, r5, 5784; CHECK-PWR8-NEXT: xori r5, r5, 1785; CHECK-PWR8-NEXT: iselgt r3, r3, r5786; CHECK-PWR8-NEXT: blr787 %t1 = icmp sgt i32 %b, %a788 %t2 = icmp ne i32 %a, %b789 %t3 = zext i1 %t2 to i64790 %t4 = select i1 %t1, i64 -1, i64 %t3791 ret i64 %t4792}793 794; select_cc lhs, rhs, 0, (select_cc rhs, lhs, -1, 1, setgt), seteq795define i64 @setbsw3(i32 %a, i32 %b) {796; CHECK-LABEL: setbsw3:797; CHECK: # %bb.0:798; CHECK-NEXT: cmpw r3, r4799; CHECK-NEXT: setb r3, cr0800; CHECK-NEXT: blr801;802; CHECK-PWR8-LABEL: setbsw3:803; CHECK-PWR8: # %bb.0:804; CHECK-PWR8-NEXT: cmpw r4, r3805; CHECK-PWR8-NEXT: li r5, 1806; CHECK-PWR8-NEXT: li r6, -1807; CHECK-PWR8-NEXT: iselgt r5, r6, r5808; CHECK-PWR8-NEXT: cmplw r3, r4809; CHECK-PWR8-NEXT: iseleq r3, 0, r5810; CHECK-PWR8-NEXT: blr811 %t1 = icmp eq i32 %a, %b812 %t2 = icmp sgt i32 %b, %a813 %t3 = select i1 %t2, i64 -1, i64 1814 %t4 = select i1 %t1, i64 0, i64 %t3815 ret i64 %t4816}817 818; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setne)), setlt819define i64 @setbsh1(i16 signext %a, i16 signext %b) {820; CHECK-LABEL: setbsh1:821; CHECK: # %bb.0:822; CHECK-NEXT: cmpw r3, r4823; CHECK-NEXT: setb r3, cr0824; CHECK-NEXT: blr825;826; CHECK-PWR8-LABEL: setbsh1:827; CHECK-PWR8: # %bb.0:828; CHECK-PWR8-NEXT: xor r5, r4, r3829; CHECK-PWR8-NEXT: cmpw r3, r4830; CHECK-PWR8-NEXT: li r3, -1831; CHECK-PWR8-NEXT: cntlzw r5, r5832; CHECK-PWR8-NEXT: srwi r5, r5, 5833; CHECK-PWR8-NEXT: xori r5, r5, 1834; CHECK-PWR8-NEXT: isellt r3, r3, r5835; CHECK-PWR8-NEXT: blr836 %t1 = icmp slt i16 %a, %b837 %t2 = icmp ne i16 %b, %a838 %t3 = zext i1 %t2 to i64839 %t4 = select i1 %t1, i64 -1, i64 %t3840 ret i64 %t4841}842 843; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setne)), setgt844define i64 @setbsh2(i16 signext %a, i16 signext %b) {845; CHECK-LABEL: setbsh2:846; CHECK: # %bb.0:847; CHECK-NEXT: cmpw r3, r4848; CHECK-NEXT: setb r3, cr0849; CHECK-NEXT: blr850;851; CHECK-PWR8-LABEL: setbsh2:852; CHECK-PWR8: # %bb.0:853; CHECK-PWR8-NEXT: xor r5, r4, r3854; CHECK-PWR8-NEXT: cmpw r4, r3855; CHECK-PWR8-NEXT: li r3, -1856; CHECK-PWR8-NEXT: cntlzw r5, r5857; CHECK-PWR8-NEXT: srwi r5, r5, 5858; CHECK-PWR8-NEXT: xori r5, r5, 1859; CHECK-PWR8-NEXT: iselgt r3, r3, r5860; CHECK-PWR8-NEXT: blr861 %t1 = icmp sgt i16 %b, %a862 %t2 = icmp ne i16 %b, %a863 %t3 = zext i1 %t2 to i64864 %t4 = select i1 %t1, i64 -1, i64 %t3865 ret i64 %t4866}867 868; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setgt)), setlt869define i64 @setbsc1(i8 %a, i8 %b) {870; CHECK-LABEL: setbsc1:871; CHECK: # %bb.0:872; CHECK-NEXT: extsb r4, r4873; CHECK-NEXT: extsb r3, r3874; CHECK-NEXT: cmpw r3, r4875; CHECK-NEXT: setb r3, cr0876; CHECK-NEXT: blr877;878; CHECK-PWR8-LABEL: setbsc1:879; CHECK-PWR8: # %bb.0:880; CHECK-PWR8-NEXT: extsb r4, r4881; CHECK-PWR8-NEXT: extsb r3, r3882; CHECK-PWR8-NEXT: sub r5, r4, r3883; CHECK-PWR8-NEXT: cmpw r3, r4884; CHECK-PWR8-NEXT: li r3, -1885; CHECK-PWR8-NEXT: rldicl r5, r5, 1, 63886; CHECK-PWR8-NEXT: isellt r3, r3, r5887; CHECK-PWR8-NEXT: blr888 %t1 = icmp slt i8 %a, %b889 %t2 = icmp sgt i8 %a, %b890 %t3 = zext i1 %t2 to i64891 %t4 = select i1 %t1, i64 -1, i64 %t3892 ret i64 %t4893}894 895; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setgt)), setgt896define i64 @setbsc2(i8 %a, i8 %b) {897; CHECK-LABEL: setbsc2:898; CHECK: # %bb.0:899; CHECK-NEXT: extsb r4, r4900; CHECK-NEXT: extsb r3, r3901; CHECK-NEXT: cmpw r3, r4902; CHECK-NEXT: setb r3, cr0903; CHECK-NEXT: blr904;905; CHECK-PWR8-LABEL: setbsc2:906; CHECK-PWR8: # %bb.0:907; CHECK-PWR8-NEXT: extsb r4, r4908; CHECK-PWR8-NEXT: extsb r3, r3909; CHECK-PWR8-NEXT: sub r5, r4, r3910; CHECK-PWR8-NEXT: cmpw r4, r3911; CHECK-PWR8-NEXT: li r3, -1912; CHECK-PWR8-NEXT: rldicl r5, r5, 1, 63913; CHECK-PWR8-NEXT: iselgt r3, r3, r5914; CHECK-PWR8-NEXT: blr915 %t1 = icmp sgt i8 %b, %a916 %t2 = icmp sgt i8 %a, %b917 %t3 = zext i1 %t2 to i64918 %t4 = select i1 %t1, i64 -1, i64 %t3919 ret i64 %t4920}921 922; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setlt)), setlt923define i64 @setbsc3(i4 %a, i4 %b) {924; CHECK-LABEL: setbsc3:925; CHECK: # %bb.0:926; CHECK-NEXT: slwi r4, r4, 28927; CHECK-NEXT: slwi r3, r3, 28928; CHECK-NEXT: srawi r4, r4, 28929; CHECK-NEXT: srawi r3, r3, 28930; CHECK-NEXT: cmpw r3, r4931; CHECK-NEXT: setb r3, cr0932; CHECK-NEXT: blr933;934; CHECK-PWR8-LABEL: setbsc3:935; CHECK-PWR8: # %bb.0:936; CHECK-PWR8-NEXT: slwi r4, r4, 28937; CHECK-PWR8-NEXT: slwi r3, r3, 28938; CHECK-PWR8-NEXT: srawi r4, r4, 28939; CHECK-PWR8-NEXT: srawi r3, r3, 28940; CHECK-PWR8-NEXT: cmpw r3, r4941; CHECK-PWR8-NEXT: sub r5, r4, r3942; CHECK-PWR8-NEXT: li r3, -1943; CHECK-PWR8-NEXT: rldicl r5, r5, 1, 63944; CHECK-PWR8-NEXT: isellt r3, r3, r5945; CHECK-PWR8-NEXT: blr946 %t1 = icmp slt i4 %a, %b947 %t2 = icmp slt i4 %b, %a948 %t3 = zext i1 %t2 to i64949 %t4 = select i1 %t1, i64 -1, i64 %t3950 ret i64 %t4951}952 953; Test with unsigned integer type i64/i32/i16/i8 for input parameter954 955; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setult)), setugt956define i64 @setbud1(i64 %a, i64 %b) {957; CHECK-LABEL: setbud1:958; CHECK: # %bb.0:959; CHECK-NEXT: cmpld r3, r4960; CHECK-NEXT: setb r3, cr0961; CHECK-NEXT: blr962;963; CHECK-PWR8-LABEL: setbud1:964; CHECK-PWR8: # %bb.0:965; CHECK-PWR8-NEXT: subc r5, r4, r3966; CHECK-PWR8-NEXT: cmpld r4, r3967; CHECK-PWR8-NEXT: li r3, -1968; CHECK-PWR8-NEXT: subfe r5, r4, r4969; CHECK-PWR8-NEXT: neg r5, r5970; CHECK-PWR8-NEXT: iselgt r3, r3, r5971; CHECK-PWR8-NEXT: blr972 %t1 = icmp ugt i64 %b, %a973 %t2 = icmp ult i64 %b, %a974 %t3 = zext i1 %t2 to i64975 %t4 = select i1 %t1, i64 -1, i64 %t3976 ret i64 %t4977}978 979; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setne)), setugt980define i64 @setbud2(i64 %a, i64 %b) {981; CHECK-LABEL: setbud2:982; CHECK: # %bb.0:983; CHECK-NEXT: cmpld r3, r4984; CHECK-NEXT: setb r3, cr0985; CHECK-NEXT: blr986;987; CHECK-PWR8-LABEL: setbud2:988; CHECK-PWR8: # %bb.0:989; CHECK-PWR8-NEXT: xor r5, r3, r4990; CHECK-PWR8-NEXT: cmpld r3, r4991; CHECK-PWR8-NEXT: li r3, 1992; CHECK-PWR8-NEXT: subfic r5, r5, 0993; CHECK-PWR8-NEXT: subfe r5, r5, r5994; CHECK-PWR8-NEXT: iselgt r3, r3, r5995; CHECK-PWR8-NEXT: blr996 %t1 = icmp ugt i64 %a, %b997 %t2 = icmp ne i64 %a, %b998 %t3 = sext i1 %t2 to i64999 %t4 = select i1 %t1, i64 1, i64 %t31000 ret i64 %t41001}1002 1003; select_cc lhs, rhs, 0, (select_cc lhs, rhs, -1, 1, setugt), seteq1004define i64 @setbud3(i64 %a, i64 %b) {1005; CHECK-LABEL: setbud3:1006; CHECK: # %bb.0:1007; CHECK-NEXT: cmpld r3, r41008; CHECK-NEXT: setb r3, cr01009; CHECK-NEXT: blr1010;1011; CHECK-PWR8-LABEL: setbud3:1012; CHECK-PWR8: # %bb.0:1013; CHECK-PWR8-NEXT: cmpld r4, r31014; CHECK-PWR8-NEXT: li r3, 11015; CHECK-PWR8-NEXT: li r4, -11016; CHECK-PWR8-NEXT: iselgt r3, r4, r31017; CHECK-PWR8-NEXT: iseleq r3, 0, r31018; CHECK-PWR8-NEXT: blr1019 %t1 = icmp eq i64 %b, %a1020 %t2 = icmp ugt i64 %b, %a1021 %t3 = select i1 %t2, i64 -1, i64 11022 %t4 = select i1 %t1, i64 0, i64 %t31023 ret i64 %t41024}1025 1026; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setne)), setult1027define i64 @setbuw1(i32 %a, i32 %b) {1028; CHECK-LABEL: setbuw1:1029; CHECK: # %bb.0:1030; CHECK-NEXT: cmplw r3, r41031; CHECK-NEXT: setb r3, cr01032; CHECK-NEXT: blr1033;1034; CHECK-PWR8-LABEL: setbuw1:1035; CHECK-PWR8: # %bb.0:1036; CHECK-PWR8-NEXT: xor r5, r3, r41037; CHECK-PWR8-NEXT: cmplw r4, r31038; CHECK-PWR8-NEXT: li r3, 11039; CHECK-PWR8-NEXT: cntlzw r5, r51040; CHECK-PWR8-NEXT: srwi r5, r5, 51041; CHECK-PWR8-NEXT: xori r5, r5, 11042; CHECK-PWR8-NEXT: neg r5, r51043; CHECK-PWR8-NEXT: isellt r3, r3, r51044; CHECK-PWR8-NEXT: blr1045 %t1 = icmp ult i32 %b, %a1046 %t2 = icmp ne i32 %a, %b1047 %t3 = sext i1 %t2 to i641048 %t4 = select i1 %t1, i64 1, i64 %t31049 ret i64 %t41050}1051 1052; select_cc lhs, rhs, 1, (sext (setcc rhs, lhs, setne)), setugt1053define i64 @setbuw2(i32 %a, i32 %b) {1054; CHECK-LABEL: setbuw2:1055; CHECK: # %bb.0:1056; CHECK-NEXT: cmplw r3, r41057; CHECK-NEXT: setb r3, cr01058; CHECK-NEXT: blr1059;1060; CHECK-PWR8-LABEL: setbuw2:1061; CHECK-PWR8: # %bb.0:1062; CHECK-PWR8-NEXT: xor r5, r4, r31063; CHECK-PWR8-NEXT: cmplw r3, r41064; CHECK-PWR8-NEXT: li r3, 11065; CHECK-PWR8-NEXT: cntlzw r5, r51066; CHECK-PWR8-NEXT: srwi r5, r5, 51067; CHECK-PWR8-NEXT: xori r5, r5, 11068; CHECK-PWR8-NEXT: neg r5, r51069; CHECK-PWR8-NEXT: iselgt r3, r3, r51070; CHECK-PWR8-NEXT: blr1071 %t1 = icmp ugt i32 %a, %b1072 %t2 = icmp ne i32 %b, %a1073 %t3 = sext i1 %t2 to i641074 %t4 = select i1 %t1, i64 1, i64 %t31075 ret i64 %t41076}1077 1078; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setne)), setult1079define i64 @setbuh(i16 %a, i16 %b) {1080; CHECK-LABEL: setbuh:1081; CHECK: # %bb.0:1082; CHECK-NEXT: clrlwi r4, r4, 161083; CHECK-NEXT: clrlwi r3, r3, 161084; CHECK-NEXT: cmplw r3, r41085; CHECK-NEXT: setb r3, cr01086; CHECK-NEXT: blr1087;1088; CHECK-PWR8-LABEL: setbuh:1089; CHECK-PWR8: # %bb.0:1090; CHECK-PWR8-NEXT: clrlwi r3, r3, 161091; CHECK-PWR8-NEXT: clrlwi r4, r4, 161092; CHECK-PWR8-NEXT: xor r5, r4, r31093; CHECK-PWR8-NEXT: cmplw r4, r31094; CHECK-PWR8-NEXT: li r3, 11095; CHECK-PWR8-NEXT: cntlzw r5, r51096; CHECK-PWR8-NEXT: srwi r5, r5, 51097; CHECK-PWR8-NEXT: xori r5, r5, 11098; CHECK-PWR8-NEXT: neg r5, r51099; CHECK-PWR8-NEXT: isellt r3, r3, r51100; CHECK-PWR8-NEXT: blr1101 %t1 = icmp ult i16 %b, %a1102 %t2 = icmp ne i16 %b, %a1103 %t3 = sext i1 %t2 to i641104 %t4 = select i1 %t1, i64 1, i64 %t31105 ret i64 %t41106}1107 1108; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setult)), setugt1109define i64 @setbuc(i8 %a, i8 %b) {1110; CHECK-LABEL: setbuc:1111; CHECK: # %bb.0:1112; CHECK-NEXT: clrlwi r4, r4, 241113; CHECK-NEXT: clrlwi r3, r3, 241114; CHECK-NEXT: cmplw r3, r41115; CHECK-NEXT: setb r3, cr01116; CHECK-NEXT: blr1117;1118; CHECK-PWR8-LABEL: setbuc:1119; CHECK-PWR8: # %bb.0:1120; CHECK-PWR8-NEXT: clrlwi r3, r3, 241121; CHECK-PWR8-NEXT: clrlwi r4, r4, 241122; CHECK-PWR8-NEXT: clrldi r5, r3, 321123; CHECK-PWR8-NEXT: clrldi r6, r4, 321124; CHECK-PWR8-NEXT: cmplw r3, r41125; CHECK-PWR8-NEXT: li r3, 11126; CHECK-PWR8-NEXT: sub r5, r5, r61127; CHECK-PWR8-NEXT: sradi r5, r5, 631128; CHECK-PWR8-NEXT: iselgt r3, r3, r51129; CHECK-PWR8-NEXT: blr1130 %t1 = icmp ugt i8 %a, %b1131 %t2 = icmp ult i8 %a, %b1132 %t3 = sext i1 %t2 to i641133 %t4 = select i1 %t1, i64 1, i64 %t31134 ret i64 %t41135}1136 1137; Test with float/double/float128 for input parameter1138 1139; select_cc lhs, rhs, -1, (zext (setcc rhs, lhs, setlt)), setlt1140define i64 @setbf1(float %a, float %b) {1141; CHECK-LABEL: setbf1:1142; CHECK: # %bb.0:1143; CHECK-NEXT: fcmpu cr0, f1, f21144; CHECK-NEXT: setb r3, cr01145; CHECK-NEXT: blr1146;1147; CHECK-PWR8-LABEL: setbf1:1148; CHECK-PWR8: # %bb.0:1149; CHECK-PWR8-NEXT: fcmpu cr0, f2, f11150; CHECK-PWR8-NEXT: li r3, 01151; CHECK-PWR8-NEXT: li r4, 11152; CHECK-PWR8-NEXT: isellt r3, r4, r31153; CHECK-PWR8-NEXT: fcmpu cr0, f1, f21154; CHECK-PWR8-NEXT: li r4, -11155; CHECK-PWR8-NEXT: isellt r3, r4, r31156; CHECK-PWR8-NEXT: blr1157 %t1 = fcmp nnan olt float %a, %b1158 %t2 = fcmp nnan olt float %b, %a1159 %t3 = zext i1 %t2 to i641160 %t4 = select i1 %t1, i64 -1, i64 %t31161 ret i64 %t41162}1163 1164; select_cc lhs, rhs, -1, (zext (setcc lhs, rhs, setlt)), setgt1165define i64 @setbf2(float %a, float %b) {1166; CHECK-LABEL: setbf2:1167; CHECK: # %bb.0:1168; CHECK-NEXT: fcmpu cr0, f1, f21169; CHECK-NEXT: setb r3, cr01170; CHECK-NEXT: blr1171;1172; CHECK-PWR8-LABEL: setbf2:1173; CHECK-PWR8: # %bb.0:1174; CHECK-PWR8-NEXT: fcmpu cr0, f2, f11175; CHECK-PWR8-NEXT: li r3, 01176; CHECK-PWR8-NEXT: li r4, 11177; CHECK-PWR8-NEXT: isellt r3, r4, r31178; CHECK-PWR8-NEXT: li r4, -11179; CHECK-PWR8-NEXT: iselgt r3, r4, r31180; CHECK-PWR8-NEXT: blr1181 %t1 = fcmp nnan ogt float %b, %a1182 %t2 = fcmp nnan olt float %b, %a1183 %t3 = zext i1 %t2 to i641184 %t4 = select i1 %t1, i64 -1, i64 %t31185 ret i64 %t41186}1187 1188; select_cc lhs, rhs, 0, (select_cc lhs, rhs, -1, 1, setgt), seteq1189define i64 @setbdf1(double %a, double %b) {1190; CHECK-LABEL: setbdf1:1191; CHECK: # %bb.0:1192; CHECK-NEXT: xscmpudp cr0, f1, f21193; CHECK-NEXT: setb r3, cr01194; CHECK-NEXT: blr1195;1196; CHECK-PWR8-LABEL: setbdf1:1197; CHECK-PWR8: # %bb.0:1198; CHECK-PWR8-NEXT: xscmpudp cr0, f2, f11199; CHECK-PWR8-NEXT: li r3, 11200; CHECK-PWR8-NEXT: li r4, -11201; CHECK-PWR8-NEXT: iselgt r3, r4, r31202; CHECK-PWR8-NEXT: iseleq r3, 0, r31203; CHECK-PWR8-NEXT: blr1204 %t1 = fcmp nnan oeq double %b, %a1205 %t2 = fcmp nnan ogt double %b, %a1206 %t3 = select i1 %t2, i64 -1, i64 11207 %t4 = select i1 %t1, i64 0, i64 %t31208 ret i64 %t41209}1210 1211; select_cc lhs, rhs, 1, (sext (setcc lhs, rhs, setgt)), setlt1212define i64 @setbdf2(double %a, double %b) {1213; CHECK-LABEL: setbdf2:1214; CHECK: # %bb.0:1215; CHECK-NEXT: xscmpudp cr0, f1, f21216; CHECK-NEXT: setb r3, cr01217; CHECK-NEXT: blr1218;1219; CHECK-PWR8-LABEL: setbdf2:1220; CHECK-PWR8: # %bb.0:1221; CHECK-PWR8-NEXT: fcmpu cr0, f2, f11222; CHECK-PWR8-NEXT: li r3, 01223; CHECK-PWR8-NEXT: li r4, -11224; CHECK-PWR8-NEXT: iselgt r3, r4, r31225; CHECK-PWR8-NEXT: xscmpudp cr0, f2, f11226; CHECK-PWR8-NEXT: li r4, 11227; CHECK-PWR8-NEXT: isellt r3, r4, r31228; CHECK-PWR8-NEXT: blr1229 %t1 = fcmp nnan olt double %b, %a1230 %t2 = fcmp nnan ogt double %b, %a1231 %t3 = sext i1 %t2 to i641232 %t4 = select i1 %t1, i64 1, i64 %t31233 ret i64 %t41234}1235 1236define i64 @setbf128(fp128 %a, fp128 %b) {1237; CHECK-LABEL: setbf128:1238; CHECK: # %bb.0:1239; CHECK-NEXT: xscmpuqp cr0, v2, v31240; CHECK-NEXT: setb r3, cr01241; CHECK-NEXT: blr1242;1243; CHECK-PWR8-LABEL: setbf128:1244; CHECK-PWR8: # %bb.0:1245; CHECK-PWR8-NEXT: mflr r01246; CHECK-PWR8-NEXT: stdu r1, -96(r1)1247; CHECK-PWR8-NEXT: std r0, 112(r1)1248; CHECK-PWR8-NEXT: .cfi_def_cfa_offset 961249; CHECK-PWR8-NEXT: .cfi_offset lr, 161250; CHECK-PWR8-NEXT: .cfi_offset r30, -161251; CHECK-PWR8-NEXT: .cfi_offset v30, -481252; CHECK-PWR8-NEXT: .cfi_offset v31, -321253; CHECK-PWR8-NEXT: li r3, 481254; CHECK-PWR8-NEXT: std r30, 80(r1) # 8-byte Folded Spill1255; CHECK-PWR8-NEXT: stvx v30, r1, r3 # 16-byte Folded Spill1256; CHECK-PWR8-NEXT: li r3, 641257; CHECK-PWR8-NEXT: vmr v30, v21258; CHECK-PWR8-NEXT: stvx v31, r1, r3 # 16-byte Folded Spill1259; CHECK-PWR8-NEXT: vmr v31, v31260; CHECK-PWR8-NEXT: bl __ltkf21261; CHECK-PWR8-NEXT: nop1262; CHECK-PWR8-NEXT: vmr v2, v301263; CHECK-PWR8-NEXT: vmr v3, v311264; CHECK-PWR8-NEXT: srawi r30, r3, 311265; CHECK-PWR8-NEXT: bl __gtkf21266; CHECK-PWR8-NEXT: nop1267; CHECK-PWR8-NEXT: li r4, 641268; CHECK-PWR8-NEXT: cmpwi r3, 01269; CHECK-PWR8-NEXT: li r3, 11270; CHECK-PWR8-NEXT: lvx v31, r1, r4 # 16-byte Folded Reload1271; CHECK-PWR8-NEXT: li r4, 481272; CHECK-PWR8-NEXT: lvx v30, r1, r4 # 16-byte Folded Reload1273; CHECK-PWR8-NEXT: iselgt r3, r3, r301274; CHECK-PWR8-NEXT: ld r30, 80(r1) # 8-byte Folded Reload1275; CHECK-PWR8-NEXT: addi r1, r1, 961276; CHECK-PWR8-NEXT: ld r0, 16(r1)1277; CHECK-PWR8-NEXT: mtlr r01278; CHECK-PWR8-NEXT: blr1279 %t1 = fcmp nnan ogt fp128 %a, %b1280 %t2 = fcmp nnan olt fp128 %a, %b1281 %t3 = sext i1 %t2 to i641282 %t4 = select i1 %t1, i64 1, i64 %t31283 ret i64 %t41284}1285 1286; Some cases we can't leverage setb1287 1288define i64 @setbn1(i64 %a, i64 %b) {1289; CHECK-LABEL: setbn1:1290; CHECK: # %bb.0:1291; CHECK-NEXT: xor r5, r3, r41292; CHECK-NEXT: cmpd r3, r41293; CHECK-NEXT: li r3, -11294; CHECK-NEXT: cntlzd r5, r51295; CHECK-NEXT: rldicl r5, r5, 58, 631296; CHECK-NEXT: isellt r3, r3, r51297; CHECK-NEXT: blr1298;1299; CHECK-PWR8-LABEL: setbn1:1300; CHECK-PWR8: # %bb.0:1301; CHECK-PWR8-NEXT: xor r5, r3, r41302; CHECK-PWR8-NEXT: cmpd r3, r41303; CHECK-PWR8-NEXT: li r3, -11304; CHECK-PWR8-NEXT: cntlzd r5, r51305; CHECK-PWR8-NEXT: rldicl r5, r5, 58, 631306; CHECK-PWR8-NEXT: isellt r3, r3, r51307; CHECK-PWR8-NEXT: blr1308 %t1 = icmp slt i64 %a, %b1309 %t2 = icmp eq i64 %a, %b1310 %t3 = zext i1 %t2 to i641311 %t4 = select i1 %t1, i64 -1, i64 %t31312 ret i64 %t41313}1314 1315define i64 @setbn2(double %a, double %b) {1316; CHECK-LABEL: setbn2:1317; CHECK: # %bb.0:1318; CHECK-NEXT: fcmpu cr0, f1, f21319; CHECK-NEXT: li r3, 11320; CHECK-NEXT: li r4, -11321; CHECK-NEXT: cror 4*cr5+lt, un, eq1322; CHECK-NEXT: xscmpudp cr0, f1, f21323; CHECK-NEXT: isel r3, 0, r3, 4*cr5+lt1324; CHECK-NEXT: isellt r3, r4, r31325; CHECK-NEXT: blr1326;1327; CHECK-PWR8-LABEL: setbn2:1328; CHECK-PWR8: # %bb.0:1329; CHECK-PWR8-NEXT: fcmpu cr0, f1, f21330; CHECK-PWR8-NEXT: li r3, 11331; CHECK-PWR8-NEXT: li r4, -11332; CHECK-PWR8-NEXT: cror 4*cr5+lt, un, eq1333; CHECK-PWR8-NEXT: xscmpudp cr0, f1, f21334; CHECK-PWR8-NEXT: isel r3, 0, r3, 4*cr5+lt1335; CHECK-PWR8-NEXT: isellt r3, r4, r31336; CHECK-PWR8-NEXT: blr1337 %t1 = fcmp olt double %a, %b1338 %t2 = fcmp one double %a, %b1339 %t3 = zext i1 %t2 to i641340 %t4 = select i1 %t1, i64 -1, i64 %t31341 ret i64 %t41342}1343 1344define i64 @setbn3(float %a, float %b) {1345; CHECK-LABEL: setbn3:1346; CHECK: # %bb.0:1347; CHECK-NEXT: fcmpu cr0, f1, f21348; CHECK-NEXT: li r3, 11349; CHECK-NEXT: li r4, -11350; CHECK-NEXT: iseleq r3, 0, r31351; CHECK-NEXT: cror 4*cr5+lt, lt, un1352; CHECK-NEXT: isel r3, r4, r3, 4*cr5+lt1353; CHECK-NEXT: blr1354;1355; CHECK-PWR8-LABEL: setbn3:1356; CHECK-PWR8: # %bb.0:1357; CHECK-PWR8-NEXT: fcmpu cr0, f1, f21358; CHECK-PWR8-NEXT: li r3, 11359; CHECK-PWR8-NEXT: li r4, -11360; CHECK-PWR8-NEXT: iseleq r3, 0, r31361; CHECK-PWR8-NEXT: cror 4*cr5+lt, lt, un1362; CHECK-PWR8-NEXT: isel r3, r4, r3, 4*cr5+lt1363; CHECK-PWR8-NEXT: blr1364 %t1 = fcmp ult float %a, %b1365 %t2 = fcmp une float %a, %b1366 %t3 = zext i1 %t2 to i641367 %t4 = select i1 %t1, i64 -1, i64 %t31368 ret i64 %t41369}1370 1371; Verify this case doesn't crash1372define void @setbn4(i128 %0, ptr %sel.out) {1373; CHECK-LABEL: setbn4:1374; CHECK: # %bb.0: # %entry1375; CHECK-NEXT: li r6, 11376; CHECK-NEXT: cmpdi cr1, r3, 01377; CHECK-NEXT: li r3, 11378; CHECK-NEXT: rldic r6, r6, 48, 151379; CHECK-NEXT: cmpld r4, r61380; CHECK-NEXT: crandc 4*cr5+lt, gt, eq1381; CHECK-NEXT: crandc 4*cr5+gt, eq, 4*cr1+eq1382; CHECK-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt1383; CHECK-NEXT: rldicl. r4, r4, 16, 481384; CHECK-NEXT: li r4, -11385; CHECK-NEXT: isel r3, 0, r3, 4*cr5+lt1386; CHECK-NEXT: iseleq r3, r4, r31387; CHECK-NEXT: stw r3, 0(r5)1388; CHECK-NEXT: blr1389;1390; CHECK-PWR8-LABEL: setbn4:1391; CHECK-PWR8: # %bb.0: # %entry1392; CHECK-PWR8-NEXT: li r6, 11393; CHECK-PWR8-NEXT: cmpdi cr1, r3, 01394; CHECK-PWR8-NEXT: li r3, 11395; CHECK-PWR8-NEXT: rldic r6, r6, 48, 151396; CHECK-PWR8-NEXT: cmpld r4, r61397; CHECK-PWR8-NEXT: crandc 4*cr5+lt, gt, eq1398; CHECK-PWR8-NEXT: crandc 4*cr5+gt, eq, 4*cr1+eq1399; CHECK-PWR8-NEXT: rldicl. r4, r4, 16, 481400; CHECK-PWR8-NEXT: li r4, -11401; CHECK-PWR8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt1402; CHECK-PWR8-NEXT: isel r3, 0, r3, 4*cr5+lt1403; CHECK-PWR8-NEXT: iseleq r3, r4, r31404; CHECK-PWR8-NEXT: stw r3, 0(r5)1405; CHECK-PWR8-NEXT: blr1406entry:1407 %c1 = icmp ult i128 %0, 51922968585348276285304963292200961408 %c2 = icmp ugt i128 %0, 51922968585348276285304963292200961409 %ext = zext i1 %c2 to i321410 %sel = select i1 %c1, i32 -1, i32 %ext1411 store i32 %sel, ptr %sel.out, align 41412 ret void1413}1414