3584 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN: | FileCheck %s -check-prefixes=CHECK,RV32,RV32I4; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \5; RUN: | FileCheck %s -check-prefixes=CHECK,RV64,RV64I6; RUN: llc -mtriple=riscv32 -mattr=+zbs -verify-machineinstrs < %s \7; RUN: | FileCheck %s -check-prefixes=CHECK,ZBS,RV32,RV32ZBS8; RUN: llc -mtriple=riscv64 -mattr=+zbs -verify-machineinstrs < %s \9; RUN: | FileCheck %s -check-prefixes=CHECK,ZBS,RV64,RV64ZBS10; RUN: llc -mtriple=riscv32 -mattr=+xtheadbs -verify-machineinstrs < %s \11; RUN: | FileCheck %s -check-prefixes=CHECK,XTHEADBS,RV32,RV32XTHEADBS12; RUN: llc -mtriple=riscv64 -mattr=+xtheadbs -verify-machineinstrs < %s \13; RUN: | FileCheck %s -check-prefixes=CHECK,XTHEADBS,RV64,RV64XTHEADBS14 15define signext i32 @bittest_7_i32(i32 signext %a) nounwind {16; CHECK-LABEL: bittest_7_i32:17; CHECK: # %bb.0:18; CHECK-NEXT: andi a0, a0, 12819; CHECK-NEXT: seqz a0, a020; CHECK-NEXT: ret21 %shr = lshr i32 %a, 722 %not = xor i32 %shr, -123 %and = and i32 %not, 124 ret i32 %and25}26 27define signext i32 @bittest_10_i32(i32 signext %a) nounwind {28; CHECK-LABEL: bittest_10_i32:29; CHECK: # %bb.0:30; CHECK-NEXT: andi a0, a0, 102431; CHECK-NEXT: seqz a0, a032; CHECK-NEXT: ret33 %shr = lshr i32 %a, 1034 %not = xor i32 %shr, -135 %and = and i32 %not, 136 ret i32 %and37}38 39define signext i32 @bittest_11_i32(i32 signext %a) nounwind {40; RV32I-LABEL: bittest_11_i32:41; RV32I: # %bb.0:42; RV32I-NEXT: not a0, a043; RV32I-NEXT: slli a0, a0, 2044; RV32I-NEXT: srli a0, a0, 3145; RV32I-NEXT: ret46;47; RV64I-LABEL: bittest_11_i32:48; RV64I: # %bb.0:49; RV64I-NEXT: not a0, a050; RV64I-NEXT: slli a0, a0, 5251; RV64I-NEXT: srli a0, a0, 6352; RV64I-NEXT: ret53;54; ZBS-LABEL: bittest_11_i32:55; ZBS: # %bb.0:56; ZBS-NEXT: not a0, a057; ZBS-NEXT: bexti a0, a0, 1158; ZBS-NEXT: ret59;60; XTHEADBS-LABEL: bittest_11_i32:61; XTHEADBS: # %bb.0:62; XTHEADBS-NEXT: not a0, a063; XTHEADBS-NEXT: th.tst a0, a0, 1164; XTHEADBS-NEXT: ret65 %shr = lshr i32 %a, 1166 %not = xor i32 %shr, -167 %and = and i32 %not, 168 ret i32 %and69}70 71define signext i32 @bittest_31_i32(i32 signext %a) nounwind {72; RV32-LABEL: bittest_31_i32:73; RV32: # %bb.0:74; RV32-NEXT: not a0, a075; RV32-NEXT: srli a0, a0, 3176; RV32-NEXT: ret77;78; RV64-LABEL: bittest_31_i32:79; RV64: # %bb.0:80; RV64-NEXT: not a0, a081; RV64-NEXT: srliw a0, a0, 3182; RV64-NEXT: ret83 %shr = lshr i32 %a, 3184 %not = xor i32 %shr, -185 %and = and i32 %not, 186 ret i32 %and87}88 89define i64 @bittest_7_i64(i64 %a) nounwind {90; RV32-LABEL: bittest_7_i64:91; RV32: # %bb.0:92; RV32-NEXT: andi a0, a0, 12893; RV32-NEXT: seqz a0, a094; RV32-NEXT: li a1, 095; RV32-NEXT: ret96;97; RV64-LABEL: bittest_7_i64:98; RV64: # %bb.0:99; RV64-NEXT: andi a0, a0, 128100; RV64-NEXT: seqz a0, a0101; RV64-NEXT: ret102 %shr = lshr i64 %a, 7103 %not = xor i64 %shr, -1104 %and = and i64 %not, 1105 ret i64 %and106}107 108define i64 @bittest_10_i64(i64 %a) nounwind {109; RV32-LABEL: bittest_10_i64:110; RV32: # %bb.0:111; RV32-NEXT: andi a0, a0, 1024112; RV32-NEXT: seqz a0, a0113; RV32-NEXT: li a1, 0114; RV32-NEXT: ret115;116; RV64-LABEL: bittest_10_i64:117; RV64: # %bb.0:118; RV64-NEXT: andi a0, a0, 1024119; RV64-NEXT: seqz a0, a0120; RV64-NEXT: ret121 %shr = lshr i64 %a, 10122 %not = xor i64 %shr, -1123 %and = and i64 %not, 1124 ret i64 %and125}126 127define i64 @bittest_11_i64(i64 %a) nounwind {128; RV32I-LABEL: bittest_11_i64:129; RV32I: # %bb.0:130; RV32I-NEXT: not a0, a0131; RV32I-NEXT: slli a0, a0, 20132; RV32I-NEXT: srli a0, a0, 31133; RV32I-NEXT: li a1, 0134; RV32I-NEXT: ret135;136; RV64I-LABEL: bittest_11_i64:137; RV64I: # %bb.0:138; RV64I-NEXT: not a0, a0139; RV64I-NEXT: slli a0, a0, 52140; RV64I-NEXT: srli a0, a0, 63141; RV64I-NEXT: ret142;143; RV32ZBS-LABEL: bittest_11_i64:144; RV32ZBS: # %bb.0:145; RV32ZBS-NEXT: not a0, a0146; RV32ZBS-NEXT: bexti a0, a0, 11147; RV32ZBS-NEXT: li a1, 0148; RV32ZBS-NEXT: ret149;150; RV64ZBS-LABEL: bittest_11_i64:151; RV64ZBS: # %bb.0:152; RV64ZBS-NEXT: not a0, a0153; RV64ZBS-NEXT: bexti a0, a0, 11154; RV64ZBS-NEXT: ret155;156; RV32XTHEADBS-LABEL: bittest_11_i64:157; RV32XTHEADBS: # %bb.0:158; RV32XTHEADBS-NEXT: not a0, a0159; RV32XTHEADBS-NEXT: th.tst a0, a0, 11160; RV32XTHEADBS-NEXT: li a1, 0161; RV32XTHEADBS-NEXT: ret162;163; RV64XTHEADBS-LABEL: bittest_11_i64:164; RV64XTHEADBS: # %bb.0:165; RV64XTHEADBS-NEXT: not a0, a0166; RV64XTHEADBS-NEXT: th.tst a0, a0, 11167; RV64XTHEADBS-NEXT: ret168 %shr = lshr i64 %a, 11169 %not = xor i64 %shr, -1170 %and = and i64 %not, 1171 ret i64 %and172}173 174define i64 @bittest_31_i64(i64 %a) nounwind {175; RV32-LABEL: bittest_31_i64:176; RV32: # %bb.0:177; RV32-NEXT: not a0, a0178; RV32-NEXT: srli a0, a0, 31179; RV32-NEXT: li a1, 0180; RV32-NEXT: ret181;182; RV64I-LABEL: bittest_31_i64:183; RV64I: # %bb.0:184; RV64I-NEXT: not a0, a0185; RV64I-NEXT: srliw a0, a0, 31186; RV64I-NEXT: ret187;188; RV64ZBS-LABEL: bittest_31_i64:189; RV64ZBS: # %bb.0:190; RV64ZBS-NEXT: sraiw a0, a0, 31191; RV64ZBS-NEXT: seqz a0, a0192; RV64ZBS-NEXT: ret193;194; RV64XTHEADBS-LABEL: bittest_31_i64:195; RV64XTHEADBS: # %bb.0:196; RV64XTHEADBS-NEXT: sraiw a0, a0, 31197; RV64XTHEADBS-NEXT: seqz a0, a0198; RV64XTHEADBS-NEXT: ret199 %shr = lshr i64 %a, 31200 %not = xor i64 %shr, -1201 %and = and i64 %not, 1202 ret i64 %and203}204 205define i64 @bittest_32_i64(i64 %a) nounwind {206; RV32-LABEL: bittest_32_i64:207; RV32: # %bb.0:208; RV32-NEXT: not a0, a1209; RV32-NEXT: andi a0, a0, 1210; RV32-NEXT: li a1, 0211; RV32-NEXT: ret212;213; RV64I-LABEL: bittest_32_i64:214; RV64I: # %bb.0:215; RV64I-NEXT: not a0, a0216; RV64I-NEXT: slli a0, a0, 31217; RV64I-NEXT: srli a0, a0, 63218; RV64I-NEXT: ret219;220; RV64ZBS-LABEL: bittest_32_i64:221; RV64ZBS: # %bb.0:222; RV64ZBS-NEXT: not a0, a0223; RV64ZBS-NEXT: bexti a0, a0, 32224; RV64ZBS-NEXT: ret225;226; RV64XTHEADBS-LABEL: bittest_32_i64:227; RV64XTHEADBS: # %bb.0:228; RV64XTHEADBS-NEXT: not a0, a0229; RV64XTHEADBS-NEXT: th.tst a0, a0, 32230; RV64XTHEADBS-NEXT: ret231 %shr = lshr i64 %a, 32232 %not = xor i64 %shr, -1233 %and = and i64 %not, 1234 ret i64 %and235}236 237define i64 @bittest_63_i64(i64 %a) nounwind {238; RV32-LABEL: bittest_63_i64:239; RV32: # %bb.0:240; RV32-NEXT: not a0, a1241; RV32-NEXT: srli a0, a0, 31242; RV32-NEXT: li a1, 0243; RV32-NEXT: ret244;245; RV64-LABEL: bittest_63_i64:246; RV64: # %bb.0:247; RV64-NEXT: not a0, a0248; RV64-NEXT: srli a0, a0, 63249; RV64-NEXT: ret250 %shr = lshr i64 %a, 63251 %not = xor i64 %shr, -1252 %and = and i64 %not, 1253 ret i64 %and254}255 256; Make sure we use (andi (srl X, Y), 1) or bext.257define i1 @bittest_constant_by_var_shr_i32(i32 signext %b) nounwind {258; RV32I-LABEL: bittest_constant_by_var_shr_i32:259; RV32I: # %bb.0:260; RV32I-NEXT: lui a1, 301408261; RV32I-NEXT: addi a1, a1, 722262; RV32I-NEXT: srl a0, a1, a0263; RV32I-NEXT: andi a0, a0, 1264; RV32I-NEXT: ret265;266; RV64I-LABEL: bittest_constant_by_var_shr_i32:267; RV64I: # %bb.0:268; RV64I-NEXT: lui a1, 301408269; RV64I-NEXT: addi a1, a1, 722270; RV64I-NEXT: srlw a0, a1, a0271; RV64I-NEXT: andi a0, a0, 1272; RV64I-NEXT: ret273;274; ZBS-LABEL: bittest_constant_by_var_shr_i32:275; ZBS: # %bb.0:276; ZBS-NEXT: lui a1, 301408277; ZBS-NEXT: addi a1, a1, 722278; ZBS-NEXT: bext a0, a1, a0279; ZBS-NEXT: ret280;281; RV32XTHEADBS-LABEL: bittest_constant_by_var_shr_i32:282; RV32XTHEADBS: # %bb.0:283; RV32XTHEADBS-NEXT: lui a1, 301408284; RV32XTHEADBS-NEXT: addi a1, a1, 722285; RV32XTHEADBS-NEXT: srl a0, a1, a0286; RV32XTHEADBS-NEXT: andi a0, a0, 1287; RV32XTHEADBS-NEXT: ret288;289; RV64XTHEADBS-LABEL: bittest_constant_by_var_shr_i32:290; RV64XTHEADBS: # %bb.0:291; RV64XTHEADBS-NEXT: lui a1, 301408292; RV64XTHEADBS-NEXT: addi a1, a1, 722293; RV64XTHEADBS-NEXT: srlw a0, a1, a0294; RV64XTHEADBS-NEXT: andi a0, a0, 1295; RV64XTHEADBS-NEXT: ret296 %shl = lshr i32 1234567890, %b297 %and = and i32 %shl, 1298 %cmp = icmp ne i32 %and, 0299 ret i1 %cmp300}301 302; Make sure we use (andi (srl X, Y), 1) or bext.303define i1 @bittest_constant_by_var_shl_i32(i32 signext %b) nounwind {304; RV32I-LABEL: bittest_constant_by_var_shl_i32:305; RV32I: # %bb.0:306; RV32I-NEXT: lui a1, 301408307; RV32I-NEXT: addi a1, a1, 722308; RV32I-NEXT: srl a0, a1, a0309; RV32I-NEXT: andi a0, a0, 1310; RV32I-NEXT: ret311;312; RV64I-LABEL: bittest_constant_by_var_shl_i32:313; RV64I: # %bb.0:314; RV64I-NEXT: lui a1, 301408315; RV64I-NEXT: addi a1, a1, 722316; RV64I-NEXT: srlw a0, a1, a0317; RV64I-NEXT: andi a0, a0, 1318; RV64I-NEXT: ret319;320; ZBS-LABEL: bittest_constant_by_var_shl_i32:321; ZBS: # %bb.0:322; ZBS-NEXT: lui a1, 301408323; ZBS-NEXT: addi a1, a1, 722324; ZBS-NEXT: bext a0, a1, a0325; ZBS-NEXT: ret326;327; RV32XTHEADBS-LABEL: bittest_constant_by_var_shl_i32:328; RV32XTHEADBS: # %bb.0:329; RV32XTHEADBS-NEXT: lui a1, 301408330; RV32XTHEADBS-NEXT: addi a1, a1, 722331; RV32XTHEADBS-NEXT: srl a0, a1, a0332; RV32XTHEADBS-NEXT: andi a0, a0, 1333; RV32XTHEADBS-NEXT: ret334;335; RV64XTHEADBS-LABEL: bittest_constant_by_var_shl_i32:336; RV64XTHEADBS: # %bb.0:337; RV64XTHEADBS-NEXT: lui a1, 301408338; RV64XTHEADBS-NEXT: addi a1, a1, 722339; RV64XTHEADBS-NEXT: srlw a0, a1, a0340; RV64XTHEADBS-NEXT: andi a0, a0, 1341; RV64XTHEADBS-NEXT: ret342 %shl = shl i32 1, %b343 %and = and i32 %shl, 1234567890344 %cmp = icmp ne i32 %and, 0345 ret i1 %cmp346}347 348; Make sure we use (andi (srl X, Y), 1) or bext.349define i1 @bittest_constant_by_var_shr_i64(i64 %b) nounwind {350; RV32-LABEL: bittest_constant_by_var_shr_i64:351; RV32: # %bb.0:352; RV32-NEXT: lui a1, 301408353; RV32-NEXT: addi a1, a1, 722354; RV32-NEXT: srl a1, a1, a0355; RV32-NEXT: addi a0, a0, -32356; RV32-NEXT: srli a0, a0, 31357; RV32-NEXT: and a0, a0, a1358; RV32-NEXT: ret359;360; RV64I-LABEL: bittest_constant_by_var_shr_i64:361; RV64I: # %bb.0:362; RV64I-NEXT: lui a1, 301408363; RV64I-NEXT: addi a1, a1, 722364; RV64I-NEXT: srl a0, a1, a0365; RV64I-NEXT: andi a0, a0, 1366; RV64I-NEXT: ret367;368; RV64ZBS-LABEL: bittest_constant_by_var_shr_i64:369; RV64ZBS: # %bb.0:370; RV64ZBS-NEXT: lui a1, 301408371; RV64ZBS-NEXT: addi a1, a1, 722372; RV64ZBS-NEXT: bext a0, a1, a0373; RV64ZBS-NEXT: ret374;375; RV64XTHEADBS-LABEL: bittest_constant_by_var_shr_i64:376; RV64XTHEADBS: # %bb.0:377; RV64XTHEADBS-NEXT: lui a1, 301408378; RV64XTHEADBS-NEXT: addi a1, a1, 722379; RV64XTHEADBS-NEXT: srl a0, a1, a0380; RV64XTHEADBS-NEXT: andi a0, a0, 1381; RV64XTHEADBS-NEXT: ret382 %shl = lshr i64 1234567890, %b383 %and = and i64 %shl, 1384 %cmp = icmp ne i64 %and, 0385 ret i1 %cmp386}387 388; Make sure we use (andi (srl X, Y), 1) or bext.389define i1 @bittest_constant_by_var_shl_i64(i64 %b) nounwind {390; RV32-LABEL: bittest_constant_by_var_shl_i64:391; RV32: # %bb.0:392; RV32-NEXT: lui a1, 301408393; RV32-NEXT: addi a1, a1, 722394; RV32-NEXT: srl a1, a1, a0395; RV32-NEXT: addi a0, a0, -32396; RV32-NEXT: srli a0, a0, 31397; RV32-NEXT: and a0, a0, a1398; RV32-NEXT: ret399;400; RV64I-LABEL: bittest_constant_by_var_shl_i64:401; RV64I: # %bb.0:402; RV64I-NEXT: lui a1, 301408403; RV64I-NEXT: addi a1, a1, 722404; RV64I-NEXT: srl a0, a1, a0405; RV64I-NEXT: andi a0, a0, 1406; RV64I-NEXT: ret407;408; RV64ZBS-LABEL: bittest_constant_by_var_shl_i64:409; RV64ZBS: # %bb.0:410; RV64ZBS-NEXT: lui a1, 301408411; RV64ZBS-NEXT: addi a1, a1, 722412; RV64ZBS-NEXT: bext a0, a1, a0413; RV64ZBS-NEXT: ret414;415; RV64XTHEADBS-LABEL: bittest_constant_by_var_shl_i64:416; RV64XTHEADBS: # %bb.0:417; RV64XTHEADBS-NEXT: lui a1, 301408418; RV64XTHEADBS-NEXT: addi a1, a1, 722419; RV64XTHEADBS-NEXT: srl a0, a1, a0420; RV64XTHEADBS-NEXT: andi a0, a0, 1421; RV64XTHEADBS-NEXT: ret422 %shl = shl i64 1, %b423 %and = and i64 %shl, 1234567890424 %cmp = icmp ne i64 %and, 0425 ret i1 %cmp426}427 428; We want to use (andi (srl X, Y), 1) or bext before the beqz.429define void @bittest_switch(i32 signext %0) {430; RV32I-LABEL: bittest_switch:431; RV32I: # %bb.0:432; RV32I-NEXT: li a1, 31433; RV32I-NEXT: bltu a1, a0, .LBB14_3434; RV32I-NEXT: # %bb.1:435; RV32I-NEXT: lui a1, 524291436; RV32I-NEXT: addi a1, a1, 768437; RV32I-NEXT: srl a0, a1, a0438; RV32I-NEXT: andi a0, a0, 1439; RV32I-NEXT: beqz a0, .LBB14_3440; RV32I-NEXT: # %bb.2:441; RV32I-NEXT: tail bar442; RV32I-NEXT: .LBB14_3:443; RV32I-NEXT: ret444;445; RV64I-LABEL: bittest_switch:446; RV64I: # %bb.0:447; RV64I-NEXT: li a1, 31448; RV64I-NEXT: bltu a1, a0, .LBB14_3449; RV64I-NEXT: # %bb.1:450; RV64I-NEXT: lui a1, 2048451; RV64I-NEXT: addi a1, a1, 51452; RV64I-NEXT: slli a1, a1, 8453; RV64I-NEXT: srl a0, a1, a0454; RV64I-NEXT: andi a0, a0, 1455; RV64I-NEXT: beqz a0, .LBB14_3456; RV64I-NEXT: # %bb.2:457; RV64I-NEXT: tail bar458; RV64I-NEXT: .LBB14_3:459; RV64I-NEXT: ret460;461; RV32ZBS-LABEL: bittest_switch:462; RV32ZBS: # %bb.0:463; RV32ZBS-NEXT: li a1, 31464; RV32ZBS-NEXT: bltu a1, a0, .LBB14_3465; RV32ZBS-NEXT: # %bb.1:466; RV32ZBS-NEXT: lui a1, 524291467; RV32ZBS-NEXT: addi a1, a1, 768468; RV32ZBS-NEXT: bext a0, a1, a0469; RV32ZBS-NEXT: beqz a0, .LBB14_3470; RV32ZBS-NEXT: # %bb.2:471; RV32ZBS-NEXT: tail bar472; RV32ZBS-NEXT: .LBB14_3:473; RV32ZBS-NEXT: ret474;475; RV64ZBS-LABEL: bittest_switch:476; RV64ZBS: # %bb.0:477; RV64ZBS-NEXT: li a1, 31478; RV64ZBS-NEXT: bltu a1, a0, .LBB14_3479; RV64ZBS-NEXT: # %bb.1:480; RV64ZBS-NEXT: lui a1, 2048481; RV64ZBS-NEXT: addi a1, a1, 51482; RV64ZBS-NEXT: slli a1, a1, 8483; RV64ZBS-NEXT: bext a0, a1, a0484; RV64ZBS-NEXT: beqz a0, .LBB14_3485; RV64ZBS-NEXT: # %bb.2:486; RV64ZBS-NEXT: tail bar487; RV64ZBS-NEXT: .LBB14_3:488; RV64ZBS-NEXT: ret489;490; RV32XTHEADBS-LABEL: bittest_switch:491; RV32XTHEADBS: # %bb.0:492; RV32XTHEADBS-NEXT: li a1, 31493; RV32XTHEADBS-NEXT: bltu a1, a0, .LBB14_3494; RV32XTHEADBS-NEXT: # %bb.1:495; RV32XTHEADBS-NEXT: lui a1, 524291496; RV32XTHEADBS-NEXT: addi a1, a1, 768497; RV32XTHEADBS-NEXT: srl a0, a1, a0498; RV32XTHEADBS-NEXT: andi a0, a0, 1499; RV32XTHEADBS-NEXT: beqz a0, .LBB14_3500; RV32XTHEADBS-NEXT: # %bb.2:501; RV32XTHEADBS-NEXT: tail bar502; RV32XTHEADBS-NEXT: .LBB14_3:503; RV32XTHEADBS-NEXT: ret504;505; RV64XTHEADBS-LABEL: bittest_switch:506; RV64XTHEADBS: # %bb.0:507; RV64XTHEADBS-NEXT: li a1, 31508; RV64XTHEADBS-NEXT: bltu a1, a0, .LBB14_3509; RV64XTHEADBS-NEXT: # %bb.1:510; RV64XTHEADBS-NEXT: lui a1, 2048511; RV64XTHEADBS-NEXT: addi a1, a1, 51512; RV64XTHEADBS-NEXT: slli a1, a1, 8513; RV64XTHEADBS-NEXT: srl a0, a1, a0514; RV64XTHEADBS-NEXT: andi a0, a0, 1515; RV64XTHEADBS-NEXT: beqz a0, .LBB14_3516; RV64XTHEADBS-NEXT: # %bb.2:517; RV64XTHEADBS-NEXT: tail bar518; RV64XTHEADBS-NEXT: .LBB14_3:519; RV64XTHEADBS-NEXT: ret520 switch i32 %0, label %3 [521 i32 8, label %2522 i32 9, label %2523 i32 12, label %2524 i32 13, label %2525 i32 31, label %2526 ]527 5282:529 tail call void @bar()530 br label %3531 5323:533 ret void534}535 536declare void @bar()537 538define signext i32 @bit_10_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {539; CHECK-LABEL: bit_10_z_select_i32:540; CHECK: # %bb.0:541; CHECK-NEXT: andi a3, a0, 1024542; CHECK-NEXT: mv a0, a1543; CHECK-NEXT: beqz a3, .LBB15_2544; CHECK-NEXT: # %bb.1:545; CHECK-NEXT: mv a0, a2546; CHECK-NEXT: .LBB15_2:547; CHECK-NEXT: ret548 %1 = and i32 %a, 1024549 %2 = icmp eq i32 %1, 0550 %3 = select i1 %2, i32 %b, i32 %c551 ret i32 %3552}553 554define signext i32 @bit_10_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {555; RV32-LABEL: bit_10_nz_select_i32:556; RV32: # %bb.0:557; RV32-NEXT: slli a3, a0, 21558; RV32-NEXT: mv a0, a1559; RV32-NEXT: bltz a3, .LBB16_2560; RV32-NEXT: # %bb.1:561; RV32-NEXT: mv a0, a2562; RV32-NEXT: .LBB16_2:563; RV32-NEXT: ret564;565; RV64-LABEL: bit_10_nz_select_i32:566; RV64: # %bb.0:567; RV64-NEXT: slli a3, a0, 53568; RV64-NEXT: mv a0, a1569; RV64-NEXT: bltz a3, .LBB16_2570; RV64-NEXT: # %bb.1:571; RV64-NEXT: mv a0, a2572; RV64-NEXT: .LBB16_2:573; RV64-NEXT: ret574 %1 = and i32 %a, 1024575 %2 = icmp ne i32 %1, 0576 %3 = select i1 %2, i32 %b, i32 %c577 ret i32 %3578}579 580define signext i32 @bit_11_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {581; RV32-LABEL: bit_11_z_select_i32:582; RV32: # %bb.0:583; RV32-NEXT: slli a3, a0, 20584; RV32-NEXT: mv a0, a1585; RV32-NEXT: bgez a3, .LBB17_2586; RV32-NEXT: # %bb.1:587; RV32-NEXT: mv a0, a2588; RV32-NEXT: .LBB17_2:589; RV32-NEXT: ret590;591; RV64-LABEL: bit_11_z_select_i32:592; RV64: # %bb.0:593; RV64-NEXT: slli a3, a0, 52594; RV64-NEXT: mv a0, a1595; RV64-NEXT: bgez a3, .LBB17_2596; RV64-NEXT: # %bb.1:597; RV64-NEXT: mv a0, a2598; RV64-NEXT: .LBB17_2:599; RV64-NEXT: ret600 %1 = and i32 %a, 2048601 %2 = icmp eq i32 %1, 0602 %3 = select i1 %2, i32 %b, i32 %c603 ret i32 %3604}605 606define signext i32 @bit_11_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {607; RV32-LABEL: bit_11_nz_select_i32:608; RV32: # %bb.0:609; RV32-NEXT: slli a3, a0, 20610; RV32-NEXT: mv a0, a1611; RV32-NEXT: bltz a3, .LBB18_2612; RV32-NEXT: # %bb.1:613; RV32-NEXT: mv a0, a2614; RV32-NEXT: .LBB18_2:615; RV32-NEXT: ret616;617; RV64-LABEL: bit_11_nz_select_i32:618; RV64: # %bb.0:619; RV64-NEXT: slli a3, a0, 52620; RV64-NEXT: mv a0, a1621; RV64-NEXT: bltz a3, .LBB18_2622; RV64-NEXT: # %bb.1:623; RV64-NEXT: mv a0, a2624; RV64-NEXT: .LBB18_2:625; RV64-NEXT: ret626 %1 = and i32 %a, 2048627 %2 = icmp ne i32 %1, 0628 %3 = select i1 %2, i32 %b, i32 %c629 ret i32 %3630}631 632define signext i32 @bit_20_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {633; RV32-LABEL: bit_20_z_select_i32:634; RV32: # %bb.0:635; RV32-NEXT: slli a3, a0, 11636; RV32-NEXT: mv a0, a1637; RV32-NEXT: bgez a3, .LBB19_2638; RV32-NEXT: # %bb.1:639; RV32-NEXT: mv a0, a2640; RV32-NEXT: .LBB19_2:641; RV32-NEXT: ret642;643; RV64-LABEL: bit_20_z_select_i32:644; RV64: # %bb.0:645; RV64-NEXT: slli a3, a0, 43646; RV64-NEXT: mv a0, a1647; RV64-NEXT: bgez a3, .LBB19_2648; RV64-NEXT: # %bb.1:649; RV64-NEXT: mv a0, a2650; RV64-NEXT: .LBB19_2:651; RV64-NEXT: ret652 %1 = and i32 %a, 1048576653 %2 = icmp eq i32 %1, 0654 %3 = select i1 %2, i32 %b, i32 %c655 ret i32 %3656}657 658define signext i32 @bit_20_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {659; RV32-LABEL: bit_20_nz_select_i32:660; RV32: # %bb.0:661; RV32-NEXT: slli a3, a0, 11662; RV32-NEXT: mv a0, a1663; RV32-NEXT: bltz a3, .LBB20_2664; RV32-NEXT: # %bb.1:665; RV32-NEXT: mv a0, a2666; RV32-NEXT: .LBB20_2:667; RV32-NEXT: ret668;669; RV64-LABEL: bit_20_nz_select_i32:670; RV64: # %bb.0:671; RV64-NEXT: slli a3, a0, 43672; RV64-NEXT: mv a0, a1673; RV64-NEXT: bltz a3, .LBB20_2674; RV64-NEXT: # %bb.1:675; RV64-NEXT: mv a0, a2676; RV64-NEXT: .LBB20_2:677; RV64-NEXT: ret678 %1 = and i32 %a, 1048576679 %2 = icmp ne i32 %1, 0680 %3 = select i1 %2, i32 %b, i32 %c681 ret i32 %3682}683 684define signext i32 @bit_31_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {685; RV32-LABEL: bit_31_z_select_i32:686; RV32: # %bb.0:687; RV32-NEXT: bgez a0, .LBB21_2688; RV32-NEXT: # %bb.1:689; RV32-NEXT: mv a1, a2690; RV32-NEXT: .LBB21_2:691; RV32-NEXT: mv a0, a1692; RV32-NEXT: ret693;694; RV64-LABEL: bit_31_z_select_i32:695; RV64: # %bb.0:696; RV64-NEXT: lui a3, 524288697; RV64-NEXT: and a3, a0, a3698; RV64-NEXT: mv a0, a1699; RV64-NEXT: beqz a3, .LBB21_2700; RV64-NEXT: # %bb.1:701; RV64-NEXT: mv a0, a2702; RV64-NEXT: .LBB21_2:703; RV64-NEXT: ret704 %1 = and i32 %a, 2147483648705 %2 = icmp eq i32 %1, 0706 %3 = select i1 %2, i32 %b, i32 %c707 ret i32 %3708}709 710define signext i32 @bit_31_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {711; RV32-LABEL: bit_31_nz_select_i32:712; RV32: # %bb.0:713; RV32-NEXT: srli a3, a0, 31714; RV32-NEXT: mv a0, a1715; RV32-NEXT: bnez a3, .LBB22_2716; RV32-NEXT: # %bb.1:717; RV32-NEXT: mv a0, a2718; RV32-NEXT: .LBB22_2:719; RV32-NEXT: ret720;721; RV64-LABEL: bit_31_nz_select_i32:722; RV64: # %bb.0:723; RV64-NEXT: lui a3, 524288724; RV64-NEXT: and a3, a0, a3725; RV64-NEXT: mv a0, a1726; RV64-NEXT: bnez a3, .LBB22_2727; RV64-NEXT: # %bb.1:728; RV64-NEXT: mv a0, a2729; RV64-NEXT: .LBB22_2:730; RV64-NEXT: ret731 %1 = and i32 %a, 2147483648732 %2 = icmp ne i32 %1, 0733 %3 = select i1 %2, i32 %b, i32 %c734 ret i32 %3735}736 737define i64 @bit_10_z_select_i64(i64 %a, i64 %b, i64 %c) {738; RV32-LABEL: bit_10_z_select_i64:739; RV32: # %bb.0:740; RV32-NEXT: mv a1, a3741; RV32-NEXT: andi a3, a0, 1024742; RV32-NEXT: mv a0, a2743; RV32-NEXT: beqz a3, .LBB23_2744; RV32-NEXT: # %bb.1:745; RV32-NEXT: mv a0, a4746; RV32-NEXT: mv a1, a5747; RV32-NEXT: .LBB23_2:748; RV32-NEXT: ret749;750; RV64-LABEL: bit_10_z_select_i64:751; RV64: # %bb.0:752; RV64-NEXT: andi a3, a0, 1024753; RV64-NEXT: mv a0, a1754; RV64-NEXT: beqz a3, .LBB23_2755; RV64-NEXT: # %bb.1:756; RV64-NEXT: mv a0, a2757; RV64-NEXT: .LBB23_2:758; RV64-NEXT: ret759 %1 = and i64 %a, 1024760 %2 = icmp eq i64 %1, 0761 %3 = select i1 %2, i64 %b, i64 %c762 ret i64 %3763}764 765define i64 @bit_10_nz_select_i64(i64 %a, i64 %b, i64 %c) {766; RV32I-LABEL: bit_10_nz_select_i64:767; RV32I: # %bb.0:768; RV32I-NEXT: mv a1, a3769; RV32I-NEXT: slli a0, a0, 21770; RV32I-NEXT: srli a3, a0, 31771; RV32I-NEXT: mv a0, a2772; RV32I-NEXT: bnez a3, .LBB24_2773; RV32I-NEXT: # %bb.1:774; RV32I-NEXT: mv a0, a4775; RV32I-NEXT: mv a1, a5776; RV32I-NEXT: .LBB24_2:777; RV32I-NEXT: ret778;779; RV64-LABEL: bit_10_nz_select_i64:780; RV64: # %bb.0:781; RV64-NEXT: slli a3, a0, 53782; RV64-NEXT: mv a0, a1783; RV64-NEXT: bltz a3, .LBB24_2784; RV64-NEXT: # %bb.1:785; RV64-NEXT: mv a0, a2786; RV64-NEXT: .LBB24_2:787; RV64-NEXT: ret788;789; RV32ZBS-LABEL: bit_10_nz_select_i64:790; RV32ZBS: # %bb.0:791; RV32ZBS-NEXT: mv a1, a3792; RV32ZBS-NEXT: bexti a3, a0, 10793; RV32ZBS-NEXT: mv a0, a2794; RV32ZBS-NEXT: bnez a3, .LBB24_2795; RV32ZBS-NEXT: # %bb.1:796; RV32ZBS-NEXT: mv a0, a4797; RV32ZBS-NEXT: mv a1, a5798; RV32ZBS-NEXT: .LBB24_2:799; RV32ZBS-NEXT: ret800;801; RV32XTHEADBS-LABEL: bit_10_nz_select_i64:802; RV32XTHEADBS: # %bb.0:803; RV32XTHEADBS-NEXT: mv a1, a3804; RV32XTHEADBS-NEXT: th.tst a3, a0, 10805; RV32XTHEADBS-NEXT: mv a0, a2806; RV32XTHEADBS-NEXT: bnez a3, .LBB24_2807; RV32XTHEADBS-NEXT: # %bb.1:808; RV32XTHEADBS-NEXT: mv a0, a4809; RV32XTHEADBS-NEXT: mv a1, a5810; RV32XTHEADBS-NEXT: .LBB24_2:811; RV32XTHEADBS-NEXT: ret812 %1 = and i64 %a, 1024813 %2 = icmp ne i64 %1, 0814 %3 = select i1 %2, i64 %b, i64 %c815 ret i64 %3816}817 818define i64 @bit_11_z_select_i64(i64 %a, i64 %b, i64 %c) {819; RV32-LABEL: bit_11_z_select_i64:820; RV32: # %bb.0:821; RV32-NEXT: mv a1, a3822; RV32-NEXT: slli a3, a0, 20823; RV32-NEXT: mv a0, a2824; RV32-NEXT: bgez a3, .LBB25_2825; RV32-NEXT: # %bb.1:826; RV32-NEXT: mv a0, a4827; RV32-NEXT: mv a1, a5828; RV32-NEXT: .LBB25_2:829; RV32-NEXT: ret830;831; RV64-LABEL: bit_11_z_select_i64:832; RV64: # %bb.0:833; RV64-NEXT: slli a3, a0, 52834; RV64-NEXT: mv a0, a1835; RV64-NEXT: bgez a3, .LBB25_2836; RV64-NEXT: # %bb.1:837; RV64-NEXT: mv a0, a2838; RV64-NEXT: .LBB25_2:839; RV64-NEXT: ret840 %1 = and i64 %a, 2048841 %2 = icmp eq i64 %1, 0842 %3 = select i1 %2, i64 %b, i64 %c843 ret i64 %3844}845 846define i64 @bit_11_nz_select_i64(i64 %a, i64 %b, i64 %c) {847; RV32I-LABEL: bit_11_nz_select_i64:848; RV32I: # %bb.0:849; RV32I-NEXT: mv a1, a3850; RV32I-NEXT: slli a0, a0, 20851; RV32I-NEXT: srli a3, a0, 31852; RV32I-NEXT: mv a0, a2853; RV32I-NEXT: bnez a3, .LBB26_2854; RV32I-NEXT: # %bb.1:855; RV32I-NEXT: mv a0, a4856; RV32I-NEXT: mv a1, a5857; RV32I-NEXT: .LBB26_2:858; RV32I-NEXT: ret859;860; RV64-LABEL: bit_11_nz_select_i64:861; RV64: # %bb.0:862; RV64-NEXT: slli a3, a0, 52863; RV64-NEXT: mv a0, a1864; RV64-NEXT: bltz a3, .LBB26_2865; RV64-NEXT: # %bb.1:866; RV64-NEXT: mv a0, a2867; RV64-NEXT: .LBB26_2:868; RV64-NEXT: ret869;870; RV32ZBS-LABEL: bit_11_nz_select_i64:871; RV32ZBS: # %bb.0:872; RV32ZBS-NEXT: mv a1, a3873; RV32ZBS-NEXT: bexti a3, a0, 11874; RV32ZBS-NEXT: mv a0, a2875; RV32ZBS-NEXT: bnez a3, .LBB26_2876; RV32ZBS-NEXT: # %bb.1:877; RV32ZBS-NEXT: mv a0, a4878; RV32ZBS-NEXT: mv a1, a5879; RV32ZBS-NEXT: .LBB26_2:880; RV32ZBS-NEXT: ret881;882; RV32XTHEADBS-LABEL: bit_11_nz_select_i64:883; RV32XTHEADBS: # %bb.0:884; RV32XTHEADBS-NEXT: mv a1, a3885; RV32XTHEADBS-NEXT: th.tst a3, a0, 11886; RV32XTHEADBS-NEXT: mv a0, a2887; RV32XTHEADBS-NEXT: bnez a3, .LBB26_2888; RV32XTHEADBS-NEXT: # %bb.1:889; RV32XTHEADBS-NEXT: mv a0, a4890; RV32XTHEADBS-NEXT: mv a1, a5891; RV32XTHEADBS-NEXT: .LBB26_2:892; RV32XTHEADBS-NEXT: ret893 %1 = and i64 %a, 2048894 %2 = icmp ne i64 %1, 0895 %3 = select i1 %2, i64 %b, i64 %c896 ret i64 %3897}898 899define i64 @bit_20_z_select_i64(i64 %a, i64 %b, i64 %c) {900; RV32-LABEL: bit_20_z_select_i64:901; RV32: # %bb.0:902; RV32-NEXT: mv a1, a3903; RV32-NEXT: slli a3, a0, 11904; RV32-NEXT: mv a0, a2905; RV32-NEXT: bgez a3, .LBB27_2906; RV32-NEXT: # %bb.1:907; RV32-NEXT: mv a0, a4908; RV32-NEXT: mv a1, a5909; RV32-NEXT: .LBB27_2:910; RV32-NEXT: ret911;912; RV64-LABEL: bit_20_z_select_i64:913; RV64: # %bb.0:914; RV64-NEXT: slli a3, a0, 43915; RV64-NEXT: mv a0, a1916; RV64-NEXT: bgez a3, .LBB27_2917; RV64-NEXT: # %bb.1:918; RV64-NEXT: mv a0, a2919; RV64-NEXT: .LBB27_2:920; RV64-NEXT: ret921 %1 = and i64 %a, 1048576922 %2 = icmp eq i64 %1, 0923 %3 = select i1 %2, i64 %b, i64 %c924 ret i64 %3925}926 927define i64 @bit_20_nz_select_i64(i64 %a, i64 %b, i64 %c) {928; RV32I-LABEL: bit_20_nz_select_i64:929; RV32I: # %bb.0:930; RV32I-NEXT: mv a1, a3931; RV32I-NEXT: slli a0, a0, 11932; RV32I-NEXT: srli a3, a0, 31933; RV32I-NEXT: mv a0, a2934; RV32I-NEXT: bnez a3, .LBB28_2935; RV32I-NEXT: # %bb.1:936; RV32I-NEXT: mv a0, a4937; RV32I-NEXT: mv a1, a5938; RV32I-NEXT: .LBB28_2:939; RV32I-NEXT: ret940;941; RV64-LABEL: bit_20_nz_select_i64:942; RV64: # %bb.0:943; RV64-NEXT: slli a3, a0, 43944; RV64-NEXT: mv a0, a1945; RV64-NEXT: bltz a3, .LBB28_2946; RV64-NEXT: # %bb.1:947; RV64-NEXT: mv a0, a2948; RV64-NEXT: .LBB28_2:949; RV64-NEXT: ret950;951; RV32ZBS-LABEL: bit_20_nz_select_i64:952; RV32ZBS: # %bb.0:953; RV32ZBS-NEXT: mv a1, a3954; RV32ZBS-NEXT: bexti a3, a0, 20955; RV32ZBS-NEXT: mv a0, a2956; RV32ZBS-NEXT: bnez a3, .LBB28_2957; RV32ZBS-NEXT: # %bb.1:958; RV32ZBS-NEXT: mv a0, a4959; RV32ZBS-NEXT: mv a1, a5960; RV32ZBS-NEXT: .LBB28_2:961; RV32ZBS-NEXT: ret962;963; RV32XTHEADBS-LABEL: bit_20_nz_select_i64:964; RV32XTHEADBS: # %bb.0:965; RV32XTHEADBS-NEXT: mv a1, a3966; RV32XTHEADBS-NEXT: th.tst a3, a0, 20967; RV32XTHEADBS-NEXT: mv a0, a2968; RV32XTHEADBS-NEXT: bnez a3, .LBB28_2969; RV32XTHEADBS-NEXT: # %bb.1:970; RV32XTHEADBS-NEXT: mv a0, a4971; RV32XTHEADBS-NEXT: mv a1, a5972; RV32XTHEADBS-NEXT: .LBB28_2:973; RV32XTHEADBS-NEXT: ret974 %1 = and i64 %a, 1048576975 %2 = icmp ne i64 %1, 0976 %3 = select i1 %2, i64 %b, i64 %c977 ret i64 %3978}979 980define i64 @bit_31_z_select_i64(i64 %a, i64 %b, i64 %c) {981; RV32-LABEL: bit_31_z_select_i64:982; RV32: # %bb.0:983; RV32-NEXT: mv a1, a3984; RV32-NEXT: bgez a0, .LBB29_2985; RV32-NEXT: # %bb.1:986; RV32-NEXT: mv a2, a4987; RV32-NEXT: mv a1, a5988; RV32-NEXT: .LBB29_2:989; RV32-NEXT: mv a0, a2990; RV32-NEXT: ret991;992; RV64-LABEL: bit_31_z_select_i64:993; RV64: # %bb.0:994; RV64-NEXT: slli a3, a0, 32995; RV64-NEXT: mv a0, a1996; RV64-NEXT: bgez a3, .LBB29_2997; RV64-NEXT: # %bb.1:998; RV64-NEXT: mv a0, a2999; RV64-NEXT: .LBB29_2:1000; RV64-NEXT: ret1001 %1 = and i64 %a, 21474836481002 %2 = icmp eq i64 %1, 01003 %3 = select i1 %2, i64 %b, i64 %c1004 ret i64 %31005}1006 1007define i64 @bit_31_nz_select_i64(i64 %a, i64 %b, i64 %c) {1008; RV32-LABEL: bit_31_nz_select_i64:1009; RV32: # %bb.0:1010; RV32-NEXT: mv a1, a31011; RV32-NEXT: srli a3, a0, 311012; RV32-NEXT: mv a0, a21013; RV32-NEXT: bnez a3, .LBB30_21014; RV32-NEXT: # %bb.1:1015; RV32-NEXT: mv a0, a41016; RV32-NEXT: mv a1, a51017; RV32-NEXT: .LBB30_2:1018; RV32-NEXT: ret1019;1020; RV64-LABEL: bit_31_nz_select_i64:1021; RV64: # %bb.0:1022; RV64-NEXT: slli a3, a0, 321023; RV64-NEXT: mv a0, a11024; RV64-NEXT: bltz a3, .LBB30_21025; RV64-NEXT: # %bb.1:1026; RV64-NEXT: mv a0, a21027; RV64-NEXT: .LBB30_2:1028; RV64-NEXT: ret1029 %1 = and i64 %a, 21474836481030 %2 = icmp ne i64 %1, 01031 %3 = select i1 %2, i64 %b, i64 %c1032 ret i64 %31033}1034 1035define i64 @bit_32_z_select_i64(i64 %a, i64 %b, i64 %c) {1036; RV32-LABEL: bit_32_z_select_i64:1037; RV32: # %bb.0:1038; RV32-NEXT: andi a1, a1, 11039; RV32-NEXT: mv a0, a21040; RV32-NEXT: beqz a1, .LBB31_21041; RV32-NEXT: # %bb.1:1042; RV32-NEXT: mv a0, a41043; RV32-NEXT: mv a3, a51044; RV32-NEXT: .LBB31_2:1045; RV32-NEXT: mv a1, a31046; RV32-NEXT: ret1047;1048; RV64-LABEL: bit_32_z_select_i64:1049; RV64: # %bb.0:1050; RV64-NEXT: slli a3, a0, 311051; RV64-NEXT: mv a0, a11052; RV64-NEXT: bgez a3, .LBB31_21053; RV64-NEXT: # %bb.1:1054; RV64-NEXT: mv a0, a21055; RV64-NEXT: .LBB31_2:1056; RV64-NEXT: ret1057 %1 = and i64 %a, 42949672961058 %2 = icmp eq i64 %1, 01059 %3 = select i1 %2, i64 %b, i64 %c1060 ret i64 %31061}1062 1063define i64 @bit_32_nz_select_i64(i64 %a, i64 %b, i64 %c) {1064; RV32-LABEL: bit_32_nz_select_i64:1065; RV32: # %bb.0:1066; RV32-NEXT: andi a1, a1, 11067; RV32-NEXT: mv a0, a21068; RV32-NEXT: bnez a1, .LBB32_21069; RV32-NEXT: # %bb.1:1070; RV32-NEXT: mv a0, a41071; RV32-NEXT: mv a3, a51072; RV32-NEXT: .LBB32_2:1073; RV32-NEXT: mv a1, a31074; RV32-NEXT: ret1075;1076; RV64-LABEL: bit_32_nz_select_i64:1077; RV64: # %bb.0:1078; RV64-NEXT: slli a3, a0, 311079; RV64-NEXT: mv a0, a11080; RV64-NEXT: bltz a3, .LBB32_21081; RV64-NEXT: # %bb.1:1082; RV64-NEXT: mv a0, a21083; RV64-NEXT: .LBB32_2:1084; RV64-NEXT: ret1085 %1 = and i64 %a, 42949672961086 %2 = icmp ne i64 %1, 01087 %3 = select i1 %2, i64 %b, i64 %c1088 ret i64 %31089}1090 1091define i64 @bit_55_z_select_i64(i64 %a, i64 %b, i64 %c) {1092; RV32-LABEL: bit_55_z_select_i64:1093; RV32: # %bb.0:1094; RV32-NEXT: slli a1, a1, 81095; RV32-NEXT: mv a0, a21096; RV32-NEXT: bgez a1, .LBB33_21097; RV32-NEXT: # %bb.1:1098; RV32-NEXT: mv a0, a41099; RV32-NEXT: mv a3, a51100; RV32-NEXT: .LBB33_2:1101; RV32-NEXT: mv a1, a31102; RV32-NEXT: ret1103;1104; RV64-LABEL: bit_55_z_select_i64:1105; RV64: # %bb.0:1106; RV64-NEXT: slli a3, a0, 81107; RV64-NEXT: mv a0, a11108; RV64-NEXT: bgez a3, .LBB33_21109; RV64-NEXT: # %bb.1:1110; RV64-NEXT: mv a0, a21111; RV64-NEXT: .LBB33_2:1112; RV64-NEXT: ret1113 %1 = and i64 %a, 360287970189639681114 %2 = icmp eq i64 %1, 01115 %3 = select i1 %2, i64 %b, i64 %c1116 ret i64 %31117}1118 1119define i64 @bit_55_nz_select_i64(i64 %a, i64 %b, i64 %c) {1120; RV32I-LABEL: bit_55_nz_select_i64:1121; RV32I: # %bb.0:1122; RV32I-NEXT: slli a1, a1, 81123; RV32I-NEXT: srli a1, a1, 311124; RV32I-NEXT: mv a0, a21125; RV32I-NEXT: bnez a1, .LBB34_21126; RV32I-NEXT: # %bb.1:1127; RV32I-NEXT: mv a0, a41128; RV32I-NEXT: mv a3, a51129; RV32I-NEXT: .LBB34_2:1130; RV32I-NEXT: mv a1, a31131; RV32I-NEXT: ret1132;1133; RV64-LABEL: bit_55_nz_select_i64:1134; RV64: # %bb.0:1135; RV64-NEXT: slli a3, a0, 81136; RV64-NEXT: mv a0, a11137; RV64-NEXT: bltz a3, .LBB34_21138; RV64-NEXT: # %bb.1:1139; RV64-NEXT: mv a0, a21140; RV64-NEXT: .LBB34_2:1141; RV64-NEXT: ret1142;1143; RV32ZBS-LABEL: bit_55_nz_select_i64:1144; RV32ZBS: # %bb.0:1145; RV32ZBS-NEXT: bexti a1, a1, 231146; RV32ZBS-NEXT: mv a0, a21147; RV32ZBS-NEXT: bnez a1, .LBB34_21148; RV32ZBS-NEXT: # %bb.1:1149; RV32ZBS-NEXT: mv a0, a41150; RV32ZBS-NEXT: mv a3, a51151; RV32ZBS-NEXT: .LBB34_2:1152; RV32ZBS-NEXT: mv a1, a31153; RV32ZBS-NEXT: ret1154;1155; RV32XTHEADBS-LABEL: bit_55_nz_select_i64:1156; RV32XTHEADBS: # %bb.0:1157; RV32XTHEADBS-NEXT: th.tst a1, a1, 231158; RV32XTHEADBS-NEXT: mv a0, a21159; RV32XTHEADBS-NEXT: bnez a1, .LBB34_21160; RV32XTHEADBS-NEXT: # %bb.1:1161; RV32XTHEADBS-NEXT: mv a0, a41162; RV32XTHEADBS-NEXT: mv a3, a51163; RV32XTHEADBS-NEXT: .LBB34_2:1164; RV32XTHEADBS-NEXT: mv a1, a31165; RV32XTHEADBS-NEXT: ret1166 %1 = and i64 %a, 360287970189639681167 %2 = icmp ne i64 %1, 01168 %3 = select i1 %2, i64 %b, i64 %c1169 ret i64 %31170}1171 1172define i64 @bit_63_z_select_i64(i64 %a, i64 %b, i64 %c) {1173; RV32-LABEL: bit_63_z_select_i64:1174; RV32: # %bb.0:1175; RV32-NEXT: mv a0, a21176; RV32-NEXT: bgez a1, .LBB35_21177; RV32-NEXT: # %bb.1:1178; RV32-NEXT: mv a0, a41179; RV32-NEXT: mv a3, a51180; RV32-NEXT: .LBB35_2:1181; RV32-NEXT: mv a1, a31182; RV32-NEXT: ret1183;1184; RV64-LABEL: bit_63_z_select_i64:1185; RV64: # %bb.0:1186; RV64-NEXT: bgez a0, .LBB35_21187; RV64-NEXT: # %bb.1:1188; RV64-NEXT: mv a1, a21189; RV64-NEXT: .LBB35_2:1190; RV64-NEXT: mv a0, a11191; RV64-NEXT: ret1192 %1 = and i64 %a, 92233720368547758081193 %2 = icmp eq i64 %1, 01194 %3 = select i1 %2, i64 %b, i64 %c1195 ret i64 %31196}1197 1198define i64 @bit_63_nz_select_i64(i64 %a, i64 %b, i64 %c) {1199; RV32-LABEL: bit_63_nz_select_i64:1200; RV32: # %bb.0:1201; RV32-NEXT: srli a1, a1, 311202; RV32-NEXT: mv a0, a21203; RV32-NEXT: bnez a1, .LBB36_21204; RV32-NEXT: # %bb.1:1205; RV32-NEXT: mv a0, a41206; RV32-NEXT: mv a3, a51207; RV32-NEXT: .LBB36_2:1208; RV32-NEXT: mv a1, a31209; RV32-NEXT: ret1210;1211; RV64-LABEL: bit_63_nz_select_i64:1212; RV64: # %bb.0:1213; RV64-NEXT: srli a3, a0, 631214; RV64-NEXT: mv a0, a11215; RV64-NEXT: bnez a3, .LBB36_21216; RV64-NEXT: # %bb.1:1217; RV64-NEXT: mv a0, a21218; RV64-NEXT: .LBB36_2:1219; RV64-NEXT: ret1220 %1 = and i64 %a, 92233720368547758081221 %2 = icmp ne i64 %1, 01222 %3 = select i1 %2, i64 %b, i64 %c1223 ret i64 %31224}1225 1226define void @bit_10_z_branch_i32(i32 signext %0) {1227; CHECK-LABEL: bit_10_z_branch_i32:1228; CHECK: # %bb.0:1229; CHECK-NEXT: andi a0, a0, 10241230; CHECK-NEXT: bnez a0, .LBB37_21231; CHECK-NEXT: # %bb.1:1232; CHECK-NEXT: tail bar1233; CHECK-NEXT: .LBB37_2:1234; CHECK-NEXT: ret1235 %2 = and i32 %0, 10241236 %3 = icmp eq i32 %2, 01237 br i1 %3, label %4, label %51238 12394:1240 tail call void @bar()1241 br label %51242 12435:1244 ret void1245}1246 1247define void @bit_10_nz_branch_i32(i32 signext %0) {1248; CHECK-LABEL: bit_10_nz_branch_i32:1249; CHECK: # %bb.0:1250; CHECK-NEXT: andi a0, a0, 10241251; CHECK-NEXT: beqz a0, .LBB38_21252; CHECK-NEXT: # %bb.1:1253; CHECK-NEXT: tail bar1254; CHECK-NEXT: .LBB38_2:1255; CHECK-NEXT: ret1256 %2 = and i32 %0, 10241257 %3 = icmp ne i32 %2, 01258 br i1 %3, label %4, label %51259 12604:1261 tail call void @bar()1262 br label %51263 12645:1265 ret void1266}1267 1268define void @bit_11_z_branch_i32(i32 signext %0) {1269; RV32-LABEL: bit_11_z_branch_i32:1270; RV32: # %bb.0:1271; RV32-NEXT: slli a0, a0, 201272; RV32-NEXT: bltz a0, .LBB39_21273; RV32-NEXT: # %bb.1:1274; RV32-NEXT: tail bar1275; RV32-NEXT: .LBB39_2:1276; RV32-NEXT: ret1277;1278; RV64-LABEL: bit_11_z_branch_i32:1279; RV64: # %bb.0:1280; RV64-NEXT: slli a0, a0, 521281; RV64-NEXT: bltz a0, .LBB39_21282; RV64-NEXT: # %bb.1:1283; RV64-NEXT: tail bar1284; RV64-NEXT: .LBB39_2:1285; RV64-NEXT: ret1286 %2 = and i32 %0, 20481287 %3 = icmp eq i32 %2, 01288 br i1 %3, label %4, label %51289 12904:1291 tail call void @bar()1292 br label %51293 12945:1295 ret void1296}1297 1298define void @bit_11_nz_branch_i32(i32 signext %0) {1299; RV32-LABEL: bit_11_nz_branch_i32:1300; RV32: # %bb.0:1301; RV32-NEXT: slli a0, a0, 201302; RV32-NEXT: bgez a0, .LBB40_21303; RV32-NEXT: # %bb.1:1304; RV32-NEXT: tail bar1305; RV32-NEXT: .LBB40_2:1306; RV32-NEXT: ret1307;1308; RV64-LABEL: bit_11_nz_branch_i32:1309; RV64: # %bb.0:1310; RV64-NEXT: slli a0, a0, 521311; RV64-NEXT: bgez a0, .LBB40_21312; RV64-NEXT: # %bb.1:1313; RV64-NEXT: tail bar1314; RV64-NEXT: .LBB40_2:1315; RV64-NEXT: ret1316 %2 = and i32 %0, 20481317 %3 = icmp ne i32 %2, 01318 br i1 %3, label %4, label %51319 13204:1321 tail call void @bar()1322 br label %51323 13245:1325 ret void1326}1327 1328define void @bit_24_z_branch_i32(i32 signext %0) {1329; RV32-LABEL: bit_24_z_branch_i32:1330; RV32: # %bb.0:1331; RV32-NEXT: slli a0, a0, 71332; RV32-NEXT: bltz a0, .LBB41_21333; RV32-NEXT: # %bb.1:1334; RV32-NEXT: tail bar1335; RV32-NEXT: .LBB41_2:1336; RV32-NEXT: ret1337;1338; RV64-LABEL: bit_24_z_branch_i32:1339; RV64: # %bb.0:1340; RV64-NEXT: slli a0, a0, 391341; RV64-NEXT: bltz a0, .LBB41_21342; RV64-NEXT: # %bb.1:1343; RV64-NEXT: tail bar1344; RV64-NEXT: .LBB41_2:1345; RV64-NEXT: ret1346 %2 = and i32 %0, 167772161347 %3 = icmp eq i32 %2, 01348 br i1 %3, label %4, label %51349 13504:1351 tail call void @bar()1352 br label %51353 13545:1355 ret void1356}1357 1358define void @bit_24_nz_branch_i32(i32 signext %0) {1359; RV32-LABEL: bit_24_nz_branch_i32:1360; RV32: # %bb.0:1361; RV32-NEXT: slli a0, a0, 71362; RV32-NEXT: bgez a0, .LBB42_21363; RV32-NEXT: # %bb.1:1364; RV32-NEXT: tail bar1365; RV32-NEXT: .LBB42_2:1366; RV32-NEXT: ret1367;1368; RV64-LABEL: bit_24_nz_branch_i32:1369; RV64: # %bb.0:1370; RV64-NEXT: slli a0, a0, 391371; RV64-NEXT: bgez a0, .LBB42_21372; RV64-NEXT: # %bb.1:1373; RV64-NEXT: tail bar1374; RV64-NEXT: .LBB42_2:1375; RV64-NEXT: ret1376 %2 = and i32 %0, 167772161377 %3 = icmp ne i32 %2, 01378 br i1 %3, label %4, label %51379 13804:1381 tail call void @bar()1382 br label %51383 13845:1385 ret void1386}1387 1388define void @bit_31_z_branch_i32(i32 signext %0) {1389; RV32-LABEL: bit_31_z_branch_i32:1390; RV32: # %bb.0:1391; RV32-NEXT: bltz a0, .LBB43_21392; RV32-NEXT: # %bb.1:1393; RV32-NEXT: tail bar1394; RV32-NEXT: .LBB43_2:1395; RV32-NEXT: ret1396;1397; RV64-LABEL: bit_31_z_branch_i32:1398; RV64: # %bb.0:1399; RV64-NEXT: lui a1, 5242881400; RV64-NEXT: and a0, a0, a11401; RV64-NEXT: bnez a0, .LBB43_21402; RV64-NEXT: # %bb.1:1403; RV64-NEXT: tail bar1404; RV64-NEXT: .LBB43_2:1405; RV64-NEXT: ret1406 %2 = and i32 %0, 21474836481407 %3 = icmp eq i32 %2, 01408 br i1 %3, label %4, label %51409 14104:1411 tail call void @bar()1412 br label %51413 14145:1415 ret void1416}1417 1418define void @bit_31_nz_branch_i32(i32 signext %0) {1419; RV32-LABEL: bit_31_nz_branch_i32:1420; RV32: # %bb.0:1421; RV32-NEXT: bgez a0, .LBB44_21422; RV32-NEXT: # %bb.1:1423; RV32-NEXT: tail bar1424; RV32-NEXT: .LBB44_2:1425; RV32-NEXT: ret1426;1427; RV64-LABEL: bit_31_nz_branch_i32:1428; RV64: # %bb.0:1429; RV64-NEXT: lui a1, 5242881430; RV64-NEXT: and a0, a0, a11431; RV64-NEXT: beqz a0, .LBB44_21432; RV64-NEXT: # %bb.1:1433; RV64-NEXT: tail bar1434; RV64-NEXT: .LBB44_2:1435; RV64-NEXT: ret1436 %2 = and i32 %0, 21474836481437 %3 = icmp ne i32 %2, 01438 br i1 %3, label %4, label %51439 14404:1441 tail call void @bar()1442 br label %51443 14445:1445 ret void1446}1447 1448define void @bit_10_z_branch_i64(i64 %0) {1449; CHECK-LABEL: bit_10_z_branch_i64:1450; CHECK: # %bb.0:1451; CHECK-NEXT: andi a0, a0, 10241452; CHECK-NEXT: bnez a0, .LBB45_21453; CHECK-NEXT: # %bb.1:1454; CHECK-NEXT: tail bar1455; CHECK-NEXT: .LBB45_2:1456; CHECK-NEXT: ret1457 %2 = and i64 %0, 10241458 %3 = icmp eq i64 %2, 01459 br i1 %3, label %4, label %51460 14614:1462 tail call void @bar()1463 br label %51464 14655:1466 ret void1467}1468 1469define void @bit_10_nz_branch_i64(i64 %0) {1470; CHECK-LABEL: bit_10_nz_branch_i64:1471; CHECK: # %bb.0:1472; CHECK-NEXT: andi a0, a0, 10241473; CHECK-NEXT: beqz a0, .LBB46_21474; CHECK-NEXT: # %bb.1:1475; CHECK-NEXT: tail bar1476; CHECK-NEXT: .LBB46_2:1477; CHECK-NEXT: ret1478 %2 = and i64 %0, 10241479 %3 = icmp ne i64 %2, 01480 br i1 %3, label %4, label %51481 14824:1483 tail call void @bar()1484 br label %51485 14865:1487 ret void1488}1489 1490define void @bit_11_z_branch_i64(i64 %0) {1491; RV32-LABEL: bit_11_z_branch_i64:1492; RV32: # %bb.0:1493; RV32-NEXT: slli a0, a0, 201494; RV32-NEXT: bltz a0, .LBB47_21495; RV32-NEXT: # %bb.1:1496; RV32-NEXT: tail bar1497; RV32-NEXT: .LBB47_2:1498; RV32-NEXT: ret1499;1500; RV64-LABEL: bit_11_z_branch_i64:1501; RV64: # %bb.0:1502; RV64-NEXT: slli a0, a0, 521503; RV64-NEXT: bltz a0, .LBB47_21504; RV64-NEXT: # %bb.1:1505; RV64-NEXT: tail bar1506; RV64-NEXT: .LBB47_2:1507; RV64-NEXT: ret1508 %2 = and i64 %0, 20481509 %3 = icmp eq i64 %2, 01510 br i1 %3, label %4, label %51511 15124:1513 tail call void @bar()1514 br label %51515 15165:1517 ret void1518}1519 1520define void @bit_11_nz_branch_i64(i64 %0) {1521; RV32-LABEL: bit_11_nz_branch_i64:1522; RV32: # %bb.0:1523; RV32-NEXT: slli a0, a0, 201524; RV32-NEXT: bgez a0, .LBB48_21525; RV32-NEXT: # %bb.1:1526; RV32-NEXT: tail bar1527; RV32-NEXT: .LBB48_2:1528; RV32-NEXT: ret1529;1530; RV64-LABEL: bit_11_nz_branch_i64:1531; RV64: # %bb.0:1532; RV64-NEXT: slli a0, a0, 521533; RV64-NEXT: bgez a0, .LBB48_21534; RV64-NEXT: # %bb.1:1535; RV64-NEXT: tail bar1536; RV64-NEXT: .LBB48_2:1537; RV64-NEXT: ret1538 %2 = and i64 %0, 20481539 %3 = icmp ne i64 %2, 01540 br i1 %3, label %4, label %51541 15424:1543 tail call void @bar()1544 br label %51545 15465:1547 ret void1548}1549 1550define void @bit_24_z_branch_i64(i64 %0) {1551; RV32-LABEL: bit_24_z_branch_i64:1552; RV32: # %bb.0:1553; RV32-NEXT: slli a0, a0, 71554; RV32-NEXT: bltz a0, .LBB49_21555; RV32-NEXT: # %bb.1:1556; RV32-NEXT: tail bar1557; RV32-NEXT: .LBB49_2:1558; RV32-NEXT: ret1559;1560; RV64-LABEL: bit_24_z_branch_i64:1561; RV64: # %bb.0:1562; RV64-NEXT: slli a0, a0, 391563; RV64-NEXT: bltz a0, .LBB49_21564; RV64-NEXT: # %bb.1:1565; RV64-NEXT: tail bar1566; RV64-NEXT: .LBB49_2:1567; RV64-NEXT: ret1568 %2 = and i64 %0, 167772161569 %3 = icmp eq i64 %2, 01570 br i1 %3, label %4, label %51571 15724:1573 tail call void @bar()1574 br label %51575 15765:1577 ret void1578}1579 1580define void @bit_24_nz_branch_i64(i64 %0) {1581; RV32-LABEL: bit_24_nz_branch_i64:1582; RV32: # %bb.0:1583; RV32-NEXT: slli a0, a0, 71584; RV32-NEXT: bgez a0, .LBB50_21585; RV32-NEXT: # %bb.1:1586; RV32-NEXT: tail bar1587; RV32-NEXT: .LBB50_2:1588; RV32-NEXT: ret1589;1590; RV64-LABEL: bit_24_nz_branch_i64:1591; RV64: # %bb.0:1592; RV64-NEXT: slli a0, a0, 391593; RV64-NEXT: bgez a0, .LBB50_21594; RV64-NEXT: # %bb.1:1595; RV64-NEXT: tail bar1596; RV64-NEXT: .LBB50_2:1597; RV64-NEXT: ret1598 %2 = and i64 %0, 167772161599 %3 = icmp ne i64 %2, 01600 br i1 %3, label %4, label %51601 16024:1603 tail call void @bar()1604 br label %51605 16065:1607 ret void1608}1609 1610define void @bit_31_z_branch_i64(i64 %0) {1611; RV32-LABEL: bit_31_z_branch_i64:1612; RV32: # %bb.0:1613; RV32-NEXT: bltz a0, .LBB51_21614; RV32-NEXT: # %bb.1:1615; RV32-NEXT: tail bar1616; RV32-NEXT: .LBB51_2:1617; RV32-NEXT: ret1618;1619; RV64-LABEL: bit_31_z_branch_i64:1620; RV64: # %bb.0:1621; RV64-NEXT: slli a0, a0, 321622; RV64-NEXT: bltz a0, .LBB51_21623; RV64-NEXT: # %bb.1:1624; RV64-NEXT: tail bar1625; RV64-NEXT: .LBB51_2:1626; RV64-NEXT: ret1627 %2 = and i64 %0, 21474836481628 %3 = icmp eq i64 %2, 01629 br i1 %3, label %4, label %51630 16314:1632 tail call void @bar()1633 br label %51634 16355:1636 ret void1637}1638 1639define void @bit_31_nz_branch_i64(i64 %0) {1640; RV32-LABEL: bit_31_nz_branch_i64:1641; RV32: # %bb.0:1642; RV32-NEXT: bgez a0, .LBB52_21643; RV32-NEXT: # %bb.1:1644; RV32-NEXT: tail bar1645; RV32-NEXT: .LBB52_2:1646; RV32-NEXT: ret1647;1648; RV64-LABEL: bit_31_nz_branch_i64:1649; RV64: # %bb.0:1650; RV64-NEXT: slli a0, a0, 321651; RV64-NEXT: bgez a0, .LBB52_21652; RV64-NEXT: # %bb.1:1653; RV64-NEXT: tail bar1654; RV64-NEXT: .LBB52_2:1655; RV64-NEXT: ret1656 %2 = and i64 %0, 21474836481657 %3 = icmp ne i64 %2, 01658 br i1 %3, label %4, label %51659 16604:1661 tail call void @bar()1662 br label %51663 16645:1665 ret void1666}1667 1668define void @bit_32_z_branch_i64(i64 %0) {1669; RV32-LABEL: bit_32_z_branch_i64:1670; RV32: # %bb.0:1671; RV32-NEXT: andi a1, a1, 11672; RV32-NEXT: bnez a1, .LBB53_21673; RV32-NEXT: # %bb.1:1674; RV32-NEXT: tail bar1675; RV32-NEXT: .LBB53_2:1676; RV32-NEXT: ret1677;1678; RV64-LABEL: bit_32_z_branch_i64:1679; RV64: # %bb.0:1680; RV64-NEXT: slli a0, a0, 311681; RV64-NEXT: bltz a0, .LBB53_21682; RV64-NEXT: # %bb.1:1683; RV64-NEXT: tail bar1684; RV64-NEXT: .LBB53_2:1685; RV64-NEXT: ret1686 %2 = and i64 %0, 42949672961687 %3 = icmp eq i64 %2, 01688 br i1 %3, label %4, label %51689 16904:1691 tail call void @bar()1692 br label %51693 16945:1695 ret void1696}1697 1698define void @bit_32_nz_branch_i64(i64 %0) {1699; RV32-LABEL: bit_32_nz_branch_i64:1700; RV32: # %bb.0:1701; RV32-NEXT: andi a1, a1, 11702; RV32-NEXT: beqz a1, .LBB54_21703; RV32-NEXT: # %bb.1:1704; RV32-NEXT: tail bar1705; RV32-NEXT: .LBB54_2:1706; RV32-NEXT: ret1707;1708; RV64-LABEL: bit_32_nz_branch_i64:1709; RV64: # %bb.0:1710; RV64-NEXT: slli a0, a0, 311711; RV64-NEXT: bgez a0, .LBB54_21712; RV64-NEXT: # %bb.1:1713; RV64-NEXT: tail bar1714; RV64-NEXT: .LBB54_2:1715; RV64-NEXT: ret1716 %2 = and i64 %0, 42949672961717 %3 = icmp ne i64 %2, 01718 br i1 %3, label %4, label %51719 17204:1721 tail call void @bar()1722 br label %51723 17245:1725 ret void1726}1727 1728define void @bit_62_z_branch_i64(i64 %0) {1729; RV32-LABEL: bit_62_z_branch_i64:1730; RV32: # %bb.0:1731; RV32-NEXT: slli a1, a1, 11732; RV32-NEXT: bltz a1, .LBB55_21733; RV32-NEXT: # %bb.1:1734; RV32-NEXT: tail bar1735; RV32-NEXT: .LBB55_2:1736; RV32-NEXT: ret1737;1738; RV64-LABEL: bit_62_z_branch_i64:1739; RV64: # %bb.0:1740; RV64-NEXT: slli a0, a0, 11741; RV64-NEXT: bltz a0, .LBB55_21742; RV64-NEXT: # %bb.1:1743; RV64-NEXT: tail bar1744; RV64-NEXT: .LBB55_2:1745; RV64-NEXT: ret1746 %2 = and i64 %0, 46116860184273879041747 %3 = icmp eq i64 %2, 01748 br i1 %3, label %4, label %51749 17504:1751 tail call void @bar()1752 br label %51753 17545:1755 ret void1756}1757 1758define void @bit_62_nz_branch_i64(i64 %0) {1759; RV32-LABEL: bit_62_nz_branch_i64:1760; RV32: # %bb.0:1761; RV32-NEXT: slli a1, a1, 11762; RV32-NEXT: bgez a1, .LBB56_21763; RV32-NEXT: # %bb.1:1764; RV32-NEXT: tail bar1765; RV32-NEXT: .LBB56_2:1766; RV32-NEXT: ret1767;1768; RV64-LABEL: bit_62_nz_branch_i64:1769; RV64: # %bb.0:1770; RV64-NEXT: slli a0, a0, 11771; RV64-NEXT: bgez a0, .LBB56_21772; RV64-NEXT: # %bb.1:1773; RV64-NEXT: tail bar1774; RV64-NEXT: .LBB56_2:1775; RV64-NEXT: ret1776 %2 = and i64 %0, 46116860184273879041777 %3 = icmp ne i64 %2, 01778 br i1 %3, label %4, label %51779 17804:1781 tail call void @bar()1782 br label %51783 17845:1785 ret void1786}1787 1788define void @bit_63_z_branch_i64(i64 %0) {1789; RV32-LABEL: bit_63_z_branch_i64:1790; RV32: # %bb.0:1791; RV32-NEXT: bltz a1, .LBB57_21792; RV32-NEXT: # %bb.1:1793; RV32-NEXT: tail bar1794; RV32-NEXT: .LBB57_2:1795; RV32-NEXT: ret1796;1797; RV64-LABEL: bit_63_z_branch_i64:1798; RV64: # %bb.0:1799; RV64-NEXT: bltz a0, .LBB57_21800; RV64-NEXT: # %bb.1:1801; RV64-NEXT: tail bar1802; RV64-NEXT: .LBB57_2:1803; RV64-NEXT: ret1804 %2 = and i64 %0, 92233720368547758081805 %3 = icmp eq i64 %2, 01806 br i1 %3, label %4, label %51807 18084:1809 tail call void @bar()1810 br label %51811 18125:1813 ret void1814}1815 1816define void @bit_63_nz_branch_i64(i64 %0) {1817; RV32-LABEL: bit_63_nz_branch_i64:1818; RV32: # %bb.0:1819; RV32-NEXT: bgez a1, .LBB58_21820; RV32-NEXT: # %bb.1:1821; RV32-NEXT: tail bar1822; RV32-NEXT: .LBB58_2:1823; RV32-NEXT: ret1824;1825; RV64-LABEL: bit_63_nz_branch_i64:1826; RV64: # %bb.0:1827; RV64-NEXT: bgez a0, .LBB58_21828; RV64-NEXT: # %bb.1:1829; RV64-NEXT: tail bar1830; RV64-NEXT: .LBB58_2:1831; RV64-NEXT: ret1832 %2 = and i64 %0, 92233720368547758081833 %3 = icmp ne i64 %2, 01834 br i1 %3, label %4, label %51835 18364:1837 tail call void @bar()1838 br label %51839 18405:1841 ret void1842}1843 1844define signext i32 @bit_10_1_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {1845; CHECK-LABEL: bit_10_1_z_select_i32:1846; CHECK: # %bb.0:1847; CHECK-NEXT: andi a3, a0, 10231848; CHECK-NEXT: mv a0, a11849; CHECK-NEXT: beqz a3, .LBB59_21850; CHECK-NEXT: # %bb.1:1851; CHECK-NEXT: mv a0, a21852; CHECK-NEXT: .LBB59_2:1853; CHECK-NEXT: ret1854 %1 = and i32 %a, 10231855 %2 = icmp eq i32 %1, 01856 %3 = select i1 %2, i32 %b, i32 %c1857 ret i32 %31858}1859 1860define signext i32 @bit_10_1_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {1861; CHECK-LABEL: bit_10_1_nz_select_i32:1862; CHECK: # %bb.0:1863; CHECK-NEXT: andi a3, a0, 10231864; CHECK-NEXT: mv a0, a11865; CHECK-NEXT: bnez a3, .LBB60_21866; CHECK-NEXT: # %bb.1:1867; CHECK-NEXT: mv a0, a21868; CHECK-NEXT: .LBB60_2:1869; CHECK-NEXT: ret1870 %1 = and i32 %a, 10231871 %2 = icmp ne i32 %1, 01872 %3 = select i1 %2, i32 %b, i32 %c1873 ret i32 %31874}1875 1876define signext i32 @bit_11_1_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {1877; CHECK-LABEL: bit_11_1_z_select_i32:1878; CHECK: # %bb.0:1879; CHECK-NEXT: andi a3, a0, 20471880; CHECK-NEXT: mv a0, a11881; CHECK-NEXT: beqz a3, .LBB61_21882; CHECK-NEXT: # %bb.1:1883; CHECK-NEXT: mv a0, a21884; CHECK-NEXT: .LBB61_2:1885; CHECK-NEXT: ret1886 %1 = and i32 %a, 20471887 %2 = icmp eq i32 %1, 01888 %3 = select i1 %2, i32 %b, i32 %c1889 ret i32 %31890}1891 1892define signext i32 @bit_11_1_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {1893; CHECK-LABEL: bit_11_1_nz_select_i32:1894; CHECK: # %bb.0:1895; CHECK-NEXT: andi a3, a0, 20471896; CHECK-NEXT: mv a0, a11897; CHECK-NEXT: bnez a3, .LBB62_21898; CHECK-NEXT: # %bb.1:1899; CHECK-NEXT: mv a0, a21900; CHECK-NEXT: .LBB62_2:1901; CHECK-NEXT: ret1902 %1 = and i32 %a, 20471903 %2 = icmp ne i32 %1, 01904 %3 = select i1 %2, i32 %b, i32 %c1905 ret i32 %31906}1907 1908define signext i32 @bit_16_1_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {1909; RV32-LABEL: bit_16_1_z_select_i32:1910; RV32: # %bb.0:1911; RV32-NEXT: slli a3, a0, 161912; RV32-NEXT: mv a0, a11913; RV32-NEXT: beqz a3, .LBB63_21914; RV32-NEXT: # %bb.1:1915; RV32-NEXT: mv a0, a21916; RV32-NEXT: .LBB63_2:1917; RV32-NEXT: ret1918;1919; RV64-LABEL: bit_16_1_z_select_i32:1920; RV64: # %bb.0:1921; RV64-NEXT: slli a3, a0, 481922; RV64-NEXT: mv a0, a11923; RV64-NEXT: beqz a3, .LBB63_21924; RV64-NEXT: # %bb.1:1925; RV64-NEXT: mv a0, a21926; RV64-NEXT: .LBB63_2:1927; RV64-NEXT: ret1928 %1 = and i32 %a, 655351929 %2 = icmp eq i32 %1, 01930 %3 = select i1 %2, i32 %b, i32 %c1931 ret i32 %31932}1933 1934define signext i32 @bit_16_1_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {1935; RV32-LABEL: bit_16_1_nz_select_i32:1936; RV32: # %bb.0:1937; RV32-NEXT: slli a3, a0, 161938; RV32-NEXT: mv a0, a11939; RV32-NEXT: bnez a3, .LBB64_21940; RV32-NEXT: # %bb.1:1941; RV32-NEXT: mv a0, a21942; RV32-NEXT: .LBB64_2:1943; RV32-NEXT: ret1944;1945; RV64-LABEL: bit_16_1_nz_select_i32:1946; RV64: # %bb.0:1947; RV64-NEXT: slli a3, a0, 481948; RV64-NEXT: mv a0, a11949; RV64-NEXT: bnez a3, .LBB64_21950; RV64-NEXT: # %bb.1:1951; RV64-NEXT: mv a0, a21952; RV64-NEXT: .LBB64_2:1953; RV64-NEXT: ret1954 %1 = and i32 %a, 655351955 %2 = icmp ne i32 %1, 01956 %3 = select i1 %2, i32 %b, i32 %c1957 ret i32 %31958}1959 1960define signext i32 @bit_20_1_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {1961; RV32-LABEL: bit_20_1_z_select_i32:1962; RV32: # %bb.0:1963; RV32-NEXT: slli a3, a0, 121964; RV32-NEXT: mv a0, a11965; RV32-NEXT: beqz a3, .LBB65_21966; RV32-NEXT: # %bb.1:1967; RV32-NEXT: mv a0, a21968; RV32-NEXT: .LBB65_2:1969; RV32-NEXT: ret1970;1971; RV64-LABEL: bit_20_1_z_select_i32:1972; RV64: # %bb.0:1973; RV64-NEXT: slli a3, a0, 441974; RV64-NEXT: mv a0, a11975; RV64-NEXT: beqz a3, .LBB65_21976; RV64-NEXT: # %bb.1:1977; RV64-NEXT: mv a0, a21978; RV64-NEXT: .LBB65_2:1979; RV64-NEXT: ret1980 %1 = and i32 %a, 10485751981 %2 = icmp eq i32 %1, 01982 %3 = select i1 %2, i32 %b, i32 %c1983 ret i32 %31984}1985 1986define signext i32 @bit_20_1_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {1987; RV32-LABEL: bit_20_1_nz_select_i32:1988; RV32: # %bb.0:1989; RV32-NEXT: slli a3, a0, 121990; RV32-NEXT: mv a0, a11991; RV32-NEXT: bnez a3, .LBB66_21992; RV32-NEXT: # %bb.1:1993; RV32-NEXT: mv a0, a21994; RV32-NEXT: .LBB66_2:1995; RV32-NEXT: ret1996;1997; RV64-LABEL: bit_20_1_nz_select_i32:1998; RV64: # %bb.0:1999; RV64-NEXT: slli a3, a0, 442000; RV64-NEXT: mv a0, a12001; RV64-NEXT: bnez a3, .LBB66_22002; RV64-NEXT: # %bb.1:2003; RV64-NEXT: mv a0, a22004; RV64-NEXT: .LBB66_2:2005; RV64-NEXT: ret2006 %1 = and i32 %a, 10485752007 %2 = icmp ne i32 %1, 02008 %3 = select i1 %2, i32 %b, i32 %c2009 ret i32 %32010}2011 2012define signext i32 @bit_31_1_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {2013; RV32-LABEL: bit_31_1_z_select_i32:2014; RV32: # %bb.0:2015; RV32-NEXT: slli a3, a0, 12016; RV32-NEXT: mv a0, a12017; RV32-NEXT: beqz a3, .LBB67_22018; RV32-NEXT: # %bb.1:2019; RV32-NEXT: mv a0, a22020; RV32-NEXT: .LBB67_2:2021; RV32-NEXT: ret2022;2023; RV64-LABEL: bit_31_1_z_select_i32:2024; RV64: # %bb.0:2025; RV64-NEXT: slli a3, a0, 332026; RV64-NEXT: mv a0, a12027; RV64-NEXT: beqz a3, .LBB67_22028; RV64-NEXT: # %bb.1:2029; RV64-NEXT: mv a0, a22030; RV64-NEXT: .LBB67_2:2031; RV64-NEXT: ret2032 %1 = and i32 %a, 21474836472033 %2 = icmp eq i32 %1, 02034 %3 = select i1 %2, i32 %b, i32 %c2035 ret i32 %32036}2037 2038define signext i32 @bit_31_1_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {2039; RV32-LABEL: bit_31_1_nz_select_i32:2040; RV32: # %bb.0:2041; RV32-NEXT: slli a3, a0, 12042; RV32-NEXT: mv a0, a12043; RV32-NEXT: bnez a3, .LBB68_22044; RV32-NEXT: # %bb.1:2045; RV32-NEXT: mv a0, a22046; RV32-NEXT: .LBB68_2:2047; RV32-NEXT: ret2048;2049; RV64-LABEL: bit_31_1_nz_select_i32:2050; RV64: # %bb.0:2051; RV64-NEXT: slli a3, a0, 332052; RV64-NEXT: mv a0, a12053; RV64-NEXT: bnez a3, .LBB68_22054; RV64-NEXT: # %bb.1:2055; RV64-NEXT: mv a0, a22056; RV64-NEXT: .LBB68_2:2057; RV64-NEXT: ret2058 %1 = and i32 %a, 21474836472059 %2 = icmp ne i32 %1, 02060 %3 = select i1 %2, i32 %b, i32 %c2061 ret i32 %32062}2063 2064define signext i32 @bit_32_1_z_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {2065; CHECK-LABEL: bit_32_1_z_select_i32:2066; CHECK: # %bb.0:2067; CHECK-NEXT: beqz a0, .LBB69_22068; CHECK-NEXT: # %bb.1:2069; CHECK-NEXT: mv a1, a22070; CHECK-NEXT: .LBB69_2:2071; CHECK-NEXT: mv a0, a12072; CHECK-NEXT: ret2073 %1 = and i32 %a, 42949672952074 %2 = icmp eq i32 %1, 02075 %3 = select i1 %2, i32 %b, i32 %c2076 ret i32 %32077}2078 2079define signext i32 @bit_32_1_nz_select_i32(i32 signext %a, i32 signext %b, i32 signext %c) {2080; CHECK-LABEL: bit_32_1_nz_select_i32:2081; CHECK: # %bb.0:2082; CHECK-NEXT: bnez a0, .LBB70_22083; CHECK-NEXT: # %bb.1:2084; CHECK-NEXT: mv a1, a22085; CHECK-NEXT: .LBB70_2:2086; CHECK-NEXT: mv a0, a12087; CHECK-NEXT: ret2088 %1 = and i32 %a, 42949672952089 %2 = icmp ne i32 %1, 02090 %3 = select i1 %2, i32 %b, i32 %c2091 ret i32 %32092}2093 2094define i64 @bit_10_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2095; RV32-LABEL: bit_10_1_z_select_i64:2096; RV32: # %bb.0:2097; RV32-NEXT: mv a1, a32098; RV32-NEXT: andi a3, a0, 10232099; RV32-NEXT: mv a0, a22100; RV32-NEXT: beqz a3, .LBB71_22101; RV32-NEXT: # %bb.1:2102; RV32-NEXT: mv a0, a42103; RV32-NEXT: mv a1, a52104; RV32-NEXT: .LBB71_2:2105; RV32-NEXT: ret2106;2107; RV64-LABEL: bit_10_1_z_select_i64:2108; RV64: # %bb.0:2109; RV64-NEXT: andi a3, a0, 10232110; RV64-NEXT: mv a0, a12111; RV64-NEXT: beqz a3, .LBB71_22112; RV64-NEXT: # %bb.1:2113; RV64-NEXT: mv a0, a22114; RV64-NEXT: .LBB71_2:2115; RV64-NEXT: ret2116 %1 = and i64 %a, 10232117 %2 = icmp eq i64 %1, 02118 %3 = select i1 %2, i64 %b, i64 %c2119 ret i64 %32120}2121 2122define i64 @bit_10_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2123; RV32-LABEL: bit_10_1_nz_select_i64:2124; RV32: # %bb.0:2125; RV32-NEXT: mv a1, a32126; RV32-NEXT: andi a3, a0, 10232127; RV32-NEXT: mv a0, a22128; RV32-NEXT: bnez a3, .LBB72_22129; RV32-NEXT: # %bb.1:2130; RV32-NEXT: mv a0, a42131; RV32-NEXT: mv a1, a52132; RV32-NEXT: .LBB72_2:2133; RV32-NEXT: ret2134;2135; RV64-LABEL: bit_10_1_nz_select_i64:2136; RV64: # %bb.0:2137; RV64-NEXT: andi a3, a0, 10232138; RV64-NEXT: mv a0, a12139; RV64-NEXT: bnez a3, .LBB72_22140; RV64-NEXT: # %bb.1:2141; RV64-NEXT: mv a0, a22142; RV64-NEXT: .LBB72_2:2143; RV64-NEXT: ret2144 %1 = and i64 %a, 10232145 %2 = icmp ne i64 %1, 02146 %3 = select i1 %2, i64 %b, i64 %c2147 ret i64 %32148}2149 2150define i64 @bit_11_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2151; RV32-LABEL: bit_11_1_z_select_i64:2152; RV32: # %bb.0:2153; RV32-NEXT: mv a1, a32154; RV32-NEXT: andi a3, a0, 20472155; RV32-NEXT: mv a0, a22156; RV32-NEXT: beqz a3, .LBB73_22157; RV32-NEXT: # %bb.1:2158; RV32-NEXT: mv a0, a42159; RV32-NEXT: mv a1, a52160; RV32-NEXT: .LBB73_2:2161; RV32-NEXT: ret2162;2163; RV64-LABEL: bit_11_1_z_select_i64:2164; RV64: # %bb.0:2165; RV64-NEXT: andi a3, a0, 20472166; RV64-NEXT: mv a0, a12167; RV64-NEXT: beqz a3, .LBB73_22168; RV64-NEXT: # %bb.1:2169; RV64-NEXT: mv a0, a22170; RV64-NEXT: .LBB73_2:2171; RV64-NEXT: ret2172 %1 = and i64 %a, 20472173 %2 = icmp eq i64 %1, 02174 %3 = select i1 %2, i64 %b, i64 %c2175 ret i64 %32176}2177 2178define i64 @bit_11_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2179; RV32-LABEL: bit_11_1_nz_select_i64:2180; RV32: # %bb.0:2181; RV32-NEXT: mv a1, a32182; RV32-NEXT: andi a3, a0, 20472183; RV32-NEXT: mv a0, a22184; RV32-NEXT: bnez a3, .LBB74_22185; RV32-NEXT: # %bb.1:2186; RV32-NEXT: mv a0, a42187; RV32-NEXT: mv a1, a52188; RV32-NEXT: .LBB74_2:2189; RV32-NEXT: ret2190;2191; RV64-LABEL: bit_11_1_nz_select_i64:2192; RV64: # %bb.0:2193; RV64-NEXT: andi a3, a0, 20472194; RV64-NEXT: mv a0, a12195; RV64-NEXT: bnez a3, .LBB74_22196; RV64-NEXT: # %bb.1:2197; RV64-NEXT: mv a0, a22198; RV64-NEXT: .LBB74_2:2199; RV64-NEXT: ret2200 %1 = and i64 %a, 20472201 %2 = icmp ne i64 %1, 02202 %3 = select i1 %2, i64 %b, i64 %c2203 ret i64 %32204}2205 2206define i64 @bit_16_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2207; RV32-LABEL: bit_16_1_z_select_i64:2208; RV32: # %bb.0:2209; RV32-NEXT: mv a1, a32210; RV32-NEXT: slli a3, a0, 162211; RV32-NEXT: mv a0, a22212; RV32-NEXT: beqz a3, .LBB75_22213; RV32-NEXT: # %bb.1:2214; RV32-NEXT: mv a0, a42215; RV32-NEXT: mv a1, a52216; RV32-NEXT: .LBB75_2:2217; RV32-NEXT: ret2218;2219; RV64-LABEL: bit_16_1_z_select_i64:2220; RV64: # %bb.0:2221; RV64-NEXT: slli a3, a0, 482222; RV64-NEXT: mv a0, a12223; RV64-NEXT: beqz a3, .LBB75_22224; RV64-NEXT: # %bb.1:2225; RV64-NEXT: mv a0, a22226; RV64-NEXT: .LBB75_2:2227; RV64-NEXT: ret2228 %1 = and i64 %a, 655352229 %2 = icmp eq i64 %1, 02230 %3 = select i1 %2, i64 %b, i64 %c2231 ret i64 %32232}2233 2234define i64 @bit_16_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2235; RV32-LABEL: bit_16_1_nz_select_i64:2236; RV32: # %bb.0:2237; RV32-NEXT: mv a1, a32238; RV32-NEXT: bnez a0, .LBB76_22239; RV32-NEXT: # %bb.1:2240; RV32-NEXT: mv a2, a42241; RV32-NEXT: mv a1, a52242; RV32-NEXT: .LBB76_2:2243; RV32-NEXT: mv a0, a22244; RV32-NEXT: ret2245;2246; RV64-LABEL: bit_16_1_nz_select_i64:2247; RV64: # %bb.0:2248; RV64-NEXT: sext.w a3, a02249; RV64-NEXT: mv a0, a12250; RV64-NEXT: bnez a3, .LBB76_22251; RV64-NEXT: # %bb.1:2252; RV64-NEXT: mv a0, a22253; RV64-NEXT: .LBB76_2:2254; RV64-NEXT: ret2255 %1 = and i64 %a, 42949672952256 %2 = icmp ne i64 %1, 02257 %3 = select i1 %2, i64 %b, i64 %c2258 ret i64 %32259}2260 2261 2262define i64 @bit_20_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2263; RV32-LABEL: bit_20_1_z_select_i64:2264; RV32: # %bb.0:2265; RV32-NEXT: mv a1, a32266; RV32-NEXT: slli a3, a0, 122267; RV32-NEXT: mv a0, a22268; RV32-NEXT: beqz a3, .LBB77_22269; RV32-NEXT: # %bb.1:2270; RV32-NEXT: mv a0, a42271; RV32-NEXT: mv a1, a52272; RV32-NEXT: .LBB77_2:2273; RV32-NEXT: ret2274;2275; RV64-LABEL: bit_20_1_z_select_i64:2276; RV64: # %bb.0:2277; RV64-NEXT: slli a3, a0, 442278; RV64-NEXT: mv a0, a12279; RV64-NEXT: beqz a3, .LBB77_22280; RV64-NEXT: # %bb.1:2281; RV64-NEXT: mv a0, a22282; RV64-NEXT: .LBB77_2:2283; RV64-NEXT: ret2284 %1 = and i64 %a, 10485752285 %2 = icmp eq i64 %1, 02286 %3 = select i1 %2, i64 %b, i64 %c2287 ret i64 %32288}2289 2290define i64 @bit_20_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2291; RV32-LABEL: bit_20_1_nz_select_i64:2292; RV32: # %bb.0:2293; RV32-NEXT: mv a1, a32294; RV32-NEXT: slli a3, a0, 122295; RV32-NEXT: mv a0, a22296; RV32-NEXT: bnez a3, .LBB78_22297; RV32-NEXT: # %bb.1:2298; RV32-NEXT: mv a0, a42299; RV32-NEXT: mv a1, a52300; RV32-NEXT: .LBB78_2:2301; RV32-NEXT: ret2302;2303; RV64-LABEL: bit_20_1_nz_select_i64:2304; RV64: # %bb.0:2305; RV64-NEXT: slli a3, a0, 442306; RV64-NEXT: mv a0, a12307; RV64-NEXT: bnez a3, .LBB78_22308; RV64-NEXT: # %bb.1:2309; RV64-NEXT: mv a0, a22310; RV64-NEXT: .LBB78_2:2311; RV64-NEXT: ret2312 %1 = and i64 %a, 10485752313 %2 = icmp ne i64 %1, 02314 %3 = select i1 %2, i64 %b, i64 %c2315 ret i64 %32316}2317 2318define i64 @bit_31_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2319; RV32-LABEL: bit_31_1_z_select_i64:2320; RV32: # %bb.0:2321; RV32-NEXT: mv a1, a32322; RV32-NEXT: slli a3, a0, 12323; RV32-NEXT: mv a0, a22324; RV32-NEXT: beqz a3, .LBB79_22325; RV32-NEXT: # %bb.1:2326; RV32-NEXT: mv a0, a42327; RV32-NEXT: mv a1, a52328; RV32-NEXT: .LBB79_2:2329; RV32-NEXT: ret2330;2331; RV64-LABEL: bit_31_1_z_select_i64:2332; RV64: # %bb.0:2333; RV64-NEXT: slli a3, a0, 332334; RV64-NEXT: mv a0, a12335; RV64-NEXT: beqz a3, .LBB79_22336; RV64-NEXT: # %bb.1:2337; RV64-NEXT: mv a0, a22338; RV64-NEXT: .LBB79_2:2339; RV64-NEXT: ret2340 %1 = and i64 %a, 21474836472341 %2 = icmp eq i64 %1, 02342 %3 = select i1 %2, i64 %b, i64 %c2343 ret i64 %32344}2345 2346define i64 @bit_31_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2347; RV32-LABEL: bit_31_1_nz_select_i64:2348; RV32: # %bb.0:2349; RV32-NEXT: mv a1, a32350; RV32-NEXT: slli a3, a0, 12351; RV32-NEXT: mv a0, a22352; RV32-NEXT: bnez a3, .LBB80_22353; RV32-NEXT: # %bb.1:2354; RV32-NEXT: mv a0, a42355; RV32-NEXT: mv a1, a52356; RV32-NEXT: .LBB80_2:2357; RV32-NEXT: ret2358;2359; RV64-LABEL: bit_31_1_nz_select_i64:2360; RV64: # %bb.0:2361; RV64-NEXT: slli a3, a0, 332362; RV64-NEXT: mv a0, a12363; RV64-NEXT: bnez a3, .LBB80_22364; RV64-NEXT: # %bb.1:2365; RV64-NEXT: mv a0, a22366; RV64-NEXT: .LBB80_2:2367; RV64-NEXT: ret2368 %1 = and i64 %a, 21474836472369 %2 = icmp ne i64 %1, 02370 %3 = select i1 %2, i64 %b, i64 %c2371 ret i64 %32372}2373 2374define i64 @bit_32_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2375; RV32-LABEL: bit_32_1_z_select_i64:2376; RV32: # %bb.0:2377; RV32-NEXT: mv a1, a32378; RV32-NEXT: beqz a0, .LBB81_22379; RV32-NEXT: # %bb.1:2380; RV32-NEXT: mv a2, a42381; RV32-NEXT: mv a1, a52382; RV32-NEXT: .LBB81_2:2383; RV32-NEXT: mv a0, a22384; RV32-NEXT: ret2385;2386; RV64-LABEL: bit_32_1_z_select_i64:2387; RV64: # %bb.0:2388; RV64-NEXT: sext.w a3, a02389; RV64-NEXT: mv a0, a12390; RV64-NEXT: beqz a3, .LBB81_22391; RV64-NEXT: # %bb.1:2392; RV64-NEXT: mv a0, a22393; RV64-NEXT: .LBB81_2:2394; RV64-NEXT: ret2395 %1 = and i64 %a, 42949672952396 %2 = icmp eq i64 %1, 02397 %3 = select i1 %2, i64 %b, i64 %c2398 ret i64 %32399}2400 2401define i64 @bit_32_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2402; RV32-LABEL: bit_32_1_nz_select_i64:2403; RV32: # %bb.0:2404; RV32-NEXT: mv a1, a32405; RV32-NEXT: bnez a0, .LBB82_22406; RV32-NEXT: # %bb.1:2407; RV32-NEXT: mv a2, a42408; RV32-NEXT: mv a1, a52409; RV32-NEXT: .LBB82_2:2410; RV32-NEXT: mv a0, a22411; RV32-NEXT: ret2412;2413; RV64-LABEL: bit_32_1_nz_select_i64:2414; RV64: # %bb.0:2415; RV64-NEXT: sext.w a3, a02416; RV64-NEXT: mv a0, a12417; RV64-NEXT: bnez a3, .LBB82_22418; RV64-NEXT: # %bb.1:2419; RV64-NEXT: mv a0, a22420; RV64-NEXT: .LBB82_2:2421; RV64-NEXT: ret2422 %1 = and i64 %a, 42949672952423 %2 = icmp ne i64 %1, 02424 %3 = select i1 %2, i64 %b, i64 %c2425 ret i64 %32426}2427 2428define i64 @bit_55_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2429; RV32-LABEL: bit_55_1_z_select_i64:2430; RV32: # %bb.0:2431; RV32-NEXT: slli a1, a1, 92432; RV32-NEXT: srli a1, a1, 92433; RV32-NEXT: or a1, a0, a12434; RV32-NEXT: mv a0, a22435; RV32-NEXT: beqz a1, .LBB83_22436; RV32-NEXT: # %bb.1:2437; RV32-NEXT: mv a0, a42438; RV32-NEXT: mv a3, a52439; RV32-NEXT: .LBB83_2:2440; RV32-NEXT: mv a1, a32441; RV32-NEXT: ret2442;2443; RV64-LABEL: bit_55_1_z_select_i64:2444; RV64: # %bb.0:2445; RV64-NEXT: slli a3, a0, 92446; RV64-NEXT: mv a0, a12447; RV64-NEXT: beqz a3, .LBB83_22448; RV64-NEXT: # %bb.1:2449; RV64-NEXT: mv a0, a22450; RV64-NEXT: .LBB83_2:2451; RV64-NEXT: ret2452 %1 = and i64 %a, 360287970189639672453 %2 = icmp eq i64 %1, 02454 %3 = select i1 %2, i64 %b, i64 %c2455 ret i64 %32456}2457 2458define i64 @bit_55_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2459; RV32-LABEL: bit_55_1_nz_select_i64:2460; RV32: # %bb.0:2461; RV32-NEXT: slli a1, a1, 92462; RV32-NEXT: srli a1, a1, 92463; RV32-NEXT: or a1, a0, a12464; RV32-NEXT: mv a0, a22465; RV32-NEXT: bnez a1, .LBB84_22466; RV32-NEXT: # %bb.1:2467; RV32-NEXT: mv a0, a42468; RV32-NEXT: mv a3, a52469; RV32-NEXT: .LBB84_2:2470; RV32-NEXT: mv a1, a32471; RV32-NEXT: ret2472;2473; RV64-LABEL: bit_55_1_nz_select_i64:2474; RV64: # %bb.0:2475; RV64-NEXT: slli a3, a0, 92476; RV64-NEXT: mv a0, a12477; RV64-NEXT: bnez a3, .LBB84_22478; RV64-NEXT: # %bb.1:2479; RV64-NEXT: mv a0, a22480; RV64-NEXT: .LBB84_2:2481; RV64-NEXT: ret2482 %1 = and i64 %a, 360287970189639672483 %2 = icmp ne i64 %1, 02484 %3 = select i1 %2, i64 %b, i64 %c2485 ret i64 %32486}2487 2488define i64 @bit_63_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2489; RV32I-LABEL: bit_63_1_z_select_i64:2490; RV32I: # %bb.0:2491; RV32I-NEXT: slli a1, a1, 12492; RV32I-NEXT: srli a1, a1, 12493; RV32I-NEXT: or a1, a0, a12494; RV32I-NEXT: mv a0, a22495; RV32I-NEXT: beqz a1, .LBB85_22496; RV32I-NEXT: # %bb.1:2497; RV32I-NEXT: mv a0, a42498; RV32I-NEXT: mv a3, a52499; RV32I-NEXT: .LBB85_2:2500; RV32I-NEXT: mv a1, a32501; RV32I-NEXT: ret2502;2503; RV64-LABEL: bit_63_1_z_select_i64:2504; RV64: # %bb.0:2505; RV64-NEXT: slli a3, a0, 12506; RV64-NEXT: mv a0, a12507; RV64-NEXT: beqz a3, .LBB85_22508; RV64-NEXT: # %bb.1:2509; RV64-NEXT: mv a0, a22510; RV64-NEXT: .LBB85_2:2511; RV64-NEXT: ret2512;2513; RV32ZBS-LABEL: bit_63_1_z_select_i64:2514; RV32ZBS: # %bb.0:2515; RV32ZBS-NEXT: bclri a1, a1, 312516; RV32ZBS-NEXT: or a1, a0, a12517; RV32ZBS-NEXT: mv a0, a22518; RV32ZBS-NEXT: beqz a1, .LBB85_22519; RV32ZBS-NEXT: # %bb.1:2520; RV32ZBS-NEXT: mv a0, a42521; RV32ZBS-NEXT: mv a3, a52522; RV32ZBS-NEXT: .LBB85_2:2523; RV32ZBS-NEXT: mv a1, a32524; RV32ZBS-NEXT: ret2525;2526; RV32XTHEADBS-LABEL: bit_63_1_z_select_i64:2527; RV32XTHEADBS: # %bb.0:2528; RV32XTHEADBS-NEXT: slli a1, a1, 12529; RV32XTHEADBS-NEXT: srli a1, a1, 12530; RV32XTHEADBS-NEXT: or a1, a0, a12531; RV32XTHEADBS-NEXT: mv a0, a22532; RV32XTHEADBS-NEXT: beqz a1, .LBB85_22533; RV32XTHEADBS-NEXT: # %bb.1:2534; RV32XTHEADBS-NEXT: mv a0, a42535; RV32XTHEADBS-NEXT: mv a3, a52536; RV32XTHEADBS-NEXT: .LBB85_2:2537; RV32XTHEADBS-NEXT: mv a1, a32538; RV32XTHEADBS-NEXT: ret2539 %1 = and i64 %a, 92233720368547758072540 %2 = icmp eq i64 %1, 02541 %3 = select i1 %2, i64 %b, i64 %c2542 ret i64 %32543}2544 2545define i64 @bit_63_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2546; RV32I-LABEL: bit_63_1_nz_select_i64:2547; RV32I: # %bb.0:2548; RV32I-NEXT: slli a1, a1, 12549; RV32I-NEXT: srli a1, a1, 12550; RV32I-NEXT: or a1, a0, a12551; RV32I-NEXT: mv a0, a22552; RV32I-NEXT: bnez a1, .LBB86_22553; RV32I-NEXT: # %bb.1:2554; RV32I-NEXT: mv a0, a42555; RV32I-NEXT: mv a3, a52556; RV32I-NEXT: .LBB86_2:2557; RV32I-NEXT: mv a1, a32558; RV32I-NEXT: ret2559;2560; RV64-LABEL: bit_63_1_nz_select_i64:2561; RV64: # %bb.0:2562; RV64-NEXT: slli a3, a0, 12563; RV64-NEXT: mv a0, a12564; RV64-NEXT: bnez a3, .LBB86_22565; RV64-NEXT: # %bb.1:2566; RV64-NEXT: mv a0, a22567; RV64-NEXT: .LBB86_2:2568; RV64-NEXT: ret2569;2570; RV32ZBS-LABEL: bit_63_1_nz_select_i64:2571; RV32ZBS: # %bb.0:2572; RV32ZBS-NEXT: bclri a1, a1, 312573; RV32ZBS-NEXT: or a1, a0, a12574; RV32ZBS-NEXT: mv a0, a22575; RV32ZBS-NEXT: bnez a1, .LBB86_22576; RV32ZBS-NEXT: # %bb.1:2577; RV32ZBS-NEXT: mv a0, a42578; RV32ZBS-NEXT: mv a3, a52579; RV32ZBS-NEXT: .LBB86_2:2580; RV32ZBS-NEXT: mv a1, a32581; RV32ZBS-NEXT: ret2582;2583; RV32XTHEADBS-LABEL: bit_63_1_nz_select_i64:2584; RV32XTHEADBS: # %bb.0:2585; RV32XTHEADBS-NEXT: slli a1, a1, 12586; RV32XTHEADBS-NEXT: srli a1, a1, 12587; RV32XTHEADBS-NEXT: or a1, a0, a12588; RV32XTHEADBS-NEXT: mv a0, a22589; RV32XTHEADBS-NEXT: bnez a1, .LBB86_22590; RV32XTHEADBS-NEXT: # %bb.1:2591; RV32XTHEADBS-NEXT: mv a0, a42592; RV32XTHEADBS-NEXT: mv a3, a52593; RV32XTHEADBS-NEXT: .LBB86_2:2594; RV32XTHEADBS-NEXT: mv a1, a32595; RV32XTHEADBS-NEXT: ret2596 %1 = and i64 %a, 92233720368547758072597 %2 = icmp ne i64 %1, 02598 %3 = select i1 %2, i64 %b, i64 %c2599 ret i64 %32600}2601 2602define i64 @bit_64_1_z_select_i64(i64 %a, i64 %b, i64 %c) {2603; RV32-LABEL: bit_64_1_z_select_i64:2604; RV32: # %bb.0:2605; RV32-NEXT: or a1, a0, a12606; RV32-NEXT: mv a0, a22607; RV32-NEXT: beqz a1, .LBB87_22608; RV32-NEXT: # %bb.1:2609; RV32-NEXT: mv a0, a42610; RV32-NEXT: mv a3, a52611; RV32-NEXT: .LBB87_2:2612; RV32-NEXT: mv a1, a32613; RV32-NEXT: ret2614;2615; RV64-LABEL: bit_64_1_z_select_i64:2616; RV64: # %bb.0:2617; RV64-NEXT: beqz a0, .LBB87_22618; RV64-NEXT: # %bb.1:2619; RV64-NEXT: mv a1, a22620; RV64-NEXT: .LBB87_2:2621; RV64-NEXT: mv a0, a12622; RV64-NEXT: ret2623 %1 = and i64 %a, 184467440737095516152624 %2 = icmp eq i64 %1, 02625 %3 = select i1 %2, i64 %b, i64 %c2626 ret i64 %32627}2628 2629define i64 @bit_64_1_nz_select_i64(i64 %a, i64 %b, i64 %c) {2630; RV32-LABEL: bit_64_1_nz_select_i64:2631; RV32: # %bb.0:2632; RV32-NEXT: or a1, a0, a12633; RV32-NEXT: mv a0, a22634; RV32-NEXT: bnez a1, .LBB88_22635; RV32-NEXT: # %bb.1:2636; RV32-NEXT: mv a0, a42637; RV32-NEXT: mv a3, a52638; RV32-NEXT: .LBB88_2:2639; RV32-NEXT: mv a1, a32640; RV32-NEXT: ret2641;2642; RV64-LABEL: bit_64_1_nz_select_i64:2643; RV64: # %bb.0:2644; RV64-NEXT: bnez a0, .LBB88_22645; RV64-NEXT: # %bb.1:2646; RV64-NEXT: mv a1, a22647; RV64-NEXT: .LBB88_2:2648; RV64-NEXT: mv a0, a12649; RV64-NEXT: ret2650 %1 = and i64 %a, 184467440737095516152651 %2 = icmp ne i64 %1, 02652 %3 = select i1 %2, i64 %b, i64 %c2653 ret i64 %32654}2655 2656define void @bit_10_1_z_branch_i32(i32 signext %0) {2657; CHECK-LABEL: bit_10_1_z_branch_i32:2658; CHECK: # %bb.0:2659; CHECK-NEXT: andi a0, a0, 10232660; CHECK-NEXT: beqz a0, .LBB89_22661; CHECK-NEXT: # %bb.1:2662; CHECK-NEXT: ret2663; CHECK-NEXT: .LBB89_2:2664; CHECK-NEXT: tail bar2665 %2 = and i32 %0, 10232666 %3 = icmp eq i32 %2, 02667 br i1 %3, label %4, label %52668 26694:2670 tail call void @bar()2671 br label %52672 26735:2674 ret void2675}2676 2677define void @bit_10_1_nz_branch_i32(i32 signext %0) {2678; CHECK-LABEL: bit_10_1_nz_branch_i32:2679; CHECK: # %bb.0:2680; CHECK-NEXT: andi a0, a0, 10232681; CHECK-NEXT: beqz a0, .LBB90_22682; CHECK-NEXT: # %bb.1:2683; CHECK-NEXT: tail bar2684; CHECK-NEXT: .LBB90_2:2685; CHECK-NEXT: ret2686 %2 = and i32 %0, 10232687 %3 = icmp ne i32 %2, 02688 br i1 %3, label %4, label %52689 26904:2691 tail call void @bar()2692 br label %52693 26945:2695 ret void2696}2697 2698define void @bit_11_1_z_branch_i32(i32 signext %0) {2699; CHECK-LABEL: bit_11_1_z_branch_i32:2700; CHECK: # %bb.0:2701; CHECK-NEXT: andi a0, a0, 20472702; CHECK-NEXT: beqz a0, .LBB91_22703; CHECK-NEXT: # %bb.1:2704; CHECK-NEXT: ret2705; CHECK-NEXT: .LBB91_2:2706; CHECK-NEXT: tail bar2707 %2 = and i32 %0, 20472708 %3 = icmp eq i32 %2, 02709 br i1 %3, label %4, label %52710 27114:2712 tail call void @bar()2713 br label %52714 27155:2716 ret void2717}2718 2719define void @bit_11_1_nz_branch_i32(i32 signext %0) {2720; CHECK-LABEL: bit_11_1_nz_branch_i32:2721; CHECK: # %bb.0:2722; CHECK-NEXT: andi a0, a0, 20472723; CHECK-NEXT: beqz a0, .LBB92_22724; CHECK-NEXT: # %bb.1:2725; CHECK-NEXT: tail bar2726; CHECK-NEXT: .LBB92_2:2727; CHECK-NEXT: ret2728 %2 = and i32 %0, 20472729 %3 = icmp ne i32 %2, 02730 br i1 %3, label %4, label %52731 27324:2733 tail call void @bar()2734 br label %52735 27365:2737 ret void2738}2739 2740define void @bit_16_1_z_branch_i32(i32 signext %0) {2741; RV32-LABEL: bit_16_1_z_branch_i32:2742; RV32: # %bb.0:2743; RV32-NEXT: slli a0, a0, 162744; RV32-NEXT: beqz a0, .LBB93_22745; RV32-NEXT: # %bb.1:2746; RV32-NEXT: ret2747; RV32-NEXT: .LBB93_2:2748; RV32-NEXT: tail bar2749;2750; RV64-LABEL: bit_16_1_z_branch_i32:2751; RV64: # %bb.0:2752; RV64-NEXT: slli a0, a0, 482753; RV64-NEXT: beqz a0, .LBB93_22754; RV64-NEXT: # %bb.1:2755; RV64-NEXT: ret2756; RV64-NEXT: .LBB93_2:2757; RV64-NEXT: tail bar2758 %2 = and i32 %0, 655352759 %3 = icmp eq i32 %2, 02760 br i1 %3, label %4, label %52761 27624:2763 tail call void @bar()2764 br label %52765 27665:2767 ret void2768}2769 2770define void @bit_16_1_nz_branch_i32(i32 signext %0) {2771; RV32-LABEL: bit_16_1_nz_branch_i32:2772; RV32: # %bb.0:2773; RV32-NEXT: slli a0, a0, 162774; RV32-NEXT: beqz a0, .LBB94_22775; RV32-NEXT: # %bb.1:2776; RV32-NEXT: tail bar2777; RV32-NEXT: .LBB94_2:2778; RV32-NEXT: ret2779;2780; RV64-LABEL: bit_16_1_nz_branch_i32:2781; RV64: # %bb.0:2782; RV64-NEXT: slli a0, a0, 482783; RV64-NEXT: beqz a0, .LBB94_22784; RV64-NEXT: # %bb.1:2785; RV64-NEXT: tail bar2786; RV64-NEXT: .LBB94_2:2787; RV64-NEXT: ret2788 %2 = and i32 %0, 655352789 %3 = icmp ne i32 %2, 02790 br i1 %3, label %4, label %52791 27924:2793 tail call void @bar()2794 br label %52795 27965:2797 ret void2798}2799 2800define void @bit_24_1_z_branch_i32(i32 signext %0) {2801; RV32-LABEL: bit_24_1_z_branch_i32:2802; RV32: # %bb.0:2803; RV32-NEXT: slli a0, a0, 82804; RV32-NEXT: beqz a0, .LBB95_22805; RV32-NEXT: # %bb.1:2806; RV32-NEXT: ret2807; RV32-NEXT: .LBB95_2:2808; RV32-NEXT: tail bar2809;2810; RV64-LABEL: bit_24_1_z_branch_i32:2811; RV64: # %bb.0:2812; RV64-NEXT: slli a0, a0, 402813; RV64-NEXT: beqz a0, .LBB95_22814; RV64-NEXT: # %bb.1:2815; RV64-NEXT: ret2816; RV64-NEXT: .LBB95_2:2817; RV64-NEXT: tail bar2818 %2 = and i32 %0, 167772152819 %3 = icmp eq i32 %2, 02820 br i1 %3, label %4, label %52821 28224:2823 tail call void @bar()2824 br label %52825 28265:2827 ret void2828}2829 2830define void @bit_24_1_nz_branch_i32(i32 signext %0) {2831; RV32-LABEL: bit_24_1_nz_branch_i32:2832; RV32: # %bb.0:2833; RV32-NEXT: slli a0, a0, 82834; RV32-NEXT: beqz a0, .LBB96_22835; RV32-NEXT: # %bb.1:2836; RV32-NEXT: tail bar2837; RV32-NEXT: .LBB96_2:2838; RV32-NEXT: ret2839;2840; RV64-LABEL: bit_24_1_nz_branch_i32:2841; RV64: # %bb.0:2842; RV64-NEXT: slli a0, a0, 402843; RV64-NEXT: beqz a0, .LBB96_22844; RV64-NEXT: # %bb.1:2845; RV64-NEXT: tail bar2846; RV64-NEXT: .LBB96_2:2847; RV64-NEXT: ret2848 %2 = and i32 %0, 167772152849 %3 = icmp ne i32 %2, 02850 br i1 %3, label %4, label %52851 28524:2853 tail call void @bar()2854 br label %52855 28565:2857 ret void2858}2859 2860define void @bit_31_1_z_branch_i32(i32 signext %0) {2861; RV32-LABEL: bit_31_1_z_branch_i32:2862; RV32: # %bb.0:2863; RV32-NEXT: slli a0, a0, 12864; RV32-NEXT: beqz a0, .LBB97_22865; RV32-NEXT: # %bb.1:2866; RV32-NEXT: ret2867; RV32-NEXT: .LBB97_2:2868; RV32-NEXT: tail bar2869;2870; RV64-LABEL: bit_31_1_z_branch_i32:2871; RV64: # %bb.0:2872; RV64-NEXT: slli a0, a0, 332873; RV64-NEXT: beqz a0, .LBB97_22874; RV64-NEXT: # %bb.1:2875; RV64-NEXT: ret2876; RV64-NEXT: .LBB97_2:2877; RV64-NEXT: tail bar2878 %2 = and i32 %0, 21474836472879 %3 = icmp eq i32 %2, 02880 br i1 %3, label %4, label %52881 28824:2883 tail call void @bar()2884 br label %52885 28865:2887 ret void2888}2889 2890define void @bit_31_1_nz_branch_i32(i32 signext %0) {2891; RV32-LABEL: bit_31_1_nz_branch_i32:2892; RV32: # %bb.0:2893; RV32-NEXT: slli a0, a0, 12894; RV32-NEXT: beqz a0, .LBB98_22895; RV32-NEXT: # %bb.1:2896; RV32-NEXT: tail bar2897; RV32-NEXT: .LBB98_2:2898; RV32-NEXT: ret2899;2900; RV64-LABEL: bit_31_1_nz_branch_i32:2901; RV64: # %bb.0:2902; RV64-NEXT: slli a0, a0, 332903; RV64-NEXT: beqz a0, .LBB98_22904; RV64-NEXT: # %bb.1:2905; RV64-NEXT: tail bar2906; RV64-NEXT: .LBB98_2:2907; RV64-NEXT: ret2908 %2 = and i32 %0, 21474836472909 %3 = icmp ne i32 %2, 02910 br i1 %3, label %4, label %52911 29124:2913 tail call void @bar()2914 br label %52915 29165:2917 ret void2918}2919 2920define void @bit_32_1_z_branch_i32(i32 signext %0) {2921; CHECK-LABEL: bit_32_1_z_branch_i32:2922; CHECK: # %bb.0:2923; CHECK-NEXT: beqz a0, .LBB99_22924; CHECK-NEXT: # %bb.1:2925; CHECK-NEXT: ret2926; CHECK-NEXT: .LBB99_2:2927; CHECK-NEXT: tail bar2928 %2 = and i32 %0, 42949672952929 %3 = icmp eq i32 %2, 02930 br i1 %3, label %4, label %52931 29324:2933 tail call void @bar()2934 br label %52935 29365:2937 ret void2938}2939 2940define void @bit_32_1_nz_branch_i32(i32 signext %0) {2941; CHECK-LABEL: bit_32_1_nz_branch_i32:2942; CHECK: # %bb.0:2943; CHECK-NEXT: beqz a0, .LBB100_22944; CHECK-NEXT: # %bb.1:2945; CHECK-NEXT: tail bar2946; CHECK-NEXT: .LBB100_2:2947; CHECK-NEXT: ret2948 %2 = and i32 %0, 42949672952949 %3 = icmp ne i32 %2, 02950 br i1 %3, label %4, label %52951 29524:2953 tail call void @bar()2954 br label %52955 29565:2957 ret void2958}2959 2960 2961define void @bit_10_1_z_branch_i64(i64 %0) {2962; CHECK-LABEL: bit_10_1_z_branch_i64:2963; CHECK: # %bb.0:2964; CHECK-NEXT: andi a0, a0, 10232965; CHECK-NEXT: beqz a0, .LBB101_22966; CHECK-NEXT: # %bb.1:2967; CHECK-NEXT: ret2968; CHECK-NEXT: .LBB101_2:2969; CHECK-NEXT: tail bar2970 %2 = and i64 %0, 10232971 %3 = icmp eq i64 %2, 02972 br i1 %3, label %4, label %52973 29744:2975 tail call void @bar()2976 br label %52977 29785:2979 ret void2980}2981 2982define void @bit_10_1_nz_branch_i64(i64 %0) {2983; CHECK-LABEL: bit_10_1_nz_branch_i64:2984; CHECK: # %bb.0:2985; CHECK-NEXT: andi a0, a0, 10232986; CHECK-NEXT: beqz a0, .LBB102_22987; CHECK-NEXT: # %bb.1:2988; CHECK-NEXT: tail bar2989; CHECK-NEXT: .LBB102_2:2990; CHECK-NEXT: ret2991 %2 = and i64 %0, 10232992 %3 = icmp ne i64 %2, 02993 br i1 %3, label %4, label %52994 29954:2996 tail call void @bar()2997 br label %52998 29995:3000 ret void3001}3002 3003define void @bit_11_1_z_branch_i64(i64 %0) {3004; CHECK-LABEL: bit_11_1_z_branch_i64:3005; CHECK: # %bb.0:3006; CHECK-NEXT: andi a0, a0, 20473007; CHECK-NEXT: beqz a0, .LBB103_23008; CHECK-NEXT: # %bb.1:3009; CHECK-NEXT: ret3010; CHECK-NEXT: .LBB103_2:3011; CHECK-NEXT: tail bar3012 %2 = and i64 %0, 20473013 %3 = icmp eq i64 %2, 03014 br i1 %3, label %4, label %53015 30164:3017 tail call void @bar()3018 br label %53019 30205:3021 ret void3022}3023 3024define void @bit_11_1_nz_branch_i64(i64 %0) {3025; CHECK-LABEL: bit_11_1_nz_branch_i64:3026; CHECK: # %bb.0:3027; CHECK-NEXT: andi a0, a0, 20473028; CHECK-NEXT: beqz a0, .LBB104_23029; CHECK-NEXT: # %bb.1:3030; CHECK-NEXT: tail bar3031; CHECK-NEXT: .LBB104_2:3032; CHECK-NEXT: ret3033 %2 = and i64 %0, 20473034 %3 = icmp ne i64 %2, 03035 br i1 %3, label %4, label %53036 30374:3038 tail call void @bar()3039 br label %53040 30415:3042 ret void3043}3044 3045define void @bit_16_1_z_branch_i64(i64 %0) {3046; RV32-LABEL: bit_16_1_z_branch_i64:3047; RV32: # %bb.0:3048; RV32-NEXT: slli a0, a0, 163049; RV32-NEXT: beqz a0, .LBB105_23050; RV32-NEXT: # %bb.1:3051; RV32-NEXT: ret3052; RV32-NEXT: .LBB105_2:3053; RV32-NEXT: tail bar3054;3055; RV64-LABEL: bit_16_1_z_branch_i64:3056; RV64: # %bb.0:3057; RV64-NEXT: slli a0, a0, 483058; RV64-NEXT: beqz a0, .LBB105_23059; RV64-NEXT: # %bb.1:3060; RV64-NEXT: ret3061; RV64-NEXT: .LBB105_2:3062; RV64-NEXT: tail bar3063 %2 = and i64 %0, 655353064 %3 = icmp eq i64 %2, 03065 br i1 %3, label %4, label %53066 30674:3068 tail call void @bar()3069 br label %53070 30715:3072 ret void3073}3074 3075define void @bit_16_1_nz_branch_i64(i64 %0) {3076; RV32-LABEL: bit_16_1_nz_branch_i64:3077; RV32: # %bb.0:3078; RV32-NEXT: slli a0, a0, 163079; RV32-NEXT: beqz a0, .LBB106_23080; RV32-NEXT: # %bb.1:3081; RV32-NEXT: tail bar3082; RV32-NEXT: .LBB106_2:3083; RV32-NEXT: ret3084;3085; RV64-LABEL: bit_16_1_nz_branch_i64:3086; RV64: # %bb.0:3087; RV64-NEXT: slli a0, a0, 483088; RV64-NEXT: beqz a0, .LBB106_23089; RV64-NEXT: # %bb.1:3090; RV64-NEXT: tail bar3091; RV64-NEXT: .LBB106_2:3092; RV64-NEXT: ret3093 %2 = and i64 %0, 655353094 %3 = icmp ne i64 %2, 03095 br i1 %3, label %4, label %53096 30974:3098 tail call void @bar()3099 br label %53100 31015:3102 ret void3103}3104 3105define void @bit_24_1_z_branch_i64(i64 %0) {3106; RV32-LABEL: bit_24_1_z_branch_i64:3107; RV32: # %bb.0:3108; RV32-NEXT: slli a0, a0, 83109; RV32-NEXT: beqz a0, .LBB107_23110; RV32-NEXT: # %bb.1:3111; RV32-NEXT: ret3112; RV32-NEXT: .LBB107_2:3113; RV32-NEXT: tail bar3114;3115; RV64-LABEL: bit_24_1_z_branch_i64:3116; RV64: # %bb.0:3117; RV64-NEXT: slli a0, a0, 403118; RV64-NEXT: beqz a0, .LBB107_23119; RV64-NEXT: # %bb.1:3120; RV64-NEXT: ret3121; RV64-NEXT: .LBB107_2:3122; RV64-NEXT: tail bar3123 %2 = and i64 %0, 167772153124 %3 = icmp eq i64 %2, 03125 br i1 %3, label %4, label %53126 31274:3128 tail call void @bar()3129 br label %53130 31315:3132 ret void3133}3134 3135define void @bit_24_1_nz_branch_i64(i64 %0) {3136; RV32-LABEL: bit_24_1_nz_branch_i64:3137; RV32: # %bb.0:3138; RV32-NEXT: slli a0, a0, 83139; RV32-NEXT: beqz a0, .LBB108_23140; RV32-NEXT: # %bb.1:3141; RV32-NEXT: tail bar3142; RV32-NEXT: .LBB108_2:3143; RV32-NEXT: ret3144;3145; RV64-LABEL: bit_24_1_nz_branch_i64:3146; RV64: # %bb.0:3147; RV64-NEXT: slli a0, a0, 403148; RV64-NEXT: beqz a0, .LBB108_23149; RV64-NEXT: # %bb.1:3150; RV64-NEXT: tail bar3151; RV64-NEXT: .LBB108_2:3152; RV64-NEXT: ret3153 %2 = and i64 %0, 167772153154 %3 = icmp ne i64 %2, 03155 br i1 %3, label %4, label %53156 31574:3158 tail call void @bar()3159 br label %53160 31615:3162 ret void3163}3164 3165define void @bit_31_1_z_branch_i64(i64 %0) {3166; RV32-LABEL: bit_31_1_z_branch_i64:3167; RV32: # %bb.0:3168; RV32-NEXT: slli a0, a0, 13169; RV32-NEXT: beqz a0, .LBB109_23170; RV32-NEXT: # %bb.1:3171; RV32-NEXT: ret3172; RV32-NEXT: .LBB109_2:3173; RV32-NEXT: tail bar3174;3175; RV64-LABEL: bit_31_1_z_branch_i64:3176; RV64: # %bb.0:3177; RV64-NEXT: slli a0, a0, 333178; RV64-NEXT: beqz a0, .LBB109_23179; RV64-NEXT: # %bb.1:3180; RV64-NEXT: ret3181; RV64-NEXT: .LBB109_2:3182; RV64-NEXT: tail bar3183 %2 = and i64 %0, 21474836473184 %3 = icmp eq i64 %2, 03185 br i1 %3, label %4, label %53186 31874:3188 tail call void @bar()3189 br label %53190 31915:3192 ret void3193}3194 3195define void @bit_31_1_nz_branch_i64(i64 %0) {3196; RV32-LABEL: bit_31_1_nz_branch_i64:3197; RV32: # %bb.0:3198; RV32-NEXT: slli a0, a0, 13199; RV32-NEXT: beqz a0, .LBB110_23200; RV32-NEXT: # %bb.1:3201; RV32-NEXT: tail bar3202; RV32-NEXT: .LBB110_2:3203; RV32-NEXT: ret3204;3205; RV64-LABEL: bit_31_1_nz_branch_i64:3206; RV64: # %bb.0:3207; RV64-NEXT: slli a0, a0, 333208; RV64-NEXT: beqz a0, .LBB110_23209; RV64-NEXT: # %bb.1:3210; RV64-NEXT: tail bar3211; RV64-NEXT: .LBB110_2:3212; RV64-NEXT: ret3213 %2 = and i64 %0, 21474836473214 %3 = icmp ne i64 %2, 03215 br i1 %3, label %4, label %53216 32174:3218 tail call void @bar()3219 br label %53220 32215:3222 ret void3223}3224 3225define void @bit_32_1_z_branch_i64(i64 %0) {3226; RV32-LABEL: bit_32_1_z_branch_i64:3227; RV32: # %bb.0:3228; RV32-NEXT: beqz a0, .LBB111_23229; RV32-NEXT: # %bb.1:3230; RV32-NEXT: ret3231; RV32-NEXT: .LBB111_2:3232; RV32-NEXT: tail bar3233;3234; RV64-LABEL: bit_32_1_z_branch_i64:3235; RV64: # %bb.0:3236; RV64-NEXT: sext.w a0, a03237; RV64-NEXT: beqz a0, .LBB111_23238; RV64-NEXT: # %bb.1:3239; RV64-NEXT: ret3240; RV64-NEXT: .LBB111_2:3241; RV64-NEXT: tail bar3242 %2 = and i64 %0, 42949672953243 %3 = icmp eq i64 %2, 03244 br i1 %3, label %4, label %53245 32464:3247 tail call void @bar()3248 br label %53249 32505:3251 ret void3252}3253 3254define void @bit_32_1_nz_branch_i64(i64 %0) {3255; RV32-LABEL: bit_32_1_nz_branch_i64:3256; RV32: # %bb.0:3257; RV32-NEXT: beqz a0, .LBB112_23258; RV32-NEXT: # %bb.1:3259; RV32-NEXT: tail bar3260; RV32-NEXT: .LBB112_2:3261; RV32-NEXT: ret3262;3263; RV64-LABEL: bit_32_1_nz_branch_i64:3264; RV64: # %bb.0:3265; RV64-NEXT: sext.w a0, a03266; RV64-NEXT: beqz a0, .LBB112_23267; RV64-NEXT: # %bb.1:3268; RV64-NEXT: tail bar3269; RV64-NEXT: .LBB112_2:3270; RV64-NEXT: ret3271 %2 = and i64 %0, 42949672953272 %3 = icmp ne i64 %2, 03273 br i1 %3, label %4, label %53274 32754:3276 tail call void @bar()3277 br label %53278 32795:3280 ret void3281}3282 3283define void @bit_62_1_z_branch_i64(i64 %0) {3284; RV32-LABEL: bit_62_1_z_branch_i64:3285; RV32: # %bb.0:3286; RV32-NEXT: slli a1, a1, 23287; RV32-NEXT: srli a1, a1, 23288; RV32-NEXT: or a0, a0, a13289; RV32-NEXT: beqz a0, .LBB113_23290; RV32-NEXT: # %bb.1:3291; RV32-NEXT: ret3292; RV32-NEXT: .LBB113_2:3293; RV32-NEXT: tail bar3294;3295; RV64-LABEL: bit_62_1_z_branch_i64:3296; RV64: # %bb.0:3297; RV64-NEXT: slli a0, a0, 23298; RV64-NEXT: beqz a0, .LBB113_23299; RV64-NEXT: # %bb.1:3300; RV64-NEXT: ret3301; RV64-NEXT: .LBB113_2:3302; RV64-NEXT: tail bar3303 %2 = and i64 %0, 46116860184273879033304 %3 = icmp eq i64 %2, 03305 br i1 %3, label %4, label %53306 33074:3308 tail call void @bar()3309 br label %53310 33115:3312 ret void3313}3314 3315define void @bit_62_1_nz_branch_i64(i64 %0) {3316; RV32-LABEL: bit_62_1_nz_branch_i64:3317; RV32: # %bb.0:3318; RV32-NEXT: slli a1, a1, 23319; RV32-NEXT: srli a1, a1, 23320; RV32-NEXT: or a0, a0, a13321; RV32-NEXT: beqz a0, .LBB114_23322; RV32-NEXT: # %bb.1:3323; RV32-NEXT: tail bar3324; RV32-NEXT: .LBB114_2:3325; RV32-NEXT: ret3326;3327; RV64-LABEL: bit_62_1_nz_branch_i64:3328; RV64: # %bb.0:3329; RV64-NEXT: slli a0, a0, 23330; RV64-NEXT: beqz a0, .LBB114_23331; RV64-NEXT: # %bb.1:3332; RV64-NEXT: tail bar3333; RV64-NEXT: .LBB114_2:3334; RV64-NEXT: ret3335 %2 = and i64 %0, 46116860184273879033336 %3 = icmp ne i64 %2, 03337 br i1 %3, label %4, label %53338 33394:3340 tail call void @bar()3341 br label %53342 33435:3344 ret void3345}3346 3347define void @bit_63_1_z_branch_i64(i64 %0) {3348; RV32I-LABEL: bit_63_1_z_branch_i64:3349; RV32I: # %bb.0:3350; RV32I-NEXT: slli a1, a1, 13351; RV32I-NEXT: srli a1, a1, 13352; RV32I-NEXT: or a0, a0, a13353; RV32I-NEXT: beqz a0, .LBB115_23354; RV32I-NEXT: # %bb.1:3355; RV32I-NEXT: ret3356; RV32I-NEXT: .LBB115_2:3357; RV32I-NEXT: tail bar3358;3359; RV64-LABEL: bit_63_1_z_branch_i64:3360; RV64: # %bb.0:3361; RV64-NEXT: slli a0, a0, 13362; RV64-NEXT: beqz a0, .LBB115_23363; RV64-NEXT: # %bb.1:3364; RV64-NEXT: ret3365; RV64-NEXT: .LBB115_2:3366; RV64-NEXT: tail bar3367;3368; RV32ZBS-LABEL: bit_63_1_z_branch_i64:3369; RV32ZBS: # %bb.0:3370; RV32ZBS-NEXT: bclri a1, a1, 313371; RV32ZBS-NEXT: or a0, a0, a13372; RV32ZBS-NEXT: beqz a0, .LBB115_23373; RV32ZBS-NEXT: # %bb.1:3374; RV32ZBS-NEXT: ret3375; RV32ZBS-NEXT: .LBB115_2:3376; RV32ZBS-NEXT: tail bar3377;3378; RV32XTHEADBS-LABEL: bit_63_1_z_branch_i64:3379; RV32XTHEADBS: # %bb.0:3380; RV32XTHEADBS-NEXT: slli a1, a1, 13381; RV32XTHEADBS-NEXT: srli a1, a1, 13382; RV32XTHEADBS-NEXT: or a0, a0, a13383; RV32XTHEADBS-NEXT: beqz a0, .LBB115_23384; RV32XTHEADBS-NEXT: # %bb.1:3385; RV32XTHEADBS-NEXT: ret3386; RV32XTHEADBS-NEXT: .LBB115_2:3387; RV32XTHEADBS-NEXT: tail bar3388 %2 = and i64 %0, 92233720368547758073389 %3 = icmp eq i64 %2, 03390 br i1 %3, label %4, label %53391 33924:3393 tail call void @bar()3394 br label %53395 33965:3397 ret void3398}3399 3400define void @bit_63_1_nz_branch_i64(i64 %0) {3401; RV32I-LABEL: bit_63_1_nz_branch_i64:3402; RV32I: # %bb.0:3403; RV32I-NEXT: slli a1, a1, 13404; RV32I-NEXT: srli a1, a1, 13405; RV32I-NEXT: or a0, a0, a13406; RV32I-NEXT: beqz a0, .LBB116_23407; RV32I-NEXT: # %bb.1:3408; RV32I-NEXT: tail bar3409; RV32I-NEXT: .LBB116_2:3410; RV32I-NEXT: ret3411;3412; RV64-LABEL: bit_63_1_nz_branch_i64:3413; RV64: # %bb.0:3414; RV64-NEXT: slli a0, a0, 13415; RV64-NEXT: beqz a0, .LBB116_23416; RV64-NEXT: # %bb.1:3417; RV64-NEXT: tail bar3418; RV64-NEXT: .LBB116_2:3419; RV64-NEXT: ret3420;3421; RV32ZBS-LABEL: bit_63_1_nz_branch_i64:3422; RV32ZBS: # %bb.0:3423; RV32ZBS-NEXT: bclri a1, a1, 313424; RV32ZBS-NEXT: or a0, a0, a13425; RV32ZBS-NEXT: beqz a0, .LBB116_23426; RV32ZBS-NEXT: # %bb.1:3427; RV32ZBS-NEXT: tail bar3428; RV32ZBS-NEXT: .LBB116_2:3429; RV32ZBS-NEXT: ret3430;3431; RV32XTHEADBS-LABEL: bit_63_1_nz_branch_i64:3432; RV32XTHEADBS: # %bb.0:3433; RV32XTHEADBS-NEXT: slli a1, a1, 13434; RV32XTHEADBS-NEXT: srli a1, a1, 13435; RV32XTHEADBS-NEXT: or a0, a0, a13436; RV32XTHEADBS-NEXT: beqz a0, .LBB116_23437; RV32XTHEADBS-NEXT: # %bb.1:3438; RV32XTHEADBS-NEXT: tail bar3439; RV32XTHEADBS-NEXT: .LBB116_2:3440; RV32XTHEADBS-NEXT: ret3441 %2 = and i64 %0, 92233720368547758073442 %3 = icmp ne i64 %2, 03443 br i1 %3, label %4, label %53444 34454:3446 tail call void @bar()3447 br label %53448 34495:3450 ret void3451}3452 3453define void @bit_64_1_z_branch_i64(i64 %0) {3454; RV32-LABEL: bit_64_1_z_branch_i64:3455; RV32: # %bb.0:3456; RV32-NEXT: or a0, a0, a13457; RV32-NEXT: beqz a0, .LBB117_23458; RV32-NEXT: # %bb.1:3459; RV32-NEXT: ret3460; RV32-NEXT: .LBB117_2:3461; RV32-NEXT: tail bar3462;3463; RV64-LABEL: bit_64_1_z_branch_i64:3464; RV64: # %bb.0:3465; RV64-NEXT: beqz a0, .LBB117_23466; RV64-NEXT: # %bb.1:3467; RV64-NEXT: ret3468; RV64-NEXT: .LBB117_2:3469; RV64-NEXT: tail bar3470 %2 = and i64 %0, 184467440737095516153471 %3 = icmp eq i64 %2, 03472 br i1 %3, label %4, label %53473 34744:3475 tail call void @bar()3476 br label %53477 34785:3479 ret void3480}3481 3482define void @bit_64_1_nz_branch_i64(i64 %0) {3483; RV32-LABEL: bit_64_1_nz_branch_i64:3484; RV32: # %bb.0:3485; RV32-NEXT: or a0, a0, a13486; RV32-NEXT: beqz a0, .LBB118_23487; RV32-NEXT: # %bb.1:3488; RV32-NEXT: tail bar3489; RV32-NEXT: .LBB118_2:3490; RV32-NEXT: ret3491;3492; RV64-LABEL: bit_64_1_nz_branch_i64:3493; RV64: # %bb.0:3494; RV64-NEXT: beqz a0, .LBB118_23495; RV64-NEXT: # %bb.1:3496; RV64-NEXT: tail bar3497; RV64-NEXT: .LBB118_2:3498; RV64-NEXT: ret3499 %2 = and i64 %0, 184467440737095516153500 %3 = icmp ne i64 %2, 03501 br i1 %3, label %4, label %53502 35034:3504 tail call void @bar()3505 br label %53506 35075:3508 ret void3509}3510 3511define i32 @bittest_31_andeq0_i64(i64 %x) {3512; RV32-LABEL: bittest_31_andeq0_i64:3513; RV32: # %bb.0:3514; RV32-NEXT: srli a0, a0, 313515; RV32-NEXT: seqz a0, a03516; RV32-NEXT: ret3517;3518; RV64-LABEL: bittest_31_andeq0_i64:3519; RV64: # %bb.0:3520; RV64-NEXT: sraiw a0, a0, 313521; RV64-NEXT: seqz a0, a03522; RV64-NEXT: ret3523 %and = and i64 %x, 21474836483524 %cmp = icmp eq i64 %and, 03525 %conv = zext i1 %cmp to i323526 ret i32 %conv3527}3528 3529define i32 @bittest_63_andeq0_i64(i64 %x) {3530; RV32-LABEL: bittest_63_andeq0_i64:3531; RV32: # %bb.0:3532; RV32-NEXT: srli a1, a1, 313533; RV32-NEXT: seqz a0, a13534; RV32-NEXT: ret3535;3536; RV64-LABEL: bittest_63_andeq0_i64:3537; RV64: # %bb.0:3538; RV64-NEXT: srli a0, a0, 633539; RV64-NEXT: seqz a0, a03540; RV64-NEXT: ret3541 %and = and i64 %x, 92233720368547758083542 %cmp = icmp eq i64 %and, 03543 %conv = zext i1 %cmp to i323544 ret i32 %conv3545}3546 3547define i32 @bittest_31_slt0_i32(i32 %x, i1 %y) {3548; RV32-LABEL: bittest_31_slt0_i32:3549; RV32: # %bb.0:3550; RV32-NEXT: srli a0, a0, 313551; RV32-NEXT: and a0, a0, a13552; RV32-NEXT: ret3553;3554; RV64-LABEL: bittest_31_slt0_i32:3555; RV64: # %bb.0:3556; RV64-NEXT: srliw a0, a0, 313557; RV64-NEXT: and a0, a0, a13558; RV64-NEXT: ret3559 %cmp = icmp slt i32 %x, 03560 %and = and i1 %cmp, %y3561 %ext = zext i1 %and to i323562 ret i32 %ext3563}3564 3565define i32 @bittest_63_slt0_i64(i32 %x, i1 %y) {3566; RV32-LABEL: bittest_63_slt0_i64:3567; RV32: # %bb.0:3568; RV32-NEXT: srai a0, a0, 313569; RV32-NEXT: srli a0, a0, 313570; RV32-NEXT: and a0, a0, a13571; RV32-NEXT: ret3572;3573; RV64-LABEL: bittest_63_slt0_i64:3574; RV64: # %bb.0:3575; RV64-NEXT: srliw a0, a0, 313576; RV64-NEXT: and a0, a0, a13577; RV64-NEXT: ret3578 %ext = sext i32 %x to i643579 %cmp = icmp slt i64 %ext, 03580 %and = and i1 %cmp, %y3581 %cond = zext i1 %and to i323582 ret i32 %cond3583}3584