brintos

brintos / llvm-project-archived public Read only

0
0
Text · 38.4 KiB · c62fb0a Raw
1297 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \3; RUN:   | FileCheck %s -check-prefixes=CHECK,RV64I4; RUN: llc -mtriple=riscv64 -mattr=+xtheadbb -verify-machineinstrs < %s \5; RUN:   | FileCheck %s -check-prefixes=CHECK,RV64XTHEADBB,RV64XTHEADBB-NOB6; RUN: llc -mtriple=riscv64 -mattr=+xtheadbb,+b -verify-machineinstrs < %s \7; RUN:   | FileCheck %s -check-prefixes=CHECK,RV64XTHEADBB,RV64XTHEADBB-B8 9define signext i32 @ctlz_i32(i32 signext %a) nounwind {10; RV64I-LABEL: ctlz_i32:11; RV64I:       # %bb.0:12; RV64I-NEXT:    beqz a0, .LBB0_213; RV64I-NEXT:  # %bb.1: # %cond.false14; RV64I-NEXT:    srliw a1, a0, 115; RV64I-NEXT:    lui a2, 34952516; RV64I-NEXT:    or a0, a0, a117; RV64I-NEXT:    addi a1, a2, 136518; RV64I-NEXT:    srliw a2, a0, 219; RV64I-NEXT:    or a0, a0, a220; RV64I-NEXT:    srliw a2, a0, 421; RV64I-NEXT:    or a0, a0, a222; RV64I-NEXT:    srliw a2, a0, 823; RV64I-NEXT:    or a0, a0, a224; RV64I-NEXT:    srliw a2, a0, 1625; RV64I-NEXT:    or a0, a0, a226; RV64I-NEXT:    not a0, a027; RV64I-NEXT:    srli a2, a0, 128; RV64I-NEXT:    and a1, a2, a129; RV64I-NEXT:    lui a2, 20971530; RV64I-NEXT:    addi a2, a2, 81931; RV64I-NEXT:    sub a0, a0, a132; RV64I-NEXT:    and a1, a0, a233; RV64I-NEXT:    srli a0, a0, 234; RV64I-NEXT:    and a0, a0, a235; RV64I-NEXT:    lui a2, 6168136; RV64I-NEXT:    add a0, a1, a037; RV64I-NEXT:    srli a1, a0, 438; RV64I-NEXT:    add a0, a0, a139; RV64I-NEXT:    addi a1, a2, -24140; RV64I-NEXT:    and a0, a0, a141; RV64I-NEXT:    slli a1, a0, 842; RV64I-NEXT:    add a0, a0, a143; RV64I-NEXT:    slli a1, a0, 1644; RV64I-NEXT:    add a0, a0, a145; RV64I-NEXT:    srliw a0, a0, 2446; RV64I-NEXT:    ret47; RV64I-NEXT:  .LBB0_2:48; RV64I-NEXT:    li a0, 3249; RV64I-NEXT:    ret50;51; RV64XTHEADBB-NOB-LABEL: ctlz_i32:52; RV64XTHEADBB-NOB:       # %bb.0:53; RV64XTHEADBB-NOB-NEXT:    th.extu a0, a0, 31, 054; RV64XTHEADBB-NOB-NEXT:    th.ff1 a0, a055; RV64XTHEADBB-NOB-NEXT:    addi a0, a0, -3256; RV64XTHEADBB-NOB-NEXT:    ret57;58; RV64XTHEADBB-B-LABEL: ctlz_i32:59; RV64XTHEADBB-B:       # %bb.0:60; RV64XTHEADBB-B-NEXT:    clzw a0, a061; RV64XTHEADBB-B-NEXT:    ret62  %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 false)63  ret i32 %164}65 66define signext i32 @log2_i32(i32 signext %a) nounwind {67; RV64I-LABEL: log2_i32:68; RV64I:       # %bb.0:69; RV64I-NEXT:    beqz a0, .LBB1_270; RV64I-NEXT:  # %bb.1: # %cond.false71; RV64I-NEXT:    srliw a1, a0, 172; RV64I-NEXT:    lui a2, 34952573; RV64I-NEXT:    or a0, a0, a174; RV64I-NEXT:    addi a1, a2, 136575; RV64I-NEXT:    srliw a2, a0, 276; RV64I-NEXT:    or a0, a0, a277; RV64I-NEXT:    srliw a2, a0, 478; RV64I-NEXT:    or a0, a0, a279; RV64I-NEXT:    srliw a2, a0, 880; RV64I-NEXT:    or a0, a0, a281; RV64I-NEXT:    srliw a2, a0, 1682; RV64I-NEXT:    or a0, a0, a283; RV64I-NEXT:    not a0, a084; RV64I-NEXT:    srli a2, a0, 185; RV64I-NEXT:    and a1, a2, a186; RV64I-NEXT:    lui a2, 20971587; RV64I-NEXT:    addi a2, a2, 81988; RV64I-NEXT:    sub a0, a0, a189; RV64I-NEXT:    and a1, a0, a290; RV64I-NEXT:    srli a0, a0, 291; RV64I-NEXT:    and a0, a0, a292; RV64I-NEXT:    lui a2, 6168193; RV64I-NEXT:    add a0, a1, a094; RV64I-NEXT:    srli a1, a0, 495; RV64I-NEXT:    add a0, a0, a196; RV64I-NEXT:    addi a1, a2, -24197; RV64I-NEXT:    and a0, a0, a198; RV64I-NEXT:    slli a1, a0, 899; RV64I-NEXT:    add a0, a0, a1100; RV64I-NEXT:    slli a1, a0, 16101; RV64I-NEXT:    add a0, a0, a1102; RV64I-NEXT:    srliw a0, a0, 24103; RV64I-NEXT:    j .LBB1_3104; RV64I-NEXT:  .LBB1_2:105; RV64I-NEXT:    li a0, 32106; RV64I-NEXT:  .LBB1_3: # %cond.end107; RV64I-NEXT:    li a1, 31108; RV64I-NEXT:    sub a0, a1, a0109; RV64I-NEXT:    ret110;111; RV64XTHEADBB-NOB-LABEL: log2_i32:112; RV64XTHEADBB-NOB:       # %bb.0:113; RV64XTHEADBB-NOB-NEXT:    th.extu a0, a0, 31, 0114; RV64XTHEADBB-NOB-NEXT:    th.ff1 a0, a0115; RV64XTHEADBB-NOB-NEXT:    li a1, 63116; RV64XTHEADBB-NOB-NEXT:    sub a0, a1, a0117; RV64XTHEADBB-NOB-NEXT:    ret118;119; RV64XTHEADBB-B-LABEL: log2_i32:120; RV64XTHEADBB-B:       # %bb.0:121; RV64XTHEADBB-B-NEXT:    clzw a0, a0122; RV64XTHEADBB-B-NEXT:    li a1, 31123; RV64XTHEADBB-B-NEXT:    sub a0, a1, a0124; RV64XTHEADBB-B-NEXT:    ret125  %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 false)126  %2 = sub i32 31, %1127  ret i32 %2128}129 130define signext i32 @log2_ceil_i32(i32 signext %a) nounwind {131; RV64I-LABEL: log2_ceil_i32:132; RV64I:       # %bb.0:133; RV64I-NEXT:    addiw a1, a0, -1134; RV64I-NEXT:    li a0, 32135; RV64I-NEXT:    li a2, 32136; RV64I-NEXT:    beqz a1, .LBB2_2137; RV64I-NEXT:  # %bb.1: # %cond.false138; RV64I-NEXT:    srliw a2, a1, 1139; RV64I-NEXT:    lui a3, 349525140; RV64I-NEXT:    or a1, a1, a2141; RV64I-NEXT:    addi a2, a3, 1365142; RV64I-NEXT:    srliw a3, a1, 2143; RV64I-NEXT:    or a1, a1, a3144; RV64I-NEXT:    srliw a3, a1, 4145; RV64I-NEXT:    or a1, a1, a3146; RV64I-NEXT:    srliw a3, a1, 8147; RV64I-NEXT:    or a1, a1, a3148; RV64I-NEXT:    srliw a3, a1, 16149; RV64I-NEXT:    or a1, a1, a3150; RV64I-NEXT:    not a1, a1151; RV64I-NEXT:    srli a3, a1, 1152; RV64I-NEXT:    and a2, a3, a2153; RV64I-NEXT:    lui a3, 209715154; RV64I-NEXT:    addi a3, a3, 819155; RV64I-NEXT:    sub a1, a1, a2156; RV64I-NEXT:    and a2, a1, a3157; RV64I-NEXT:    srli a1, a1, 2158; RV64I-NEXT:    and a1, a1, a3159; RV64I-NEXT:    lui a3, 61681160; RV64I-NEXT:    add a1, a2, a1161; RV64I-NEXT:    srli a2, a1, 4162; RV64I-NEXT:    add a1, a1, a2163; RV64I-NEXT:    addi a2, a3, -241164; RV64I-NEXT:    and a1, a1, a2165; RV64I-NEXT:    slli a2, a1, 8166; RV64I-NEXT:    add a1, a1, a2167; RV64I-NEXT:    slli a2, a1, 16168; RV64I-NEXT:    add a1, a1, a2169; RV64I-NEXT:    srliw a2, a1, 24170; RV64I-NEXT:  .LBB2_2: # %cond.end171; RV64I-NEXT:    sub a0, a0, a2172; RV64I-NEXT:    ret173;174; RV64XTHEADBB-NOB-LABEL: log2_ceil_i32:175; RV64XTHEADBB-NOB:       # %bb.0:176; RV64XTHEADBB-NOB-NEXT:    addi a0, a0, -1177; RV64XTHEADBB-NOB-NEXT:    th.extu a0, a0, 31, 0178; RV64XTHEADBB-NOB-NEXT:    th.ff1 a0, a0179; RV64XTHEADBB-NOB-NEXT:    li a1, 64180; RV64XTHEADBB-NOB-NEXT:    sub a0, a1, a0181; RV64XTHEADBB-NOB-NEXT:    ret182;183; RV64XTHEADBB-B-LABEL: log2_ceil_i32:184; RV64XTHEADBB-B:       # %bb.0:185; RV64XTHEADBB-B-NEXT:    addi a0, a0, -1186; RV64XTHEADBB-B-NEXT:    clzw a0, a0187; RV64XTHEADBB-B-NEXT:    li a1, 32188; RV64XTHEADBB-B-NEXT:    sub a0, a1, a0189; RV64XTHEADBB-B-NEXT:    ret190  %1 = sub i32 %a, 1191  %2 = call i32 @llvm.ctlz.i32(i32 %1, i1 false)192  %3 = sub i32 32, %2193  ret i32 %3194}195 196define signext i32 @findLastSet_i32(i32 signext %a) nounwind {197; RV64I-LABEL: findLastSet_i32:198; RV64I:       # %bb.0:199; RV64I-NEXT:    srliw a1, a0, 1200; RV64I-NEXT:    lui a2, 349525201; RV64I-NEXT:    or a1, a0, a1202; RV64I-NEXT:    addi a2, a2, 1365203; RV64I-NEXT:    srliw a3, a1, 2204; RV64I-NEXT:    or a1, a1, a3205; RV64I-NEXT:    srliw a3, a1, 4206; RV64I-NEXT:    or a1, a1, a3207; RV64I-NEXT:    srliw a3, a1, 8208; RV64I-NEXT:    or a1, a1, a3209; RV64I-NEXT:    srliw a3, a1, 16210; RV64I-NEXT:    or a1, a1, a3211; RV64I-NEXT:    not a1, a1212; RV64I-NEXT:    srli a3, a1, 1213; RV64I-NEXT:    and a2, a3, a2214; RV64I-NEXT:    lui a3, 209715215; RV64I-NEXT:    addi a3, a3, 819216; RV64I-NEXT:    sub a1, a1, a2217; RV64I-NEXT:    and a2, a1, a3218; RV64I-NEXT:    srli a1, a1, 2219; RV64I-NEXT:    and a1, a1, a3220; RV64I-NEXT:    lui a3, 61681221; RV64I-NEXT:    snez a0, a0222; RV64I-NEXT:    addi a3, a3, -241223; RV64I-NEXT:    add a1, a2, a1224; RV64I-NEXT:    srli a2, a1, 4225; RV64I-NEXT:    add a1, a1, a2226; RV64I-NEXT:    and a1, a1, a3227; RV64I-NEXT:    slli a2, a1, 8228; RV64I-NEXT:    add a1, a1, a2229; RV64I-NEXT:    slli a2, a1, 16230; RV64I-NEXT:    add a1, a1, a2231; RV64I-NEXT:    srliw a1, a1, 24232; RV64I-NEXT:    xori a1, a1, 31233; RV64I-NEXT:    addi a0, a0, -1234; RV64I-NEXT:    or a0, a0, a1235; RV64I-NEXT:    ret236;237; RV64XTHEADBB-NOB-LABEL: findLastSet_i32:238; RV64XTHEADBB-NOB:       # %bb.0:239; RV64XTHEADBB-NOB-NEXT:    slli a1, a0, 32240; RV64XTHEADBB-NOB-NEXT:    snez a0, a0241; RV64XTHEADBB-NOB-NEXT:    th.ff1 a1, a1242; RV64XTHEADBB-NOB-NEXT:    xori a1, a1, 31243; RV64XTHEADBB-NOB-NEXT:    addi a0, a0, -1244; RV64XTHEADBB-NOB-NEXT:    or a0, a0, a1245; RV64XTHEADBB-NOB-NEXT:    ret246;247; RV64XTHEADBB-B-LABEL: findLastSet_i32:248; RV64XTHEADBB-B:       # %bb.0:249; RV64XTHEADBB-B-NEXT:    clzw a1, a0250; RV64XTHEADBB-B-NEXT:    snez a0, a0251; RV64XTHEADBB-B-NEXT:    xori a1, a1, 31252; RV64XTHEADBB-B-NEXT:    addi a0, a0, -1253; RV64XTHEADBB-B-NEXT:    or a0, a0, a1254; RV64XTHEADBB-B-NEXT:    ret255  %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 true)256  %2 = xor i32 31, %1257  %3 = icmp eq i32 %a, 0258  %4 = select i1 %3, i32 -1, i32 %2259  ret i32 %4260}261 262define i32 @ctlz_lshr_i32(i32 signext %a) {263; RV64I-LABEL: ctlz_lshr_i32:264; RV64I:       # %bb.0:265; RV64I-NEXT:    srliw a0, a0, 1266; RV64I-NEXT:    beqz a0, .LBB4_2267; RV64I-NEXT:  # %bb.1: # %cond.false268; RV64I-NEXT:    srliw a1, a0, 1269; RV64I-NEXT:    lui a2, 349525270; RV64I-NEXT:    or a0, a0, a1271; RV64I-NEXT:    addi a1, a2, 1365272; RV64I-NEXT:    srliw a2, a0, 2273; RV64I-NEXT:    or a0, a0, a2274; RV64I-NEXT:    srliw a2, a0, 4275; RV64I-NEXT:    or a0, a0, a2276; RV64I-NEXT:    srliw a2, a0, 8277; RV64I-NEXT:    or a0, a0, a2278; RV64I-NEXT:    srliw a2, a0, 16279; RV64I-NEXT:    or a0, a0, a2280; RV64I-NEXT:    not a0, a0281; RV64I-NEXT:    srli a2, a0, 1282; RV64I-NEXT:    and a1, a2, a1283; RV64I-NEXT:    lui a2, 209715284; RV64I-NEXT:    addi a2, a2, 819285; RV64I-NEXT:    sub a0, a0, a1286; RV64I-NEXT:    and a1, a0, a2287; RV64I-NEXT:    srli a0, a0, 2288; RV64I-NEXT:    and a0, a0, a2289; RV64I-NEXT:    lui a2, 61681290; RV64I-NEXT:    add a0, a1, a0291; RV64I-NEXT:    srli a1, a0, 4292; RV64I-NEXT:    add a0, a0, a1293; RV64I-NEXT:    addi a1, a2, -241294; RV64I-NEXT:    and a0, a0, a1295; RV64I-NEXT:    slli a1, a0, 8296; RV64I-NEXT:    add a0, a0, a1297; RV64I-NEXT:    slli a1, a0, 16298; RV64I-NEXT:    add a0, a0, a1299; RV64I-NEXT:    srliw a0, a0, 24300; RV64I-NEXT:    ret301; RV64I-NEXT:  .LBB4_2:302; RV64I-NEXT:    li a0, 32303; RV64I-NEXT:    ret304;305; RV64XTHEADBB-NOB-LABEL: ctlz_lshr_i32:306; RV64XTHEADBB-NOB:       # %bb.0:307; RV64XTHEADBB-NOB-NEXT:    srliw a0, a0, 1308; RV64XTHEADBB-NOB-NEXT:    th.ff1 a0, a0309; RV64XTHEADBB-NOB-NEXT:    addi a0, a0, -32310; RV64XTHEADBB-NOB-NEXT:    ret311;312; RV64XTHEADBB-B-LABEL: ctlz_lshr_i32:313; RV64XTHEADBB-B:       # %bb.0:314; RV64XTHEADBB-B-NEXT:    srliw a0, a0, 1315; RV64XTHEADBB-B-NEXT:    clzw a0, a0316; RV64XTHEADBB-B-NEXT:    ret317  %1 = lshr i32 %a, 1318  %2 = call i32 @llvm.ctlz.i32(i32 %1, i1 false)319  ret i32 %2320}321 322define i64 @ctlz_i64(i64 %a) nounwind {323; RV64I-LABEL: ctlz_i64:324; RV64I:       # %bb.0:325; RV64I-NEXT:    beqz a0, .LBB5_2326; RV64I-NEXT:  # %bb.1: # %cond.false327; RV64I-NEXT:    srli a1, a0, 1328; RV64I-NEXT:    lui a2, 349525329; RV64I-NEXT:    lui a3, 209715330; RV64I-NEXT:    or a0, a0, a1331; RV64I-NEXT:    addi a1, a2, 1365332; RV64I-NEXT:    addi a2, a3, 819333; RV64I-NEXT:    srli a3, a0, 2334; RV64I-NEXT:    or a0, a0, a3335; RV64I-NEXT:    slli a3, a1, 32336; RV64I-NEXT:    add a1, a1, a3337; RV64I-NEXT:    slli a3, a2, 32338; RV64I-NEXT:    add a2, a2, a3339; RV64I-NEXT:    srli a3, a0, 4340; RV64I-NEXT:    or a0, a0, a3341; RV64I-NEXT:    srli a3, a0, 8342; RV64I-NEXT:    or a0, a0, a3343; RV64I-NEXT:    srli a3, a0, 16344; RV64I-NEXT:    or a0, a0, a3345; RV64I-NEXT:    srli a3, a0, 32346; RV64I-NEXT:    or a0, a0, a3347; RV64I-NEXT:    not a0, a0348; RV64I-NEXT:    srli a3, a0, 1349; RV64I-NEXT:    and a1, a3, a1350; RV64I-NEXT:    lui a3, 61681351; RV64I-NEXT:    addi a3, a3, -241352; RV64I-NEXT:    sub a0, a0, a1353; RV64I-NEXT:    and a1, a0, a2354; RV64I-NEXT:    srli a0, a0, 2355; RV64I-NEXT:    and a0, a0, a2356; RV64I-NEXT:    slli a2, a3, 32357; RV64I-NEXT:    add a0, a1, a0358; RV64I-NEXT:    srli a1, a0, 4359; RV64I-NEXT:    add a0, a0, a1360; RV64I-NEXT:    add a2, a3, a2361; RV64I-NEXT:    and a0, a0, a2362; RV64I-NEXT:    slli a1, a0, 8363; RV64I-NEXT:    add a0, a0, a1364; RV64I-NEXT:    slli a1, a0, 16365; RV64I-NEXT:    add a0, a0, a1366; RV64I-NEXT:    slli a1, a0, 32367; RV64I-NEXT:    add a0, a0, a1368; RV64I-NEXT:    srli a0, a0, 56369; RV64I-NEXT:    ret370; RV64I-NEXT:  .LBB5_2:371; RV64I-NEXT:    li a0, 64372; RV64I-NEXT:    ret373;374; RV64XTHEADBB-NOB-LABEL: ctlz_i64:375; RV64XTHEADBB-NOB:       # %bb.0:376; RV64XTHEADBB-NOB-NEXT:    th.ff1 a0, a0377; RV64XTHEADBB-NOB-NEXT:    ret378;379; RV64XTHEADBB-B-LABEL: ctlz_i64:380; RV64XTHEADBB-B:       # %bb.0:381; RV64XTHEADBB-B-NEXT:    clz a0, a0382; RV64XTHEADBB-B-NEXT:    ret383  %1 = call i64 @llvm.ctlz.i64(i64 %a, i1 false)384  ret i64 %1385}386 387define signext i32 @cttz_i32(i32 signext %a) nounwind {388; RV64I-LABEL: cttz_i32:389; RV64I:       # %bb.0:390; RV64I-NEXT:    beqz a0, .LBB6_2391; RV64I-NEXT:  # %bb.1: # %cond.false392; RV64I-NEXT:    neg a1, a0393; RV64I-NEXT:    and a0, a0, a1394; RV64I-NEXT:    slli a1, a0, 6395; RV64I-NEXT:    slli a2, a0, 8396; RV64I-NEXT:    slli a3, a0, 10397; RV64I-NEXT:    slli a4, a0, 12398; RV64I-NEXT:    add a1, a1, a2399; RV64I-NEXT:    slli a2, a0, 16400; RV64I-NEXT:    sub a3, a3, a4401; RV64I-NEXT:    slli a4, a0, 18402; RV64I-NEXT:    sub a2, a2, a4403; RV64I-NEXT:    slli a4, a0, 4404; RV64I-NEXT:    sub a4, a0, a4405; RV64I-NEXT:    add a1, a4, a1406; RV64I-NEXT:    slli a4, a0, 14407; RV64I-NEXT:    sub a3, a3, a4408; RV64I-NEXT:    slli a4, a0, 23409; RV64I-NEXT:    sub a2, a2, a4410; RV64I-NEXT:    slli a0, a0, 27411; RV64I-NEXT:    add a1, a1, a3412; RV64I-NEXT:    add a0, a2, a0413; RV64I-NEXT:    add a0, a1, a0414; RV64I-NEXT:    srliw a0, a0, 27415; RV64I-NEXT:    lui a1, %hi(.LCPI6_0)416; RV64I-NEXT:    addi a1, a1, %lo(.LCPI6_0)417; RV64I-NEXT:    add a0, a1, a0418; RV64I-NEXT:    lbu a0, 0(a0)419; RV64I-NEXT:    ret420; RV64I-NEXT:  .LBB6_2:421; RV64I-NEXT:    li a0, 32422; RV64I-NEXT:    ret423;424; RV64XTHEADBB-NOB-LABEL: cttz_i32:425; RV64XTHEADBB-NOB:       # %bb.0:426; RV64XTHEADBB-NOB-NEXT:    beqz a0, .LBB6_2427; RV64XTHEADBB-NOB-NEXT:  # %bb.1: # %cond.false428; RV64XTHEADBB-NOB-NEXT:    addi a1, a0, -1429; RV64XTHEADBB-NOB-NEXT:    not a0, a0430; RV64XTHEADBB-NOB-NEXT:    and a0, a0, a1431; RV64XTHEADBB-NOB-NEXT:    th.ff1 a0, a0432; RV64XTHEADBB-NOB-NEXT:    li a1, 64433; RV64XTHEADBB-NOB-NEXT:    sub a0, a1, a0434; RV64XTHEADBB-NOB-NEXT:    ret435; RV64XTHEADBB-NOB-NEXT:  .LBB6_2:436; RV64XTHEADBB-NOB-NEXT:    li a0, 32437; RV64XTHEADBB-NOB-NEXT:    ret438;439; RV64XTHEADBB-B-LABEL: cttz_i32:440; RV64XTHEADBB-B:       # %bb.0:441; RV64XTHEADBB-B-NEXT:    ctzw a0, a0442; RV64XTHEADBB-B-NEXT:    ret443  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 false)444  ret i32 %1445}446 447define signext i32 @cttz_zero_undef_i32(i32 signext %a) nounwind {448; RV64I-LABEL: cttz_zero_undef_i32:449; RV64I:       # %bb.0:450; RV64I-NEXT:    neg a1, a0451; RV64I-NEXT:    and a0, a0, a1452; RV64I-NEXT:    slli a1, a0, 6453; RV64I-NEXT:    slli a2, a0, 8454; RV64I-NEXT:    slli a3, a0, 10455; RV64I-NEXT:    slli a4, a0, 12456; RV64I-NEXT:    add a1, a1, a2457; RV64I-NEXT:    slli a2, a0, 16458; RV64I-NEXT:    sub a3, a3, a4459; RV64I-NEXT:    slli a4, a0, 18460; RV64I-NEXT:    sub a2, a2, a4461; RV64I-NEXT:    slli a4, a0, 4462; RV64I-NEXT:    sub a4, a0, a4463; RV64I-NEXT:    add a1, a4, a1464; RV64I-NEXT:    slli a4, a0, 14465; RV64I-NEXT:    sub a3, a3, a4466; RV64I-NEXT:    slli a4, a0, 23467; RV64I-NEXT:    sub a2, a2, a4468; RV64I-NEXT:    slli a0, a0, 27469; RV64I-NEXT:    add a1, a1, a3470; RV64I-NEXT:    add a0, a2, a0471; RV64I-NEXT:    add a0, a1, a0472; RV64I-NEXT:    srliw a0, a0, 27473; RV64I-NEXT:    lui a1, %hi(.LCPI7_0)474; RV64I-NEXT:    addi a1, a1, %lo(.LCPI7_0)475; RV64I-NEXT:    add a0, a1, a0476; RV64I-NEXT:    lbu a0, 0(a0)477; RV64I-NEXT:    ret478;479; RV64XTHEADBB-NOB-LABEL: cttz_zero_undef_i32:480; RV64XTHEADBB-NOB:       # %bb.0:481; RV64XTHEADBB-NOB-NEXT:    addi a1, a0, -1482; RV64XTHEADBB-NOB-NEXT:    not a0, a0483; RV64XTHEADBB-NOB-NEXT:    and a0, a0, a1484; RV64XTHEADBB-NOB-NEXT:    th.ff1 a0, a0485; RV64XTHEADBB-NOB-NEXT:    li a1, 64486; RV64XTHEADBB-NOB-NEXT:    sub a0, a1, a0487; RV64XTHEADBB-NOB-NEXT:    ret488;489; RV64XTHEADBB-B-LABEL: cttz_zero_undef_i32:490; RV64XTHEADBB-B:       # %bb.0:491; RV64XTHEADBB-B-NEXT:    ctzw a0, a0492; RV64XTHEADBB-B-NEXT:    ret493  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 true)494  ret i32 %1495}496 497define signext i32 @findFirstSet_i32(i32 signext %a) nounwind {498; RV64I-LABEL: findFirstSet_i32:499; RV64I:       # %bb.0:500; RV64I-NEXT:    neg a1, a0501; RV64I-NEXT:    and a1, a0, a1502; RV64I-NEXT:    slli a2, a1, 6503; RV64I-NEXT:    slli a3, a1, 8504; RV64I-NEXT:    slli a4, a1, 10505; RV64I-NEXT:    slli a5, a1, 12506; RV64I-NEXT:    add a2, a2, a3507; RV64I-NEXT:    slli a3, a1, 16508; RV64I-NEXT:    sub a4, a4, a5509; RV64I-NEXT:    slli a5, a1, 18510; RV64I-NEXT:    sub a3, a3, a5511; RV64I-NEXT:    slli a5, a1, 4512; RV64I-NEXT:    sub a5, a1, a5513; RV64I-NEXT:    add a2, a5, a2514; RV64I-NEXT:    slli a5, a1, 14515; RV64I-NEXT:    sub a4, a4, a5516; RV64I-NEXT:    slli a5, a1, 23517; RV64I-NEXT:    sub a3, a3, a5518; RV64I-NEXT:    slli a1, a1, 27519; RV64I-NEXT:    add a2, a2, a4520; RV64I-NEXT:    add a1, a3, a1521; RV64I-NEXT:    add a1, a2, a1522; RV64I-NEXT:    srliw a1, a1, 27523; RV64I-NEXT:    lui a2, %hi(.LCPI8_0)524; RV64I-NEXT:    addi a2, a2, %lo(.LCPI8_0)525; RV64I-NEXT:    add a1, a2, a1526; RV64I-NEXT:    lbu a1, 0(a1)527; RV64I-NEXT:    snez a0, a0528; RV64I-NEXT:    addi a0, a0, -1529; RV64I-NEXT:    or a0, a0, a1530; RV64I-NEXT:    ret531;532; RV64XTHEADBB-NOB-LABEL: findFirstSet_i32:533; RV64XTHEADBB-NOB:       # %bb.0:534; RV64XTHEADBB-NOB-NEXT:    addi a1, a0, -1535; RV64XTHEADBB-NOB-NEXT:    not a2, a0536; RV64XTHEADBB-NOB-NEXT:    and a1, a2, a1537; RV64XTHEADBB-NOB-NEXT:    li a2, 64538; RV64XTHEADBB-NOB-NEXT:    snez a0, a0539; RV64XTHEADBB-NOB-NEXT:    th.ff1 a1, a1540; RV64XTHEADBB-NOB-NEXT:    sub a2, a2, a1541; RV64XTHEADBB-NOB-NEXT:    addi a0, a0, -1542; RV64XTHEADBB-NOB-NEXT:    or a0, a0, a2543; RV64XTHEADBB-NOB-NEXT:    ret544;545; RV64XTHEADBB-B-LABEL: findFirstSet_i32:546; RV64XTHEADBB-B:       # %bb.0:547; RV64XTHEADBB-B-NEXT:    ctzw a1, a0548; RV64XTHEADBB-B-NEXT:    snez a0, a0549; RV64XTHEADBB-B-NEXT:    addi a0, a0, -1550; RV64XTHEADBB-B-NEXT:    or a0, a0, a1551; RV64XTHEADBB-B-NEXT:    ret552  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 true)553  %2 = icmp eq i32 %a, 0554  %3 = select i1 %2, i32 -1, i32 %1555  ret i32 %3556}557 558define signext i32 @ffs_i32(i32 signext %a) nounwind {559; RV64I-LABEL: ffs_i32:560; RV64I:       # %bb.0:561; RV64I-NEXT:    neg a1, a0562; RV64I-NEXT:    and a1, a0, a1563; RV64I-NEXT:    slli a2, a1, 6564; RV64I-NEXT:    slli a3, a1, 8565; RV64I-NEXT:    slli a4, a1, 10566; RV64I-NEXT:    slli a5, a1, 12567; RV64I-NEXT:    add a2, a2, a3568; RV64I-NEXT:    slli a3, a1, 16569; RV64I-NEXT:    sub a4, a4, a5570; RV64I-NEXT:    slli a5, a1, 18571; RV64I-NEXT:    sub a3, a3, a5572; RV64I-NEXT:    slli a5, a1, 4573; RV64I-NEXT:    sub a5, a1, a5574; RV64I-NEXT:    add a2, a5, a2575; RV64I-NEXT:    slli a5, a1, 14576; RV64I-NEXT:    sub a4, a4, a5577; RV64I-NEXT:    slli a5, a1, 23578; RV64I-NEXT:    sub a3, a3, a5579; RV64I-NEXT:    add a2, a2, a4580; RV64I-NEXT:    lui a4, %hi(.LCPI9_0)581; RV64I-NEXT:    addi a4, a4, %lo(.LCPI9_0)582; RV64I-NEXT:    slli a1, a1, 27583; RV64I-NEXT:    add a1, a3, a1584; RV64I-NEXT:    add a1, a2, a1585; RV64I-NEXT:    srliw a1, a1, 27586; RV64I-NEXT:    add a1, a4, a1587; RV64I-NEXT:    lbu a1, 0(a1)588; RV64I-NEXT:    seqz a0, a0589; RV64I-NEXT:    addi a1, a1, 1590; RV64I-NEXT:    addi a0, a0, -1591; RV64I-NEXT:    and a0, a0, a1592; RV64I-NEXT:    ret593;594; RV64XTHEADBB-NOB-LABEL: ffs_i32:595; RV64XTHEADBB-NOB:       # %bb.0:596; RV64XTHEADBB-NOB-NEXT:    addi a1, a0, -1597; RV64XTHEADBB-NOB-NEXT:    not a2, a0598; RV64XTHEADBB-NOB-NEXT:    and a1, a2, a1599; RV64XTHEADBB-NOB-NEXT:    li a2, 65600; RV64XTHEADBB-NOB-NEXT:    seqz a0, a0601; RV64XTHEADBB-NOB-NEXT:    th.ff1 a1, a1602; RV64XTHEADBB-NOB-NEXT:    sub a2, a2, a1603; RV64XTHEADBB-NOB-NEXT:    addi a0, a0, -1604; RV64XTHEADBB-NOB-NEXT:    and a0, a0, a2605; RV64XTHEADBB-NOB-NEXT:    ret606;607; RV64XTHEADBB-B-LABEL: ffs_i32:608; RV64XTHEADBB-B:       # %bb.0:609; RV64XTHEADBB-B-NEXT:    ctzw a1, a0610; RV64XTHEADBB-B-NEXT:    seqz a0, a0611; RV64XTHEADBB-B-NEXT:    addi a1, a1, 1612; RV64XTHEADBB-B-NEXT:    addi a0, a0, -1613; RV64XTHEADBB-B-NEXT:    and a0, a0, a1614; RV64XTHEADBB-B-NEXT:    ret615  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 true)616  %2 = add i32 %1, 1617  %3 = icmp eq i32 %a, 0618  %4 = select i1 %3, i32 0, i32 %2619  ret i32 %4620}621 622define i64 @cttz_i64(i64 %a) nounwind {623; RV64I-LABEL: cttz_i64:624; RV64I:       # %bb.0:625; RV64I-NEXT:    beqz a0, .LBB10_2626; RV64I-NEXT:  # %bb.1: # %cond.false627; RV64I-NEXT:    addi sp, sp, -16628; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill629; RV64I-NEXT:    neg a1, a0630; RV64I-NEXT:    and a0, a0, a1631; RV64I-NEXT:    lui a1, %hi(.LCPI10_0)632; RV64I-NEXT:    ld a1, %lo(.LCPI10_0)(a1)633; RV64I-NEXT:    call __muldi3634; RV64I-NEXT:    srli a0, a0, 58635; RV64I-NEXT:    lui a1, %hi(.LCPI10_1)636; RV64I-NEXT:    addi a1, a1, %lo(.LCPI10_1)637; RV64I-NEXT:    add a0, a1, a0638; RV64I-NEXT:    lbu a0, 0(a0)639; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload640; RV64I-NEXT:    addi sp, sp, 16641; RV64I-NEXT:    ret642; RV64I-NEXT:  .LBB10_2:643; RV64I-NEXT:    li a0, 64644; RV64I-NEXT:    ret645;646; RV64XTHEADBB-NOB-LABEL: cttz_i64:647; RV64XTHEADBB-NOB:       # %bb.0:648; RV64XTHEADBB-NOB-NEXT:    beqz a0, .LBB10_2649; RV64XTHEADBB-NOB-NEXT:  # %bb.1: # %cond.false650; RV64XTHEADBB-NOB-NEXT:    addi a1, a0, -1651; RV64XTHEADBB-NOB-NEXT:    not a0, a0652; RV64XTHEADBB-NOB-NEXT:    and a0, a0, a1653; RV64XTHEADBB-NOB-NEXT:    th.ff1 a0, a0654; RV64XTHEADBB-NOB-NEXT:    li a1, 64655; RV64XTHEADBB-NOB-NEXT:    sub a0, a1, a0656; RV64XTHEADBB-NOB-NEXT:    ret657; RV64XTHEADBB-NOB-NEXT:  .LBB10_2:658; RV64XTHEADBB-NOB-NEXT:    li a0, 64659; RV64XTHEADBB-NOB-NEXT:    ret660;661; RV64XTHEADBB-B-LABEL: cttz_i64:662; RV64XTHEADBB-B:       # %bb.0:663; RV64XTHEADBB-B-NEXT:    ctz a0, a0664; RV64XTHEADBB-B-NEXT:    ret665  %1 = call i64 @llvm.cttz.i64(i64 %a, i1 false)666  ret i64 %1667}668 669define signext i32 @sexti1_i32(i32 signext %a) nounwind {670; RV64I-LABEL: sexti1_i32:671; RV64I:       # %bb.0:672; RV64I-NEXT:    slli a0, a0, 63673; RV64I-NEXT:    srai a0, a0, 63674; RV64I-NEXT:    ret675;676; RV64XTHEADBB-LABEL: sexti1_i32:677; RV64XTHEADBB:       # %bb.0:678; RV64XTHEADBB-NEXT:    th.ext a0, a0, 0, 0679; RV64XTHEADBB-NEXT:    ret680  %shl = shl i32 %a, 31681  %shr = ashr exact i32 %shl, 31682  ret i32 %shr683}684 685define signext i32 @sexti1_i32_2(i1 %a) nounwind {686; RV64I-LABEL: sexti1_i32_2:687; RV64I:       # %bb.0:688; RV64I-NEXT:    slli a0, a0, 63689; RV64I-NEXT:    srai a0, a0, 63690; RV64I-NEXT:    ret691;692; RV64XTHEADBB-LABEL: sexti1_i32_2:693; RV64XTHEADBB:       # %bb.0:694; RV64XTHEADBB-NEXT:    th.ext a0, a0, 0, 0695; RV64XTHEADBB-NEXT:    ret696  %sext = sext i1 %a to i32697  ret i32 %sext698}699 700; Make sure we don't use not+th.ext701define zeroext i8 @sexti1_i32_setcc(i32 signext %a) {702; CHECK-LABEL: sexti1_i32_setcc:703; CHECK:       # %bb.0:704; CHECK-NEXT:    srli a0, a0, 63705; CHECK-NEXT:    addi a0, a0, -1706; CHECK-NEXT:    zext.b a0, a0707; CHECK-NEXT:    ret708  %icmp = icmp sgt i32 %a, -1709  %sext = sext i1 %icmp to i8710  ret i8 %sext711}712 713; Make sure we don't use seqz+th.ext instead of snez+addi714define signext i32 @sexti1_i32_setcc_2(i32 signext %a, i32 signext %b) {715; CHECK-LABEL: sexti1_i32_setcc_2:716; CHECK:       # %bb.0:717; CHECK-NEXT:    xor a0, a0, a1718; CHECK-NEXT:    snez a0, a0719; CHECK-NEXT:    addi a0, a0, -1720; CHECK-NEXT:    ret721  %icmp = icmp eq i32 %a, %b722  %sext = sext i1 %icmp to i32723  ret i32 %sext724}725 726; Make sure we don't use th.ext instead of neg.727define signext i32 @sexti1_i32_setcc_3(i32 signext %a, i32 signext %b) {728; CHECK-LABEL: sexti1_i32_setcc_3:729; CHECK:       # %bb.0:730; CHECK-NEXT:    slt a0, a0, a1731; CHECK-NEXT:    neg a0, a0732; CHECK-NEXT:    ret733  %icmp = icmp slt i32 %a, %b734  %sext = sext i1 %icmp to i32735  ret i32 %sext736}737 738define i64 @sexti1_i64(i64 %a) nounwind {739; RV64I-LABEL: sexti1_i64:740; RV64I:       # %bb.0:741; RV64I-NEXT:    slli a0, a0, 63742; RV64I-NEXT:    srai a0, a0, 63743; RV64I-NEXT:    ret744;745; RV64XTHEADBB-LABEL: sexti1_i64:746; RV64XTHEADBB:       # %bb.0:747; RV64XTHEADBB-NEXT:    th.ext a0, a0, 0, 0748; RV64XTHEADBB-NEXT:    ret749  %shl = shl i64 %a, 63750  %shr = ashr exact i64 %shl, 63751  ret i64 %shr752}753 754define i64 @sexti1_i64_2(i1 %a) nounwind {755; RV64I-LABEL: sexti1_i64_2:756; RV64I:       # %bb.0:757; RV64I-NEXT:    slli a0, a0, 63758; RV64I-NEXT:    srai a0, a0, 63759; RV64I-NEXT:    ret760;761; RV64XTHEADBB-LABEL: sexti1_i64_2:762; RV64XTHEADBB:       # %bb.0:763; RV64XTHEADBB-NEXT:    th.ext a0, a0, 0, 0764; RV64XTHEADBB-NEXT:    ret765  %sext = sext i1 %a to i64766  ret i64 %sext767}768 769; Make sure we don't use not+th.ext770define zeroext i8 @sexti1_i64_setcc(i64 %a) {771; CHECK-LABEL: sexti1_i64_setcc:772; CHECK:       # %bb.0:773; CHECK-NEXT:    srli a0, a0, 63774; CHECK-NEXT:    addi a0, a0, -1775; CHECK-NEXT:    zext.b a0, a0776; CHECK-NEXT:    ret777  %icmp = icmp sgt i64 %a, -1778  %sext = sext i1 %icmp to i8779  ret i8 %sext780}781 782; Make sure we don't use seqz+th.ext instead of snez+addi783define i64 @sexti1_i64_setcc_2(i64 %a, i64 %b) {784; CHECK-LABEL: sexti1_i64_setcc_2:785; CHECK:       # %bb.0:786; CHECK-NEXT:    xor a0, a0, a1787; CHECK-NEXT:    snez a0, a0788; CHECK-NEXT:    addi a0, a0, -1789; CHECK-NEXT:    ret790  %icmp = icmp eq i64 %a, %b791  %sext = sext i1 %icmp to i64792  ret i64 %sext793}794 795; Make sure we don't use th.ext instead of neg.796define i64 @sexti1_i64_setcc_3(i64 %a, i64 %b) {797; CHECK-LABEL: sexti1_i64_setcc_3:798; CHECK:       # %bb.0:799; CHECK-NEXT:    slt a0, a0, a1800; CHECK-NEXT:    neg a0, a0801; CHECK-NEXT:    ret802  %icmp = icmp slt i64 %a, %b803  %sext = sext i1 %icmp to i64804  ret i64 %sext805}806 807define signext i32 @sextb_i32(i32 signext %a) nounwind {808; RV64I-LABEL: sextb_i32:809; RV64I:       # %bb.0:810; RV64I-NEXT:    slli a0, a0, 56811; RV64I-NEXT:    srai a0, a0, 56812; RV64I-NEXT:    ret813;814; RV64XTHEADBB-NOB-LABEL: sextb_i32:815; RV64XTHEADBB-NOB:       # %bb.0:816; RV64XTHEADBB-NOB-NEXT:    th.ext a0, a0, 7, 0817; RV64XTHEADBB-NOB-NEXT:    ret818;819; RV64XTHEADBB-B-LABEL: sextb_i32:820; RV64XTHEADBB-B:       # %bb.0:821; RV64XTHEADBB-B-NEXT:    sext.b a0, a0822; RV64XTHEADBB-B-NEXT:    ret823  %shl = shl i32 %a, 24824  %shr = ashr exact i32 %shl, 24825  ret i32 %shr826}827 828define i64 @sextb_i64(i64 %a) nounwind {829; RV64I-LABEL: sextb_i64:830; RV64I:       # %bb.0:831; RV64I-NEXT:    slli a0, a0, 56832; RV64I-NEXT:    srai a0, a0, 56833; RV64I-NEXT:    ret834;835; RV64XTHEADBB-NOB-LABEL: sextb_i64:836; RV64XTHEADBB-NOB:       # %bb.0:837; RV64XTHEADBB-NOB-NEXT:    th.ext a0, a0, 7, 0838; RV64XTHEADBB-NOB-NEXT:    ret839;840; RV64XTHEADBB-B-LABEL: sextb_i64:841; RV64XTHEADBB-B:       # %bb.0:842; RV64XTHEADBB-B-NEXT:    sext.b a0, a0843; RV64XTHEADBB-B-NEXT:    ret844  %shl = shl i64 %a, 56845  %shr = ashr exact i64 %shl, 56846  ret i64 %shr847}848 849define signext i32 @sexth_i32(i32 signext %a) nounwind {850; RV64I-LABEL: sexth_i32:851; RV64I:       # %bb.0:852; RV64I-NEXT:    slli a0, a0, 48853; RV64I-NEXT:    srai a0, a0, 48854; RV64I-NEXT:    ret855;856; RV64XTHEADBB-NOB-LABEL: sexth_i32:857; RV64XTHEADBB-NOB:       # %bb.0:858; RV64XTHEADBB-NOB-NEXT:    th.ext a0, a0, 15, 0859; RV64XTHEADBB-NOB-NEXT:    ret860;861; RV64XTHEADBB-B-LABEL: sexth_i32:862; RV64XTHEADBB-B:       # %bb.0:863; RV64XTHEADBB-B-NEXT:    sext.h a0, a0864; RV64XTHEADBB-B-NEXT:    ret865  %shl = shl i32 %a, 16866  %shr = ashr exact i32 %shl, 16867  ret i32 %shr868}869 870define signext i32 @no_sexth_i32(i32 signext %a) nounwind {871; CHECK-LABEL: no_sexth_i32:872; CHECK:       # %bb.0:873; CHECK-NEXT:    slli a0, a0, 49874; CHECK-NEXT:    srai a0, a0, 48875; CHECK-NEXT:    ret876  %shl = shl i32 %a, 17877  %shr = ashr exact i32 %shl, 16878  ret i32 %shr879}880 881define i64 @sexth_i64(i64 %a) nounwind {882; RV64I-LABEL: sexth_i64:883; RV64I:       # %bb.0:884; RV64I-NEXT:    slli a0, a0, 48885; RV64I-NEXT:    srai a0, a0, 48886; RV64I-NEXT:    ret887;888; RV64XTHEADBB-NOB-LABEL: sexth_i64:889; RV64XTHEADBB-NOB:       # %bb.0:890; RV64XTHEADBB-NOB-NEXT:    th.ext a0, a0, 15, 0891; RV64XTHEADBB-NOB-NEXT:    ret892;893; RV64XTHEADBB-B-LABEL: sexth_i64:894; RV64XTHEADBB-B:       # %bb.0:895; RV64XTHEADBB-B-NEXT:    sext.h a0, a0896; RV64XTHEADBB-B-NEXT:    ret897  %shl = shl i64 %a, 48898  %shr = ashr exact i64 %shl, 48899  ret i64 %shr900}901 902define i64 @no_sexth_i64(i64 %a) nounwind {903; CHECK-LABEL: no_sexth_i64:904; CHECK:       # %bb.0:905; CHECK-NEXT:    slli a0, a0, 49906; CHECK-NEXT:    srai a0, a0, 48907; CHECK-NEXT:    ret908  %shl = shl i64 %a, 49909  %shr = ashr exact i64 %shl, 48910  ret i64 %shr911}912 913define i32 @zexth_i32(i32 %a) nounwind {914; RV64I-LABEL: zexth_i32:915; RV64I:       # %bb.0:916; RV64I-NEXT:    slli a0, a0, 48917; RV64I-NEXT:    srli a0, a0, 48918; RV64I-NEXT:    ret919;920; RV64XTHEADBB-NOB-LABEL: zexth_i32:921; RV64XTHEADBB-NOB:       # %bb.0:922; RV64XTHEADBB-NOB-NEXT:    th.extu a0, a0, 15, 0923; RV64XTHEADBB-NOB-NEXT:    ret924;925; RV64XTHEADBB-B-LABEL: zexth_i32:926; RV64XTHEADBB-B:       # %bb.0:927; RV64XTHEADBB-B-NEXT:    zext.h a0, a0928; RV64XTHEADBB-B-NEXT:    ret929  %and = and i32 %a, 65535930  ret i32 %and931}932 933define i64 @zexth_i64(i64 %a) nounwind {934; RV64I-LABEL: zexth_i64:935; RV64I:       # %bb.0:936; RV64I-NEXT:    slli a0, a0, 48937; RV64I-NEXT:    srli a0, a0, 48938; RV64I-NEXT:    ret939;940; RV64XTHEADBB-NOB-LABEL: zexth_i64:941; RV64XTHEADBB-NOB:       # %bb.0:942; RV64XTHEADBB-NOB-NEXT:    th.extu a0, a0, 15, 0943; RV64XTHEADBB-NOB-NEXT:    ret944;945; RV64XTHEADBB-B-LABEL: zexth_i64:946; RV64XTHEADBB-B:       # %bb.0:947; RV64XTHEADBB-B-NEXT:    zext.h a0, a0948; RV64XTHEADBB-B-NEXT:    ret949  %and = and i64 %a, 65535950  ret i64 %and951}952 953define i64 @zextw_i64(i64 %a) nounwind {954; RV64I-LABEL: zextw_i64:955; RV64I:       # %bb.0:956; RV64I-NEXT:    slli a0, a0, 32957; RV64I-NEXT:    srli a0, a0, 32958; RV64I-NEXT:    ret959;960; RV64XTHEADBB-NOB-LABEL: zextw_i64:961; RV64XTHEADBB-NOB:       # %bb.0:962; RV64XTHEADBB-NOB-NEXT:    th.extu a0, a0, 31, 0963; RV64XTHEADBB-NOB-NEXT:    ret964;965; RV64XTHEADBB-B-LABEL: zextw_i64:966; RV64XTHEADBB-B:       # %bb.0:967; RV64XTHEADBB-B-NEXT:    zext.w a0, a0968; RV64XTHEADBB-B-NEXT:    ret969  %and = and i64 %a, 4294967295970  ret i64 %and971}972 973define i64 @zext_bf_i64(i64 %a) nounwind {974; RV64I-LABEL: zext_bf_i64:975; RV64I:       # %bb.0:976; RV64I-NEXT:    slli a0, a0, 47977; RV64I-NEXT:    srli a0, a0, 48978; RV64I-NEXT:    ret979;980; RV64XTHEADBB-LABEL: zext_bf_i64:981; RV64XTHEADBB:       # %bb.0:982; RV64XTHEADBB-NEXT:    th.extu a0, a0, 16, 1983; RV64XTHEADBB-NEXT:    ret984  %1 = lshr i64 %a, 1985  %and = and i64 %1, 65535986  ret i64 %and987}988 989define i64 @zext_bf2_i64(i64 %a) nounwind {990; RV64I-LABEL: zext_bf2_i64:991; RV64I:       # %bb.0:992; RV64I-NEXT:    slli a0, a0, 48993; RV64I-NEXT:    srli a0, a0, 49994; RV64I-NEXT:    ret995;996; RV64XTHEADBB-LABEL: zext_bf2_i64:997; RV64XTHEADBB:       # %bb.0:998; RV64XTHEADBB-NEXT:    th.extu a0, a0, 15, 1999; RV64XTHEADBB-NEXT:    ret1000  %t0 = and i64 %a, 655351001  %result = lshr i64 %t0, 11002  ret i64 %result1003}1004 1005define i64 @zext_i64_srliw(i64 %a) nounwind {1006; CHECK-LABEL: zext_i64_srliw:1007; CHECK:       # %bb.0:1008; CHECK-NEXT:    srliw a0, a0, 161009; CHECK-NEXT:    ret1010  %1 = lshr i64 %a, 161011  %and = and i64 %1, 655351012  ret i64 %and1013}1014 1015define signext i32 @bswap_i32(i32 signext %a) nounwind {1016; RV64I-LABEL: bswap_i32:1017; RV64I:       # %bb.0:1018; RV64I-NEXT:    srli a1, a0, 81019; RV64I-NEXT:    lui a2, 161020; RV64I-NEXT:    srliw a3, a0, 241021; RV64I-NEXT:    addi a2, a2, -2561022; RV64I-NEXT:    and a1, a1, a21023; RV64I-NEXT:    and a2, a0, a21024; RV64I-NEXT:    or a1, a1, a31025; RV64I-NEXT:    slli a2, a2, 81026; RV64I-NEXT:    slliw a0, a0, 241027; RV64I-NEXT:    or a0, a0, a21028; RV64I-NEXT:    or a0, a0, a11029; RV64I-NEXT:    ret1030;1031; RV64XTHEADBB-LABEL: bswap_i32:1032; RV64XTHEADBB:       # %bb.0:1033; RV64XTHEADBB-NEXT:    th.revw a0, a01034; RV64XTHEADBB-NEXT:    ret1035  %1 = tail call i32 @llvm.bswap.i32(i32 %a)1036  ret i32 %11037}1038 1039; Similar to bswap_i32 but the result is not sign extended.1040define void @bswap_i32_nosext(i32 signext %a, ptr %x) nounwind {1041; RV64I-LABEL: bswap_i32_nosext:1042; RV64I:       # %bb.0:1043; RV64I-NEXT:    srli a2, a0, 81044; RV64I-NEXT:    lui a3, 161045; RV64I-NEXT:    srliw a4, a0, 241046; RV64I-NEXT:    addi a3, a3, -2561047; RV64I-NEXT:    and a2, a2, a31048; RV64I-NEXT:    and a3, a0, a31049; RV64I-NEXT:    or a2, a2, a41050; RV64I-NEXT:    slli a3, a3, 81051; RV64I-NEXT:    slli a0, a0, 241052; RV64I-NEXT:    or a0, a0, a31053; RV64I-NEXT:    or a0, a0, a21054; RV64I-NEXT:    sw a0, 0(a1)1055; RV64I-NEXT:    ret1056;1057; RV64XTHEADBB-LABEL: bswap_i32_nosext:1058; RV64XTHEADBB:       # %bb.0:1059; RV64XTHEADBB-NEXT:    th.revw a0, a01060; RV64XTHEADBB-NEXT:    sw a0, 0(a1)1061; RV64XTHEADBB-NEXT:    ret1062  %1 = tail call i32 @llvm.bswap.i32(i32 %a)1063  store i32 %1, ptr %x1064  ret void1065}1066 1067define i64 @bswap_i64(i64 %a) {1068; RV64I-LABEL: bswap_i64:1069; RV64I:       # %bb.0:1070; RV64I-NEXT:    srli a1, a0, 401071; RV64I-NEXT:    lui a2, 161072; RV64I-NEXT:    srli a3, a0, 561073; RV64I-NEXT:    srli a4, a0, 241074; RV64I-NEXT:    lui a5, 40801075; RV64I-NEXT:    addi a2, a2, -2561076; RV64I-NEXT:    and a1, a1, a21077; RV64I-NEXT:    or a1, a1, a31078; RV64I-NEXT:    srli a3, a0, 81079; RV64I-NEXT:    and a4, a4, a51080; RV64I-NEXT:    srliw a3, a3, 241081; RV64I-NEXT:    slli a3, a3, 241082; RV64I-NEXT:    or a3, a3, a41083; RV64I-NEXT:    srliw a4, a0, 241084; RV64I-NEXT:    and a5, a0, a51085; RV64I-NEXT:    and a2, a0, a21086; RV64I-NEXT:    slli a0, a0, 561087; RV64I-NEXT:    slli a4, a4, 321088; RV64I-NEXT:    slli a5, a5, 241089; RV64I-NEXT:    or a4, a5, a41090; RV64I-NEXT:    slli a2, a2, 401091; RV64I-NEXT:    or a1, a3, a11092; RV64I-NEXT:    or a0, a0, a21093; RV64I-NEXT:    or a0, a0, a41094; RV64I-NEXT:    or a0, a0, a11095; RV64I-NEXT:    ret1096;1097; RV64XTHEADBB-NOB-LABEL: bswap_i64:1098; RV64XTHEADBB-NOB:       # %bb.0:1099; RV64XTHEADBB-NOB-NEXT:    th.rev a0, a01100; RV64XTHEADBB-NOB-NEXT:    ret1101;1102; RV64XTHEADBB-B-LABEL: bswap_i64:1103; RV64XTHEADBB-B:       # %bb.0:1104; RV64XTHEADBB-B-NEXT:    rev8 a0, a01105; RV64XTHEADBB-B-NEXT:    ret1106  %1 = call i64 @llvm.bswap.i64(i64 %a)1107  ret i64 %11108}1109 1110define void @sextw_removal_ext(i32 signext %arg, i32 signext %arg1) nounwind {1111; RV64I-LABEL: sextw_removal_ext:1112; RV64I:       # %bb.0: # %bb1113; RV64I-NEXT:    addi sp, sp, -161114; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill1115; RV64I-NEXT:    sraw a0, a0, a11116; RV64I-NEXT:  .LBB36_1: # %bb21117; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11118; RV64I-NEXT:    call foo1119; RV64I-NEXT:    slli a0, a0, 161120; RV64I-NEXT:    srai a0, a0, 321121; RV64I-NEXT:    bnez a0, .LBB36_11122; RV64I-NEXT:  # %bb.2: # %bb71123; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload1124; RV64I-NEXT:    addi sp, sp, 161125; RV64I-NEXT:    ret1126;1127; RV64XTHEADBB-LABEL: sextw_removal_ext:1128; RV64XTHEADBB:       # %bb.0: # %bb1129; RV64XTHEADBB-NEXT:    addi sp, sp, -161130; RV64XTHEADBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill1131; RV64XTHEADBB-NEXT:    sraw a0, a0, a11132; RV64XTHEADBB-NEXT:  .LBB36_1: # %bb21133; RV64XTHEADBB-NEXT:    # =>This Inner Loop Header: Depth=11134; RV64XTHEADBB-NEXT:    call foo1135; RV64XTHEADBB-NEXT:    th.ext a0, a0, 47, 161136; RV64XTHEADBB-NEXT:    bnez a0, .LBB36_11137; RV64XTHEADBB-NEXT:  # %bb.2: # %bb71138; RV64XTHEADBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload1139; RV64XTHEADBB-NEXT:    addi sp, sp, 161140; RV64XTHEADBB-NEXT:    ret1141bb:1142  %i = ashr i32 %arg, %arg11143  br label %bb21144 1145bb2:                                              ; preds = %bb2, %bb1146  %i3 = phi i32 [ %i, %bb ], [ %i7, %bb2 ]1147  %i4 = tail call i64 @foo(i32 signext %i3)1148  %i5 = shl i64 %i4, 161149  %i6 = ashr i64 %i5, 321150  %i7 = trunc i64 %i6 to i321151  %i8 = icmp eq i32 %i7, 01152  br i1 %i8, label %bb7, label %bb21153 1154bb7:                                              ; preds = %bb21155  ret void1156}1157 1158declare i64 @foo(i32 signext)1159 1160define void @sextw_removal_extu(i32 signext %arg, i32 signext %arg1) nounwind {1161; RV64I-LABEL: sextw_removal_extu:1162; RV64I:       # %bb.0: # %bb1163; RV64I-NEXT:    addi sp, sp, -161164; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill1165; RV64I-NEXT:    sraw a0, a0, a11166; RV64I-NEXT:  .LBB37_1: # %bb21167; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11168; RV64I-NEXT:    call foo1169; RV64I-NEXT:    slli a0, a0, 161170; RV64I-NEXT:    srli a0, a0, 331171; RV64I-NEXT:    bnez a0, .LBB37_11172; RV64I-NEXT:  # %bb.2: # %bb71173; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload1174; RV64I-NEXT:    addi sp, sp, 161175; RV64I-NEXT:    ret1176;1177; RV64XTHEADBB-LABEL: sextw_removal_extu:1178; RV64XTHEADBB:       # %bb.0: # %bb1179; RV64XTHEADBB-NEXT:    addi sp, sp, -161180; RV64XTHEADBB-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill1181; RV64XTHEADBB-NEXT:    sraw a0, a0, a11182; RV64XTHEADBB-NEXT:  .LBB37_1: # %bb21183; RV64XTHEADBB-NEXT:    # =>This Inner Loop Header: Depth=11184; RV64XTHEADBB-NEXT:    call foo1185; RV64XTHEADBB-NEXT:    th.extu a0, a0, 47, 171186; RV64XTHEADBB-NEXT:    bnez a0, .LBB37_11187; RV64XTHEADBB-NEXT:  # %bb.2: # %bb71188; RV64XTHEADBB-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload1189; RV64XTHEADBB-NEXT:    addi sp, sp, 161190; RV64XTHEADBB-NEXT:    ret1191bb:1192  %i = ashr i32 %arg, %arg11193  br label %bb21194 1195bb2:                                              ; preds = %bb2, %bb1196  %i3 = phi i32 [ %i, %bb ], [ %i7, %bb2 ]1197  %i4 = tail call i64 @foo(i32 signext %i3)1198  %i5 = shl i64 %i4, 161199  %i6 = lshr i64 %i5, 331200  %i7 = trunc i64 %i6 to i321201  %i8 = icmp eq i32 %i7, 01202  br i1 %i8, label %bb7, label %bb21203 1204bb7:                                              ; preds = %bb21205  ret void1206}1207 1208define signext i32 @hasAllNBitUsers_extu(i64 %arg1, i64 %arg2, i64 %arg3)  {1209; RV64I-LABEL: hasAllNBitUsers_extu:1210; RV64I:       # %bb.0: # %entry1211; RV64I-NEXT:    addi a2, a2, -11212; RV64I-NEXT:    li a3, 2561213; RV64I-NEXT:  .LBB38_1: # %bb21214; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11215; RV64I-NEXT:    slli a0, a0, 471216; RV64I-NEXT:    srli a0, a0, 621217; RV64I-NEXT:    addi a2, a2, 11218; RV64I-NEXT:    addw a0, a0, a11219; RV64I-NEXT:    bltu a2, a3, .LBB38_11220; RV64I-NEXT:  # %bb.2: # %bb71221; RV64I-NEXT:    ret1222;1223; RV64XTHEADBB-LABEL: hasAllNBitUsers_extu:1224; RV64XTHEADBB:       # %bb.0: # %entry1225; RV64XTHEADBB-NEXT:    addi a2, a2, -11226; RV64XTHEADBB-NEXT:    li a3, 2561227; RV64XTHEADBB-NEXT:  .LBB38_1: # %bb21228; RV64XTHEADBB-NEXT:    # =>This Inner Loop Header: Depth=11229; RV64XTHEADBB-NEXT:    th.extu a0, a0, 16, 151230; RV64XTHEADBB-NEXT:    addi a2, a2, 11231; RV64XTHEADBB-NEXT:    addw a0, a0, a11232; RV64XTHEADBB-NEXT:    bltu a2, a3, .LBB38_11233; RV64XTHEADBB-NEXT:  # %bb.2: # %bb71234; RV64XTHEADBB-NEXT:    ret1235entry:1236  br label %bb21237 1238bb2:                                              ; preds = %bb2, %entry1239  %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]1240  %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]1241  %i3 = add i64 %i2, 11242  %i4 = lshr i64 %i1, 151243  %i4b = and i64 %i4, 31244  %i5 = add i64 %i4b, %arg21245  %i6 = icmp ugt i64 %i2, 2551246  br i1 %i6, label %bb7, label %bb21247 1248bb7:                                              ; preds = %bb21249  %i7 = trunc i64 %i5 to i321250  ret i32 %i71251}1252 1253define signext i32 @hasAllNBitUsers_ext(i64 %arg1, i64 %arg2, i64 %arg3)  {1254; RV64I-LABEL: hasAllNBitUsers_ext:1255; RV64I:       # %bb.0: # %entry1256; RV64I-NEXT:    addi a2, a2, -11257; RV64I-NEXT:    li a3, 2561258; RV64I-NEXT:  .LBB39_1: # %bb21259; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11260; RV64I-NEXT:    slli a0, a0, 471261; RV64I-NEXT:    srli a0, a0, 621262; RV64I-NEXT:    addi a2, a2, 11263; RV64I-NEXT:    addw a0, a0, a11264; RV64I-NEXT:    bltu a2, a3, .LBB39_11265; RV64I-NEXT:  # %bb.2: # %bb71266; RV64I-NEXT:    ret1267;1268; RV64XTHEADBB-LABEL: hasAllNBitUsers_ext:1269; RV64XTHEADBB:       # %bb.0: # %entry1270; RV64XTHEADBB-NEXT:    addi a2, a2, -11271; RV64XTHEADBB-NEXT:    li a3, 2561272; RV64XTHEADBB-NEXT:  .LBB39_1: # %bb21273; RV64XTHEADBB-NEXT:    # =>This Inner Loop Header: Depth=11274; RV64XTHEADBB-NEXT:    th.extu a0, a0, 16, 151275; RV64XTHEADBB-NEXT:    addi a2, a2, 11276; RV64XTHEADBB-NEXT:    addw a0, a0, a11277; RV64XTHEADBB-NEXT:    bltu a2, a3, .LBB39_11278; RV64XTHEADBB-NEXT:  # %bb.2: # %bb71279; RV64XTHEADBB-NEXT:    ret1280entry:1281  br label %bb21282 1283bb2:                                              ; preds = %bb2, %entry1284  %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]1285  %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]1286  %i3 = add i64 %i2, 11287  %i4 = ashr i64 %i1, 151288  %i4b = and i64 %i4, 31289  %i5 = add i64 %i4b, %arg21290  %i6 = icmp ugt i64 %i2, 2551291  br i1 %i6, label %bb7, label %bb21292 1293bb7:                                              ; preds = %bb21294  %i7 = trunc i64 %i5 to i321295  ret i32 %i71296}1297