brintos

brintos / llvm-project-archived public Read only

0
0
Text · 52.2 KiB · 9450eea Raw
1734 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-prefix=RV32I4; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \5; RUN:   | FileCheck %s -check-prefix=RV64I6; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \7; RUN:   | FileCheck %s -check-prefixes=RV32ZB,RV32ZBB8; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \9; RUN:   | FileCheck %s -check-prefixes=RV64ZB,RV64ZBB10; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \11; RUN:   | FileCheck %s -check-prefixes=RV32ZB,RV32ZBKB12; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \13; RUN:   | FileCheck %s -check-prefixes=RV64ZB,RV64ZBKB14 15define i16 @test_bswap_i16(i16 %a) nounwind {16; RV32I-LABEL: test_bswap_i16:17; RV32I:       # %bb.0:18; RV32I-NEXT:    slli a1, a0, 819; RV32I-NEXT:    slli a0, a0, 1620; RV32I-NEXT:    srli a0, a0, 2421; RV32I-NEXT:    or a0, a1, a022; RV32I-NEXT:    ret23;24; RV64I-LABEL: test_bswap_i16:25; RV64I:       # %bb.0:26; RV64I-NEXT:    slli a1, a0, 827; RV64I-NEXT:    slli a0, a0, 4828; RV64I-NEXT:    srli a0, a0, 5629; RV64I-NEXT:    or a0, a1, a030; RV64I-NEXT:    ret31;32; RV32ZB-LABEL: test_bswap_i16:33; RV32ZB:       # %bb.0:34; RV32ZB-NEXT:    rev8 a0, a035; RV32ZB-NEXT:    srli a0, a0, 1636; RV32ZB-NEXT:    ret37;38; RV64ZB-LABEL: test_bswap_i16:39; RV64ZB:       # %bb.0:40; RV64ZB-NEXT:    rev8 a0, a041; RV64ZB-NEXT:    srli a0, a0, 4842; RV64ZB-NEXT:    ret43  %tmp = call i16 @llvm.bswap.i16(i16 %a)44  ret i16 %tmp45}46 47define i32 @test_bswap_i32(i32 %a) nounwind {48; RV32I-LABEL: test_bswap_i32:49; RV32I:       # %bb.0:50; RV32I-NEXT:    srli a1, a0, 851; RV32I-NEXT:    lui a2, 1652; RV32I-NEXT:    srli a3, a0, 2453; RV32I-NEXT:    addi a2, a2, -25654; RV32I-NEXT:    and a1, a1, a255; RV32I-NEXT:    and a2, a0, a256; RV32I-NEXT:    or a1, a1, a357; RV32I-NEXT:    slli a2, a2, 858; RV32I-NEXT:    slli a0, a0, 2459; RV32I-NEXT:    or a0, a0, a260; RV32I-NEXT:    or a0, a0, a161; RV32I-NEXT:    ret62;63; RV64I-LABEL: test_bswap_i32:64; RV64I:       # %bb.0:65; RV64I-NEXT:    srli a1, a0, 866; RV64I-NEXT:    lui a2, 1667; RV64I-NEXT:    srliw a3, a0, 2468; RV64I-NEXT:    addi a2, a2, -25669; RV64I-NEXT:    and a1, a1, a270; RV64I-NEXT:    and a2, a0, a271; RV64I-NEXT:    or a1, a1, a372; RV64I-NEXT:    slli a2, a2, 873; RV64I-NEXT:    slliw a0, a0, 2474; RV64I-NEXT:    or a0, a0, a275; RV64I-NEXT:    or a0, a0, a176; RV64I-NEXT:    ret77;78; RV32ZB-LABEL: test_bswap_i32:79; RV32ZB:       # %bb.0:80; RV32ZB-NEXT:    rev8 a0, a081; RV32ZB-NEXT:    ret82;83; RV64ZB-LABEL: test_bswap_i32:84; RV64ZB:       # %bb.0:85; RV64ZB-NEXT:    rev8 a0, a086; RV64ZB-NEXT:    srli a0, a0, 3287; RV64ZB-NEXT:    ret88  %tmp = call i32 @llvm.bswap.i32(i32 %a)89  ret i32 %tmp90}91 92define i64 @test_bswap_i64(i64 %a) nounwind {93; RV32I-LABEL: test_bswap_i64:94; RV32I:       # %bb.0:95; RV32I-NEXT:    srli a2, a1, 896; RV32I-NEXT:    lui a3, 1697; RV32I-NEXT:    srli a4, a1, 2498; RV32I-NEXT:    srli a5, a0, 899; RV32I-NEXT:    addi a3, a3, -256100; RV32I-NEXT:    and a2, a2, a3101; RV32I-NEXT:    or a2, a2, a4102; RV32I-NEXT:    srli a4, a0, 24103; RV32I-NEXT:    and a5, a5, a3104; RV32I-NEXT:    or a4, a5, a4105; RV32I-NEXT:    slli a5, a1, 24106; RV32I-NEXT:    and a1, a1, a3107; RV32I-NEXT:    slli a1, a1, 8108; RV32I-NEXT:    or a1, a5, a1109; RV32I-NEXT:    and a3, a0, a3110; RV32I-NEXT:    slli a0, a0, 24111; RV32I-NEXT:    slli a3, a3, 8112; RV32I-NEXT:    or a3, a0, a3113; RV32I-NEXT:    or a0, a1, a2114; RV32I-NEXT:    or a1, a3, a4115; RV32I-NEXT:    ret116;117; RV64I-LABEL: test_bswap_i64:118; RV64I:       # %bb.0:119; RV64I-NEXT:    srli a1, a0, 40120; RV64I-NEXT:    lui a2, 16121; RV64I-NEXT:    srli a3, a0, 56122; RV64I-NEXT:    srli a4, a0, 24123; RV64I-NEXT:    lui a5, 4080124; RV64I-NEXT:    addi a2, a2, -256125; RV64I-NEXT:    and a1, a1, a2126; RV64I-NEXT:    or a1, a1, a3127; RV64I-NEXT:    srli a3, a0, 8128; RV64I-NEXT:    and a4, a4, a5129; RV64I-NEXT:    srliw a3, a3, 24130; RV64I-NEXT:    slli a3, a3, 24131; RV64I-NEXT:    or a3, a3, a4132; RV64I-NEXT:    srliw a4, a0, 24133; RV64I-NEXT:    and a5, a0, a5134; RV64I-NEXT:    and a2, a0, a2135; RV64I-NEXT:    slli a0, a0, 56136; RV64I-NEXT:    slli a4, a4, 32137; RV64I-NEXT:    slli a5, a5, 24138; RV64I-NEXT:    or a4, a5, a4139; RV64I-NEXT:    slli a2, a2, 40140; RV64I-NEXT:    or a1, a3, a1141; RV64I-NEXT:    or a0, a0, a2142; RV64I-NEXT:    or a0, a0, a4143; RV64I-NEXT:    or a0, a0, a1144; RV64I-NEXT:    ret145;146; RV32ZB-LABEL: test_bswap_i64:147; RV32ZB:       # %bb.0:148; RV32ZB-NEXT:    rev8 a2, a1149; RV32ZB-NEXT:    rev8 a1, a0150; RV32ZB-NEXT:    mv a0, a2151; RV32ZB-NEXT:    ret152;153; RV64ZB-LABEL: test_bswap_i64:154; RV64ZB:       # %bb.0:155; RV64ZB-NEXT:    rev8 a0, a0156; RV64ZB-NEXT:    ret157  %tmp = call i64 @llvm.bswap.i64(i64 %a)158  ret i64 %tmp159}160 161define i7 @test_bitreverse_i7(i7 %a) nounwind {162; RV32I-LABEL: test_bitreverse_i7:163; RV32I:       # %bb.0:164; RV32I-NEXT:    srli a1, a0, 8165; RV32I-NEXT:    lui a2, 16166; RV32I-NEXT:    srli a3, a0, 24167; RV32I-NEXT:    addi a2, a2, -256168; RV32I-NEXT:    and a1, a1, a2169; RV32I-NEXT:    and a2, a0, a2170; RV32I-NEXT:    slli a0, a0, 24171; RV32I-NEXT:    or a1, a1, a3172; RV32I-NEXT:    lui a3, 61681173; RV32I-NEXT:    slli a2, a2, 8174; RV32I-NEXT:    or a0, a0, a2175; RV32I-NEXT:    lui a2, 209715176; RV32I-NEXT:    addi a3, a3, -241177; RV32I-NEXT:    or a0, a0, a1178; RV32I-NEXT:    srli a1, a0, 4179; RV32I-NEXT:    and a0, a0, a3180; RV32I-NEXT:    and a1, a1, a3181; RV32I-NEXT:    lui a3, 344064182; RV32I-NEXT:    addi a2, a2, 819183; RV32I-NEXT:    slli a0, a0, 4184; RV32I-NEXT:    or a0, a1, a0185; RV32I-NEXT:    srli a1, a0, 2186; RV32I-NEXT:    and a0, a0, a2187; RV32I-NEXT:    and a1, a1, a2188; RV32I-NEXT:    lui a2, 348160189; RV32I-NEXT:    slli a0, a0, 2190; RV32I-NEXT:    or a0, a1, a0191; RV32I-NEXT:    srli a1, a0, 1192; RV32I-NEXT:    and a0, a0, a2193; RV32I-NEXT:    and a1, a1, a3194; RV32I-NEXT:    slli a0, a0, 1195; RV32I-NEXT:    or a0, a1, a0196; RV32I-NEXT:    srli a0, a0, 25197; RV32I-NEXT:    ret198;199; RV64I-LABEL: test_bitreverse_i7:200; RV64I:       # %bb.0:201; RV64I-NEXT:    srli a1, a0, 40202; RV64I-NEXT:    lui a2, 16203; RV64I-NEXT:    srli a3, a0, 56204; RV64I-NEXT:    srli a4, a0, 24205; RV64I-NEXT:    lui a5, 4080206; RV64I-NEXT:    srli a6, a0, 8207; RV64I-NEXT:    srliw a7, a0, 24208; RV64I-NEXT:    addi a2, a2, -256209; RV64I-NEXT:    and a1, a1, a2210; RV64I-NEXT:    or a1, a1, a3211; RV64I-NEXT:    lui a3, 61681212; RV64I-NEXT:    and a4, a4, a5213; RV64I-NEXT:    srliw a6, a6, 24214; RV64I-NEXT:    slli a6, a6, 24215; RV64I-NEXT:    or a4, a6, a4216; RV64I-NEXT:    lui a6, 209715217; RV64I-NEXT:    and a5, a0, a5218; RV64I-NEXT:    slli a7, a7, 32219; RV64I-NEXT:    addi a3, a3, -241220; RV64I-NEXT:    addi a6, a6, 819221; RV64I-NEXT:    slli a5, a5, 24222; RV64I-NEXT:    or a5, a5, a7223; RV64I-NEXT:    slli a7, a3, 32224; RV64I-NEXT:    add a3, a3, a7225; RV64I-NEXT:    slli a7, a6, 32226; RV64I-NEXT:    add a6, a6, a7227; RV64I-NEXT:    or a1, a4, a1228; RV64I-NEXT:    and a2, a0, a2229; RV64I-NEXT:    slli a0, a0, 56230; RV64I-NEXT:    slli a2, a2, 40231; RV64I-NEXT:    or a0, a0, a2232; RV64I-NEXT:    li a2, 21233; RV64I-NEXT:    or a0, a0, a5234; RV64I-NEXT:    li a4, 85235; RV64I-NEXT:    slli a2, a2, 58236; RV64I-NEXT:    slli a4, a4, 56237; RV64I-NEXT:    or a0, a0, a1238; RV64I-NEXT:    srli a1, a0, 4239; RV64I-NEXT:    and a0, a0, a3240; RV64I-NEXT:    and a1, a1, a3241; RV64I-NEXT:    slli a0, a0, 4242; RV64I-NEXT:    or a0, a1, a0243; RV64I-NEXT:    srli a1, a0, 2244; RV64I-NEXT:    and a0, a0, a6245; RV64I-NEXT:    and a1, a1, a6246; RV64I-NEXT:    slli a0, a0, 2247; RV64I-NEXT:    or a0, a1, a0248; RV64I-NEXT:    srli a1, a0, 1249; RV64I-NEXT:    and a0, a0, a4250; RV64I-NEXT:    and a1, a1, a2251; RV64I-NEXT:    slli a0, a0, 1252; RV64I-NEXT:    or a0, a1, a0253; RV64I-NEXT:    srli a0, a0, 57254; RV64I-NEXT:    ret255;256; RV32ZBB-LABEL: test_bitreverse_i7:257; RV32ZBB:       # %bb.0:258; RV32ZBB-NEXT:    rev8 a0, a0259; RV32ZBB-NEXT:    lui a1, 61681260; RV32ZBB-NEXT:    srli a2, a0, 4261; RV32ZBB-NEXT:    addi a1, a1, -241262; RV32ZBB-NEXT:    and a2, a2, a1263; RV32ZBB-NEXT:    and a0, a0, a1264; RV32ZBB-NEXT:    lui a1, 209715265; RV32ZBB-NEXT:    addi a1, a1, 819266; RV32ZBB-NEXT:    slli a0, a0, 4267; RV32ZBB-NEXT:    or a0, a2, a0268; RV32ZBB-NEXT:    srli a2, a0, 2269; RV32ZBB-NEXT:    and a0, a0, a1270; RV32ZBB-NEXT:    and a1, a2, a1271; RV32ZBB-NEXT:    lui a2, 344064272; RV32ZBB-NEXT:    slli a0, a0, 2273; RV32ZBB-NEXT:    or a0, a1, a0274; RV32ZBB-NEXT:    lui a1, 348160275; RV32ZBB-NEXT:    and a1, a0, a1276; RV32ZBB-NEXT:    srli a0, a0, 1277; RV32ZBB-NEXT:    and a0, a0, a2278; RV32ZBB-NEXT:    slli a1, a1, 1279; RV32ZBB-NEXT:    or a0, a0, a1280; RV32ZBB-NEXT:    srli a0, a0, 25281; RV32ZBB-NEXT:    ret282;283; RV64ZBB-LABEL: test_bitreverse_i7:284; RV64ZBB:       # %bb.0:285; RV64ZBB-NEXT:    rev8 a0, a0286; RV64ZBB-NEXT:    lui a1, 61681287; RV64ZBB-NEXT:    lui a2, 209715288; RV64ZBB-NEXT:    addi a1, a1, -241289; RV64ZBB-NEXT:    addi a2, a2, 819290; RV64ZBB-NEXT:    slli a3, a1, 32291; RV64ZBB-NEXT:    add a1, a1, a3292; RV64ZBB-NEXT:    slli a3, a2, 32293; RV64ZBB-NEXT:    add a2, a2, a3294; RV64ZBB-NEXT:    srli a3, a0, 4295; RV64ZBB-NEXT:    and a3, a3, a1296; RV64ZBB-NEXT:    and a0, a0, a1297; RV64ZBB-NEXT:    li a1, 21298; RV64ZBB-NEXT:    slli a0, a0, 4299; RV64ZBB-NEXT:    or a0, a3, a0300; RV64ZBB-NEXT:    srli a3, a0, 2301; RV64ZBB-NEXT:    and a0, a0, a2302; RV64ZBB-NEXT:    and a2, a3, a2303; RV64ZBB-NEXT:    li a3, 85304; RV64ZBB-NEXT:    slli a1, a1, 58305; RV64ZBB-NEXT:    slli a3, a3, 56306; RV64ZBB-NEXT:    slli a0, a0, 2307; RV64ZBB-NEXT:    or a0, a2, a0308; RV64ZBB-NEXT:    srli a2, a0, 1309; RV64ZBB-NEXT:    and a0, a0, a3310; RV64ZBB-NEXT:    and a1, a2, a1311; RV64ZBB-NEXT:    slli a0, a0, 1312; RV64ZBB-NEXT:    or a0, a1, a0313; RV64ZBB-NEXT:    srli a0, a0, 57314; RV64ZBB-NEXT:    ret315;316; RV32ZBKB-LABEL: test_bitreverse_i7:317; RV32ZBKB:       # %bb.0:318; RV32ZBKB-NEXT:    slli a0, a0, 24319; RV32ZBKB-NEXT:    brev8 a0, a0320; RV32ZBKB-NEXT:    srli a0, a0, 25321; RV32ZBKB-NEXT:    ret322;323; RV64ZBKB-LABEL: test_bitreverse_i7:324; RV64ZBKB:       # %bb.0:325; RV64ZBKB-NEXT:    slli a0, a0, 56326; RV64ZBKB-NEXT:    brev8 a0, a0327; RV64ZBKB-NEXT:    srli a0, a0, 57328; RV64ZBKB-NEXT:    ret329  %tmp = call i7 @llvm.bitreverse.i7(i7 %a)330  ret i7 %tmp331}332 333define i8 @test_bitreverse_i8(i8 %a) nounwind {334; RV32I-LABEL: test_bitreverse_i8:335; RV32I:       # %bb.0:336; RV32I-NEXT:    andi a1, a0, 15337; RV32I-NEXT:    slli a0, a0, 24338; RV32I-NEXT:    slli a1, a1, 4339; RV32I-NEXT:    srli a0, a0, 28340; RV32I-NEXT:    or a0, a0, a1341; RV32I-NEXT:    andi a1, a0, 51342; RV32I-NEXT:    srli a0, a0, 2343; RV32I-NEXT:    slli a1, a1, 2344; RV32I-NEXT:    andi a0, a0, 51345; RV32I-NEXT:    or a0, a0, a1346; RV32I-NEXT:    andi a1, a0, 85347; RV32I-NEXT:    srli a0, a0, 1348; RV32I-NEXT:    slli a1, a1, 1349; RV32I-NEXT:    andi a0, a0, 85350; RV32I-NEXT:    or a0, a0, a1351; RV32I-NEXT:    ret352;353; RV64I-LABEL: test_bitreverse_i8:354; RV64I:       # %bb.0:355; RV64I-NEXT:    andi a1, a0, 15356; RV64I-NEXT:    slli a0, a0, 56357; RV64I-NEXT:    slli a1, a1, 4358; RV64I-NEXT:    srli a0, a0, 60359; RV64I-NEXT:    or a0, a0, a1360; RV64I-NEXT:    andi a1, a0, 51361; RV64I-NEXT:    srli a0, a0, 2362; RV64I-NEXT:    slli a1, a1, 2363; RV64I-NEXT:    andi a0, a0, 51364; RV64I-NEXT:    or a0, a0, a1365; RV64I-NEXT:    andi a1, a0, 85366; RV64I-NEXT:    srli a0, a0, 1367; RV64I-NEXT:    slli a1, a1, 1368; RV64I-NEXT:    andi a0, a0, 85369; RV64I-NEXT:    or a0, a0, a1370; RV64I-NEXT:    ret371;372; RV32ZBB-LABEL: test_bitreverse_i8:373; RV32ZBB:       # %bb.0:374; RV32ZBB-NEXT:    andi a1, a0, 15375; RV32ZBB-NEXT:    slli a0, a0, 24376; RV32ZBB-NEXT:    slli a1, a1, 4377; RV32ZBB-NEXT:    srli a0, a0, 28378; RV32ZBB-NEXT:    or a0, a0, a1379; RV32ZBB-NEXT:    andi a1, a0, 51380; RV32ZBB-NEXT:    srli a0, a0, 2381; RV32ZBB-NEXT:    slli a1, a1, 2382; RV32ZBB-NEXT:    andi a0, a0, 51383; RV32ZBB-NEXT:    or a0, a0, a1384; RV32ZBB-NEXT:    andi a1, a0, 85385; RV32ZBB-NEXT:    srli a0, a0, 1386; RV32ZBB-NEXT:    slli a1, a1, 1387; RV32ZBB-NEXT:    andi a0, a0, 85388; RV32ZBB-NEXT:    or a0, a0, a1389; RV32ZBB-NEXT:    ret390;391; RV64ZBB-LABEL: test_bitreverse_i8:392; RV64ZBB:       # %bb.0:393; RV64ZBB-NEXT:    andi a1, a0, 15394; RV64ZBB-NEXT:    slli a0, a0, 56395; RV64ZBB-NEXT:    slli a1, a1, 4396; RV64ZBB-NEXT:    srli a0, a0, 60397; RV64ZBB-NEXT:    or a0, a0, a1398; RV64ZBB-NEXT:    andi a1, a0, 51399; RV64ZBB-NEXT:    srli a0, a0, 2400; RV64ZBB-NEXT:    slli a1, a1, 2401; RV64ZBB-NEXT:    andi a0, a0, 51402; RV64ZBB-NEXT:    or a0, a0, a1403; RV64ZBB-NEXT:    andi a1, a0, 85404; RV64ZBB-NEXT:    srli a0, a0, 1405; RV64ZBB-NEXT:    slli a1, a1, 1406; RV64ZBB-NEXT:    andi a0, a0, 85407; RV64ZBB-NEXT:    or a0, a0, a1408; RV64ZBB-NEXT:    ret409;410; RV32ZBKB-LABEL: test_bitreverse_i8:411; RV32ZBKB:       # %bb.0:412; RV32ZBKB-NEXT:    brev8 a0, a0413; RV32ZBKB-NEXT:    ret414;415; RV64ZBKB-LABEL: test_bitreverse_i8:416; RV64ZBKB:       # %bb.0:417; RV64ZBKB-NEXT:    brev8 a0, a0418; RV64ZBKB-NEXT:    ret419  %tmp = call i8 @llvm.bitreverse.i8(i8 %a)420  ret i8 %tmp421}422 423define i16 @test_bitreverse_i16(i16 %a) nounwind {424; RV32I-LABEL: test_bitreverse_i16:425; RV32I:       # %bb.0:426; RV32I-NEXT:    slli a1, a0, 8427; RV32I-NEXT:    slli a0, a0, 16428; RV32I-NEXT:    lui a2, 1429; RV32I-NEXT:    srli a0, a0, 24430; RV32I-NEXT:    addi a2, a2, -241431; RV32I-NEXT:    or a0, a1, a0432; RV32I-NEXT:    srli a1, a0, 4433; RV32I-NEXT:    and a0, a0, a2434; RV32I-NEXT:    and a1, a1, a2435; RV32I-NEXT:    lui a2, 3436; RV32I-NEXT:    addi a2, a2, 819437; RV32I-NEXT:    slli a0, a0, 4438; RV32I-NEXT:    or a0, a1, a0439; RV32I-NEXT:    srli a1, a0, 2440; RV32I-NEXT:    and a0, a0, a2441; RV32I-NEXT:    and a1, a1, a2442; RV32I-NEXT:    lui a2, 5443; RV32I-NEXT:    addi a2, a2, 1365444; RV32I-NEXT:    slli a0, a0, 2445; RV32I-NEXT:    or a0, a1, a0446; RV32I-NEXT:    srli a1, a0, 1447; RV32I-NEXT:    and a0, a0, a2448; RV32I-NEXT:    and a1, a1, a2449; RV32I-NEXT:    slli a0, a0, 1450; RV32I-NEXT:    or a0, a1, a0451; RV32I-NEXT:    ret452;453; RV64I-LABEL: test_bitreverse_i16:454; RV64I:       # %bb.0:455; RV64I-NEXT:    slli a1, a0, 8456; RV64I-NEXT:    slli a0, a0, 48457; RV64I-NEXT:    lui a2, 1458; RV64I-NEXT:    srli a0, a0, 56459; RV64I-NEXT:    addi a2, a2, -241460; RV64I-NEXT:    or a0, a1, a0461; RV64I-NEXT:    srli a1, a0, 4462; RV64I-NEXT:    and a0, a0, a2463; RV64I-NEXT:    and a1, a1, a2464; RV64I-NEXT:    lui a2, 3465; RV64I-NEXT:    addi a2, a2, 819466; RV64I-NEXT:    slli a0, a0, 4467; RV64I-NEXT:    or a0, a1, a0468; RV64I-NEXT:    srli a1, a0, 2469; RV64I-NEXT:    and a0, a0, a2470; RV64I-NEXT:    and a1, a1, a2471; RV64I-NEXT:    lui a2, 5472; RV64I-NEXT:    addi a2, a2, 1365473; RV64I-NEXT:    slli a0, a0, 2474; RV64I-NEXT:    or a0, a1, a0475; RV64I-NEXT:    srli a1, a0, 1476; RV64I-NEXT:    and a0, a0, a2477; RV64I-NEXT:    and a1, a1, a2478; RV64I-NEXT:    slli a0, a0, 1479; RV64I-NEXT:    or a0, a1, a0480; RV64I-NEXT:    ret481;482; RV32ZBB-LABEL: test_bitreverse_i16:483; RV32ZBB:       # %bb.0:484; RV32ZBB-NEXT:    rev8 a0, a0485; RV32ZBB-NEXT:    lui a1, 15486; RV32ZBB-NEXT:    srli a2, a0, 12487; RV32ZBB-NEXT:    addi a1, a1, 240488; RV32ZBB-NEXT:    and a1, a2, a1489; RV32ZBB-NEXT:    lui a2, 3490; RV32ZBB-NEXT:    srli a0, a0, 20491; RV32ZBB-NEXT:    addi a2, a2, 819492; RV32ZBB-NEXT:    andi a0, a0, -241493; RV32ZBB-NEXT:    or a0, a0, a1494; RV32ZBB-NEXT:    srli a1, a0, 2495; RV32ZBB-NEXT:    and a0, a0, a2496; RV32ZBB-NEXT:    and a1, a1, a2497; RV32ZBB-NEXT:    lui a2, 5498; RV32ZBB-NEXT:    addi a2, a2, 1365499; RV32ZBB-NEXT:    slli a0, a0, 2500; RV32ZBB-NEXT:    or a0, a1, a0501; RV32ZBB-NEXT:    srli a1, a0, 1502; RV32ZBB-NEXT:    and a0, a0, a2503; RV32ZBB-NEXT:    and a1, a1, a2504; RV32ZBB-NEXT:    slli a0, a0, 1505; RV32ZBB-NEXT:    or a0, a1, a0506; RV32ZBB-NEXT:    ret507;508; RV64ZBB-LABEL: test_bitreverse_i16:509; RV64ZBB:       # %bb.0:510; RV64ZBB-NEXT:    rev8 a0, a0511; RV64ZBB-NEXT:    lui a1, 15512; RV64ZBB-NEXT:    srli a2, a0, 44513; RV64ZBB-NEXT:    addi a1, a1, 240514; RV64ZBB-NEXT:    and a1, a2, a1515; RV64ZBB-NEXT:    lui a2, 3516; RV64ZBB-NEXT:    srli a0, a0, 52517; RV64ZBB-NEXT:    addi a2, a2, 819518; RV64ZBB-NEXT:    andi a0, a0, -241519; RV64ZBB-NEXT:    or a0, a0, a1520; RV64ZBB-NEXT:    srli a1, a0, 2521; RV64ZBB-NEXT:    and a0, a0, a2522; RV64ZBB-NEXT:    and a1, a1, a2523; RV64ZBB-NEXT:    lui a2, 5524; RV64ZBB-NEXT:    addi a2, a2, 1365525; RV64ZBB-NEXT:    slli a0, a0, 2526; RV64ZBB-NEXT:    or a0, a1, a0527; RV64ZBB-NEXT:    srli a1, a0, 1528; RV64ZBB-NEXT:    and a0, a0, a2529; RV64ZBB-NEXT:    and a1, a1, a2530; RV64ZBB-NEXT:    slli a0, a0, 1531; RV64ZBB-NEXT:    or a0, a1, a0532; RV64ZBB-NEXT:    ret533;534; RV32ZBKB-LABEL: test_bitreverse_i16:535; RV32ZBKB:       # %bb.0:536; RV32ZBKB-NEXT:    rev8 a0, a0537; RV32ZBKB-NEXT:    brev8 a0, a0538; RV32ZBKB-NEXT:    srli a0, a0, 16539; RV32ZBKB-NEXT:    ret540;541; RV64ZBKB-LABEL: test_bitreverse_i16:542; RV64ZBKB:       # %bb.0:543; RV64ZBKB-NEXT:    rev8 a0, a0544; RV64ZBKB-NEXT:    brev8 a0, a0545; RV64ZBKB-NEXT:    srli a0, a0, 48546; RV64ZBKB-NEXT:    ret547  %tmp = call i16 @llvm.bitreverse.i16(i16 %a)548  ret i16 %tmp549}550 551define i32 @test_bitreverse_i32(i32 %a) nounwind {552; RV32I-LABEL: test_bitreverse_i32:553; RV32I:       # %bb.0:554; RV32I-NEXT:    srli a1, a0, 8555; RV32I-NEXT:    lui a2, 16556; RV32I-NEXT:    srli a3, a0, 24557; RV32I-NEXT:    addi a2, a2, -256558; RV32I-NEXT:    and a1, a1, a2559; RV32I-NEXT:    and a2, a0, a2560; RV32I-NEXT:    slli a0, a0, 24561; RV32I-NEXT:    or a1, a1, a3562; RV32I-NEXT:    lui a3, 61681563; RV32I-NEXT:    slli a2, a2, 8564; RV32I-NEXT:    or a0, a0, a2565; RV32I-NEXT:    lui a2, 209715566; RV32I-NEXT:    addi a3, a3, -241567; RV32I-NEXT:    or a0, a0, a1568; RV32I-NEXT:    srli a1, a0, 4569; RV32I-NEXT:    and a0, a0, a3570; RV32I-NEXT:    and a1, a1, a3571; RV32I-NEXT:    lui a3, 349525572; RV32I-NEXT:    addi a2, a2, 819573; RV32I-NEXT:    addi a3, a3, 1365574; RV32I-NEXT:    slli a0, a0, 4575; RV32I-NEXT:    or a0, a1, a0576; RV32I-NEXT:    srli a1, a0, 2577; RV32I-NEXT:    and a0, a0, a2578; RV32I-NEXT:    and a1, a1, a2579; RV32I-NEXT:    slli a0, a0, 2580; RV32I-NEXT:    or a0, a1, a0581; RV32I-NEXT:    srli a1, a0, 1582; RV32I-NEXT:    and a0, a0, a3583; RV32I-NEXT:    and a1, a1, a3584; RV32I-NEXT:    slli a0, a0, 1585; RV32I-NEXT:    or a0, a1, a0586; RV32I-NEXT:    ret587;588; RV64I-LABEL: test_bitreverse_i32:589; RV64I:       # %bb.0:590; RV64I-NEXT:    srli a1, a0, 8591; RV64I-NEXT:    lui a2, 16592; RV64I-NEXT:    srliw a3, a0, 24593; RV64I-NEXT:    addi a2, a2, -256594; RV64I-NEXT:    and a1, a1, a2595; RV64I-NEXT:    and a2, a0, a2596; RV64I-NEXT:    slliw a0, a0, 24597; RV64I-NEXT:    or a1, a1, a3598; RV64I-NEXT:    lui a3, 61681599; RV64I-NEXT:    slli a2, a2, 8600; RV64I-NEXT:    or a0, a0, a2601; RV64I-NEXT:    lui a2, 209715602; RV64I-NEXT:    addi a3, a3, -241603; RV64I-NEXT:    or a0, a0, a1604; RV64I-NEXT:    srli a1, a0, 4605; RV64I-NEXT:    and a0, a0, a3606; RV64I-NEXT:    and a1, a1, a3607; RV64I-NEXT:    lui a3, 349525608; RV64I-NEXT:    addi a2, a2, 819609; RV64I-NEXT:    addi a3, a3, 1365610; RV64I-NEXT:    slliw a0, a0, 4611; RV64I-NEXT:    or a0, a1, a0612; RV64I-NEXT:    srli a1, a0, 2613; RV64I-NEXT:    and a0, a0, a2614; RV64I-NEXT:    and a1, a1, a2615; RV64I-NEXT:    slliw a0, a0, 2616; RV64I-NEXT:    or a0, a1, a0617; RV64I-NEXT:    srli a1, a0, 1618; RV64I-NEXT:    and a0, a0, a3619; RV64I-NEXT:    and a1, a1, a3620; RV64I-NEXT:    slliw a0, a0, 1621; RV64I-NEXT:    or a0, a1, a0622; RV64I-NEXT:    ret623;624; RV32ZBB-LABEL: test_bitreverse_i32:625; RV32ZBB:       # %bb.0:626; RV32ZBB-NEXT:    rev8 a0, a0627; RV32ZBB-NEXT:    lui a1, 61681628; RV32ZBB-NEXT:    srli a2, a0, 4629; RV32ZBB-NEXT:    addi a1, a1, -241630; RV32ZBB-NEXT:    and a2, a2, a1631; RV32ZBB-NEXT:    and a0, a0, a1632; RV32ZBB-NEXT:    lui a1, 209715633; RV32ZBB-NEXT:    addi a1, a1, 819634; RV32ZBB-NEXT:    slli a0, a0, 4635; RV32ZBB-NEXT:    or a0, a2, a0636; RV32ZBB-NEXT:    srli a2, a0, 2637; RV32ZBB-NEXT:    and a0, a0, a1638; RV32ZBB-NEXT:    and a1, a2, a1639; RV32ZBB-NEXT:    lui a2, 349525640; RV32ZBB-NEXT:    addi a2, a2, 1365641; RV32ZBB-NEXT:    slli a0, a0, 2642; RV32ZBB-NEXT:    or a0, a1, a0643; RV32ZBB-NEXT:    srli a1, a0, 1644; RV32ZBB-NEXT:    and a0, a0, a2645; RV32ZBB-NEXT:    and a1, a1, a2646; RV32ZBB-NEXT:    slli a0, a0, 1647; RV32ZBB-NEXT:    or a0, a1, a0648; RV32ZBB-NEXT:    ret649;650; RV64ZBB-LABEL: test_bitreverse_i32:651; RV64ZBB:       # %bb.0:652; RV64ZBB-NEXT:    rev8 a0, a0653; RV64ZBB-NEXT:    lui a1, 61681654; RV64ZBB-NEXT:    srli a2, a0, 36655; RV64ZBB-NEXT:    addi a1, a1, -241656; RV64ZBB-NEXT:    and a1, a2, a1657; RV64ZBB-NEXT:    lui a2, 986895658; RV64ZBB-NEXT:    srli a0, a0, 28659; RV64ZBB-NEXT:    addi a2, a2, 240660; RV64ZBB-NEXT:    and a0, a0, a2661; RV64ZBB-NEXT:    lui a2, 209715662; RV64ZBB-NEXT:    addi a2, a2, 819663; RV64ZBB-NEXT:    sext.w a0, a0664; RV64ZBB-NEXT:    or a0, a1, a0665; RV64ZBB-NEXT:    srli a1, a0, 2666; RV64ZBB-NEXT:    and a0, a0, a2667; RV64ZBB-NEXT:    and a1, a1, a2668; RV64ZBB-NEXT:    lui a2, 349525669; RV64ZBB-NEXT:    addi a2, a2, 1365670; RV64ZBB-NEXT:    slliw a0, a0, 2671; RV64ZBB-NEXT:    or a0, a1, a0672; RV64ZBB-NEXT:    srli a1, a0, 1673; RV64ZBB-NEXT:    and a0, a0, a2674; RV64ZBB-NEXT:    and a1, a1, a2675; RV64ZBB-NEXT:    slliw a0, a0, 1676; RV64ZBB-NEXT:    or a0, a1, a0677; RV64ZBB-NEXT:    ret678;679; RV32ZBKB-LABEL: test_bitreverse_i32:680; RV32ZBKB:       # %bb.0:681; RV32ZBKB-NEXT:    rev8 a0, a0682; RV32ZBKB-NEXT:    brev8 a0, a0683; RV32ZBKB-NEXT:    ret684;685; RV64ZBKB-LABEL: test_bitreverse_i32:686; RV64ZBKB:       # %bb.0:687; RV64ZBKB-NEXT:    rev8 a0, a0688; RV64ZBKB-NEXT:    brev8 a0, a0689; RV64ZBKB-NEXT:    srli a0, a0, 32690; RV64ZBKB-NEXT:    ret691  %tmp = call i32 @llvm.bitreverse.i32(i32 %a)692  ret i32 %tmp693}694 695define i64 @test_bitreverse_i64(i64 %a) nounwind {696; RV32I-LABEL: test_bitreverse_i64:697; RV32I:       # %bb.0:698; RV32I-NEXT:    srli a2, a1, 8699; RV32I-NEXT:    lui a3, 16700; RV32I-NEXT:    srli a4, a1, 24701; RV32I-NEXT:    slli a5, a1, 24702; RV32I-NEXT:    lui a6, 61681703; RV32I-NEXT:    srli a7, a0, 8704; RV32I-NEXT:    addi a3, a3, -256705; RV32I-NEXT:    and a2, a2, a3706; RV32I-NEXT:    or a2, a2, a4707; RV32I-NEXT:    srli a4, a0, 24708; RV32I-NEXT:    and a7, a7, a3709; RV32I-NEXT:    or a4, a7, a4710; RV32I-NEXT:    lui a7, 209715711; RV32I-NEXT:    and a1, a1, a3712; RV32I-NEXT:    slli a1, a1, 8713; RV32I-NEXT:    or a1, a5, a1714; RV32I-NEXT:    lui a5, 349525715; RV32I-NEXT:    and a3, a0, a3716; RV32I-NEXT:    slli a0, a0, 24717; RV32I-NEXT:    addi a6, a6, -241718; RV32I-NEXT:    addi a7, a7, 819719; RV32I-NEXT:    addi a5, a5, 1365720; RV32I-NEXT:    slli a3, a3, 8721; RV32I-NEXT:    or a0, a0, a3722; RV32I-NEXT:    or a1, a1, a2723; RV32I-NEXT:    or a0, a0, a4724; RV32I-NEXT:    srli a2, a1, 4725; RV32I-NEXT:    and a1, a1, a6726; RV32I-NEXT:    srli a3, a0, 4727; RV32I-NEXT:    and a0, a0, a6728; RV32I-NEXT:    and a2, a2, a6729; RV32I-NEXT:    slli a1, a1, 4730; RV32I-NEXT:    and a3, a3, a6731; RV32I-NEXT:    slli a0, a0, 4732; RV32I-NEXT:    or a1, a2, a1733; RV32I-NEXT:    or a0, a3, a0734; RV32I-NEXT:    srli a2, a1, 2735; RV32I-NEXT:    and a1, a1, a7736; RV32I-NEXT:    srli a3, a0, 2737; RV32I-NEXT:    and a0, a0, a7738; RV32I-NEXT:    and a2, a2, a7739; RV32I-NEXT:    slli a1, a1, 2740; RV32I-NEXT:    and a3, a3, a7741; RV32I-NEXT:    slli a0, a0, 2742; RV32I-NEXT:    or a1, a2, a1743; RV32I-NEXT:    or a0, a3, a0744; RV32I-NEXT:    srli a2, a1, 1745; RV32I-NEXT:    and a1, a1, a5746; RV32I-NEXT:    srli a3, a0, 1747; RV32I-NEXT:    and a0, a0, a5748; RV32I-NEXT:    and a2, a2, a5749; RV32I-NEXT:    slli a1, a1, 1750; RV32I-NEXT:    and a3, a3, a5751; RV32I-NEXT:    slli a4, a0, 1752; RV32I-NEXT:    or a0, a2, a1753; RV32I-NEXT:    or a1, a3, a4754; RV32I-NEXT:    ret755;756; RV64I-LABEL: test_bitreverse_i64:757; RV64I:       # %bb.0:758; RV64I-NEXT:    srli a1, a0, 40759; RV64I-NEXT:    lui a2, 16760; RV64I-NEXT:    srli a3, a0, 56761; RV64I-NEXT:    srli a4, a0, 24762; RV64I-NEXT:    lui a5, 4080763; RV64I-NEXT:    srli a6, a0, 8764; RV64I-NEXT:    srliw a7, a0, 24765; RV64I-NEXT:    lui t0, 61681766; RV64I-NEXT:    addi a2, a2, -256767; RV64I-NEXT:    and a1, a1, a2768; RV64I-NEXT:    or a1, a1, a3769; RV64I-NEXT:    lui a3, 209715770; RV64I-NEXT:    and a4, a4, a5771; RV64I-NEXT:    srliw a6, a6, 24772; RV64I-NEXT:    slli a6, a6, 24773; RV64I-NEXT:    or a4, a6, a4774; RV64I-NEXT:    lui a6, 349525775; RV64I-NEXT:    and a5, a0, a5776; RV64I-NEXT:    slli a7, a7, 32777; RV64I-NEXT:    addi t0, t0, -241778; RV64I-NEXT:    addi a3, a3, 819779; RV64I-NEXT:    addi a6, a6, 1365780; RV64I-NEXT:    slli a5, a5, 24781; RV64I-NEXT:    or a5, a5, a7782; RV64I-NEXT:    slli a7, t0, 32783; RV64I-NEXT:    add a7, t0, a7784; RV64I-NEXT:    slli t0, a3, 32785; RV64I-NEXT:    add a3, a3, t0786; RV64I-NEXT:    slli t0, a6, 32787; RV64I-NEXT:    add a6, a6, t0788; RV64I-NEXT:    or a1, a4, a1789; RV64I-NEXT:    and a2, a0, a2790; RV64I-NEXT:    slli a0, a0, 56791; RV64I-NEXT:    slli a2, a2, 40792; RV64I-NEXT:    or a0, a0, a2793; RV64I-NEXT:    or a0, a0, a5794; RV64I-NEXT:    or a0, a0, a1795; RV64I-NEXT:    srli a1, a0, 4796; RV64I-NEXT:    and a0, a0, a7797; RV64I-NEXT:    and a1, a1, a7798; RV64I-NEXT:    slli a0, a0, 4799; RV64I-NEXT:    or a0, a1, a0800; RV64I-NEXT:    srli a1, a0, 2801; RV64I-NEXT:    and a0, a0, a3802; RV64I-NEXT:    and a1, a1, a3803; RV64I-NEXT:    slli a0, a0, 2804; RV64I-NEXT:    or a0, a1, a0805; RV64I-NEXT:    srli a1, a0, 1806; RV64I-NEXT:    and a0, a0, a6807; RV64I-NEXT:    and a1, a1, a6808; RV64I-NEXT:    slli a0, a0, 1809; RV64I-NEXT:    or a0, a1, a0810; RV64I-NEXT:    ret811;812; RV32ZBB-LABEL: test_bitreverse_i64:813; RV32ZBB:       # %bb.0:814; RV32ZBB-NEXT:    rev8 a1, a1815; RV32ZBB-NEXT:    lui a2, 61681816; RV32ZBB-NEXT:    lui a3, 209715817; RV32ZBB-NEXT:    rev8 a0, a0818; RV32ZBB-NEXT:    srli a4, a1, 4819; RV32ZBB-NEXT:    addi a2, a2, -241820; RV32ZBB-NEXT:    srli a5, a0, 4821; RV32ZBB-NEXT:    and a4, a4, a2822; RV32ZBB-NEXT:    and a1, a1, a2823; RV32ZBB-NEXT:    and a5, a5, a2824; RV32ZBB-NEXT:    and a0, a0, a2825; RV32ZBB-NEXT:    lui a2, 349525826; RV32ZBB-NEXT:    addi a3, a3, 819827; RV32ZBB-NEXT:    addi a2, a2, 1365828; RV32ZBB-NEXT:    slli a1, a1, 4829; RV32ZBB-NEXT:    slli a0, a0, 4830; RV32ZBB-NEXT:    or a1, a4, a1831; RV32ZBB-NEXT:    or a0, a5, a0832; RV32ZBB-NEXT:    srli a4, a1, 2833; RV32ZBB-NEXT:    and a1, a1, a3834; RV32ZBB-NEXT:    srli a5, a0, 2835; RV32ZBB-NEXT:    and a0, a0, a3836; RV32ZBB-NEXT:    and a4, a4, a3837; RV32ZBB-NEXT:    slli a1, a1, 2838; RV32ZBB-NEXT:    and a3, a5, a3839; RV32ZBB-NEXT:    slli a0, a0, 2840; RV32ZBB-NEXT:    or a1, a4, a1841; RV32ZBB-NEXT:    or a0, a3, a0842; RV32ZBB-NEXT:    srli a3, a1, 1843; RV32ZBB-NEXT:    and a1, a1, a2844; RV32ZBB-NEXT:    srli a4, a0, 1845; RV32ZBB-NEXT:    and a0, a0, a2846; RV32ZBB-NEXT:    and a3, a3, a2847; RV32ZBB-NEXT:    slli a1, a1, 1848; RV32ZBB-NEXT:    and a2, a4, a2849; RV32ZBB-NEXT:    slli a4, a0, 1850; RV32ZBB-NEXT:    or a0, a3, a1851; RV32ZBB-NEXT:    or a1, a2, a4852; RV32ZBB-NEXT:    ret853;854; RV64ZBB-LABEL: test_bitreverse_i64:855; RV64ZBB:       # %bb.0:856; RV64ZBB-NEXT:    rev8 a0, a0857; RV64ZBB-NEXT:    lui a1, 61681858; RV64ZBB-NEXT:    lui a2, 209715859; RV64ZBB-NEXT:    lui a3, 349525860; RV64ZBB-NEXT:    addi a1, a1, -241861; RV64ZBB-NEXT:    addi a2, a2, 819862; RV64ZBB-NEXT:    addi a3, a3, 1365863; RV64ZBB-NEXT:    slli a4, a1, 32864; RV64ZBB-NEXT:    add a1, a1, a4865; RV64ZBB-NEXT:    slli a4, a2, 32866; RV64ZBB-NEXT:    add a2, a2, a4867; RV64ZBB-NEXT:    slli a4, a3, 32868; RV64ZBB-NEXT:    add a3, a3, a4869; RV64ZBB-NEXT:    srli a4, a0, 4870; RV64ZBB-NEXT:    and a4, a4, a1871; RV64ZBB-NEXT:    and a0, a0, a1872; RV64ZBB-NEXT:    slli a0, a0, 4873; RV64ZBB-NEXT:    or a0, a4, a0874; RV64ZBB-NEXT:    srli a1, a0, 2875; RV64ZBB-NEXT:    and a0, a0, a2876; RV64ZBB-NEXT:    and a1, a1, a2877; RV64ZBB-NEXT:    slli a0, a0, 2878; RV64ZBB-NEXT:    or a0, a1, a0879; RV64ZBB-NEXT:    srli a1, a0, 1880; RV64ZBB-NEXT:    and a0, a0, a3881; RV64ZBB-NEXT:    and a1, a1, a3882; RV64ZBB-NEXT:    slli a0, a0, 1883; RV64ZBB-NEXT:    or a0, a1, a0884; RV64ZBB-NEXT:    ret885;886; RV32ZBKB-LABEL: test_bitreverse_i64:887; RV32ZBKB:       # %bb.0:888; RV32ZBKB-NEXT:    rev8 a1, a1889; RV32ZBKB-NEXT:    rev8 a2, a0890; RV32ZBKB-NEXT:    brev8 a0, a1891; RV32ZBKB-NEXT:    brev8 a1, a2892; RV32ZBKB-NEXT:    ret893;894; RV64ZBKB-LABEL: test_bitreverse_i64:895; RV64ZBKB:       # %bb.0:896; RV64ZBKB-NEXT:    rev8 a0, a0897; RV64ZBKB-NEXT:    brev8 a0, a0898; RV64ZBKB-NEXT:    ret899  %tmp = call i64 @llvm.bitreverse.i64(i64 %a)900  ret i64 %tmp901}902 903define i16 @test_bswap_bitreverse_i16(i16 %a) nounwind {904; RV32I-LABEL: test_bswap_bitreverse_i16:905; RV32I:       # %bb.0:906; RV32I-NEXT:    srli a1, a0, 4907; RV32I-NEXT:    lui a2, 1908; RV32I-NEXT:    addi a2, a2, -241909; RV32I-NEXT:    and a1, a1, a2910; RV32I-NEXT:    and a0, a0, a2911; RV32I-NEXT:    lui a2, 3912; RV32I-NEXT:    addi a2, a2, 819913; RV32I-NEXT:    slli a0, a0, 4914; RV32I-NEXT:    or a0, a1, a0915; RV32I-NEXT:    srli a1, a0, 2916; RV32I-NEXT:    and a0, a0, a2917; RV32I-NEXT:    and a1, a1, a2918; RV32I-NEXT:    lui a2, 5919; RV32I-NEXT:    addi a2, a2, 1365920; RV32I-NEXT:    slli a0, a0, 2921; RV32I-NEXT:    or a0, a1, a0922; RV32I-NEXT:    srli a1, a0, 1923; RV32I-NEXT:    and a0, a0, a2924; RV32I-NEXT:    and a1, a1, a2925; RV32I-NEXT:    slli a0, a0, 1926; RV32I-NEXT:    or a0, a1, a0927; RV32I-NEXT:    ret928;929; RV64I-LABEL: test_bswap_bitreverse_i16:930; RV64I:       # %bb.0:931; RV64I-NEXT:    srli a1, a0, 4932; RV64I-NEXT:    lui a2, 1933; RV64I-NEXT:    addi a2, a2, -241934; RV64I-NEXT:    and a1, a1, a2935; RV64I-NEXT:    and a0, a0, a2936; RV64I-NEXT:    lui a2, 3937; RV64I-NEXT:    addi a2, a2, 819938; RV64I-NEXT:    slli a0, a0, 4939; RV64I-NEXT:    or a0, a1, a0940; RV64I-NEXT:    srli a1, a0, 2941; RV64I-NEXT:    and a0, a0, a2942; RV64I-NEXT:    and a1, a1, a2943; RV64I-NEXT:    lui a2, 5944; RV64I-NEXT:    addi a2, a2, 1365945; RV64I-NEXT:    slli a0, a0, 2946; RV64I-NEXT:    or a0, a1, a0947; RV64I-NEXT:    srli a1, a0, 1948; RV64I-NEXT:    and a0, a0, a2949; RV64I-NEXT:    and a1, a1, a2950; RV64I-NEXT:    slli a0, a0, 1951; RV64I-NEXT:    or a0, a1, a0952; RV64I-NEXT:    ret953;954; RV32ZBB-LABEL: test_bswap_bitreverse_i16:955; RV32ZBB:       # %bb.0:956; RV32ZBB-NEXT:    srli a1, a0, 4957; RV32ZBB-NEXT:    lui a2, 1958; RV32ZBB-NEXT:    addi a2, a2, -241959; RV32ZBB-NEXT:    and a1, a1, a2960; RV32ZBB-NEXT:    and a0, a0, a2961; RV32ZBB-NEXT:    lui a2, 3962; RV32ZBB-NEXT:    addi a2, a2, 819963; RV32ZBB-NEXT:    slli a0, a0, 4964; RV32ZBB-NEXT:    or a0, a1, a0965; RV32ZBB-NEXT:    srli a1, a0, 2966; RV32ZBB-NEXT:    and a0, a0, a2967; RV32ZBB-NEXT:    and a1, a1, a2968; RV32ZBB-NEXT:    lui a2, 5969; RV32ZBB-NEXT:    addi a2, a2, 1365970; RV32ZBB-NEXT:    slli a0, a0, 2971; RV32ZBB-NEXT:    or a0, a1, a0972; RV32ZBB-NEXT:    srli a1, a0, 1973; RV32ZBB-NEXT:    and a0, a0, a2974; RV32ZBB-NEXT:    and a1, a1, a2975; RV32ZBB-NEXT:    slli a0, a0, 1976; RV32ZBB-NEXT:    or a0, a1, a0977; RV32ZBB-NEXT:    ret978;979; RV64ZBB-LABEL: test_bswap_bitreverse_i16:980; RV64ZBB:       # %bb.0:981; RV64ZBB-NEXT:    srli a1, a0, 4982; RV64ZBB-NEXT:    lui a2, 1983; RV64ZBB-NEXT:    addi a2, a2, -241984; RV64ZBB-NEXT:    and a1, a1, a2985; RV64ZBB-NEXT:    and a0, a0, a2986; RV64ZBB-NEXT:    lui a2, 3987; RV64ZBB-NEXT:    addi a2, a2, 819988; RV64ZBB-NEXT:    slli a0, a0, 4989; RV64ZBB-NEXT:    or a0, a1, a0990; RV64ZBB-NEXT:    srli a1, a0, 2991; RV64ZBB-NEXT:    and a0, a0, a2992; RV64ZBB-NEXT:    and a1, a1, a2993; RV64ZBB-NEXT:    lui a2, 5994; RV64ZBB-NEXT:    addi a2, a2, 1365995; RV64ZBB-NEXT:    slli a0, a0, 2996; RV64ZBB-NEXT:    or a0, a1, a0997; RV64ZBB-NEXT:    srli a1, a0, 1998; RV64ZBB-NEXT:    and a0, a0, a2999; RV64ZBB-NEXT:    and a1, a1, a21000; RV64ZBB-NEXT:    slli a0, a0, 11001; RV64ZBB-NEXT:    or a0, a1, a01002; RV64ZBB-NEXT:    ret1003;1004; RV32ZBKB-LABEL: test_bswap_bitreverse_i16:1005; RV32ZBKB:       # %bb.0:1006; RV32ZBKB-NEXT:    brev8 a0, a01007; RV32ZBKB-NEXT:    ret1008;1009; RV64ZBKB-LABEL: test_bswap_bitreverse_i16:1010; RV64ZBKB:       # %bb.0:1011; RV64ZBKB-NEXT:    brev8 a0, a01012; RV64ZBKB-NEXT:    ret1013  %tmp = call i16 @llvm.bswap.i16(i16 %a)1014  %tmp2 = call i16 @llvm.bitreverse.i16(i16 %tmp)1015  ret i16 %tmp21016}1017 1018define i32 @test_bswap_bitreverse_i32(i32 %a) nounwind {1019; RV32I-LABEL: test_bswap_bitreverse_i32:1020; RV32I:       # %bb.0:1021; RV32I-NEXT:    srli a1, a0, 41022; RV32I-NEXT:    lui a2, 616811023; RV32I-NEXT:    addi a2, a2, -2411024; RV32I-NEXT:    and a1, a1, a21025; RV32I-NEXT:    and a0, a0, a21026; RV32I-NEXT:    lui a2, 2097151027; RV32I-NEXT:    addi a2, a2, 8191028; RV32I-NEXT:    slli a0, a0, 41029; RV32I-NEXT:    or a0, a1, a01030; RV32I-NEXT:    srli a1, a0, 21031; RV32I-NEXT:    and a0, a0, a21032; RV32I-NEXT:    and a1, a1, a21033; RV32I-NEXT:    lui a2, 3495251034; RV32I-NEXT:    addi a2, a2, 13651035; RV32I-NEXT:    slli a0, a0, 21036; RV32I-NEXT:    or a0, a1, a01037; RV32I-NEXT:    srli a1, a0, 11038; RV32I-NEXT:    and a0, a0, a21039; RV32I-NEXT:    and a1, a1, a21040; RV32I-NEXT:    slli a0, a0, 11041; RV32I-NEXT:    or a0, a1, a01042; RV32I-NEXT:    ret1043;1044; RV64I-LABEL: test_bswap_bitreverse_i32:1045; RV64I:       # %bb.0:1046; RV64I-NEXT:    srli a1, a0, 41047; RV64I-NEXT:    lui a2, 616811048; RV64I-NEXT:    addi a2, a2, -2411049; RV64I-NEXT:    and a1, a1, a21050; RV64I-NEXT:    and a0, a0, a21051; RV64I-NEXT:    lui a2, 2097151052; RV64I-NEXT:    addi a2, a2, 8191053; RV64I-NEXT:    slliw a0, a0, 41054; RV64I-NEXT:    or a0, a1, a01055; RV64I-NEXT:    srli a1, a0, 21056; RV64I-NEXT:    and a0, a0, a21057; RV64I-NEXT:    and a1, a1, a21058; RV64I-NEXT:    lui a2, 3495251059; RV64I-NEXT:    addi a2, a2, 13651060; RV64I-NEXT:    slliw a0, a0, 21061; RV64I-NEXT:    or a0, a1, a01062; RV64I-NEXT:    srli a1, a0, 11063; RV64I-NEXT:    and a0, a0, a21064; RV64I-NEXT:    and a1, a1, a21065; RV64I-NEXT:    slliw a0, a0, 11066; RV64I-NEXT:    or a0, a1, a01067; RV64I-NEXT:    ret1068;1069; RV32ZBB-LABEL: test_bswap_bitreverse_i32:1070; RV32ZBB:       # %bb.0:1071; RV32ZBB-NEXT:    srli a1, a0, 41072; RV32ZBB-NEXT:    lui a2, 616811073; RV32ZBB-NEXT:    addi a2, a2, -2411074; RV32ZBB-NEXT:    and a1, a1, a21075; RV32ZBB-NEXT:    and a0, a0, a21076; RV32ZBB-NEXT:    lui a2, 2097151077; RV32ZBB-NEXT:    addi a2, a2, 8191078; RV32ZBB-NEXT:    slli a0, a0, 41079; RV32ZBB-NEXT:    or a0, a1, a01080; RV32ZBB-NEXT:    srli a1, a0, 21081; RV32ZBB-NEXT:    and a0, a0, a21082; RV32ZBB-NEXT:    and a1, a1, a21083; RV32ZBB-NEXT:    lui a2, 3495251084; RV32ZBB-NEXT:    addi a2, a2, 13651085; RV32ZBB-NEXT:    slli a0, a0, 21086; RV32ZBB-NEXT:    or a0, a1, a01087; RV32ZBB-NEXT:    srli a1, a0, 11088; RV32ZBB-NEXT:    and a0, a0, a21089; RV32ZBB-NEXT:    and a1, a1, a21090; RV32ZBB-NEXT:    slli a0, a0, 11091; RV32ZBB-NEXT:    or a0, a1, a01092; RV32ZBB-NEXT:    ret1093;1094; RV64ZBB-LABEL: test_bswap_bitreverse_i32:1095; RV64ZBB:       # %bb.0:1096; RV64ZBB-NEXT:    srli a1, a0, 41097; RV64ZBB-NEXT:    lui a2, 616811098; RV64ZBB-NEXT:    addi a2, a2, -2411099; RV64ZBB-NEXT:    and a1, a1, a21100; RV64ZBB-NEXT:    and a0, a0, a21101; RV64ZBB-NEXT:    lui a2, 2097151102; RV64ZBB-NEXT:    addi a2, a2, 8191103; RV64ZBB-NEXT:    slliw a0, a0, 41104; RV64ZBB-NEXT:    or a0, a1, a01105; RV64ZBB-NEXT:    srli a1, a0, 21106; RV64ZBB-NEXT:    and a0, a0, a21107; RV64ZBB-NEXT:    and a1, a1, a21108; RV64ZBB-NEXT:    lui a2, 3495251109; RV64ZBB-NEXT:    addi a2, a2, 13651110; RV64ZBB-NEXT:    slliw a0, a0, 21111; RV64ZBB-NEXT:    or a0, a1, a01112; RV64ZBB-NEXT:    srli a1, a0, 11113; RV64ZBB-NEXT:    and a0, a0, a21114; RV64ZBB-NEXT:    and a1, a1, a21115; RV64ZBB-NEXT:    slliw a0, a0, 11116; RV64ZBB-NEXT:    or a0, a1, a01117; RV64ZBB-NEXT:    ret1118;1119; RV32ZBKB-LABEL: test_bswap_bitreverse_i32:1120; RV32ZBKB:       # %bb.0:1121; RV32ZBKB-NEXT:    brev8 a0, a01122; RV32ZBKB-NEXT:    ret1123;1124; RV64ZBKB-LABEL: test_bswap_bitreverse_i32:1125; RV64ZBKB:       # %bb.0:1126; RV64ZBKB-NEXT:    brev8 a0, a01127; RV64ZBKB-NEXT:    ret1128  %tmp = call i32 @llvm.bswap.i32(i32 %a)1129  %tmp2 = call i32 @llvm.bitreverse.i32(i32 %tmp)1130  ret i32 %tmp21131}1132 1133define i64 @test_bswap_bitreverse_i64(i64 %a) nounwind {1134; RV32I-LABEL: test_bswap_bitreverse_i64:1135; RV32I:       # %bb.0:1136; RV32I-NEXT:    srli a2, a0, 41137; RV32I-NEXT:    lui a3, 616811138; RV32I-NEXT:    lui a4, 2097151139; RV32I-NEXT:    srli a5, a1, 41140; RV32I-NEXT:    addi a3, a3, -2411141; RV32I-NEXT:    and a2, a2, a31142; RV32I-NEXT:    and a0, a0, a31143; RV32I-NEXT:    and a5, a5, a31144; RV32I-NEXT:    and a1, a1, a31145; RV32I-NEXT:    lui a3, 3495251146; RV32I-NEXT:    addi a4, a4, 8191147; RV32I-NEXT:    addi a3, a3, 13651148; RV32I-NEXT:    slli a0, a0, 41149; RV32I-NEXT:    slli a1, a1, 41150; RV32I-NEXT:    or a0, a2, a01151; RV32I-NEXT:    or a1, a5, a11152; RV32I-NEXT:    srli a2, a0, 21153; RV32I-NEXT:    and a0, a0, a41154; RV32I-NEXT:    srli a5, a1, 21155; RV32I-NEXT:    and a1, a1, a41156; RV32I-NEXT:    and a2, a2, a41157; RV32I-NEXT:    slli a0, a0, 21158; RV32I-NEXT:    and a4, a5, a41159; RV32I-NEXT:    slli a1, a1, 21160; RV32I-NEXT:    or a0, a2, a01161; RV32I-NEXT:    or a1, a4, a11162; RV32I-NEXT:    srli a2, a0, 11163; RV32I-NEXT:    and a0, a0, a31164; RV32I-NEXT:    srli a4, a1, 11165; RV32I-NEXT:    and a1, a1, a31166; RV32I-NEXT:    and a2, a2, a31167; RV32I-NEXT:    slli a0, a0, 11168; RV32I-NEXT:    and a3, a4, a31169; RV32I-NEXT:    slli a1, a1, 11170; RV32I-NEXT:    or a0, a2, a01171; RV32I-NEXT:    or a1, a3, a11172; RV32I-NEXT:    ret1173;1174; RV64I-LABEL: test_bswap_bitreverse_i64:1175; RV64I:       # %bb.0:1176; RV64I-NEXT:    lui a1, 616811177; RV64I-NEXT:    lui a2, 2097151178; RV64I-NEXT:    lui a3, 3495251179; RV64I-NEXT:    addi a1, a1, -2411180; RV64I-NEXT:    addi a2, a2, 8191181; RV64I-NEXT:    addi a3, a3, 13651182; RV64I-NEXT:    slli a4, a1, 321183; RV64I-NEXT:    add a1, a1, a41184; RV64I-NEXT:    slli a4, a2, 321185; RV64I-NEXT:    add a2, a2, a41186; RV64I-NEXT:    slli a4, a3, 321187; RV64I-NEXT:    add a3, a3, a41188; RV64I-NEXT:    srli a4, a0, 41189; RV64I-NEXT:    and a4, a4, a11190; RV64I-NEXT:    and a0, a0, a11191; RV64I-NEXT:    slli a0, a0, 41192; RV64I-NEXT:    or a0, a4, a01193; RV64I-NEXT:    srli a1, a0, 21194; RV64I-NEXT:    and a0, a0, a21195; RV64I-NEXT:    and a1, a1, a21196; RV64I-NEXT:    slli a0, a0, 21197; RV64I-NEXT:    or a0, a1, a01198; RV64I-NEXT:    srli a1, a0, 11199; RV64I-NEXT:    and a0, a0, a31200; RV64I-NEXT:    and a1, a1, a31201; RV64I-NEXT:    slli a0, a0, 11202; RV64I-NEXT:    or a0, a1, a01203; RV64I-NEXT:    ret1204;1205; RV32ZBB-LABEL: test_bswap_bitreverse_i64:1206; RV32ZBB:       # %bb.0:1207; RV32ZBB-NEXT:    srli a2, a0, 41208; RV32ZBB-NEXT:    lui a3, 616811209; RV32ZBB-NEXT:    lui a4, 2097151210; RV32ZBB-NEXT:    srli a5, a1, 41211; RV32ZBB-NEXT:    addi a3, a3, -2411212; RV32ZBB-NEXT:    and a2, a2, a31213; RV32ZBB-NEXT:    and a0, a0, a31214; RV32ZBB-NEXT:    and a5, a5, a31215; RV32ZBB-NEXT:    and a1, a1, a31216; RV32ZBB-NEXT:    lui a3, 3495251217; RV32ZBB-NEXT:    addi a4, a4, 8191218; RV32ZBB-NEXT:    addi a3, a3, 13651219; RV32ZBB-NEXT:    slli a0, a0, 41220; RV32ZBB-NEXT:    slli a1, a1, 41221; RV32ZBB-NEXT:    or a0, a2, a01222; RV32ZBB-NEXT:    or a1, a5, a11223; RV32ZBB-NEXT:    srli a2, a0, 21224; RV32ZBB-NEXT:    and a0, a0, a41225; RV32ZBB-NEXT:    srli a5, a1, 21226; RV32ZBB-NEXT:    and a1, a1, a41227; RV32ZBB-NEXT:    and a2, a2, a41228; RV32ZBB-NEXT:    slli a0, a0, 21229; RV32ZBB-NEXT:    and a4, a5, a41230; RV32ZBB-NEXT:    slli a1, a1, 21231; RV32ZBB-NEXT:    or a0, a2, a01232; RV32ZBB-NEXT:    or a1, a4, a11233; RV32ZBB-NEXT:    srli a2, a0, 11234; RV32ZBB-NEXT:    and a0, a0, a31235; RV32ZBB-NEXT:    srli a4, a1, 11236; RV32ZBB-NEXT:    and a1, a1, a31237; RV32ZBB-NEXT:    and a2, a2, a31238; RV32ZBB-NEXT:    slli a0, a0, 11239; RV32ZBB-NEXT:    and a3, a4, a31240; RV32ZBB-NEXT:    slli a1, a1, 11241; RV32ZBB-NEXT:    or a0, a2, a01242; RV32ZBB-NEXT:    or a1, a3, a11243; RV32ZBB-NEXT:    ret1244;1245; RV64ZBB-LABEL: test_bswap_bitreverse_i64:1246; RV64ZBB:       # %bb.0:1247; RV64ZBB-NEXT:    lui a1, 616811248; RV64ZBB-NEXT:    lui a2, 2097151249; RV64ZBB-NEXT:    lui a3, 3495251250; RV64ZBB-NEXT:    addi a1, a1, -2411251; RV64ZBB-NEXT:    addi a2, a2, 8191252; RV64ZBB-NEXT:    addi a3, a3, 13651253; RV64ZBB-NEXT:    slli a4, a1, 321254; RV64ZBB-NEXT:    add a1, a1, a41255; RV64ZBB-NEXT:    slli a4, a2, 321256; RV64ZBB-NEXT:    add a2, a2, a41257; RV64ZBB-NEXT:    slli a4, a3, 321258; RV64ZBB-NEXT:    add a3, a3, a41259; RV64ZBB-NEXT:    srli a4, a0, 41260; RV64ZBB-NEXT:    and a4, a4, a11261; RV64ZBB-NEXT:    and a0, a0, a11262; RV64ZBB-NEXT:    slli a0, a0, 41263; RV64ZBB-NEXT:    or a0, a4, a01264; RV64ZBB-NEXT:    srli a1, a0, 21265; RV64ZBB-NEXT:    and a0, a0, a21266; RV64ZBB-NEXT:    and a1, a1, a21267; RV64ZBB-NEXT:    slli a0, a0, 21268; RV64ZBB-NEXT:    or a0, a1, a01269; RV64ZBB-NEXT:    srli a1, a0, 11270; RV64ZBB-NEXT:    and a0, a0, a31271; RV64ZBB-NEXT:    and a1, a1, a31272; RV64ZBB-NEXT:    slli a0, a0, 11273; RV64ZBB-NEXT:    or a0, a1, a01274; RV64ZBB-NEXT:    ret1275;1276; RV32ZBKB-LABEL: test_bswap_bitreverse_i64:1277; RV32ZBKB:       # %bb.0:1278; RV32ZBKB-NEXT:    brev8 a0, a01279; RV32ZBKB-NEXT:    brev8 a1, a11280; RV32ZBKB-NEXT:    ret1281;1282; RV64ZBKB-LABEL: test_bswap_bitreverse_i64:1283; RV64ZBKB:       # %bb.0:1284; RV64ZBKB-NEXT:    brev8 a0, a01285; RV64ZBKB-NEXT:    ret1286  %tmp = call i64 @llvm.bswap.i64(i64 %a)1287  %tmp2 = call i64 @llvm.bitreverse.i64(i64 %tmp)1288  ret i64 %tmp21289}1290 1291define i16 @test_bitreverse_bswap_i16(i16 %a) nounwind {1292; RV32I-LABEL: test_bitreverse_bswap_i16:1293; RV32I:       # %bb.0:1294; RV32I-NEXT:    srli a1, a0, 41295; RV32I-NEXT:    lui a2, 11296; RV32I-NEXT:    addi a2, a2, -2411297; RV32I-NEXT:    and a1, a1, a21298; RV32I-NEXT:    and a0, a0, a21299; RV32I-NEXT:    lui a2, 31300; RV32I-NEXT:    addi a2, a2, 8191301; RV32I-NEXT:    slli a0, a0, 41302; RV32I-NEXT:    or a0, a1, a01303; RV32I-NEXT:    srli a1, a0, 21304; RV32I-NEXT:    and a0, a0, a21305; RV32I-NEXT:    and a1, a1, a21306; RV32I-NEXT:    lui a2, 51307; RV32I-NEXT:    addi a2, a2, 13651308; RV32I-NEXT:    slli a0, a0, 21309; RV32I-NEXT:    or a0, a1, a01310; RV32I-NEXT:    srli a1, a0, 11311; RV32I-NEXT:    and a0, a0, a21312; RV32I-NEXT:    and a1, a1, a21313; RV32I-NEXT:    slli a0, a0, 11314; RV32I-NEXT:    or a0, a1, a01315; RV32I-NEXT:    ret1316;1317; RV64I-LABEL: test_bitreverse_bswap_i16:1318; RV64I:       # %bb.0:1319; RV64I-NEXT:    srli a1, a0, 41320; RV64I-NEXT:    lui a2, 11321; RV64I-NEXT:    addi a2, a2, -2411322; RV64I-NEXT:    and a1, a1, a21323; RV64I-NEXT:    and a0, a0, a21324; RV64I-NEXT:    lui a2, 31325; RV64I-NEXT:    addi a2, a2, 8191326; RV64I-NEXT:    slli a0, a0, 41327; RV64I-NEXT:    or a0, a1, a01328; RV64I-NEXT:    srli a1, a0, 21329; RV64I-NEXT:    and a0, a0, a21330; RV64I-NEXT:    and a1, a1, a21331; RV64I-NEXT:    lui a2, 51332; RV64I-NEXT:    addi a2, a2, 13651333; RV64I-NEXT:    slli a0, a0, 21334; RV64I-NEXT:    or a0, a1, a01335; RV64I-NEXT:    srli a1, a0, 11336; RV64I-NEXT:    and a0, a0, a21337; RV64I-NEXT:    and a1, a1, a21338; RV64I-NEXT:    slli a0, a0, 11339; RV64I-NEXT:    or a0, a1, a01340; RV64I-NEXT:    ret1341;1342; RV32ZBB-LABEL: test_bitreverse_bswap_i16:1343; RV32ZBB:       # %bb.0:1344; RV32ZBB-NEXT:    srli a1, a0, 41345; RV32ZBB-NEXT:    lui a2, 11346; RV32ZBB-NEXT:    addi a2, a2, -2411347; RV32ZBB-NEXT:    and a1, a1, a21348; RV32ZBB-NEXT:    and a0, a0, a21349; RV32ZBB-NEXT:    lui a2, 31350; RV32ZBB-NEXT:    addi a2, a2, 8191351; RV32ZBB-NEXT:    slli a0, a0, 41352; RV32ZBB-NEXT:    or a0, a1, a01353; RV32ZBB-NEXT:    srli a1, a0, 21354; RV32ZBB-NEXT:    and a0, a0, a21355; RV32ZBB-NEXT:    and a1, a1, a21356; RV32ZBB-NEXT:    lui a2, 51357; RV32ZBB-NEXT:    addi a2, a2, 13651358; RV32ZBB-NEXT:    slli a0, a0, 21359; RV32ZBB-NEXT:    or a0, a1, a01360; RV32ZBB-NEXT:    srli a1, a0, 11361; RV32ZBB-NEXT:    and a0, a0, a21362; RV32ZBB-NEXT:    and a1, a1, a21363; RV32ZBB-NEXT:    slli a0, a0, 11364; RV32ZBB-NEXT:    or a0, a1, a01365; RV32ZBB-NEXT:    ret1366;1367; RV64ZBB-LABEL: test_bitreverse_bswap_i16:1368; RV64ZBB:       # %bb.0:1369; RV64ZBB-NEXT:    srli a1, a0, 41370; RV64ZBB-NEXT:    lui a2, 11371; RV64ZBB-NEXT:    addi a2, a2, -2411372; RV64ZBB-NEXT:    and a1, a1, a21373; RV64ZBB-NEXT:    and a0, a0, a21374; RV64ZBB-NEXT:    lui a2, 31375; RV64ZBB-NEXT:    addi a2, a2, 8191376; RV64ZBB-NEXT:    slli a0, a0, 41377; RV64ZBB-NEXT:    or a0, a1, a01378; RV64ZBB-NEXT:    srli a1, a0, 21379; RV64ZBB-NEXT:    and a0, a0, a21380; RV64ZBB-NEXT:    and a1, a1, a21381; RV64ZBB-NEXT:    lui a2, 51382; RV64ZBB-NEXT:    addi a2, a2, 13651383; RV64ZBB-NEXT:    slli a0, a0, 21384; RV64ZBB-NEXT:    or a0, a1, a01385; RV64ZBB-NEXT:    srli a1, a0, 11386; RV64ZBB-NEXT:    and a0, a0, a21387; RV64ZBB-NEXT:    and a1, a1, a21388; RV64ZBB-NEXT:    slli a0, a0, 11389; RV64ZBB-NEXT:    or a0, a1, a01390; RV64ZBB-NEXT:    ret1391;1392; RV32ZBKB-LABEL: test_bitreverse_bswap_i16:1393; RV32ZBKB:       # %bb.0:1394; RV32ZBKB-NEXT:    brev8 a0, a01395; RV32ZBKB-NEXT:    ret1396;1397; RV64ZBKB-LABEL: test_bitreverse_bswap_i16:1398; RV64ZBKB:       # %bb.0:1399; RV64ZBKB-NEXT:    brev8 a0, a01400; RV64ZBKB-NEXT:    ret1401  %tmp = call i16 @llvm.bitreverse.i16(i16 %a)1402  %tmp2 = call i16 @llvm.bswap.i16(i16 %tmp)1403  ret i16 %tmp21404}1405 1406define i32 @test_bitreverse_bswap_i32(i32 %a) nounwind {1407; RV32I-LABEL: test_bitreverse_bswap_i32:1408; RV32I:       # %bb.0:1409; RV32I-NEXT:    srli a1, a0, 41410; RV32I-NEXT:    lui a2, 616811411; RV32I-NEXT:    addi a2, a2, -2411412; RV32I-NEXT:    and a1, a1, a21413; RV32I-NEXT:    and a0, a0, a21414; RV32I-NEXT:    lui a2, 2097151415; RV32I-NEXT:    addi a2, a2, 8191416; RV32I-NEXT:    slli a0, a0, 41417; RV32I-NEXT:    or a0, a1, a01418; RV32I-NEXT:    srli a1, a0, 21419; RV32I-NEXT:    and a0, a0, a21420; RV32I-NEXT:    and a1, a1, a21421; RV32I-NEXT:    lui a2, 3495251422; RV32I-NEXT:    addi a2, a2, 13651423; RV32I-NEXT:    slli a0, a0, 21424; RV32I-NEXT:    or a0, a1, a01425; RV32I-NEXT:    srli a1, a0, 11426; RV32I-NEXT:    and a0, a0, a21427; RV32I-NEXT:    and a1, a1, a21428; RV32I-NEXT:    slli a0, a0, 11429; RV32I-NEXT:    or a0, a1, a01430; RV32I-NEXT:    ret1431;1432; RV64I-LABEL: test_bitreverse_bswap_i32:1433; RV64I:       # %bb.0:1434; RV64I-NEXT:    srli a1, a0, 41435; RV64I-NEXT:    lui a2, 616811436; RV64I-NEXT:    addi a2, a2, -2411437; RV64I-NEXT:    and a1, a1, a21438; RV64I-NEXT:    and a0, a0, a21439; RV64I-NEXT:    lui a2, 2097151440; RV64I-NEXT:    addi a2, a2, 8191441; RV64I-NEXT:    slliw a0, a0, 41442; RV64I-NEXT:    or a0, a1, a01443; RV64I-NEXT:    srli a1, a0, 21444; RV64I-NEXT:    and a0, a0, a21445; RV64I-NEXT:    and a1, a1, a21446; RV64I-NEXT:    lui a2, 3495251447; RV64I-NEXT:    addi a2, a2, 13651448; RV64I-NEXT:    slliw a0, a0, 21449; RV64I-NEXT:    or a0, a1, a01450; RV64I-NEXT:    srli a1, a0, 11451; RV64I-NEXT:    and a0, a0, a21452; RV64I-NEXT:    and a1, a1, a21453; RV64I-NEXT:    slliw a0, a0, 11454; RV64I-NEXT:    or a0, a1, a01455; RV64I-NEXT:    ret1456;1457; RV32ZBB-LABEL: test_bitreverse_bswap_i32:1458; RV32ZBB:       # %bb.0:1459; RV32ZBB-NEXT:    srli a1, a0, 41460; RV32ZBB-NEXT:    lui a2, 616811461; RV32ZBB-NEXT:    addi a2, a2, -2411462; RV32ZBB-NEXT:    and a1, a1, a21463; RV32ZBB-NEXT:    and a0, a0, a21464; RV32ZBB-NEXT:    lui a2, 2097151465; RV32ZBB-NEXT:    addi a2, a2, 8191466; RV32ZBB-NEXT:    slli a0, a0, 41467; RV32ZBB-NEXT:    or a0, a1, a01468; RV32ZBB-NEXT:    srli a1, a0, 21469; RV32ZBB-NEXT:    and a0, a0, a21470; RV32ZBB-NEXT:    and a1, a1, a21471; RV32ZBB-NEXT:    lui a2, 3495251472; RV32ZBB-NEXT:    addi a2, a2, 13651473; RV32ZBB-NEXT:    slli a0, a0, 21474; RV32ZBB-NEXT:    or a0, a1, a01475; RV32ZBB-NEXT:    srli a1, a0, 11476; RV32ZBB-NEXT:    and a0, a0, a21477; RV32ZBB-NEXT:    and a1, a1, a21478; RV32ZBB-NEXT:    slli a0, a0, 11479; RV32ZBB-NEXT:    or a0, a1, a01480; RV32ZBB-NEXT:    ret1481;1482; RV64ZBB-LABEL: test_bitreverse_bswap_i32:1483; RV64ZBB:       # %bb.0:1484; RV64ZBB-NEXT:    srli a1, a0, 41485; RV64ZBB-NEXT:    lui a2, 616811486; RV64ZBB-NEXT:    addi a2, a2, -2411487; RV64ZBB-NEXT:    and a1, a1, a21488; RV64ZBB-NEXT:    and a0, a0, a21489; RV64ZBB-NEXT:    lui a2, 2097151490; RV64ZBB-NEXT:    addi a2, a2, 8191491; RV64ZBB-NEXT:    slliw a0, a0, 41492; RV64ZBB-NEXT:    or a0, a1, a01493; RV64ZBB-NEXT:    srli a1, a0, 21494; RV64ZBB-NEXT:    and a0, a0, a21495; RV64ZBB-NEXT:    and a1, a1, a21496; RV64ZBB-NEXT:    lui a2, 3495251497; RV64ZBB-NEXT:    addi a2, a2, 13651498; RV64ZBB-NEXT:    slliw a0, a0, 21499; RV64ZBB-NEXT:    or a0, a1, a01500; RV64ZBB-NEXT:    srli a1, a0, 11501; RV64ZBB-NEXT:    and a0, a0, a21502; RV64ZBB-NEXT:    and a1, a1, a21503; RV64ZBB-NEXT:    slliw a0, a0, 11504; RV64ZBB-NEXT:    or a0, a1, a01505; RV64ZBB-NEXT:    ret1506;1507; RV32ZBKB-LABEL: test_bitreverse_bswap_i32:1508; RV32ZBKB:       # %bb.0:1509; RV32ZBKB-NEXT:    brev8 a0, a01510; RV32ZBKB-NEXT:    ret1511;1512; RV64ZBKB-LABEL: test_bitreverse_bswap_i32:1513; RV64ZBKB:       # %bb.0:1514; RV64ZBKB-NEXT:    brev8 a0, a01515; RV64ZBKB-NEXT:    ret1516  %tmp = call i32 @llvm.bitreverse.i32(i32 %a)1517  %tmp2 = call i32 @llvm.bswap.i32(i32 %tmp)1518  ret i32 %tmp21519}1520 1521define i64 @test_bitreverse_bswap_i64(i64 %a) nounwind {1522; RV32I-LABEL: test_bitreverse_bswap_i64:1523; RV32I:       # %bb.0:1524; RV32I-NEXT:    srli a2, a0, 41525; RV32I-NEXT:    lui a3, 616811526; RV32I-NEXT:    lui a4, 2097151527; RV32I-NEXT:    srli a5, a1, 41528; RV32I-NEXT:    addi a3, a3, -2411529; RV32I-NEXT:    and a2, a2, a31530; RV32I-NEXT:    and a0, a0, a31531; RV32I-NEXT:    and a5, a5, a31532; RV32I-NEXT:    and a1, a1, a31533; RV32I-NEXT:    lui a3, 3495251534; RV32I-NEXT:    addi a4, a4, 8191535; RV32I-NEXT:    addi a3, a3, 13651536; RV32I-NEXT:    slli a0, a0, 41537; RV32I-NEXT:    slli a1, a1, 41538; RV32I-NEXT:    or a0, a2, a01539; RV32I-NEXT:    or a1, a5, a11540; RV32I-NEXT:    srli a2, a0, 21541; RV32I-NEXT:    and a0, a0, a41542; RV32I-NEXT:    srli a5, a1, 21543; RV32I-NEXT:    and a1, a1, a41544; RV32I-NEXT:    and a2, a2, a41545; RV32I-NEXT:    slli a0, a0, 21546; RV32I-NEXT:    and a4, a5, a41547; RV32I-NEXT:    slli a1, a1, 21548; RV32I-NEXT:    or a0, a2, a01549; RV32I-NEXT:    or a1, a4, a11550; RV32I-NEXT:    srli a2, a0, 11551; RV32I-NEXT:    and a0, a0, a31552; RV32I-NEXT:    srli a4, a1, 11553; RV32I-NEXT:    and a1, a1, a31554; RV32I-NEXT:    and a2, a2, a31555; RV32I-NEXT:    slli a0, a0, 11556; RV32I-NEXT:    and a3, a4, a31557; RV32I-NEXT:    slli a1, a1, 11558; RV32I-NEXT:    or a0, a2, a01559; RV32I-NEXT:    or a1, a3, a11560; RV32I-NEXT:    ret1561;1562; RV64I-LABEL: test_bitreverse_bswap_i64:1563; RV64I:       # %bb.0:1564; RV64I-NEXT:    lui a1, 616811565; RV64I-NEXT:    lui a2, 2097151566; RV64I-NEXT:    lui a3, 3495251567; RV64I-NEXT:    addi a1, a1, -2411568; RV64I-NEXT:    addi a2, a2, 8191569; RV64I-NEXT:    addi a3, a3, 13651570; RV64I-NEXT:    slli a4, a1, 321571; RV64I-NEXT:    add a1, a1, a41572; RV64I-NEXT:    slli a4, a2, 321573; RV64I-NEXT:    add a2, a2, a41574; RV64I-NEXT:    slli a4, a3, 321575; RV64I-NEXT:    add a3, a3, a41576; RV64I-NEXT:    srli a4, a0, 41577; RV64I-NEXT:    and a4, a4, a11578; RV64I-NEXT:    and a0, a0, a11579; RV64I-NEXT:    slli a0, a0, 41580; RV64I-NEXT:    or a0, a4, a01581; RV64I-NEXT:    srli a1, a0, 21582; RV64I-NEXT:    and a0, a0, a21583; RV64I-NEXT:    and a1, a1, a21584; RV64I-NEXT:    slli a0, a0, 21585; RV64I-NEXT:    or a0, a1, a01586; RV64I-NEXT:    srli a1, a0, 11587; RV64I-NEXT:    and a0, a0, a31588; RV64I-NEXT:    and a1, a1, a31589; RV64I-NEXT:    slli a0, a0, 11590; RV64I-NEXT:    or a0, a1, a01591; RV64I-NEXT:    ret1592;1593; RV32ZBB-LABEL: test_bitreverse_bswap_i64:1594; RV32ZBB:       # %bb.0:1595; RV32ZBB-NEXT:    srli a2, a0, 41596; RV32ZBB-NEXT:    lui a3, 616811597; RV32ZBB-NEXT:    lui a4, 2097151598; RV32ZBB-NEXT:    srli a5, a1, 41599; RV32ZBB-NEXT:    addi a3, a3, -2411600; RV32ZBB-NEXT:    and a2, a2, a31601; RV32ZBB-NEXT:    and a0, a0, a31602; RV32ZBB-NEXT:    and a5, a5, a31603; RV32ZBB-NEXT:    and a1, a1, a31604; RV32ZBB-NEXT:    lui a3, 3495251605; RV32ZBB-NEXT:    addi a4, a4, 8191606; RV32ZBB-NEXT:    addi a3, a3, 13651607; RV32ZBB-NEXT:    slli a0, a0, 41608; RV32ZBB-NEXT:    slli a1, a1, 41609; RV32ZBB-NEXT:    or a0, a2, a01610; RV32ZBB-NEXT:    or a1, a5, a11611; RV32ZBB-NEXT:    srli a2, a0, 21612; RV32ZBB-NEXT:    and a0, a0, a41613; RV32ZBB-NEXT:    srli a5, a1, 21614; RV32ZBB-NEXT:    and a1, a1, a41615; RV32ZBB-NEXT:    and a2, a2, a41616; RV32ZBB-NEXT:    slli a0, a0, 21617; RV32ZBB-NEXT:    and a4, a5, a41618; RV32ZBB-NEXT:    slli a1, a1, 21619; RV32ZBB-NEXT:    or a0, a2, a01620; RV32ZBB-NEXT:    or a1, a4, a11621; RV32ZBB-NEXT:    srli a2, a0, 11622; RV32ZBB-NEXT:    and a0, a0, a31623; RV32ZBB-NEXT:    srli a4, a1, 11624; RV32ZBB-NEXT:    and a1, a1, a31625; RV32ZBB-NEXT:    and a2, a2, a31626; RV32ZBB-NEXT:    slli a0, a0, 11627; RV32ZBB-NEXT:    and a3, a4, a31628; RV32ZBB-NEXT:    slli a1, a1, 11629; RV32ZBB-NEXT:    or a0, a2, a01630; RV32ZBB-NEXT:    or a1, a3, a11631; RV32ZBB-NEXT:    ret1632;1633; RV64ZBB-LABEL: test_bitreverse_bswap_i64:1634; RV64ZBB:       # %bb.0:1635; RV64ZBB-NEXT:    lui a1, 616811636; RV64ZBB-NEXT:    lui a2, 2097151637; RV64ZBB-NEXT:    lui a3, 3495251638; RV64ZBB-NEXT:    addi a1, a1, -2411639; RV64ZBB-NEXT:    addi a2, a2, 8191640; RV64ZBB-NEXT:    addi a3, a3, 13651641; RV64ZBB-NEXT:    slli a4, a1, 321642; RV64ZBB-NEXT:    add a1, a1, a41643; RV64ZBB-NEXT:    slli a4, a2, 321644; RV64ZBB-NEXT:    add a2, a2, a41645; RV64ZBB-NEXT:    slli a4, a3, 321646; RV64ZBB-NEXT:    add a3, a3, a41647; RV64ZBB-NEXT:    srli a4, a0, 41648; RV64ZBB-NEXT:    and a4, a4, a11649; RV64ZBB-NEXT:    and a0, a0, a11650; RV64ZBB-NEXT:    slli a0, a0, 41651; RV64ZBB-NEXT:    or a0, a4, a01652; RV64ZBB-NEXT:    srli a1, a0, 21653; RV64ZBB-NEXT:    and a0, a0, a21654; RV64ZBB-NEXT:    and a1, a1, a21655; RV64ZBB-NEXT:    slli a0, a0, 21656; RV64ZBB-NEXT:    or a0, a1, a01657; RV64ZBB-NEXT:    srli a1, a0, 11658; RV64ZBB-NEXT:    and a0, a0, a31659; RV64ZBB-NEXT:    and a1, a1, a31660; RV64ZBB-NEXT:    slli a0, a0, 11661; RV64ZBB-NEXT:    or a0, a1, a01662; RV64ZBB-NEXT:    ret1663;1664; RV32ZBKB-LABEL: test_bitreverse_bswap_i64:1665; RV32ZBKB:       # %bb.0:1666; RV32ZBKB-NEXT:    brev8 a0, a01667; RV32ZBKB-NEXT:    brev8 a1, a11668; RV32ZBKB-NEXT:    ret1669;1670; RV64ZBKB-LABEL: test_bitreverse_bswap_i64:1671; RV64ZBKB:       # %bb.0:1672; RV64ZBKB-NEXT:    brev8 a0, a01673; RV64ZBKB-NEXT:    ret1674  %tmp = call i64 @llvm.bitreverse.i64(i64 %a)1675  %tmp2 = call i64 @llvm.bswap.i64(i64 %tmp)1676  ret i64 %tmp21677}1678 1679define i32 @pr55484(i32 %0) {1680; RV32I-LABEL: pr55484:1681; RV32I:       # %bb.0:1682; RV32I-NEXT:    slli a1, a0, 81683; RV32I-NEXT:    slli a0, a0, 241684; RV32I-NEXT:    or a0, a0, a11685; RV32I-NEXT:    srai a0, a0, 161686; RV32I-NEXT:    ret1687;1688; RV64I-LABEL: pr55484:1689; RV64I:       # %bb.0:1690; RV64I-NEXT:    slli a1, a0, 401691; RV64I-NEXT:    slli a0, a0, 561692; RV64I-NEXT:    or a0, a0, a11693; RV64I-NEXT:    srai a0, a0, 481694; RV64I-NEXT:    ret1695;1696; RV32ZBB-LABEL: pr55484:1697; RV32ZBB:       # %bb.0:1698; RV32ZBB-NEXT:    srli a1, a0, 81699; RV32ZBB-NEXT:    slli a0, a0, 81700; RV32ZBB-NEXT:    or a0, a1, a01701; RV32ZBB-NEXT:    sext.h a0, a01702; RV32ZBB-NEXT:    ret1703;1704; RV64ZBB-LABEL: pr55484:1705; RV64ZBB:       # %bb.0:1706; RV64ZBB-NEXT:    srli a1, a0, 81707; RV64ZBB-NEXT:    slli a0, a0, 81708; RV64ZBB-NEXT:    or a0, a1, a01709; RV64ZBB-NEXT:    sext.h a0, a01710; RV64ZBB-NEXT:    ret1711;1712; RV32ZBKB-LABEL: pr55484:1713; RV32ZBKB:       # %bb.0:1714; RV32ZBKB-NEXT:    slli a1, a0, 81715; RV32ZBKB-NEXT:    slli a0, a0, 241716; RV32ZBKB-NEXT:    or a0, a0, a11717; RV32ZBKB-NEXT:    srai a0, a0, 161718; RV32ZBKB-NEXT:    ret1719;1720; RV64ZBKB-LABEL: pr55484:1721; RV64ZBKB:       # %bb.0:1722; RV64ZBKB-NEXT:    slli a1, a0, 401723; RV64ZBKB-NEXT:    slli a0, a0, 561724; RV64ZBKB-NEXT:    or a0, a0, a11725; RV64ZBKB-NEXT:    srai a0, a0, 481726; RV64ZBKB-NEXT:    ret1727  %2 = lshr i32 %0, 81728  %3 = shl i32 %0, 81729  %4 = or i32 %2, %31730  %5 = trunc i32 %4 to i161731  %6 = sext i16 %5 to i321732  ret i32 %61733}1734