3145 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN: | FileCheck %s -check-prefixes=RV32_NOZBB,RV32I4; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \5; RUN: | FileCheck %s -check-prefixes=RV64NOZBB,RV64I6; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \7; RUN: | FileCheck %s -check-prefixes=RV32_NOZBB,RV32M8; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \9; RUN: | FileCheck %s -check-prefixes=RV64NOZBB,RV64M10; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \11; RUN: | FileCheck %s -check-prefix=RV32ZBB12; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \13; RUN: | FileCheck %s -check-prefix=RV64ZBB14; RUN: llc -mtriple=riscv32 -mattr=+xtheadbb -verify-machineinstrs < %s \15; RUN: | FileCheck %s -check-prefix=RV32XTHEADBB16; RUN: llc -mtriple=riscv64 -mattr=+xtheadbb -verify-machineinstrs < %s \17; RUN: | FileCheck %s -check-prefix=RV64XTHEADBB18 19define i8 @test_cttz_i8(i8 %a) nounwind {20; RV32_NOZBB-LABEL: test_cttz_i8:21; RV32_NOZBB: # %bb.0:22; RV32_NOZBB-NEXT: zext.b a1, a023; RV32_NOZBB-NEXT: beqz a1, .LBB0_224; RV32_NOZBB-NEXT: # %bb.1: # %cond.false25; RV32_NOZBB-NEXT: addi a1, a0, -126; RV32_NOZBB-NEXT: not a0, a027; RV32_NOZBB-NEXT: and a0, a0, a128; RV32_NOZBB-NEXT: srli a1, a0, 129; RV32_NOZBB-NEXT: andi a1, a1, 8530; RV32_NOZBB-NEXT: sub a0, a0, a131; RV32_NOZBB-NEXT: andi a1, a0, 5132; RV32_NOZBB-NEXT: srli a0, a0, 233; RV32_NOZBB-NEXT: andi a0, a0, 5134; RV32_NOZBB-NEXT: add a0, a1, a035; RV32_NOZBB-NEXT: srli a1, a0, 436; RV32_NOZBB-NEXT: add a0, a0, a137; RV32_NOZBB-NEXT: andi a0, a0, 1538; RV32_NOZBB-NEXT: ret39; RV32_NOZBB-NEXT: .LBB0_2:40; RV32_NOZBB-NEXT: li a0, 841; RV32_NOZBB-NEXT: ret42;43; RV64NOZBB-LABEL: test_cttz_i8:44; RV64NOZBB: # %bb.0:45; RV64NOZBB-NEXT: zext.b a1, a046; RV64NOZBB-NEXT: beqz a1, .LBB0_247; RV64NOZBB-NEXT: # %bb.1: # %cond.false48; RV64NOZBB-NEXT: addi a1, a0, -149; RV64NOZBB-NEXT: not a0, a050; RV64NOZBB-NEXT: and a0, a0, a151; RV64NOZBB-NEXT: srli a1, a0, 152; RV64NOZBB-NEXT: andi a1, a1, 8553; RV64NOZBB-NEXT: sub a0, a0, a154; RV64NOZBB-NEXT: andi a1, a0, 5155; RV64NOZBB-NEXT: srli a0, a0, 256; RV64NOZBB-NEXT: andi a0, a0, 5157; RV64NOZBB-NEXT: add a0, a1, a058; RV64NOZBB-NEXT: srli a1, a0, 459; RV64NOZBB-NEXT: add a0, a0, a160; RV64NOZBB-NEXT: andi a0, a0, 1561; RV64NOZBB-NEXT: ret62; RV64NOZBB-NEXT: .LBB0_2:63; RV64NOZBB-NEXT: li a0, 864; RV64NOZBB-NEXT: ret65;66; RV32ZBB-LABEL: test_cttz_i8:67; RV32ZBB: # %bb.0:68; RV32ZBB-NEXT: ori a0, a0, 25669; RV32ZBB-NEXT: ctz a0, a070; RV32ZBB-NEXT: ret71;72; RV64ZBB-LABEL: test_cttz_i8:73; RV64ZBB: # %bb.0:74; RV64ZBB-NEXT: ori a0, a0, 25675; RV64ZBB-NEXT: ctz a0, a076; RV64ZBB-NEXT: ret77;78; RV32XTHEADBB-LABEL: test_cttz_i8:79; RV32XTHEADBB: # %bb.0:80; RV32XTHEADBB-NEXT: zext.b a1, a081; RV32XTHEADBB-NEXT: beqz a1, .LBB0_282; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false83; RV32XTHEADBB-NEXT: addi a1, a0, -184; RV32XTHEADBB-NEXT: not a0, a085; RV32XTHEADBB-NEXT: and a0, a0, a186; RV32XTHEADBB-NEXT: th.ff1 a0, a087; RV32XTHEADBB-NEXT: li a1, 3288; RV32XTHEADBB-NEXT: sub a0, a1, a089; RV32XTHEADBB-NEXT: ret90; RV32XTHEADBB-NEXT: .LBB0_2:91; RV32XTHEADBB-NEXT: li a0, 892; RV32XTHEADBB-NEXT: ret93;94; RV64XTHEADBB-LABEL: test_cttz_i8:95; RV64XTHEADBB: # %bb.0:96; RV64XTHEADBB-NEXT: zext.b a1, a097; RV64XTHEADBB-NEXT: beqz a1, .LBB0_298; RV64XTHEADBB-NEXT: # %bb.1: # %cond.false99; RV64XTHEADBB-NEXT: addi a1, a0, -1100; RV64XTHEADBB-NEXT: not a0, a0101; RV64XTHEADBB-NEXT: and a0, a0, a1102; RV64XTHEADBB-NEXT: th.ff1 a0, a0103; RV64XTHEADBB-NEXT: li a1, 64104; RV64XTHEADBB-NEXT: sub a0, a1, a0105; RV64XTHEADBB-NEXT: ret106; RV64XTHEADBB-NEXT: .LBB0_2:107; RV64XTHEADBB-NEXT: li a0, 8108; RV64XTHEADBB-NEXT: ret109 %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 false)110 ret i8 %tmp111}112 113define i16 @test_cttz_i16(i16 %a) nounwind {114; RV32_NOZBB-LABEL: test_cttz_i16:115; RV32_NOZBB: # %bb.0:116; RV32_NOZBB-NEXT: slli a1, a0, 16117; RV32_NOZBB-NEXT: beqz a1, .LBB1_2118; RV32_NOZBB-NEXT: # %bb.1: # %cond.false119; RV32_NOZBB-NEXT: addi a1, a0, -1120; RV32_NOZBB-NEXT: not a0, a0121; RV32_NOZBB-NEXT: lui a2, 5122; RV32_NOZBB-NEXT: and a0, a0, a1123; RV32_NOZBB-NEXT: addi a1, a2, 1365124; RV32_NOZBB-NEXT: srli a2, a0, 1125; RV32_NOZBB-NEXT: and a1, a2, a1126; RV32_NOZBB-NEXT: lui a2, 3127; RV32_NOZBB-NEXT: addi a2, a2, 819128; RV32_NOZBB-NEXT: sub a0, a0, a1129; RV32_NOZBB-NEXT: and a1, a0, a2130; RV32_NOZBB-NEXT: srli a0, a0, 2131; RV32_NOZBB-NEXT: and a0, a0, a2132; RV32_NOZBB-NEXT: add a0, a1, a0133; RV32_NOZBB-NEXT: srli a1, a0, 4134; RV32_NOZBB-NEXT: add a0, a0, a1135; RV32_NOZBB-NEXT: andi a1, a0, 15136; RV32_NOZBB-NEXT: slli a0, a0, 20137; RV32_NOZBB-NEXT: srli a0, a0, 28138; RV32_NOZBB-NEXT: add a0, a1, a0139; RV32_NOZBB-NEXT: ret140; RV32_NOZBB-NEXT: .LBB1_2:141; RV32_NOZBB-NEXT: li a0, 16142; RV32_NOZBB-NEXT: ret143;144; RV64NOZBB-LABEL: test_cttz_i16:145; RV64NOZBB: # %bb.0:146; RV64NOZBB-NEXT: slli a1, a0, 48147; RV64NOZBB-NEXT: beqz a1, .LBB1_2148; RV64NOZBB-NEXT: # %bb.1: # %cond.false149; RV64NOZBB-NEXT: addi a1, a0, -1150; RV64NOZBB-NEXT: not a0, a0151; RV64NOZBB-NEXT: lui a2, 5152; RV64NOZBB-NEXT: and a0, a0, a1153; RV64NOZBB-NEXT: addi a1, a2, 1365154; RV64NOZBB-NEXT: srli a2, a0, 1155; RV64NOZBB-NEXT: and a1, a2, a1156; RV64NOZBB-NEXT: lui a2, 3157; RV64NOZBB-NEXT: addi a2, a2, 819158; RV64NOZBB-NEXT: sub a0, a0, a1159; RV64NOZBB-NEXT: and a1, a0, a2160; RV64NOZBB-NEXT: srli a0, a0, 2161; RV64NOZBB-NEXT: and a0, a0, a2162; RV64NOZBB-NEXT: add a0, a1, a0163; RV64NOZBB-NEXT: srli a1, a0, 4164; RV64NOZBB-NEXT: add a0, a0, a1165; RV64NOZBB-NEXT: andi a1, a0, 15166; RV64NOZBB-NEXT: slli a0, a0, 52167; RV64NOZBB-NEXT: srli a0, a0, 60168; RV64NOZBB-NEXT: add a0, a1, a0169; RV64NOZBB-NEXT: ret170; RV64NOZBB-NEXT: .LBB1_2:171; RV64NOZBB-NEXT: li a0, 16172; RV64NOZBB-NEXT: ret173;174; RV32ZBB-LABEL: test_cttz_i16:175; RV32ZBB: # %bb.0:176; RV32ZBB-NEXT: lui a1, 16177; RV32ZBB-NEXT: or a0, a0, a1178; RV32ZBB-NEXT: ctz a0, a0179; RV32ZBB-NEXT: ret180;181; RV64ZBB-LABEL: test_cttz_i16:182; RV64ZBB: # %bb.0:183; RV64ZBB-NEXT: lui a1, 16184; RV64ZBB-NEXT: or a0, a0, a1185; RV64ZBB-NEXT: ctz a0, a0186; RV64ZBB-NEXT: ret187;188; RV32XTHEADBB-LABEL: test_cttz_i16:189; RV32XTHEADBB: # %bb.0:190; RV32XTHEADBB-NEXT: slli a1, a0, 16191; RV32XTHEADBB-NEXT: beqz a1, .LBB1_2192; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false193; RV32XTHEADBB-NEXT: addi a1, a0, -1194; RV32XTHEADBB-NEXT: not a0, a0195; RV32XTHEADBB-NEXT: and a0, a0, a1196; RV32XTHEADBB-NEXT: th.ff1 a0, a0197; RV32XTHEADBB-NEXT: li a1, 32198; RV32XTHEADBB-NEXT: sub a0, a1, a0199; RV32XTHEADBB-NEXT: ret200; RV32XTHEADBB-NEXT: .LBB1_2:201; RV32XTHEADBB-NEXT: li a0, 16202; RV32XTHEADBB-NEXT: ret203;204; RV64XTHEADBB-LABEL: test_cttz_i16:205; RV64XTHEADBB: # %bb.0:206; RV64XTHEADBB-NEXT: slli a1, a0, 48207; RV64XTHEADBB-NEXT: beqz a1, .LBB1_2208; RV64XTHEADBB-NEXT: # %bb.1: # %cond.false209; RV64XTHEADBB-NEXT: addi a1, a0, -1210; RV64XTHEADBB-NEXT: not a0, a0211; RV64XTHEADBB-NEXT: and a0, a0, a1212; RV64XTHEADBB-NEXT: th.ff1 a0, a0213; RV64XTHEADBB-NEXT: li a1, 64214; RV64XTHEADBB-NEXT: sub a0, a1, a0215; RV64XTHEADBB-NEXT: ret216; RV64XTHEADBB-NEXT: .LBB1_2:217; RV64XTHEADBB-NEXT: li a0, 16218; RV64XTHEADBB-NEXT: ret219 %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 false)220 ret i16 %tmp221}222 223define i32 @test_cttz_i32(i32 %a) nounwind {224; RV32I-LABEL: test_cttz_i32:225; RV32I: # %bb.0:226; RV32I-NEXT: beqz a0, .LBB2_2227; RV32I-NEXT: # %bb.1: # %cond.false228; RV32I-NEXT: addi sp, sp, -16229; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill230; RV32I-NEXT: neg a1, a0231; RV32I-NEXT: and a0, a0, a1232; RV32I-NEXT: lui a1, 30667233; RV32I-NEXT: addi a1, a1, 1329234; RV32I-NEXT: call __mulsi3235; RV32I-NEXT: srli a0, a0, 27236; RV32I-NEXT: lui a1, %hi(.LCPI2_0)237; RV32I-NEXT: addi a1, a1, %lo(.LCPI2_0)238; RV32I-NEXT: add a0, a1, a0239; RV32I-NEXT: lbu a0, 0(a0)240; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload241; RV32I-NEXT: addi sp, sp, 16242; RV32I-NEXT: ret243; RV32I-NEXT: .LBB2_2:244; RV32I-NEXT: li a0, 32245; RV32I-NEXT: ret246;247; RV64I-LABEL: test_cttz_i32:248; RV64I: # %bb.0:249; RV64I-NEXT: sext.w a1, a0250; RV64I-NEXT: beqz a1, .LBB2_2251; RV64I-NEXT: # %bb.1: # %cond.false252; RV64I-NEXT: neg a1, a0253; RV64I-NEXT: and a0, a0, a1254; RV64I-NEXT: slli a1, a0, 6255; RV64I-NEXT: slli a2, a0, 8256; RV64I-NEXT: slli a3, a0, 10257; RV64I-NEXT: slli a4, a0, 12258; RV64I-NEXT: add a1, a1, a2259; RV64I-NEXT: slli a2, a0, 16260; RV64I-NEXT: sub a3, a3, a4261; RV64I-NEXT: slli a4, a0, 18262; RV64I-NEXT: sub a2, a2, a4263; RV64I-NEXT: slli a4, a0, 4264; RV64I-NEXT: sub a4, a0, a4265; RV64I-NEXT: add a1, a4, a1266; RV64I-NEXT: slli a4, a0, 14267; RV64I-NEXT: sub a3, a3, a4268; RV64I-NEXT: slli a4, a0, 23269; RV64I-NEXT: sub a2, a2, a4270; RV64I-NEXT: slli a0, a0, 27271; RV64I-NEXT: add a1, a1, a3272; RV64I-NEXT: add a0, a2, a0273; RV64I-NEXT: add a0, a1, a0274; RV64I-NEXT: srliw a0, a0, 27275; RV64I-NEXT: lui a1, %hi(.LCPI2_0)276; RV64I-NEXT: addi a1, a1, %lo(.LCPI2_0)277; RV64I-NEXT: add a0, a1, a0278; RV64I-NEXT: lbu a0, 0(a0)279; RV64I-NEXT: ret280; RV64I-NEXT: .LBB2_2:281; RV64I-NEXT: li a0, 32282; RV64I-NEXT: ret283;284; RV32M-LABEL: test_cttz_i32:285; RV32M: # %bb.0:286; RV32M-NEXT: beqz a0, .LBB2_2287; RV32M-NEXT: # %bb.1: # %cond.false288; RV32M-NEXT: neg a1, a0289; RV32M-NEXT: and a0, a0, a1290; RV32M-NEXT: lui a1, 30667291; RV32M-NEXT: addi a1, a1, 1329292; RV32M-NEXT: mul a0, a0, a1293; RV32M-NEXT: srli a0, a0, 27294; RV32M-NEXT: lui a1, %hi(.LCPI2_0)295; RV32M-NEXT: addi a1, a1, %lo(.LCPI2_0)296; RV32M-NEXT: add a0, a1, a0297; RV32M-NEXT: lbu a0, 0(a0)298; RV32M-NEXT: ret299; RV32M-NEXT: .LBB2_2:300; RV32M-NEXT: li a0, 32301; RV32M-NEXT: ret302;303; RV64M-LABEL: test_cttz_i32:304; RV64M: # %bb.0:305; RV64M-NEXT: sext.w a1, a0306; RV64M-NEXT: beqz a1, .LBB2_2307; RV64M-NEXT: # %bb.1: # %cond.false308; RV64M-NEXT: neg a1, a0309; RV64M-NEXT: and a0, a0, a1310; RV64M-NEXT: lui a1, 30667311; RV64M-NEXT: addi a1, a1, 1329312; RV64M-NEXT: mul a0, a0, a1313; RV64M-NEXT: srliw a0, a0, 27314; RV64M-NEXT: lui a1, %hi(.LCPI2_0)315; RV64M-NEXT: addi a1, a1, %lo(.LCPI2_0)316; RV64M-NEXT: add a0, a1, a0317; RV64M-NEXT: lbu a0, 0(a0)318; RV64M-NEXT: ret319; RV64M-NEXT: .LBB2_2:320; RV64M-NEXT: li a0, 32321; RV64M-NEXT: ret322;323; RV32ZBB-LABEL: test_cttz_i32:324; RV32ZBB: # %bb.0:325; RV32ZBB-NEXT: ctz a0, a0326; RV32ZBB-NEXT: ret327;328; RV64ZBB-LABEL: test_cttz_i32:329; RV64ZBB: # %bb.0:330; RV64ZBB-NEXT: ctzw a0, a0331; RV64ZBB-NEXT: ret332;333; RV32XTHEADBB-LABEL: test_cttz_i32:334; RV32XTHEADBB: # %bb.0:335; RV32XTHEADBB-NEXT: beqz a0, .LBB2_2336; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false337; RV32XTHEADBB-NEXT: addi a1, a0, -1338; RV32XTHEADBB-NEXT: not a0, a0339; RV32XTHEADBB-NEXT: and a0, a0, a1340; RV32XTHEADBB-NEXT: th.ff1 a0, a0341; RV32XTHEADBB-NEXT: li a1, 32342; RV32XTHEADBB-NEXT: sub a0, a1, a0343; RV32XTHEADBB-NEXT: ret344; RV32XTHEADBB-NEXT: .LBB2_2:345; RV32XTHEADBB-NEXT: li a0, 32346; RV32XTHEADBB-NEXT: ret347;348; RV64XTHEADBB-LABEL: test_cttz_i32:349; RV64XTHEADBB: # %bb.0:350; RV64XTHEADBB-NEXT: sext.w a1, a0351; RV64XTHEADBB-NEXT: beqz a1, .LBB2_2352; RV64XTHEADBB-NEXT: # %bb.1: # %cond.false353; RV64XTHEADBB-NEXT: addi a1, a0, -1354; RV64XTHEADBB-NEXT: not a0, a0355; RV64XTHEADBB-NEXT: and a0, a0, a1356; RV64XTHEADBB-NEXT: th.ff1 a0, a0357; RV64XTHEADBB-NEXT: li a1, 64358; RV64XTHEADBB-NEXT: sub a0, a1, a0359; RV64XTHEADBB-NEXT: ret360; RV64XTHEADBB-NEXT: .LBB2_2:361; RV64XTHEADBB-NEXT: li a0, 32362; RV64XTHEADBB-NEXT: ret363 %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 false)364 ret i32 %tmp365}366 367define i64 @test_cttz_i64(i64 %a) nounwind {368; RV32I-LABEL: test_cttz_i64:369; RV32I: # %bb.0:370; RV32I-NEXT: addi sp, sp, -32371; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill372; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill373; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill374; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill375; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill376; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill377; RV32I-NEXT: mv s0, a1378; RV32I-NEXT: or a1, a0, a1379; RV32I-NEXT: beqz a1, .LBB3_3380; RV32I-NEXT: # %bb.1: # %cond.false381; RV32I-NEXT: neg a1, a0382; RV32I-NEXT: and a1, a0, a1383; RV32I-NEXT: lui s2, 30667384; RV32I-NEXT: addi s2, s2, 1329385; RV32I-NEXT: mv s4, a0386; RV32I-NEXT: mv a0, a1387; RV32I-NEXT: mv a1, s2388; RV32I-NEXT: call __mulsi3389; RV32I-NEXT: mv s1, a0390; RV32I-NEXT: lui s3, %hi(.LCPI3_0)391; RV32I-NEXT: addi s3, s3, %lo(.LCPI3_0)392; RV32I-NEXT: neg a0, s0393; RV32I-NEXT: and a0, s0, a0394; RV32I-NEXT: mv a1, s2395; RV32I-NEXT: call __mulsi3396; RV32I-NEXT: bnez s4, .LBB3_4397; RV32I-NEXT: # %bb.2: # %cond.false398; RV32I-NEXT: srli a0, a0, 27399; RV32I-NEXT: add a0, s3, a0400; RV32I-NEXT: lbu a0, 0(a0)401; RV32I-NEXT: addi a0, a0, 32402; RV32I-NEXT: j .LBB3_5403; RV32I-NEXT: .LBB3_3:404; RV32I-NEXT: li a0, 64405; RV32I-NEXT: j .LBB3_6406; RV32I-NEXT: .LBB3_4:407; RV32I-NEXT: srli s1, s1, 27408; RV32I-NEXT: add s1, s3, s1409; RV32I-NEXT: lbu a0, 0(s1)410; RV32I-NEXT: .LBB3_5: # %cond.false411; RV32I-NEXT: li a1, 0412; RV32I-NEXT: .LBB3_6: # %cond.end413; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload414; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload415; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload416; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload417; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload418; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload419; RV32I-NEXT: addi sp, sp, 32420; RV32I-NEXT: ret421;422; RV64I-LABEL: test_cttz_i64:423; RV64I: # %bb.0:424; RV64I-NEXT: beqz a0, .LBB3_2425; RV64I-NEXT: # %bb.1: # %cond.false426; RV64I-NEXT: addi sp, sp, -16427; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill428; RV64I-NEXT: neg a1, a0429; RV64I-NEXT: and a0, a0, a1430; RV64I-NEXT: lui a1, %hi(.LCPI3_0)431; RV64I-NEXT: ld a1, %lo(.LCPI3_0)(a1)432; RV64I-NEXT: call __muldi3433; RV64I-NEXT: srli a0, a0, 58434; RV64I-NEXT: lui a1, %hi(.LCPI3_1)435; RV64I-NEXT: addi a1, a1, %lo(.LCPI3_1)436; RV64I-NEXT: add a0, a1, a0437; RV64I-NEXT: lbu a0, 0(a0)438; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload439; RV64I-NEXT: addi sp, sp, 16440; RV64I-NEXT: ret441; RV64I-NEXT: .LBB3_2:442; RV64I-NEXT: li a0, 64443; RV64I-NEXT: ret444;445; RV32M-LABEL: test_cttz_i64:446; RV32M: # %bb.0:447; RV32M-NEXT: or a2, a0, a1448; RV32M-NEXT: beqz a2, .LBB3_3449; RV32M-NEXT: # %bb.1: # %cond.false450; RV32M-NEXT: lui a3, 30667451; RV32M-NEXT: addi a3, a3, 1329452; RV32M-NEXT: lui a2, %hi(.LCPI3_0)453; RV32M-NEXT: addi a2, a2, %lo(.LCPI3_0)454; RV32M-NEXT: bnez a0, .LBB3_4455; RV32M-NEXT: # %bb.2: # %cond.false456; RV32M-NEXT: neg a0, a1457; RV32M-NEXT: and a0, a1, a0458; RV32M-NEXT: mul a0, a0, a3459; RV32M-NEXT: srli a0, a0, 27460; RV32M-NEXT: add a0, a2, a0461; RV32M-NEXT: lbu a0, 0(a0)462; RV32M-NEXT: addi a0, a0, 32463; RV32M-NEXT: li a1, 0464; RV32M-NEXT: ret465; RV32M-NEXT: .LBB3_3:466; RV32M-NEXT: li a1, 0467; RV32M-NEXT: li a0, 64468; RV32M-NEXT: ret469; RV32M-NEXT: .LBB3_4:470; RV32M-NEXT: neg a1, a0471; RV32M-NEXT: and a0, a0, a1472; RV32M-NEXT: mul a0, a0, a3473; RV32M-NEXT: srli a0, a0, 27474; RV32M-NEXT: add a0, a2, a0475; RV32M-NEXT: lbu a0, 0(a0)476; RV32M-NEXT: li a1, 0477; RV32M-NEXT: ret478;479; RV64M-LABEL: test_cttz_i64:480; RV64M: # %bb.0:481; RV64M-NEXT: beqz a0, .LBB3_2482; RV64M-NEXT: # %bb.1: # %cond.false483; RV64M-NEXT: lui a1, %hi(.LCPI3_0)484; RV64M-NEXT: ld a1, %lo(.LCPI3_0)(a1)485; RV64M-NEXT: neg a2, a0486; RV64M-NEXT: and a0, a0, a2487; RV64M-NEXT: mul a0, a0, a1488; RV64M-NEXT: srli a0, a0, 58489; RV64M-NEXT: lui a1, %hi(.LCPI3_1)490; RV64M-NEXT: addi a1, a1, %lo(.LCPI3_1)491; RV64M-NEXT: add a0, a1, a0492; RV64M-NEXT: lbu a0, 0(a0)493; RV64M-NEXT: ret494; RV64M-NEXT: .LBB3_2:495; RV64M-NEXT: li a0, 64496; RV64M-NEXT: ret497;498; RV32ZBB-LABEL: test_cttz_i64:499; RV32ZBB: # %bb.0:500; RV32ZBB-NEXT: bnez a0, .LBB3_2501; RV32ZBB-NEXT: # %bb.1:502; RV32ZBB-NEXT: ctz a0, a1503; RV32ZBB-NEXT: addi a0, a0, 32504; RV32ZBB-NEXT: li a1, 0505; RV32ZBB-NEXT: ret506; RV32ZBB-NEXT: .LBB3_2:507; RV32ZBB-NEXT: ctz a0, a0508; RV32ZBB-NEXT: li a1, 0509; RV32ZBB-NEXT: ret510;511; RV64ZBB-LABEL: test_cttz_i64:512; RV64ZBB: # %bb.0:513; RV64ZBB-NEXT: ctz a0, a0514; RV64ZBB-NEXT: ret515;516; RV32XTHEADBB-LABEL: test_cttz_i64:517; RV32XTHEADBB: # %bb.0:518; RV32XTHEADBB-NEXT: or a2, a0, a1519; RV32XTHEADBB-NEXT: beqz a2, .LBB3_3520; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false521; RV32XTHEADBB-NEXT: bnez a0, .LBB3_4522; RV32XTHEADBB-NEXT: # %bb.2: # %cond.false523; RV32XTHEADBB-NEXT: addi a0, a1, -1524; RV32XTHEADBB-NEXT: not a1, a1525; RV32XTHEADBB-NEXT: and a0, a1, a0526; RV32XTHEADBB-NEXT: th.ff1 a0, a0527; RV32XTHEADBB-NEXT: li a1, 64528; RV32XTHEADBB-NEXT: j .LBB3_5529; RV32XTHEADBB-NEXT: .LBB3_3:530; RV32XTHEADBB-NEXT: li a1, 0531; RV32XTHEADBB-NEXT: li a0, 64532; RV32XTHEADBB-NEXT: ret533; RV32XTHEADBB-NEXT: .LBB3_4:534; RV32XTHEADBB-NEXT: addi a1, a0, -1535; RV32XTHEADBB-NEXT: not a0, a0536; RV32XTHEADBB-NEXT: and a0, a0, a1537; RV32XTHEADBB-NEXT: th.ff1 a0, a0538; RV32XTHEADBB-NEXT: li a1, 32539; RV32XTHEADBB-NEXT: .LBB3_5: # %cond.false540; RV32XTHEADBB-NEXT: sub a0, a1, a0541; RV32XTHEADBB-NEXT: li a1, 0542; RV32XTHEADBB-NEXT: ret543;544; RV64XTHEADBB-LABEL: test_cttz_i64:545; RV64XTHEADBB: # %bb.0:546; RV64XTHEADBB-NEXT: beqz a0, .LBB3_2547; RV64XTHEADBB-NEXT: # %bb.1: # %cond.false548; RV64XTHEADBB-NEXT: addi a1, a0, -1549; RV64XTHEADBB-NEXT: not a0, a0550; RV64XTHEADBB-NEXT: and a0, a0, a1551; RV64XTHEADBB-NEXT: th.ff1 a0, a0552; RV64XTHEADBB-NEXT: li a1, 64553; RV64XTHEADBB-NEXT: sub a0, a1, a0554; RV64XTHEADBB-NEXT: ret555; RV64XTHEADBB-NEXT: .LBB3_2:556; RV64XTHEADBB-NEXT: li a0, 64557; RV64XTHEADBB-NEXT: ret558 %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 false)559 ret i64 %tmp560}561 562define i8 @test_cttz_i8_zero_undef(i8 %a) nounwind {563; RV32_NOZBB-LABEL: test_cttz_i8_zero_undef:564; RV32_NOZBB: # %bb.0:565; RV32_NOZBB-NEXT: addi a1, a0, -1566; RV32_NOZBB-NEXT: not a0, a0567; RV32_NOZBB-NEXT: and a0, a0, a1568; RV32_NOZBB-NEXT: srli a1, a0, 1569; RV32_NOZBB-NEXT: andi a1, a1, 85570; RV32_NOZBB-NEXT: sub a0, a0, a1571; RV32_NOZBB-NEXT: andi a1, a0, 51572; RV32_NOZBB-NEXT: srli a0, a0, 2573; RV32_NOZBB-NEXT: andi a0, a0, 51574; RV32_NOZBB-NEXT: add a0, a1, a0575; RV32_NOZBB-NEXT: srli a1, a0, 4576; RV32_NOZBB-NEXT: add a0, a0, a1577; RV32_NOZBB-NEXT: andi a0, a0, 15578; RV32_NOZBB-NEXT: ret579;580; RV64NOZBB-LABEL: test_cttz_i8_zero_undef:581; RV64NOZBB: # %bb.0:582; RV64NOZBB-NEXT: addi a1, a0, -1583; RV64NOZBB-NEXT: not a0, a0584; RV64NOZBB-NEXT: and a0, a0, a1585; RV64NOZBB-NEXT: srli a1, a0, 1586; RV64NOZBB-NEXT: andi a1, a1, 85587; RV64NOZBB-NEXT: sub a0, a0, a1588; RV64NOZBB-NEXT: andi a1, a0, 51589; RV64NOZBB-NEXT: srli a0, a0, 2590; RV64NOZBB-NEXT: andi a0, a0, 51591; RV64NOZBB-NEXT: add a0, a1, a0592; RV64NOZBB-NEXT: srli a1, a0, 4593; RV64NOZBB-NEXT: add a0, a0, a1594; RV64NOZBB-NEXT: andi a0, a0, 15595; RV64NOZBB-NEXT: ret596;597; RV32ZBB-LABEL: test_cttz_i8_zero_undef:598; RV32ZBB: # %bb.0:599; RV32ZBB-NEXT: ctz a0, a0600; RV32ZBB-NEXT: ret601;602; RV64ZBB-LABEL: test_cttz_i8_zero_undef:603; RV64ZBB: # %bb.0:604; RV64ZBB-NEXT: ctz a0, a0605; RV64ZBB-NEXT: ret606;607; RV32XTHEADBB-LABEL: test_cttz_i8_zero_undef:608; RV32XTHEADBB: # %bb.0:609; RV32XTHEADBB-NEXT: addi a1, a0, -1610; RV32XTHEADBB-NEXT: not a0, a0611; RV32XTHEADBB-NEXT: and a0, a0, a1612; RV32XTHEADBB-NEXT: th.ff1 a0, a0613; RV32XTHEADBB-NEXT: li a1, 32614; RV32XTHEADBB-NEXT: sub a0, a1, a0615; RV32XTHEADBB-NEXT: ret616;617; RV64XTHEADBB-LABEL: test_cttz_i8_zero_undef:618; RV64XTHEADBB: # %bb.0:619; RV64XTHEADBB-NEXT: addi a1, a0, -1620; RV64XTHEADBB-NEXT: not a0, a0621; RV64XTHEADBB-NEXT: and a0, a0, a1622; RV64XTHEADBB-NEXT: th.ff1 a0, a0623; RV64XTHEADBB-NEXT: li a1, 64624; RV64XTHEADBB-NEXT: sub a0, a1, a0625; RV64XTHEADBB-NEXT: ret626 %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 true)627 ret i8 %tmp628}629 630define i16 @test_cttz_i16_zero_undef(i16 %a) nounwind {631; RV32_NOZBB-LABEL: test_cttz_i16_zero_undef:632; RV32_NOZBB: # %bb.0:633; RV32_NOZBB-NEXT: addi a1, a0, -1634; RV32_NOZBB-NEXT: not a0, a0635; RV32_NOZBB-NEXT: lui a2, 5636; RV32_NOZBB-NEXT: and a0, a0, a1637; RV32_NOZBB-NEXT: addi a1, a2, 1365638; RV32_NOZBB-NEXT: srli a2, a0, 1639; RV32_NOZBB-NEXT: and a1, a2, a1640; RV32_NOZBB-NEXT: lui a2, 3641; RV32_NOZBB-NEXT: addi a2, a2, 819642; RV32_NOZBB-NEXT: sub a0, a0, a1643; RV32_NOZBB-NEXT: and a1, a0, a2644; RV32_NOZBB-NEXT: srli a0, a0, 2645; RV32_NOZBB-NEXT: and a0, a0, a2646; RV32_NOZBB-NEXT: add a0, a1, a0647; RV32_NOZBB-NEXT: srli a1, a0, 4648; RV32_NOZBB-NEXT: add a0, a0, a1649; RV32_NOZBB-NEXT: andi a1, a0, 15650; RV32_NOZBB-NEXT: slli a0, a0, 20651; RV32_NOZBB-NEXT: srli a0, a0, 28652; RV32_NOZBB-NEXT: add a0, a1, a0653; RV32_NOZBB-NEXT: ret654;655; RV64NOZBB-LABEL: test_cttz_i16_zero_undef:656; RV64NOZBB: # %bb.0:657; RV64NOZBB-NEXT: addi a1, a0, -1658; RV64NOZBB-NEXT: not a0, a0659; RV64NOZBB-NEXT: lui a2, 5660; RV64NOZBB-NEXT: and a0, a0, a1661; RV64NOZBB-NEXT: addi a1, a2, 1365662; RV64NOZBB-NEXT: srli a2, a0, 1663; RV64NOZBB-NEXT: and a1, a2, a1664; RV64NOZBB-NEXT: lui a2, 3665; RV64NOZBB-NEXT: addi a2, a2, 819666; RV64NOZBB-NEXT: sub a0, a0, a1667; RV64NOZBB-NEXT: and a1, a0, a2668; RV64NOZBB-NEXT: srli a0, a0, 2669; RV64NOZBB-NEXT: and a0, a0, a2670; RV64NOZBB-NEXT: add a0, a1, a0671; RV64NOZBB-NEXT: srli a1, a0, 4672; RV64NOZBB-NEXT: add a0, a0, a1673; RV64NOZBB-NEXT: andi a1, a0, 15674; RV64NOZBB-NEXT: slli a0, a0, 52675; RV64NOZBB-NEXT: srli a0, a0, 60676; RV64NOZBB-NEXT: add a0, a1, a0677; RV64NOZBB-NEXT: ret678;679; RV32ZBB-LABEL: test_cttz_i16_zero_undef:680; RV32ZBB: # %bb.0:681; RV32ZBB-NEXT: ctz a0, a0682; RV32ZBB-NEXT: ret683;684; RV64ZBB-LABEL: test_cttz_i16_zero_undef:685; RV64ZBB: # %bb.0:686; RV64ZBB-NEXT: ctz a0, a0687; RV64ZBB-NEXT: ret688;689; RV32XTHEADBB-LABEL: test_cttz_i16_zero_undef:690; RV32XTHEADBB: # %bb.0:691; RV32XTHEADBB-NEXT: addi a1, a0, -1692; RV32XTHEADBB-NEXT: not a0, a0693; RV32XTHEADBB-NEXT: and a0, a0, a1694; RV32XTHEADBB-NEXT: th.ff1 a0, a0695; RV32XTHEADBB-NEXT: li a1, 32696; RV32XTHEADBB-NEXT: sub a0, a1, a0697; RV32XTHEADBB-NEXT: ret698;699; RV64XTHEADBB-LABEL: test_cttz_i16_zero_undef:700; RV64XTHEADBB: # %bb.0:701; RV64XTHEADBB-NEXT: addi a1, a0, -1702; RV64XTHEADBB-NEXT: not a0, a0703; RV64XTHEADBB-NEXT: and a0, a0, a1704; RV64XTHEADBB-NEXT: th.ff1 a0, a0705; RV64XTHEADBB-NEXT: li a1, 64706; RV64XTHEADBB-NEXT: sub a0, a1, a0707; RV64XTHEADBB-NEXT: ret708 %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 true)709 ret i16 %tmp710}711 712define i32 @test_cttz_i32_zero_undef(i32 %a) nounwind {713; RV32I-LABEL: test_cttz_i32_zero_undef:714; RV32I: # %bb.0:715; RV32I-NEXT: addi sp, sp, -16716; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill717; RV32I-NEXT: neg a1, a0718; RV32I-NEXT: and a0, a0, a1719; RV32I-NEXT: lui a1, 30667720; RV32I-NEXT: addi a1, a1, 1329721; RV32I-NEXT: call __mulsi3722; RV32I-NEXT: srli a0, a0, 27723; RV32I-NEXT: lui a1, %hi(.LCPI6_0)724; RV32I-NEXT: addi a1, a1, %lo(.LCPI6_0)725; RV32I-NEXT: add a0, a1, a0726; RV32I-NEXT: lbu a0, 0(a0)727; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload728; RV32I-NEXT: addi sp, sp, 16729; RV32I-NEXT: ret730;731; RV64I-LABEL: test_cttz_i32_zero_undef:732; RV64I: # %bb.0:733; RV64I-NEXT: neg a1, a0734; RV64I-NEXT: and a0, a0, a1735; RV64I-NEXT: slli a1, a0, 6736; RV64I-NEXT: slli a2, a0, 8737; RV64I-NEXT: slli a3, a0, 10738; RV64I-NEXT: slli a4, a0, 12739; RV64I-NEXT: add a1, a1, a2740; RV64I-NEXT: slli a2, a0, 16741; RV64I-NEXT: sub a3, a3, a4742; RV64I-NEXT: slli a4, a0, 18743; RV64I-NEXT: sub a2, a2, a4744; RV64I-NEXT: slli a4, a0, 4745; RV64I-NEXT: sub a4, a0, a4746; RV64I-NEXT: add a1, a4, a1747; RV64I-NEXT: slli a4, a0, 14748; RV64I-NEXT: sub a3, a3, a4749; RV64I-NEXT: slli a4, a0, 23750; RV64I-NEXT: sub a2, a2, a4751; RV64I-NEXT: slli a0, a0, 27752; RV64I-NEXT: add a1, a1, a3753; RV64I-NEXT: add a0, a2, a0754; RV64I-NEXT: add a0, a1, a0755; RV64I-NEXT: srliw a0, a0, 27756; RV64I-NEXT: lui a1, %hi(.LCPI6_0)757; RV64I-NEXT: addi a1, a1, %lo(.LCPI6_0)758; RV64I-NEXT: add a0, a1, a0759; RV64I-NEXT: lbu a0, 0(a0)760; RV64I-NEXT: ret761;762; RV32M-LABEL: test_cttz_i32_zero_undef:763; RV32M: # %bb.0:764; RV32M-NEXT: neg a1, a0765; RV32M-NEXT: and a0, a0, a1766; RV32M-NEXT: lui a1, 30667767; RV32M-NEXT: addi a1, a1, 1329768; RV32M-NEXT: mul a0, a0, a1769; RV32M-NEXT: srli a0, a0, 27770; RV32M-NEXT: lui a1, %hi(.LCPI6_0)771; RV32M-NEXT: addi a1, a1, %lo(.LCPI6_0)772; RV32M-NEXT: add a0, a1, a0773; RV32M-NEXT: lbu a0, 0(a0)774; RV32M-NEXT: ret775;776; RV64M-LABEL: test_cttz_i32_zero_undef:777; RV64M: # %bb.0:778; RV64M-NEXT: neg a1, a0779; RV64M-NEXT: and a0, a0, a1780; RV64M-NEXT: lui a1, 30667781; RV64M-NEXT: addi a1, a1, 1329782; RV64M-NEXT: mul a0, a0, a1783; RV64M-NEXT: srliw a0, a0, 27784; RV64M-NEXT: lui a1, %hi(.LCPI6_0)785; RV64M-NEXT: addi a1, a1, %lo(.LCPI6_0)786; RV64M-NEXT: add a0, a1, a0787; RV64M-NEXT: lbu a0, 0(a0)788; RV64M-NEXT: ret789;790; RV32ZBB-LABEL: test_cttz_i32_zero_undef:791; RV32ZBB: # %bb.0:792; RV32ZBB-NEXT: ctz a0, a0793; RV32ZBB-NEXT: ret794;795; RV64ZBB-LABEL: test_cttz_i32_zero_undef:796; RV64ZBB: # %bb.0:797; RV64ZBB-NEXT: ctzw a0, a0798; RV64ZBB-NEXT: ret799;800; RV32XTHEADBB-LABEL: test_cttz_i32_zero_undef:801; RV32XTHEADBB: # %bb.0:802; RV32XTHEADBB-NEXT: addi a1, a0, -1803; RV32XTHEADBB-NEXT: not a0, a0804; RV32XTHEADBB-NEXT: and a0, a0, a1805; RV32XTHEADBB-NEXT: th.ff1 a0, a0806; RV32XTHEADBB-NEXT: li a1, 32807; RV32XTHEADBB-NEXT: sub a0, a1, a0808; RV32XTHEADBB-NEXT: ret809;810; RV64XTHEADBB-LABEL: test_cttz_i32_zero_undef:811; RV64XTHEADBB: # %bb.0:812; RV64XTHEADBB-NEXT: addi a1, a0, -1813; RV64XTHEADBB-NEXT: not a0, a0814; RV64XTHEADBB-NEXT: and a0, a0, a1815; RV64XTHEADBB-NEXT: th.ff1 a0, a0816; RV64XTHEADBB-NEXT: li a1, 64817; RV64XTHEADBB-NEXT: sub a0, a1, a0818; RV64XTHEADBB-NEXT: ret819 %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 true)820 ret i32 %tmp821}822 823define i64 @test_cttz_i64_zero_undef(i64 %a) nounwind {824; RV32I-LABEL: test_cttz_i64_zero_undef:825; RV32I: # %bb.0:826; RV32I-NEXT: addi sp, sp, -32827; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill828; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill829; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill830; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill831; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill832; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill833; RV32I-NEXT: mv s1, a1834; RV32I-NEXT: mv s2, a0835; RV32I-NEXT: neg a0, a0836; RV32I-NEXT: and a0, s2, a0837; RV32I-NEXT: lui s3, 30667838; RV32I-NEXT: addi s3, s3, 1329839; RV32I-NEXT: mv a1, s3840; RV32I-NEXT: call __mulsi3841; RV32I-NEXT: mv s0, a0842; RV32I-NEXT: lui s4, %hi(.LCPI7_0)843; RV32I-NEXT: addi s4, s4, %lo(.LCPI7_0)844; RV32I-NEXT: neg a0, s1845; RV32I-NEXT: and a0, s1, a0846; RV32I-NEXT: mv a1, s3847; RV32I-NEXT: call __mulsi3848; RV32I-NEXT: bnez s2, .LBB7_2849; RV32I-NEXT: # %bb.1:850; RV32I-NEXT: srli a0, a0, 27851; RV32I-NEXT: add a0, s4, a0852; RV32I-NEXT: lbu a0, 0(a0)853; RV32I-NEXT: addi a0, a0, 32854; RV32I-NEXT: j .LBB7_3855; RV32I-NEXT: .LBB7_2:856; RV32I-NEXT: srli s0, s0, 27857; RV32I-NEXT: add s0, s4, s0858; RV32I-NEXT: lbu a0, 0(s0)859; RV32I-NEXT: .LBB7_3:860; RV32I-NEXT: li a1, 0861; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload862; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload863; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload864; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload865; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload866; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload867; RV32I-NEXT: addi sp, sp, 32868; RV32I-NEXT: ret869;870; RV64I-LABEL: test_cttz_i64_zero_undef:871; RV64I: # %bb.0:872; RV64I-NEXT: addi sp, sp, -16873; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill874; RV64I-NEXT: neg a1, a0875; RV64I-NEXT: and a0, a0, a1876; RV64I-NEXT: lui a1, %hi(.LCPI7_0)877; RV64I-NEXT: ld a1, %lo(.LCPI7_0)(a1)878; RV64I-NEXT: call __muldi3879; RV64I-NEXT: srli a0, a0, 58880; RV64I-NEXT: lui a1, %hi(.LCPI7_1)881; RV64I-NEXT: addi a1, a1, %lo(.LCPI7_1)882; RV64I-NEXT: add a0, a1, a0883; RV64I-NEXT: lbu a0, 0(a0)884; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload885; RV64I-NEXT: addi sp, sp, 16886; RV64I-NEXT: ret887;888; RV32M-LABEL: test_cttz_i64_zero_undef:889; RV32M: # %bb.0:890; RV32M-NEXT: lui a3, 30667891; RV32M-NEXT: addi a3, a3, 1329892; RV32M-NEXT: lui a2, %hi(.LCPI7_0)893; RV32M-NEXT: addi a2, a2, %lo(.LCPI7_0)894; RV32M-NEXT: bnez a0, .LBB7_2895; RV32M-NEXT: # %bb.1:896; RV32M-NEXT: neg a0, a1897; RV32M-NEXT: and a0, a1, a0898; RV32M-NEXT: mul a0, a0, a3899; RV32M-NEXT: srli a0, a0, 27900; RV32M-NEXT: add a0, a2, a0901; RV32M-NEXT: lbu a0, 0(a0)902; RV32M-NEXT: addi a0, a0, 32903; RV32M-NEXT: li a1, 0904; RV32M-NEXT: ret905; RV32M-NEXT: .LBB7_2:906; RV32M-NEXT: neg a1, a0907; RV32M-NEXT: and a0, a0, a1908; RV32M-NEXT: mul a0, a0, a3909; RV32M-NEXT: srli a0, a0, 27910; RV32M-NEXT: add a0, a2, a0911; RV32M-NEXT: lbu a0, 0(a0)912; RV32M-NEXT: li a1, 0913; RV32M-NEXT: ret914;915; RV64M-LABEL: test_cttz_i64_zero_undef:916; RV64M: # %bb.0:917; RV64M-NEXT: lui a1, %hi(.LCPI7_0)918; RV64M-NEXT: ld a1, %lo(.LCPI7_0)(a1)919; RV64M-NEXT: neg a2, a0920; RV64M-NEXT: and a0, a0, a2921; RV64M-NEXT: mul a0, a0, a1922; RV64M-NEXT: srli a0, a0, 58923; RV64M-NEXT: lui a1, %hi(.LCPI7_1)924; RV64M-NEXT: addi a1, a1, %lo(.LCPI7_1)925; RV64M-NEXT: add a0, a1, a0926; RV64M-NEXT: lbu a0, 0(a0)927; RV64M-NEXT: ret928;929; RV32ZBB-LABEL: test_cttz_i64_zero_undef:930; RV32ZBB: # %bb.0:931; RV32ZBB-NEXT: bnez a0, .LBB7_2932; RV32ZBB-NEXT: # %bb.1:933; RV32ZBB-NEXT: ctz a0, a1934; RV32ZBB-NEXT: addi a0, a0, 32935; RV32ZBB-NEXT: li a1, 0936; RV32ZBB-NEXT: ret937; RV32ZBB-NEXT: .LBB7_2:938; RV32ZBB-NEXT: ctz a0, a0939; RV32ZBB-NEXT: li a1, 0940; RV32ZBB-NEXT: ret941;942; RV64ZBB-LABEL: test_cttz_i64_zero_undef:943; RV64ZBB: # %bb.0:944; RV64ZBB-NEXT: ctz a0, a0945; RV64ZBB-NEXT: ret946;947; RV32XTHEADBB-LABEL: test_cttz_i64_zero_undef:948; RV32XTHEADBB: # %bb.0:949; RV32XTHEADBB-NEXT: bnez a0, .LBB7_2950; RV32XTHEADBB-NEXT: # %bb.1:951; RV32XTHEADBB-NEXT: addi a0, a1, -1952; RV32XTHEADBB-NEXT: not a1, a1953; RV32XTHEADBB-NEXT: and a0, a1, a0954; RV32XTHEADBB-NEXT: th.ff1 a0, a0955; RV32XTHEADBB-NEXT: li a1, 64956; RV32XTHEADBB-NEXT: j .LBB7_3957; RV32XTHEADBB-NEXT: .LBB7_2:958; RV32XTHEADBB-NEXT: addi a1, a0, -1959; RV32XTHEADBB-NEXT: not a0, a0960; RV32XTHEADBB-NEXT: and a0, a0, a1961; RV32XTHEADBB-NEXT: th.ff1 a0, a0962; RV32XTHEADBB-NEXT: li a1, 32963; RV32XTHEADBB-NEXT: .LBB7_3:964; RV32XTHEADBB-NEXT: sub a0, a1, a0965; RV32XTHEADBB-NEXT: li a1, 0966; RV32XTHEADBB-NEXT: ret967;968; RV64XTHEADBB-LABEL: test_cttz_i64_zero_undef:969; RV64XTHEADBB: # %bb.0:970; RV64XTHEADBB-NEXT: addi a1, a0, -1971; RV64XTHEADBB-NEXT: not a0, a0972; RV64XTHEADBB-NEXT: and a0, a0, a1973; RV64XTHEADBB-NEXT: th.ff1 a0, a0974; RV64XTHEADBB-NEXT: li a1, 64975; RV64XTHEADBB-NEXT: sub a0, a1, a0976; RV64XTHEADBB-NEXT: ret977 %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 true)978 ret i64 %tmp979}980 981define i8 @test_ctlz_i8(i8 %a) nounwind {982; RV32_NOZBB-LABEL: test_ctlz_i8:983; RV32_NOZBB: # %bb.0:984; RV32_NOZBB-NEXT: zext.b a1, a0985; RV32_NOZBB-NEXT: beqz a1, .LBB8_2986; RV32_NOZBB-NEXT: # %bb.1: # %cond.false987; RV32_NOZBB-NEXT: slli a1, a0, 24988; RV32_NOZBB-NEXT: srli a1, a1, 25989; RV32_NOZBB-NEXT: or a0, a0, a1990; RV32_NOZBB-NEXT: slli a1, a0, 24991; RV32_NOZBB-NEXT: srli a1, a1, 26992; RV32_NOZBB-NEXT: or a0, a0, a1993; RV32_NOZBB-NEXT: slli a1, a0, 24994; RV32_NOZBB-NEXT: srli a1, a1, 28995; RV32_NOZBB-NEXT: or a0, a0, a1996; RV32_NOZBB-NEXT: not a0, a0997; RV32_NOZBB-NEXT: srli a1, a0, 1998; RV32_NOZBB-NEXT: andi a1, a1, 85999; RV32_NOZBB-NEXT: sub a0, a0, a11000; RV32_NOZBB-NEXT: andi a1, a0, 511001; RV32_NOZBB-NEXT: srli a0, a0, 21002; RV32_NOZBB-NEXT: andi a0, a0, 511003; RV32_NOZBB-NEXT: add a0, a1, a01004; RV32_NOZBB-NEXT: srli a1, a0, 41005; RV32_NOZBB-NEXT: add a0, a0, a11006; RV32_NOZBB-NEXT: andi a0, a0, 151007; RV32_NOZBB-NEXT: ret1008; RV32_NOZBB-NEXT: .LBB8_2:1009; RV32_NOZBB-NEXT: li a0, 81010; RV32_NOZBB-NEXT: ret1011;1012; RV64NOZBB-LABEL: test_ctlz_i8:1013; RV64NOZBB: # %bb.0:1014; RV64NOZBB-NEXT: zext.b a1, a01015; RV64NOZBB-NEXT: beqz a1, .LBB8_21016; RV64NOZBB-NEXT: # %bb.1: # %cond.false1017; RV64NOZBB-NEXT: slli a1, a0, 561018; RV64NOZBB-NEXT: srli a1, a1, 571019; RV64NOZBB-NEXT: or a0, a0, a11020; RV64NOZBB-NEXT: slli a1, a0, 561021; RV64NOZBB-NEXT: srli a1, a1, 581022; RV64NOZBB-NEXT: or a0, a0, a11023; RV64NOZBB-NEXT: slli a1, a0, 561024; RV64NOZBB-NEXT: srli a1, a1, 601025; RV64NOZBB-NEXT: or a0, a0, a11026; RV64NOZBB-NEXT: not a0, a01027; RV64NOZBB-NEXT: srli a1, a0, 11028; RV64NOZBB-NEXT: andi a1, a1, 851029; RV64NOZBB-NEXT: sub a0, a0, a11030; RV64NOZBB-NEXT: andi a1, a0, 511031; RV64NOZBB-NEXT: srli a0, a0, 21032; RV64NOZBB-NEXT: andi a0, a0, 511033; RV64NOZBB-NEXT: add a0, a1, a01034; RV64NOZBB-NEXT: srli a1, a0, 41035; RV64NOZBB-NEXT: add a0, a0, a11036; RV64NOZBB-NEXT: andi a0, a0, 151037; RV64NOZBB-NEXT: ret1038; RV64NOZBB-NEXT: .LBB8_2:1039; RV64NOZBB-NEXT: li a0, 81040; RV64NOZBB-NEXT: ret1041;1042; RV32ZBB-LABEL: test_ctlz_i8:1043; RV32ZBB: # %bb.0:1044; RV32ZBB-NEXT: zext.b a0, a01045; RV32ZBB-NEXT: clz a0, a01046; RV32ZBB-NEXT: addi a0, a0, -241047; RV32ZBB-NEXT: ret1048;1049; RV64ZBB-LABEL: test_ctlz_i8:1050; RV64ZBB: # %bb.0:1051; RV64ZBB-NEXT: zext.b a0, a01052; RV64ZBB-NEXT: clz a0, a01053; RV64ZBB-NEXT: addi a0, a0, -561054; RV64ZBB-NEXT: ret1055;1056; RV32XTHEADBB-LABEL: test_ctlz_i8:1057; RV32XTHEADBB: # %bb.0:1058; RV32XTHEADBB-NEXT: zext.b a0, a01059; RV32XTHEADBB-NEXT: th.ff1 a0, a01060; RV32XTHEADBB-NEXT: addi a0, a0, -241061; RV32XTHEADBB-NEXT: ret1062;1063; RV64XTHEADBB-LABEL: test_ctlz_i8:1064; RV64XTHEADBB: # %bb.0:1065; RV64XTHEADBB-NEXT: zext.b a0, a01066; RV64XTHEADBB-NEXT: th.ff1 a0, a01067; RV64XTHEADBB-NEXT: addi a0, a0, -561068; RV64XTHEADBB-NEXT: ret1069 %tmp = call i8 @llvm.ctlz.i8(i8 %a, i1 false)1070 ret i8 %tmp1071}1072 1073define i16 @test_ctlz_i16(i16 %a) nounwind {1074; RV32_NOZBB-LABEL: test_ctlz_i16:1075; RV32_NOZBB: # %bb.0:1076; RV32_NOZBB-NEXT: slli a1, a0, 161077; RV32_NOZBB-NEXT: beqz a1, .LBB9_21078; RV32_NOZBB-NEXT: # %bb.1: # %cond.false1079; RV32_NOZBB-NEXT: srli a1, a1, 171080; RV32_NOZBB-NEXT: lui a2, 51081; RV32_NOZBB-NEXT: or a0, a0, a11082; RV32_NOZBB-NEXT: addi a1, a2, 13651083; RV32_NOZBB-NEXT: slli a2, a0, 161084; RV32_NOZBB-NEXT: srli a2, a2, 181085; RV32_NOZBB-NEXT: or a0, a0, a21086; RV32_NOZBB-NEXT: slli a2, a0, 161087; RV32_NOZBB-NEXT: srli a2, a2, 201088; RV32_NOZBB-NEXT: or a0, a0, a21089; RV32_NOZBB-NEXT: slli a2, a0, 161090; RV32_NOZBB-NEXT: srli a2, a2, 241091; RV32_NOZBB-NEXT: or a0, a0, a21092; RV32_NOZBB-NEXT: not a0, a01093; RV32_NOZBB-NEXT: srli a2, a0, 11094; RV32_NOZBB-NEXT: and a1, a2, a11095; RV32_NOZBB-NEXT: lui a2, 31096; RV32_NOZBB-NEXT: addi a2, a2, 8191097; RV32_NOZBB-NEXT: sub a0, a0, a11098; RV32_NOZBB-NEXT: and a1, a0, a21099; RV32_NOZBB-NEXT: srli a0, a0, 21100; RV32_NOZBB-NEXT: and a0, a0, a21101; RV32_NOZBB-NEXT: add a0, a1, a01102; RV32_NOZBB-NEXT: srli a1, a0, 41103; RV32_NOZBB-NEXT: add a0, a0, a11104; RV32_NOZBB-NEXT: andi a1, a0, 151105; RV32_NOZBB-NEXT: slli a0, a0, 201106; RV32_NOZBB-NEXT: srli a0, a0, 281107; RV32_NOZBB-NEXT: add a0, a1, a01108; RV32_NOZBB-NEXT: ret1109; RV32_NOZBB-NEXT: .LBB9_2:1110; RV32_NOZBB-NEXT: li a0, 161111; RV32_NOZBB-NEXT: ret1112;1113; RV64NOZBB-LABEL: test_ctlz_i16:1114; RV64NOZBB: # %bb.0:1115; RV64NOZBB-NEXT: slli a1, a0, 481116; RV64NOZBB-NEXT: beqz a1, .LBB9_21117; RV64NOZBB-NEXT: # %bb.1: # %cond.false1118; RV64NOZBB-NEXT: srli a1, a1, 491119; RV64NOZBB-NEXT: lui a2, 51120; RV64NOZBB-NEXT: or a0, a0, a11121; RV64NOZBB-NEXT: addi a1, a2, 13651122; RV64NOZBB-NEXT: slli a2, a0, 481123; RV64NOZBB-NEXT: srli a2, a2, 501124; RV64NOZBB-NEXT: or a0, a0, a21125; RV64NOZBB-NEXT: slli a2, a0, 481126; RV64NOZBB-NEXT: srli a2, a2, 521127; RV64NOZBB-NEXT: or a0, a0, a21128; RV64NOZBB-NEXT: slli a2, a0, 481129; RV64NOZBB-NEXT: srli a2, a2, 561130; RV64NOZBB-NEXT: or a0, a0, a21131; RV64NOZBB-NEXT: not a0, a01132; RV64NOZBB-NEXT: srli a2, a0, 11133; RV64NOZBB-NEXT: and a1, a2, a11134; RV64NOZBB-NEXT: lui a2, 31135; RV64NOZBB-NEXT: addi a2, a2, 8191136; RV64NOZBB-NEXT: sub a0, a0, a11137; RV64NOZBB-NEXT: and a1, a0, a21138; RV64NOZBB-NEXT: srli a0, a0, 21139; RV64NOZBB-NEXT: and a0, a0, a21140; RV64NOZBB-NEXT: add a0, a1, a01141; RV64NOZBB-NEXT: srli a1, a0, 41142; RV64NOZBB-NEXT: add a0, a0, a11143; RV64NOZBB-NEXT: andi a1, a0, 151144; RV64NOZBB-NEXT: slli a0, a0, 521145; RV64NOZBB-NEXT: srli a0, a0, 601146; RV64NOZBB-NEXT: add a0, a1, a01147; RV64NOZBB-NEXT: ret1148; RV64NOZBB-NEXT: .LBB9_2:1149; RV64NOZBB-NEXT: li a0, 161150; RV64NOZBB-NEXT: ret1151;1152; RV32ZBB-LABEL: test_ctlz_i16:1153; RV32ZBB: # %bb.0:1154; RV32ZBB-NEXT: zext.h a0, a01155; RV32ZBB-NEXT: clz a0, a01156; RV32ZBB-NEXT: addi a0, a0, -161157; RV32ZBB-NEXT: ret1158;1159; RV64ZBB-LABEL: test_ctlz_i16:1160; RV64ZBB: # %bb.0:1161; RV64ZBB-NEXT: zext.h a0, a01162; RV64ZBB-NEXT: clz a0, a01163; RV64ZBB-NEXT: addi a0, a0, -481164; RV64ZBB-NEXT: ret1165;1166; RV32XTHEADBB-LABEL: test_ctlz_i16:1167; RV32XTHEADBB: # %bb.0:1168; RV32XTHEADBB-NEXT: th.extu a0, a0, 15, 01169; RV32XTHEADBB-NEXT: th.ff1 a0, a01170; RV32XTHEADBB-NEXT: addi a0, a0, -161171; RV32XTHEADBB-NEXT: ret1172;1173; RV64XTHEADBB-LABEL: test_ctlz_i16:1174; RV64XTHEADBB: # %bb.0:1175; RV64XTHEADBB-NEXT: th.extu a0, a0, 15, 01176; RV64XTHEADBB-NEXT: th.ff1 a0, a01177; RV64XTHEADBB-NEXT: addi a0, a0, -481178; RV64XTHEADBB-NEXT: ret1179 %tmp = call i16 @llvm.ctlz.i16(i16 %a, i1 false)1180 ret i16 %tmp1181}1182 1183define i32 @test_ctlz_i32(i32 %a) nounwind {1184; RV32I-LABEL: test_ctlz_i32:1185; RV32I: # %bb.0:1186; RV32I-NEXT: beqz a0, .LBB10_21187; RV32I-NEXT: # %bb.1: # %cond.false1188; RV32I-NEXT: srli a1, a0, 11189; RV32I-NEXT: lui a2, 3495251190; RV32I-NEXT: or a0, a0, a11191; RV32I-NEXT: addi a1, a2, 13651192; RV32I-NEXT: srli a2, a0, 21193; RV32I-NEXT: or a0, a0, a21194; RV32I-NEXT: srli a2, a0, 41195; RV32I-NEXT: or a0, a0, a21196; RV32I-NEXT: srli a2, a0, 81197; RV32I-NEXT: or a0, a0, a21198; RV32I-NEXT: srli a2, a0, 161199; RV32I-NEXT: or a0, a0, a21200; RV32I-NEXT: not a0, a01201; RV32I-NEXT: srli a2, a0, 11202; RV32I-NEXT: and a1, a2, a11203; RV32I-NEXT: lui a2, 2097151204; RV32I-NEXT: addi a2, a2, 8191205; RV32I-NEXT: sub a0, a0, a11206; RV32I-NEXT: and a1, a0, a21207; RV32I-NEXT: srli a0, a0, 21208; RV32I-NEXT: and a0, a0, a21209; RV32I-NEXT: lui a2, 616811210; RV32I-NEXT: add a0, a1, a01211; RV32I-NEXT: srli a1, a0, 41212; RV32I-NEXT: add a0, a0, a11213; RV32I-NEXT: addi a1, a2, -2411214; RV32I-NEXT: and a0, a0, a11215; RV32I-NEXT: slli a1, a0, 81216; RV32I-NEXT: add a0, a0, a11217; RV32I-NEXT: slli a1, a0, 161218; RV32I-NEXT: add a0, a0, a11219; RV32I-NEXT: srli a0, a0, 241220; RV32I-NEXT: ret1221; RV32I-NEXT: .LBB10_2:1222; RV32I-NEXT: li a0, 321223; RV32I-NEXT: ret1224;1225; RV64I-LABEL: test_ctlz_i32:1226; RV64I: # %bb.0:1227; RV64I-NEXT: sext.w a1, a01228; RV64I-NEXT: beqz a1, .LBB10_21229; RV64I-NEXT: # %bb.1: # %cond.false1230; RV64I-NEXT: srliw a1, a0, 11231; RV64I-NEXT: lui a2, 3495251232; RV64I-NEXT: or a0, a0, a11233; RV64I-NEXT: addi a1, a2, 13651234; RV64I-NEXT: srliw a2, a0, 21235; RV64I-NEXT: or a0, a0, a21236; RV64I-NEXT: srliw a2, a0, 41237; RV64I-NEXT: or a0, a0, a21238; RV64I-NEXT: srliw a2, a0, 81239; RV64I-NEXT: or a0, a0, a21240; RV64I-NEXT: srliw a2, a0, 161241; RV64I-NEXT: or a0, a0, a21242; RV64I-NEXT: not a0, a01243; RV64I-NEXT: srli a2, a0, 11244; RV64I-NEXT: and a1, a2, a11245; RV64I-NEXT: lui a2, 2097151246; RV64I-NEXT: addi a2, a2, 8191247; RV64I-NEXT: sub a0, a0, a11248; RV64I-NEXT: and a1, a0, a21249; RV64I-NEXT: srli a0, a0, 21250; RV64I-NEXT: and a0, a0, a21251; RV64I-NEXT: lui a2, 616811252; RV64I-NEXT: add a0, a1, a01253; RV64I-NEXT: srli a1, a0, 41254; RV64I-NEXT: add a0, a0, a11255; RV64I-NEXT: addi a1, a2, -2411256; RV64I-NEXT: and a0, a0, a11257; RV64I-NEXT: slli a1, a0, 81258; RV64I-NEXT: add a0, a0, a11259; RV64I-NEXT: slli a1, a0, 161260; RV64I-NEXT: add a0, a0, a11261; RV64I-NEXT: srliw a0, a0, 241262; RV64I-NEXT: ret1263; RV64I-NEXT: .LBB10_2:1264; RV64I-NEXT: li a0, 321265; RV64I-NEXT: ret1266;1267; RV32M-LABEL: test_ctlz_i32:1268; RV32M: # %bb.0:1269; RV32M-NEXT: beqz a0, .LBB10_21270; RV32M-NEXT: # %bb.1: # %cond.false1271; RV32M-NEXT: srli a1, a0, 11272; RV32M-NEXT: lui a2, 3495251273; RV32M-NEXT: or a0, a0, a11274; RV32M-NEXT: addi a1, a2, 13651275; RV32M-NEXT: srli a2, a0, 21276; RV32M-NEXT: or a0, a0, a21277; RV32M-NEXT: srli a2, a0, 41278; RV32M-NEXT: or a0, a0, a21279; RV32M-NEXT: srli a2, a0, 81280; RV32M-NEXT: or a0, a0, a21281; RV32M-NEXT: srli a2, a0, 161282; RV32M-NEXT: or a0, a0, a21283; RV32M-NEXT: not a0, a01284; RV32M-NEXT: srli a2, a0, 11285; RV32M-NEXT: and a1, a2, a11286; RV32M-NEXT: lui a2, 2097151287; RV32M-NEXT: addi a2, a2, 8191288; RV32M-NEXT: sub a0, a0, a11289; RV32M-NEXT: and a1, a0, a21290; RV32M-NEXT: srli a0, a0, 21291; RV32M-NEXT: and a0, a0, a21292; RV32M-NEXT: lui a2, 616811293; RV32M-NEXT: add a0, a1, a01294; RV32M-NEXT: srli a1, a0, 41295; RV32M-NEXT: add a0, a0, a11296; RV32M-NEXT: lui a1, 41121297; RV32M-NEXT: addi a2, a2, -2411298; RV32M-NEXT: and a0, a0, a21299; RV32M-NEXT: addi a1, a1, 2571300; RV32M-NEXT: mul a0, a0, a11301; RV32M-NEXT: srli a0, a0, 241302; RV32M-NEXT: ret1303; RV32M-NEXT: .LBB10_2:1304; RV32M-NEXT: li a0, 321305; RV32M-NEXT: ret1306;1307; RV64M-LABEL: test_ctlz_i32:1308; RV64M: # %bb.0:1309; RV64M-NEXT: sext.w a1, a01310; RV64M-NEXT: beqz a1, .LBB10_21311; RV64M-NEXT: # %bb.1: # %cond.false1312; RV64M-NEXT: srliw a1, a0, 11313; RV64M-NEXT: lui a2, 3495251314; RV64M-NEXT: or a0, a0, a11315; RV64M-NEXT: addi a1, a2, 13651316; RV64M-NEXT: srliw a2, a0, 21317; RV64M-NEXT: or a0, a0, a21318; RV64M-NEXT: srliw a2, a0, 41319; RV64M-NEXT: or a0, a0, a21320; RV64M-NEXT: srliw a2, a0, 81321; RV64M-NEXT: or a0, a0, a21322; RV64M-NEXT: srliw a2, a0, 161323; RV64M-NEXT: or a0, a0, a21324; RV64M-NEXT: not a0, a01325; RV64M-NEXT: srli a2, a0, 11326; RV64M-NEXT: and a1, a2, a11327; RV64M-NEXT: lui a2, 2097151328; RV64M-NEXT: addi a2, a2, 8191329; RV64M-NEXT: sub a0, a0, a11330; RV64M-NEXT: and a1, a0, a21331; RV64M-NEXT: srli a0, a0, 21332; RV64M-NEXT: and a0, a0, a21333; RV64M-NEXT: lui a2, 616811334; RV64M-NEXT: add a0, a1, a01335; RV64M-NEXT: srli a1, a0, 41336; RV64M-NEXT: add a0, a0, a11337; RV64M-NEXT: lui a1, 41121338; RV64M-NEXT: addi a2, a2, -2411339; RV64M-NEXT: and a0, a0, a21340; RV64M-NEXT: addi a1, a1, 2571341; RV64M-NEXT: mul a0, a0, a11342; RV64M-NEXT: srliw a0, a0, 241343; RV64M-NEXT: ret1344; RV64M-NEXT: .LBB10_2:1345; RV64M-NEXT: li a0, 321346; RV64M-NEXT: ret1347;1348; RV32ZBB-LABEL: test_ctlz_i32:1349; RV32ZBB: # %bb.0:1350; RV32ZBB-NEXT: clz a0, a01351; RV32ZBB-NEXT: ret1352;1353; RV64ZBB-LABEL: test_ctlz_i32:1354; RV64ZBB: # %bb.0:1355; RV64ZBB-NEXT: clzw a0, a01356; RV64ZBB-NEXT: ret1357;1358; RV32XTHEADBB-LABEL: test_ctlz_i32:1359; RV32XTHEADBB: # %bb.0:1360; RV32XTHEADBB-NEXT: th.ff1 a0, a01361; RV32XTHEADBB-NEXT: ret1362;1363; RV64XTHEADBB-LABEL: test_ctlz_i32:1364; RV64XTHEADBB: # %bb.0:1365; RV64XTHEADBB-NEXT: th.extu a0, a0, 31, 01366; RV64XTHEADBB-NEXT: th.ff1 a0, a01367; RV64XTHEADBB-NEXT: addi a0, a0, -321368; RV64XTHEADBB-NEXT: ret1369 %tmp = call i32 @llvm.ctlz.i32(i32 %a, i1 false)1370 ret i32 %tmp1371}1372 1373define i64 @test_ctlz_i64(i64 %a) nounwind {1374; RV32I-LABEL: test_ctlz_i64:1375; RV32I: # %bb.0:1376; RV32I-NEXT: or a2, a0, a11377; RV32I-NEXT: beqz a2, .LBB11_31378; RV32I-NEXT: # %bb.1: # %cond.false1379; RV32I-NEXT: lui a2, 3495251380; RV32I-NEXT: lui a3, 2097151381; RV32I-NEXT: lui a5, 616811382; RV32I-NEXT: addi a4, a2, 13651383; RV32I-NEXT: addi a3, a3, 8191384; RV32I-NEXT: addi a2, a5, -2411385; RV32I-NEXT: bnez a1, .LBB11_41386; RV32I-NEXT: # %bb.2: # %cond.false1387; RV32I-NEXT: srli a1, a0, 11388; RV32I-NEXT: or a0, a0, a11389; RV32I-NEXT: srli a1, a0, 21390; RV32I-NEXT: or a0, a0, a11391; RV32I-NEXT: srli a1, a0, 41392; RV32I-NEXT: or a0, a0, a11393; RV32I-NEXT: srli a1, a0, 81394; RV32I-NEXT: or a0, a0, a11395; RV32I-NEXT: srli a1, a0, 161396; RV32I-NEXT: or a0, a0, a11397; RV32I-NEXT: not a0, a01398; RV32I-NEXT: srli a1, a0, 11399; RV32I-NEXT: and a1, a1, a41400; RV32I-NEXT: sub a0, a0, a11401; RV32I-NEXT: and a1, a0, a31402; RV32I-NEXT: srli a0, a0, 21403; RV32I-NEXT: and a0, a0, a31404; RV32I-NEXT: add a0, a1, a01405; RV32I-NEXT: srli a1, a0, 41406; RV32I-NEXT: add a0, a0, a11407; RV32I-NEXT: and a0, a0, a21408; RV32I-NEXT: slli a1, a0, 81409; RV32I-NEXT: add a0, a0, a11410; RV32I-NEXT: slli a1, a0, 161411; RV32I-NEXT: add a0, a0, a11412; RV32I-NEXT: srli a0, a0, 241413; RV32I-NEXT: addi a0, a0, 321414; RV32I-NEXT: li a1, 01415; RV32I-NEXT: ret1416; RV32I-NEXT: .LBB11_3:1417; RV32I-NEXT: li a1, 01418; RV32I-NEXT: li a0, 641419; RV32I-NEXT: ret1420; RV32I-NEXT: .LBB11_4:1421; RV32I-NEXT: srli a0, a1, 11422; RV32I-NEXT: or a0, a1, a01423; RV32I-NEXT: srli a1, a0, 21424; RV32I-NEXT: or a0, a0, a11425; RV32I-NEXT: srli a1, a0, 41426; RV32I-NEXT: or a0, a0, a11427; RV32I-NEXT: srli a1, a0, 81428; RV32I-NEXT: or a0, a0, a11429; RV32I-NEXT: srli a1, a0, 161430; RV32I-NEXT: or a0, a0, a11431; RV32I-NEXT: not a0, a01432; RV32I-NEXT: srli a1, a0, 11433; RV32I-NEXT: and a1, a1, a41434; RV32I-NEXT: sub a0, a0, a11435; RV32I-NEXT: and a1, a0, a31436; RV32I-NEXT: srli a0, a0, 21437; RV32I-NEXT: and a0, a0, a31438; RV32I-NEXT: add a0, a1, a01439; RV32I-NEXT: srli a1, a0, 41440; RV32I-NEXT: add a0, a0, a11441; RV32I-NEXT: and a0, a0, a21442; RV32I-NEXT: slli a1, a0, 81443; RV32I-NEXT: add a0, a0, a11444; RV32I-NEXT: slli a1, a0, 161445; RV32I-NEXT: add a0, a0, a11446; RV32I-NEXT: srli a0, a0, 241447; RV32I-NEXT: li a1, 01448; RV32I-NEXT: ret1449;1450; RV64I-LABEL: test_ctlz_i64:1451; RV64I: # %bb.0:1452; RV64I-NEXT: beqz a0, .LBB11_21453; RV64I-NEXT: # %bb.1: # %cond.false1454; RV64I-NEXT: srli a1, a0, 11455; RV64I-NEXT: lui a2, 3495251456; RV64I-NEXT: lui a3, 2097151457; RV64I-NEXT: or a0, a0, a11458; RV64I-NEXT: addi a1, a2, 13651459; RV64I-NEXT: addi a2, a3, 8191460; RV64I-NEXT: srli a3, a0, 21461; RV64I-NEXT: or a0, a0, a31462; RV64I-NEXT: slli a3, a1, 321463; RV64I-NEXT: add a1, a1, a31464; RV64I-NEXT: slli a3, a2, 321465; RV64I-NEXT: add a2, a2, a31466; RV64I-NEXT: srli a3, a0, 41467; RV64I-NEXT: or a0, a0, a31468; RV64I-NEXT: srli a3, a0, 81469; RV64I-NEXT: or a0, a0, a31470; RV64I-NEXT: srli a3, a0, 161471; RV64I-NEXT: or a0, a0, a31472; RV64I-NEXT: srli a3, a0, 321473; RV64I-NEXT: or a0, a0, a31474; RV64I-NEXT: not a0, a01475; RV64I-NEXT: srli a3, a0, 11476; RV64I-NEXT: and a1, a3, a11477; RV64I-NEXT: lui a3, 616811478; RV64I-NEXT: addi a3, a3, -2411479; RV64I-NEXT: sub a0, a0, a11480; RV64I-NEXT: and a1, a0, a21481; RV64I-NEXT: srli a0, a0, 21482; RV64I-NEXT: and a0, a0, a21483; RV64I-NEXT: slli a2, a3, 321484; RV64I-NEXT: add a0, a1, a01485; RV64I-NEXT: srli a1, a0, 41486; RV64I-NEXT: add a0, a0, a11487; RV64I-NEXT: add a2, a3, a21488; RV64I-NEXT: and a0, a0, a21489; RV64I-NEXT: slli a1, a0, 81490; RV64I-NEXT: add a0, a0, a11491; RV64I-NEXT: slli a1, a0, 161492; RV64I-NEXT: add a0, a0, a11493; RV64I-NEXT: slli a1, a0, 321494; RV64I-NEXT: add a0, a0, a11495; RV64I-NEXT: srli a0, a0, 561496; RV64I-NEXT: ret1497; RV64I-NEXT: .LBB11_2:1498; RV64I-NEXT: li a0, 641499; RV64I-NEXT: ret1500;1501; RV32M-LABEL: test_ctlz_i64:1502; RV32M: # %bb.0:1503; RV32M-NEXT: or a2, a0, a11504; RV32M-NEXT: beqz a2, .LBB11_31505; RV32M-NEXT: # %bb.1: # %cond.false1506; RV32M-NEXT: lui a2, 3495251507; RV32M-NEXT: lui a3, 2097151508; RV32M-NEXT: lui a6, 616811509; RV32M-NEXT: lui a7, 41121510; RV32M-NEXT: addi a5, a2, 13651511; RV32M-NEXT: addi a4, a3, 8191512; RV32M-NEXT: addi a3, a6, -2411513; RV32M-NEXT: addi a2, a7, 2571514; RV32M-NEXT: bnez a1, .LBB11_41515; RV32M-NEXT: # %bb.2: # %cond.false1516; RV32M-NEXT: srli a1, a0, 11517; RV32M-NEXT: or a0, a0, a11518; RV32M-NEXT: srli a1, a0, 21519; RV32M-NEXT: or a0, a0, a11520; RV32M-NEXT: srli a1, a0, 41521; RV32M-NEXT: or a0, a0, a11522; RV32M-NEXT: srli a1, a0, 81523; RV32M-NEXT: or a0, a0, a11524; RV32M-NEXT: srli a1, a0, 161525; RV32M-NEXT: or a0, a0, a11526; RV32M-NEXT: not a0, a01527; RV32M-NEXT: srli a1, a0, 11528; RV32M-NEXT: and a1, a1, a51529; RV32M-NEXT: sub a0, a0, a11530; RV32M-NEXT: and a1, a0, a41531; RV32M-NEXT: srli a0, a0, 21532; RV32M-NEXT: and a0, a0, a41533; RV32M-NEXT: add a0, a1, a01534; RV32M-NEXT: srli a1, a0, 41535; RV32M-NEXT: add a0, a0, a11536; RV32M-NEXT: and a0, a0, a31537; RV32M-NEXT: mul a0, a0, a21538; RV32M-NEXT: srli a0, a0, 241539; RV32M-NEXT: addi a0, a0, 321540; RV32M-NEXT: li a1, 01541; RV32M-NEXT: ret1542; RV32M-NEXT: .LBB11_3:1543; RV32M-NEXT: li a1, 01544; RV32M-NEXT: li a0, 641545; RV32M-NEXT: ret1546; RV32M-NEXT: .LBB11_4:1547; RV32M-NEXT: srli a0, a1, 11548; RV32M-NEXT: or a0, a1, a01549; RV32M-NEXT: srli a1, a0, 21550; RV32M-NEXT: or a0, a0, a11551; RV32M-NEXT: srli a1, a0, 41552; RV32M-NEXT: or a0, a0, a11553; RV32M-NEXT: srli a1, a0, 81554; RV32M-NEXT: or a0, a0, a11555; RV32M-NEXT: srli a1, a0, 161556; RV32M-NEXT: or a0, a0, a11557; RV32M-NEXT: not a0, a01558; RV32M-NEXT: srli a1, a0, 11559; RV32M-NEXT: and a1, a1, a51560; RV32M-NEXT: sub a0, a0, a11561; RV32M-NEXT: and a1, a0, a41562; RV32M-NEXT: srli a0, a0, 21563; RV32M-NEXT: and a0, a0, a41564; RV32M-NEXT: add a0, a1, a01565; RV32M-NEXT: srli a1, a0, 41566; RV32M-NEXT: add a0, a0, a11567; RV32M-NEXT: and a0, a0, a31568; RV32M-NEXT: mul a0, a0, a21569; RV32M-NEXT: srli a0, a0, 241570; RV32M-NEXT: li a1, 01571; RV32M-NEXT: ret1572;1573; RV64M-LABEL: test_ctlz_i64:1574; RV64M: # %bb.0:1575; RV64M-NEXT: beqz a0, .LBB11_21576; RV64M-NEXT: # %bb.1: # %cond.false1577; RV64M-NEXT: srli a1, a0, 11578; RV64M-NEXT: lui a2, 3495251579; RV64M-NEXT: lui a3, 2097151580; RV64M-NEXT: lui a4, 616811581; RV64M-NEXT: or a0, a0, a11582; RV64M-NEXT: addi a1, a2, 13651583; RV64M-NEXT: addi a2, a3, 8191584; RV64M-NEXT: addi a3, a4, -2411585; RV64M-NEXT: srli a4, a0, 21586; RV64M-NEXT: or a0, a0, a41587; RV64M-NEXT: slli a4, a1, 321588; RV64M-NEXT: add a1, a1, a41589; RV64M-NEXT: slli a4, a2, 321590; RV64M-NEXT: add a2, a2, a41591; RV64M-NEXT: slli a4, a3, 321592; RV64M-NEXT: add a3, a3, a41593; RV64M-NEXT: srli a4, a0, 41594; RV64M-NEXT: or a0, a0, a41595; RV64M-NEXT: srli a4, a0, 81596; RV64M-NEXT: or a0, a0, a41597; RV64M-NEXT: srli a4, a0, 161598; RV64M-NEXT: or a0, a0, a41599; RV64M-NEXT: srli a4, a0, 321600; RV64M-NEXT: or a0, a0, a41601; RV64M-NEXT: not a0, a01602; RV64M-NEXT: srli a4, a0, 11603; RV64M-NEXT: and a1, a4, a11604; RV64M-NEXT: sub a0, a0, a11605; RV64M-NEXT: and a1, a0, a21606; RV64M-NEXT: srli a0, a0, 21607; RV64M-NEXT: and a0, a0, a21608; RV64M-NEXT: lui a2, 41121609; RV64M-NEXT: addi a2, a2, 2571610; RV64M-NEXT: add a0, a1, a01611; RV64M-NEXT: srli a1, a0, 41612; RV64M-NEXT: add a0, a0, a11613; RV64M-NEXT: slli a1, a2, 321614; RV64M-NEXT: and a0, a0, a31615; RV64M-NEXT: add a1, a2, a11616; RV64M-NEXT: mul a0, a0, a11617; RV64M-NEXT: srli a0, a0, 561618; RV64M-NEXT: ret1619; RV64M-NEXT: .LBB11_2:1620; RV64M-NEXT: li a0, 641621; RV64M-NEXT: ret1622;1623; RV32ZBB-LABEL: test_ctlz_i64:1624; RV32ZBB: # %bb.0:1625; RV32ZBB-NEXT: bnez a1, .LBB11_21626; RV32ZBB-NEXT: # %bb.1:1627; RV32ZBB-NEXT: clz a0, a01628; RV32ZBB-NEXT: addi a0, a0, 321629; RV32ZBB-NEXT: li a1, 01630; RV32ZBB-NEXT: ret1631; RV32ZBB-NEXT: .LBB11_2:1632; RV32ZBB-NEXT: clz a0, a11633; RV32ZBB-NEXT: li a1, 01634; RV32ZBB-NEXT: ret1635;1636; RV64ZBB-LABEL: test_ctlz_i64:1637; RV64ZBB: # %bb.0:1638; RV64ZBB-NEXT: clz a0, a01639; RV64ZBB-NEXT: ret1640;1641; RV32XTHEADBB-LABEL: test_ctlz_i64:1642; RV32XTHEADBB: # %bb.0:1643; RV32XTHEADBB-NEXT: bnez a1, .LBB11_21644; RV32XTHEADBB-NEXT: # %bb.1:1645; RV32XTHEADBB-NEXT: th.ff1 a0, a01646; RV32XTHEADBB-NEXT: addi a0, a0, 321647; RV32XTHEADBB-NEXT: li a1, 01648; RV32XTHEADBB-NEXT: ret1649; RV32XTHEADBB-NEXT: .LBB11_2:1650; RV32XTHEADBB-NEXT: th.ff1 a0, a11651; RV32XTHEADBB-NEXT: li a1, 01652; RV32XTHEADBB-NEXT: ret1653;1654; RV64XTHEADBB-LABEL: test_ctlz_i64:1655; RV64XTHEADBB: # %bb.0:1656; RV64XTHEADBB-NEXT: th.ff1 a0, a01657; RV64XTHEADBB-NEXT: ret1658 %tmp = call i64 @llvm.ctlz.i64(i64 %a, i1 false)1659 ret i64 %tmp1660}1661 1662define i8 @test_ctlz_i8_zero_undef(i8 %a) nounwind {1663; RV32_NOZBB-LABEL: test_ctlz_i8_zero_undef:1664; RV32_NOZBB: # %bb.0:1665; RV32_NOZBB-NEXT: slli a1, a0, 241666; RV32_NOZBB-NEXT: srli a1, a1, 251667; RV32_NOZBB-NEXT: or a0, a0, a11668; RV32_NOZBB-NEXT: slli a1, a0, 241669; RV32_NOZBB-NEXT: srli a1, a1, 261670; RV32_NOZBB-NEXT: or a0, a0, a11671; RV32_NOZBB-NEXT: slli a1, a0, 241672; RV32_NOZBB-NEXT: srli a1, a1, 281673; RV32_NOZBB-NEXT: or a0, a0, a11674; RV32_NOZBB-NEXT: not a0, a01675; RV32_NOZBB-NEXT: srli a1, a0, 11676; RV32_NOZBB-NEXT: andi a1, a1, 851677; RV32_NOZBB-NEXT: sub a0, a0, a11678; RV32_NOZBB-NEXT: andi a1, a0, 511679; RV32_NOZBB-NEXT: srli a0, a0, 21680; RV32_NOZBB-NEXT: andi a0, a0, 511681; RV32_NOZBB-NEXT: add a0, a1, a01682; RV32_NOZBB-NEXT: srli a1, a0, 41683; RV32_NOZBB-NEXT: add a0, a0, a11684; RV32_NOZBB-NEXT: andi a0, a0, 151685; RV32_NOZBB-NEXT: ret1686;1687; RV64NOZBB-LABEL: test_ctlz_i8_zero_undef:1688; RV64NOZBB: # %bb.0:1689; RV64NOZBB-NEXT: slli a1, a0, 561690; RV64NOZBB-NEXT: srli a1, a1, 571691; RV64NOZBB-NEXT: or a0, a0, a11692; RV64NOZBB-NEXT: slli a1, a0, 561693; RV64NOZBB-NEXT: srli a1, a1, 581694; RV64NOZBB-NEXT: or a0, a0, a11695; RV64NOZBB-NEXT: slli a1, a0, 561696; RV64NOZBB-NEXT: srli a1, a1, 601697; RV64NOZBB-NEXT: or a0, a0, a11698; RV64NOZBB-NEXT: not a0, a01699; RV64NOZBB-NEXT: srli a1, a0, 11700; RV64NOZBB-NEXT: andi a1, a1, 851701; RV64NOZBB-NEXT: sub a0, a0, a11702; RV64NOZBB-NEXT: andi a1, a0, 511703; RV64NOZBB-NEXT: srli a0, a0, 21704; RV64NOZBB-NEXT: andi a0, a0, 511705; RV64NOZBB-NEXT: add a0, a1, a01706; RV64NOZBB-NEXT: srli a1, a0, 41707; RV64NOZBB-NEXT: add a0, a0, a11708; RV64NOZBB-NEXT: andi a0, a0, 151709; RV64NOZBB-NEXT: ret1710;1711; RV32ZBB-LABEL: test_ctlz_i8_zero_undef:1712; RV32ZBB: # %bb.0:1713; RV32ZBB-NEXT: slli a0, a0, 241714; RV32ZBB-NEXT: clz a0, a01715; RV32ZBB-NEXT: ret1716;1717; RV64ZBB-LABEL: test_ctlz_i8_zero_undef:1718; RV64ZBB: # %bb.0:1719; RV64ZBB-NEXT: slli a0, a0, 561720; RV64ZBB-NEXT: clz a0, a01721; RV64ZBB-NEXT: ret1722;1723; RV32XTHEADBB-LABEL: test_ctlz_i8_zero_undef:1724; RV32XTHEADBB: # %bb.0:1725; RV32XTHEADBB-NEXT: slli a0, a0, 241726; RV32XTHEADBB-NEXT: th.ff1 a0, a01727; RV32XTHEADBB-NEXT: ret1728;1729; RV64XTHEADBB-LABEL: test_ctlz_i8_zero_undef:1730; RV64XTHEADBB: # %bb.0:1731; RV64XTHEADBB-NEXT: slli a0, a0, 561732; RV64XTHEADBB-NEXT: th.ff1 a0, a01733; RV64XTHEADBB-NEXT: ret1734 %tmp = call i8 @llvm.ctlz.i8(i8 %a, i1 true)1735 ret i8 %tmp1736}1737 1738define i16 @test_ctlz_i16_zero_undef(i16 %a) nounwind {1739; RV32_NOZBB-LABEL: test_ctlz_i16_zero_undef:1740; RV32_NOZBB: # %bb.0:1741; RV32_NOZBB-NEXT: slli a1, a0, 161742; RV32_NOZBB-NEXT: lui a2, 51743; RV32_NOZBB-NEXT: srli a1, a1, 171744; RV32_NOZBB-NEXT: addi a2, a2, 13651745; RV32_NOZBB-NEXT: or a0, a0, a11746; RV32_NOZBB-NEXT: slli a1, a0, 161747; RV32_NOZBB-NEXT: srli a1, a1, 181748; RV32_NOZBB-NEXT: or a0, a0, a11749; RV32_NOZBB-NEXT: slli a1, a0, 161750; RV32_NOZBB-NEXT: srli a1, a1, 201751; RV32_NOZBB-NEXT: or a0, a0, a11752; RV32_NOZBB-NEXT: slli a1, a0, 161753; RV32_NOZBB-NEXT: srli a1, a1, 241754; RV32_NOZBB-NEXT: or a0, a0, a11755; RV32_NOZBB-NEXT: not a0, a01756; RV32_NOZBB-NEXT: srli a1, a0, 11757; RV32_NOZBB-NEXT: and a1, a1, a21758; RV32_NOZBB-NEXT: lui a2, 31759; RV32_NOZBB-NEXT: addi a2, a2, 8191760; RV32_NOZBB-NEXT: sub a0, a0, a11761; RV32_NOZBB-NEXT: and a1, a0, a21762; RV32_NOZBB-NEXT: srli a0, a0, 21763; RV32_NOZBB-NEXT: and a0, a0, a21764; RV32_NOZBB-NEXT: add a0, a1, a01765; RV32_NOZBB-NEXT: srli a1, a0, 41766; RV32_NOZBB-NEXT: add a0, a0, a11767; RV32_NOZBB-NEXT: andi a1, a0, 151768; RV32_NOZBB-NEXT: slli a0, a0, 201769; RV32_NOZBB-NEXT: srli a0, a0, 281770; RV32_NOZBB-NEXT: add a0, a1, a01771; RV32_NOZBB-NEXT: ret1772;1773; RV64NOZBB-LABEL: test_ctlz_i16_zero_undef:1774; RV64NOZBB: # %bb.0:1775; RV64NOZBB-NEXT: slli a1, a0, 481776; RV64NOZBB-NEXT: lui a2, 51777; RV64NOZBB-NEXT: srli a1, a1, 491778; RV64NOZBB-NEXT: addi a2, a2, 13651779; RV64NOZBB-NEXT: or a0, a0, a11780; RV64NOZBB-NEXT: slli a1, a0, 481781; RV64NOZBB-NEXT: srli a1, a1, 501782; RV64NOZBB-NEXT: or a0, a0, a11783; RV64NOZBB-NEXT: slli a1, a0, 481784; RV64NOZBB-NEXT: srli a1, a1, 521785; RV64NOZBB-NEXT: or a0, a0, a11786; RV64NOZBB-NEXT: slli a1, a0, 481787; RV64NOZBB-NEXT: srli a1, a1, 561788; RV64NOZBB-NEXT: or a0, a0, a11789; RV64NOZBB-NEXT: not a0, a01790; RV64NOZBB-NEXT: srli a1, a0, 11791; RV64NOZBB-NEXT: and a1, a1, a21792; RV64NOZBB-NEXT: lui a2, 31793; RV64NOZBB-NEXT: addi a2, a2, 8191794; RV64NOZBB-NEXT: sub a0, a0, a11795; RV64NOZBB-NEXT: and a1, a0, a21796; RV64NOZBB-NEXT: srli a0, a0, 21797; RV64NOZBB-NEXT: and a0, a0, a21798; RV64NOZBB-NEXT: add a0, a1, a01799; RV64NOZBB-NEXT: srli a1, a0, 41800; RV64NOZBB-NEXT: add a0, a0, a11801; RV64NOZBB-NEXT: andi a1, a0, 151802; RV64NOZBB-NEXT: slli a0, a0, 521803; RV64NOZBB-NEXT: srli a0, a0, 601804; RV64NOZBB-NEXT: add a0, a1, a01805; RV64NOZBB-NEXT: ret1806;1807; RV32ZBB-LABEL: test_ctlz_i16_zero_undef:1808; RV32ZBB: # %bb.0:1809; RV32ZBB-NEXT: slli a0, a0, 161810; RV32ZBB-NEXT: clz a0, a01811; RV32ZBB-NEXT: ret1812;1813; RV64ZBB-LABEL: test_ctlz_i16_zero_undef:1814; RV64ZBB: # %bb.0:1815; RV64ZBB-NEXT: slli a0, a0, 481816; RV64ZBB-NEXT: clz a0, a01817; RV64ZBB-NEXT: ret1818;1819; RV32XTHEADBB-LABEL: test_ctlz_i16_zero_undef:1820; RV32XTHEADBB: # %bb.0:1821; RV32XTHEADBB-NEXT: slli a0, a0, 161822; RV32XTHEADBB-NEXT: th.ff1 a0, a01823; RV32XTHEADBB-NEXT: ret1824;1825; RV64XTHEADBB-LABEL: test_ctlz_i16_zero_undef:1826; RV64XTHEADBB: # %bb.0:1827; RV64XTHEADBB-NEXT: slli a0, a0, 481828; RV64XTHEADBB-NEXT: th.ff1 a0, a01829; RV64XTHEADBB-NEXT: ret1830 %tmp = call i16 @llvm.ctlz.i16(i16 %a, i1 true)1831 ret i16 %tmp1832}1833 1834define i32 @test_ctlz_i32_zero_undef(i32 %a) nounwind {1835; RV32I-LABEL: test_ctlz_i32_zero_undef:1836; RV32I: # %bb.0:1837; RV32I-NEXT: srli a1, a0, 11838; RV32I-NEXT: lui a2, 3495251839; RV32I-NEXT: or a0, a0, a11840; RV32I-NEXT: addi a1, a2, 13651841; RV32I-NEXT: srli a2, a0, 21842; RV32I-NEXT: or a0, a0, a21843; RV32I-NEXT: srli a2, a0, 41844; RV32I-NEXT: or a0, a0, a21845; RV32I-NEXT: srli a2, a0, 81846; RV32I-NEXT: or a0, a0, a21847; RV32I-NEXT: srli a2, a0, 161848; RV32I-NEXT: or a0, a0, a21849; RV32I-NEXT: not a0, a01850; RV32I-NEXT: srli a2, a0, 11851; RV32I-NEXT: and a1, a2, a11852; RV32I-NEXT: lui a2, 2097151853; RV32I-NEXT: addi a2, a2, 8191854; RV32I-NEXT: sub a0, a0, a11855; RV32I-NEXT: and a1, a0, a21856; RV32I-NEXT: srli a0, a0, 21857; RV32I-NEXT: and a0, a0, a21858; RV32I-NEXT: lui a2, 616811859; RV32I-NEXT: add a0, a1, a01860; RV32I-NEXT: srli a1, a0, 41861; RV32I-NEXT: add a0, a0, a11862; RV32I-NEXT: addi a1, a2, -2411863; RV32I-NEXT: and a0, a0, a11864; RV32I-NEXT: slli a1, a0, 81865; RV32I-NEXT: add a0, a0, a11866; RV32I-NEXT: slli a1, a0, 161867; RV32I-NEXT: add a0, a0, a11868; RV32I-NEXT: srli a0, a0, 241869; RV32I-NEXT: ret1870;1871; RV64I-LABEL: test_ctlz_i32_zero_undef:1872; RV64I: # %bb.0:1873; RV64I-NEXT: srliw a1, a0, 11874; RV64I-NEXT: lui a2, 3495251875; RV64I-NEXT: or a0, a0, a11876; RV64I-NEXT: addi a1, a2, 13651877; RV64I-NEXT: srliw a2, a0, 21878; RV64I-NEXT: or a0, a0, a21879; RV64I-NEXT: srliw a2, a0, 41880; RV64I-NEXT: or a0, a0, a21881; RV64I-NEXT: srliw a2, a0, 81882; RV64I-NEXT: or a0, a0, a21883; RV64I-NEXT: srliw a2, a0, 161884; RV64I-NEXT: or a0, a0, a21885; RV64I-NEXT: not a0, a01886; RV64I-NEXT: srli a2, a0, 11887; RV64I-NEXT: and a1, a2, a11888; RV64I-NEXT: lui a2, 2097151889; RV64I-NEXT: addi a2, a2, 8191890; RV64I-NEXT: sub a0, a0, a11891; RV64I-NEXT: and a1, a0, a21892; RV64I-NEXT: srli a0, a0, 21893; RV64I-NEXT: and a0, a0, a21894; RV64I-NEXT: lui a2, 616811895; RV64I-NEXT: add a0, a1, a01896; RV64I-NEXT: srli a1, a0, 41897; RV64I-NEXT: add a0, a0, a11898; RV64I-NEXT: addi a1, a2, -2411899; RV64I-NEXT: and a0, a0, a11900; RV64I-NEXT: slli a1, a0, 81901; RV64I-NEXT: add a0, a0, a11902; RV64I-NEXT: slli a1, a0, 161903; RV64I-NEXT: add a0, a0, a11904; RV64I-NEXT: srliw a0, a0, 241905; RV64I-NEXT: ret1906;1907; RV32M-LABEL: test_ctlz_i32_zero_undef:1908; RV32M: # %bb.0:1909; RV32M-NEXT: srli a1, a0, 11910; RV32M-NEXT: lui a2, 3495251911; RV32M-NEXT: or a0, a0, a11912; RV32M-NEXT: addi a1, a2, 13651913; RV32M-NEXT: srli a2, a0, 21914; RV32M-NEXT: or a0, a0, a21915; RV32M-NEXT: srli a2, a0, 41916; RV32M-NEXT: or a0, a0, a21917; RV32M-NEXT: srli a2, a0, 81918; RV32M-NEXT: or a0, a0, a21919; RV32M-NEXT: srli a2, a0, 161920; RV32M-NEXT: or a0, a0, a21921; RV32M-NEXT: not a0, a01922; RV32M-NEXT: srli a2, a0, 11923; RV32M-NEXT: and a1, a2, a11924; RV32M-NEXT: lui a2, 2097151925; RV32M-NEXT: addi a2, a2, 8191926; RV32M-NEXT: sub a0, a0, a11927; RV32M-NEXT: and a1, a0, a21928; RV32M-NEXT: srli a0, a0, 21929; RV32M-NEXT: and a0, a0, a21930; RV32M-NEXT: lui a2, 616811931; RV32M-NEXT: add a0, a1, a01932; RV32M-NEXT: srli a1, a0, 41933; RV32M-NEXT: add a0, a0, a11934; RV32M-NEXT: lui a1, 41121935; RV32M-NEXT: addi a2, a2, -2411936; RV32M-NEXT: and a0, a0, a21937; RV32M-NEXT: addi a1, a1, 2571938; RV32M-NEXT: mul a0, a0, a11939; RV32M-NEXT: srli a0, a0, 241940; RV32M-NEXT: ret1941;1942; RV64M-LABEL: test_ctlz_i32_zero_undef:1943; RV64M: # %bb.0:1944; RV64M-NEXT: srliw a1, a0, 11945; RV64M-NEXT: lui a2, 3495251946; RV64M-NEXT: or a0, a0, a11947; RV64M-NEXT: addi a1, a2, 13651948; RV64M-NEXT: srliw a2, a0, 21949; RV64M-NEXT: or a0, a0, a21950; RV64M-NEXT: srliw a2, a0, 41951; RV64M-NEXT: or a0, a0, a21952; RV64M-NEXT: srliw a2, a0, 81953; RV64M-NEXT: or a0, a0, a21954; RV64M-NEXT: srliw a2, a0, 161955; RV64M-NEXT: or a0, a0, a21956; RV64M-NEXT: not a0, a01957; RV64M-NEXT: srli a2, a0, 11958; RV64M-NEXT: and a1, a2, a11959; RV64M-NEXT: lui a2, 2097151960; RV64M-NEXT: addi a2, a2, 8191961; RV64M-NEXT: sub a0, a0, a11962; RV64M-NEXT: and a1, a0, a21963; RV64M-NEXT: srli a0, a0, 21964; RV64M-NEXT: and a0, a0, a21965; RV64M-NEXT: lui a2, 616811966; RV64M-NEXT: add a0, a1, a01967; RV64M-NEXT: srli a1, a0, 41968; RV64M-NEXT: add a0, a0, a11969; RV64M-NEXT: lui a1, 41121970; RV64M-NEXT: addi a2, a2, -2411971; RV64M-NEXT: and a0, a0, a21972; RV64M-NEXT: addi a1, a1, 2571973; RV64M-NEXT: mul a0, a0, a11974; RV64M-NEXT: srliw a0, a0, 241975; RV64M-NEXT: ret1976;1977; RV32ZBB-LABEL: test_ctlz_i32_zero_undef:1978; RV32ZBB: # %bb.0:1979; RV32ZBB-NEXT: clz a0, a01980; RV32ZBB-NEXT: ret1981;1982; RV64ZBB-LABEL: test_ctlz_i32_zero_undef:1983; RV64ZBB: # %bb.0:1984; RV64ZBB-NEXT: clzw a0, a01985; RV64ZBB-NEXT: ret1986;1987; RV32XTHEADBB-LABEL: test_ctlz_i32_zero_undef:1988; RV32XTHEADBB: # %bb.0:1989; RV32XTHEADBB-NEXT: th.ff1 a0, a01990; RV32XTHEADBB-NEXT: ret1991;1992; RV64XTHEADBB-LABEL: test_ctlz_i32_zero_undef:1993; RV64XTHEADBB: # %bb.0:1994; RV64XTHEADBB-NEXT: slli a0, a0, 321995; RV64XTHEADBB-NEXT: th.ff1 a0, a01996; RV64XTHEADBB-NEXT: ret1997 %tmp = call i32 @llvm.ctlz.i32(i32 %a, i1 true)1998 ret i32 %tmp1999}2000 2001define i64 @test_ctlz_i64_zero_undef(i64 %a) nounwind {2002; RV32I-LABEL: test_ctlz_i64_zero_undef:2003; RV32I: # %bb.0:2004; RV32I-NEXT: lui a2, 3495252005; RV32I-NEXT: lui a3, 2097152006; RV32I-NEXT: lui a5, 616812007; RV32I-NEXT: addi a4, a2, 13652008; RV32I-NEXT: addi a3, a3, 8192009; RV32I-NEXT: addi a2, a5, -2412010; RV32I-NEXT: bnez a1, .LBB15_22011; RV32I-NEXT: # %bb.1:2012; RV32I-NEXT: srli a1, a0, 12013; RV32I-NEXT: or a0, a0, a12014; RV32I-NEXT: srli a1, a0, 22015; RV32I-NEXT: or a0, a0, a12016; RV32I-NEXT: srli a1, a0, 42017; RV32I-NEXT: or a0, a0, a12018; RV32I-NEXT: srli a1, a0, 82019; RV32I-NEXT: or a0, a0, a12020; RV32I-NEXT: srli a1, a0, 162021; RV32I-NEXT: or a0, a0, a12022; RV32I-NEXT: not a0, a02023; RV32I-NEXT: srli a1, a0, 12024; RV32I-NEXT: and a1, a1, a42025; RV32I-NEXT: sub a0, a0, a12026; RV32I-NEXT: and a1, a0, a32027; RV32I-NEXT: srli a0, a0, 22028; RV32I-NEXT: and a0, a0, a32029; RV32I-NEXT: add a0, a1, a02030; RV32I-NEXT: srli a1, a0, 42031; RV32I-NEXT: add a0, a0, a12032; RV32I-NEXT: and a0, a0, a22033; RV32I-NEXT: slli a1, a0, 82034; RV32I-NEXT: add a0, a0, a12035; RV32I-NEXT: slli a1, a0, 162036; RV32I-NEXT: add a0, a0, a12037; RV32I-NEXT: srli a0, a0, 242038; RV32I-NEXT: addi a0, a0, 322039; RV32I-NEXT: li a1, 02040; RV32I-NEXT: ret2041; RV32I-NEXT: .LBB15_2:2042; RV32I-NEXT: srli a0, a1, 12043; RV32I-NEXT: or a0, a1, a02044; RV32I-NEXT: srli a1, a0, 22045; RV32I-NEXT: or a0, a0, a12046; RV32I-NEXT: srli a1, a0, 42047; RV32I-NEXT: or a0, a0, a12048; RV32I-NEXT: srli a1, a0, 82049; RV32I-NEXT: or a0, a0, a12050; RV32I-NEXT: srli a1, a0, 162051; RV32I-NEXT: or a0, a0, a12052; RV32I-NEXT: not a0, a02053; RV32I-NEXT: srli a1, a0, 12054; RV32I-NEXT: and a1, a1, a42055; RV32I-NEXT: sub a0, a0, a12056; RV32I-NEXT: and a1, a0, a32057; RV32I-NEXT: srli a0, a0, 22058; RV32I-NEXT: and a0, a0, a32059; RV32I-NEXT: add a0, a1, a02060; RV32I-NEXT: srli a1, a0, 42061; RV32I-NEXT: add a0, a0, a12062; RV32I-NEXT: and a0, a0, a22063; RV32I-NEXT: slli a1, a0, 82064; RV32I-NEXT: add a0, a0, a12065; RV32I-NEXT: slli a1, a0, 162066; RV32I-NEXT: add a0, a0, a12067; RV32I-NEXT: srli a0, a0, 242068; RV32I-NEXT: li a1, 02069; RV32I-NEXT: ret2070;2071; RV64I-LABEL: test_ctlz_i64_zero_undef:2072; RV64I: # %bb.0:2073; RV64I-NEXT: srli a1, a0, 12074; RV64I-NEXT: lui a2, 3495252075; RV64I-NEXT: lui a3, 2097152076; RV64I-NEXT: or a0, a0, a12077; RV64I-NEXT: addi a1, a2, 13652078; RV64I-NEXT: addi a2, a3, 8192079; RV64I-NEXT: srli a3, a0, 22080; RV64I-NEXT: or a0, a0, a32081; RV64I-NEXT: slli a3, a1, 322082; RV64I-NEXT: add a1, a1, a32083; RV64I-NEXT: slli a3, a2, 322084; RV64I-NEXT: add a2, a2, a32085; RV64I-NEXT: srli a3, a0, 42086; RV64I-NEXT: or a0, a0, a32087; RV64I-NEXT: srli a3, a0, 82088; RV64I-NEXT: or a0, a0, a32089; RV64I-NEXT: srli a3, a0, 162090; RV64I-NEXT: or a0, a0, a32091; RV64I-NEXT: srli a3, a0, 322092; RV64I-NEXT: or a0, a0, a32093; RV64I-NEXT: not a0, a02094; RV64I-NEXT: srli a3, a0, 12095; RV64I-NEXT: and a1, a3, a12096; RV64I-NEXT: lui a3, 616812097; RV64I-NEXT: addi a3, a3, -2412098; RV64I-NEXT: sub a0, a0, a12099; RV64I-NEXT: and a1, a0, a22100; RV64I-NEXT: srli a0, a0, 22101; RV64I-NEXT: and a0, a0, a22102; RV64I-NEXT: slli a2, a3, 322103; RV64I-NEXT: add a0, a1, a02104; RV64I-NEXT: srli a1, a0, 42105; RV64I-NEXT: add a0, a0, a12106; RV64I-NEXT: add a2, a3, a22107; RV64I-NEXT: and a0, a0, a22108; RV64I-NEXT: slli a1, a0, 82109; RV64I-NEXT: add a0, a0, a12110; RV64I-NEXT: slli a1, a0, 162111; RV64I-NEXT: add a0, a0, a12112; RV64I-NEXT: slli a1, a0, 322113; RV64I-NEXT: add a0, a0, a12114; RV64I-NEXT: srli a0, a0, 562115; RV64I-NEXT: ret2116;2117; RV32M-LABEL: test_ctlz_i64_zero_undef:2118; RV32M: # %bb.0:2119; RV32M-NEXT: lui a2, 3495252120; RV32M-NEXT: lui a3, 2097152121; RV32M-NEXT: lui a6, 616812122; RV32M-NEXT: lui a7, 41122123; RV32M-NEXT: addi a5, a2, 13652124; RV32M-NEXT: addi a4, a3, 8192125; RV32M-NEXT: addi a3, a6, -2412126; RV32M-NEXT: addi a2, a7, 2572127; RV32M-NEXT: bnez a1, .LBB15_22128; RV32M-NEXT: # %bb.1:2129; RV32M-NEXT: srli a1, a0, 12130; RV32M-NEXT: or a0, a0, a12131; RV32M-NEXT: srli a1, a0, 22132; RV32M-NEXT: or a0, a0, a12133; RV32M-NEXT: srli a1, a0, 42134; RV32M-NEXT: or a0, a0, a12135; RV32M-NEXT: srli a1, a0, 82136; RV32M-NEXT: or a0, a0, a12137; RV32M-NEXT: srli a1, a0, 162138; RV32M-NEXT: or a0, a0, a12139; RV32M-NEXT: not a0, a02140; RV32M-NEXT: srli a1, a0, 12141; RV32M-NEXT: and a1, a1, a52142; RV32M-NEXT: sub a0, a0, a12143; RV32M-NEXT: and a1, a0, a42144; RV32M-NEXT: srli a0, a0, 22145; RV32M-NEXT: and a0, a0, a42146; RV32M-NEXT: add a0, a1, a02147; RV32M-NEXT: srli a1, a0, 42148; RV32M-NEXT: add a0, a0, a12149; RV32M-NEXT: and a0, a0, a32150; RV32M-NEXT: mul a0, a0, a22151; RV32M-NEXT: srli a0, a0, 242152; RV32M-NEXT: addi a0, a0, 322153; RV32M-NEXT: li a1, 02154; RV32M-NEXT: ret2155; RV32M-NEXT: .LBB15_2:2156; RV32M-NEXT: srli a0, a1, 12157; RV32M-NEXT: or a0, a1, a02158; RV32M-NEXT: srli a1, a0, 22159; RV32M-NEXT: or a0, a0, a12160; RV32M-NEXT: srli a1, a0, 42161; RV32M-NEXT: or a0, a0, a12162; RV32M-NEXT: srli a1, a0, 82163; RV32M-NEXT: or a0, a0, a12164; RV32M-NEXT: srli a1, a0, 162165; RV32M-NEXT: or a0, a0, a12166; RV32M-NEXT: not a0, a02167; RV32M-NEXT: srli a1, a0, 12168; RV32M-NEXT: and a1, a1, a52169; RV32M-NEXT: sub a0, a0, a12170; RV32M-NEXT: and a1, a0, a42171; RV32M-NEXT: srli a0, a0, 22172; RV32M-NEXT: and a0, a0, a42173; RV32M-NEXT: add a0, a1, a02174; RV32M-NEXT: srli a1, a0, 42175; RV32M-NEXT: add a0, a0, a12176; RV32M-NEXT: and a0, a0, a32177; RV32M-NEXT: mul a0, a0, a22178; RV32M-NEXT: srli a0, a0, 242179; RV32M-NEXT: li a1, 02180; RV32M-NEXT: ret2181;2182; RV64M-LABEL: test_ctlz_i64_zero_undef:2183; RV64M: # %bb.0:2184; RV64M-NEXT: srli a1, a0, 12185; RV64M-NEXT: lui a2, 3495252186; RV64M-NEXT: lui a3, 2097152187; RV64M-NEXT: lui a4, 616812188; RV64M-NEXT: or a0, a0, a12189; RV64M-NEXT: addi a1, a2, 13652190; RV64M-NEXT: addi a2, a3, 8192191; RV64M-NEXT: addi a3, a4, -2412192; RV64M-NEXT: srli a4, a0, 22193; RV64M-NEXT: or a0, a0, a42194; RV64M-NEXT: slli a4, a1, 322195; RV64M-NEXT: add a1, a1, a42196; RV64M-NEXT: slli a4, a2, 322197; RV64M-NEXT: add a2, a2, a42198; RV64M-NEXT: slli a4, a3, 322199; RV64M-NEXT: add a3, a3, a42200; RV64M-NEXT: srli a4, a0, 42201; RV64M-NEXT: or a0, a0, a42202; RV64M-NEXT: srli a4, a0, 82203; RV64M-NEXT: or a0, a0, a42204; RV64M-NEXT: srli a4, a0, 162205; RV64M-NEXT: or a0, a0, a42206; RV64M-NEXT: srli a4, a0, 322207; RV64M-NEXT: or a0, a0, a42208; RV64M-NEXT: not a0, a02209; RV64M-NEXT: srli a4, a0, 12210; RV64M-NEXT: and a1, a4, a12211; RV64M-NEXT: sub a0, a0, a12212; RV64M-NEXT: and a1, a0, a22213; RV64M-NEXT: srli a0, a0, 22214; RV64M-NEXT: and a0, a0, a22215; RV64M-NEXT: lui a2, 41122216; RV64M-NEXT: addi a2, a2, 2572217; RV64M-NEXT: add a0, a1, a02218; RV64M-NEXT: srli a1, a0, 42219; RV64M-NEXT: add a0, a0, a12220; RV64M-NEXT: slli a1, a2, 322221; RV64M-NEXT: and a0, a0, a32222; RV64M-NEXT: add a1, a2, a12223; RV64M-NEXT: mul a0, a0, a12224; RV64M-NEXT: srli a0, a0, 562225; RV64M-NEXT: ret2226;2227; RV32ZBB-LABEL: test_ctlz_i64_zero_undef:2228; RV32ZBB: # %bb.0:2229; RV32ZBB-NEXT: bnez a1, .LBB15_22230; RV32ZBB-NEXT: # %bb.1:2231; RV32ZBB-NEXT: clz a0, a02232; RV32ZBB-NEXT: addi a0, a0, 322233; RV32ZBB-NEXT: li a1, 02234; RV32ZBB-NEXT: ret2235; RV32ZBB-NEXT: .LBB15_2:2236; RV32ZBB-NEXT: clz a0, a12237; RV32ZBB-NEXT: li a1, 02238; RV32ZBB-NEXT: ret2239;2240; RV64ZBB-LABEL: test_ctlz_i64_zero_undef:2241; RV64ZBB: # %bb.0:2242; RV64ZBB-NEXT: clz a0, a02243; RV64ZBB-NEXT: ret2244;2245; RV32XTHEADBB-LABEL: test_ctlz_i64_zero_undef:2246; RV32XTHEADBB: # %bb.0:2247; RV32XTHEADBB-NEXT: bnez a1, .LBB15_22248; RV32XTHEADBB-NEXT: # %bb.1:2249; RV32XTHEADBB-NEXT: th.ff1 a0, a02250; RV32XTHEADBB-NEXT: addi a0, a0, 322251; RV32XTHEADBB-NEXT: li a1, 02252; RV32XTHEADBB-NEXT: ret2253; RV32XTHEADBB-NEXT: .LBB15_2:2254; RV32XTHEADBB-NEXT: th.ff1 a0, a12255; RV32XTHEADBB-NEXT: li a1, 02256; RV32XTHEADBB-NEXT: ret2257;2258; RV64XTHEADBB-LABEL: test_ctlz_i64_zero_undef:2259; RV64XTHEADBB: # %bb.0:2260; RV64XTHEADBB-NEXT: th.ff1 a0, a02261; RV64XTHEADBB-NEXT: ret2262 %tmp = call i64 @llvm.ctlz.i64(i64 %a, i1 true)2263 ret i64 %tmp2264}2265 2266define i8 @test_ctpop_i8(i8 %a) nounwind {2267; RV32_NOZBB-LABEL: test_ctpop_i8:2268; RV32_NOZBB: # %bb.0:2269; RV32_NOZBB-NEXT: srli a1, a0, 12270; RV32_NOZBB-NEXT: andi a1, a1, 852271; RV32_NOZBB-NEXT: sub a0, a0, a12272; RV32_NOZBB-NEXT: andi a1, a0, 512273; RV32_NOZBB-NEXT: srli a0, a0, 22274; RV32_NOZBB-NEXT: andi a0, a0, 512275; RV32_NOZBB-NEXT: add a0, a1, a02276; RV32_NOZBB-NEXT: srli a1, a0, 42277; RV32_NOZBB-NEXT: add a0, a0, a12278; RV32_NOZBB-NEXT: andi a0, a0, 152279; RV32_NOZBB-NEXT: ret2280;2281; RV64NOZBB-LABEL: test_ctpop_i8:2282; RV64NOZBB: # %bb.0:2283; RV64NOZBB-NEXT: srli a1, a0, 12284; RV64NOZBB-NEXT: andi a1, a1, 852285; RV64NOZBB-NEXT: sub a0, a0, a12286; RV64NOZBB-NEXT: andi a1, a0, 512287; RV64NOZBB-NEXT: srli a0, a0, 22288; RV64NOZBB-NEXT: andi a0, a0, 512289; RV64NOZBB-NEXT: add a0, a1, a02290; RV64NOZBB-NEXT: srli a1, a0, 42291; RV64NOZBB-NEXT: add a0, a0, a12292; RV64NOZBB-NEXT: andi a0, a0, 152293; RV64NOZBB-NEXT: ret2294;2295; RV32ZBB-LABEL: test_ctpop_i8:2296; RV32ZBB: # %bb.0:2297; RV32ZBB-NEXT: zext.b a0, a02298; RV32ZBB-NEXT: cpop a0, a02299; RV32ZBB-NEXT: ret2300;2301; RV64ZBB-LABEL: test_ctpop_i8:2302; RV64ZBB: # %bb.0:2303; RV64ZBB-NEXT: zext.b a0, a02304; RV64ZBB-NEXT: cpopw a0, a02305; RV64ZBB-NEXT: ret2306;2307; RV32XTHEADBB-LABEL: test_ctpop_i8:2308; RV32XTHEADBB: # %bb.0:2309; RV32XTHEADBB-NEXT: srli a1, a0, 12310; RV32XTHEADBB-NEXT: andi a1, a1, 852311; RV32XTHEADBB-NEXT: sub a0, a0, a12312; RV32XTHEADBB-NEXT: andi a1, a0, 512313; RV32XTHEADBB-NEXT: srli a0, a0, 22314; RV32XTHEADBB-NEXT: andi a0, a0, 512315; RV32XTHEADBB-NEXT: add a0, a1, a02316; RV32XTHEADBB-NEXT: srli a1, a0, 42317; RV32XTHEADBB-NEXT: add a0, a0, a12318; RV32XTHEADBB-NEXT: andi a0, a0, 152319; RV32XTHEADBB-NEXT: ret2320;2321; RV64XTHEADBB-LABEL: test_ctpop_i8:2322; RV64XTHEADBB: # %bb.0:2323; RV64XTHEADBB-NEXT: srli a1, a0, 12324; RV64XTHEADBB-NEXT: andi a1, a1, 852325; RV64XTHEADBB-NEXT: sub a0, a0, a12326; RV64XTHEADBB-NEXT: andi a1, a0, 512327; RV64XTHEADBB-NEXT: srli a0, a0, 22328; RV64XTHEADBB-NEXT: andi a0, a0, 512329; RV64XTHEADBB-NEXT: add a0, a1, a02330; RV64XTHEADBB-NEXT: srli a1, a0, 42331; RV64XTHEADBB-NEXT: add a0, a0, a12332; RV64XTHEADBB-NEXT: andi a0, a0, 152333; RV64XTHEADBB-NEXT: ret2334 %1 = call i8 @llvm.ctpop.i8(i8 %a)2335 ret i8 %12336}2337 2338define i16 @test_ctpop_i16(i16 %a) nounwind {2339; RV32_NOZBB-LABEL: test_ctpop_i16:2340; RV32_NOZBB: # %bb.0:2341; RV32_NOZBB-NEXT: srli a1, a0, 12342; RV32_NOZBB-NEXT: lui a2, 52343; RV32_NOZBB-NEXT: addi a2, a2, 13652344; RV32_NOZBB-NEXT: and a1, a1, a22345; RV32_NOZBB-NEXT: lui a2, 32346; RV32_NOZBB-NEXT: addi a2, a2, 8192347; RV32_NOZBB-NEXT: sub a0, a0, a12348; RV32_NOZBB-NEXT: and a1, a0, a22349; RV32_NOZBB-NEXT: srli a0, a0, 22350; RV32_NOZBB-NEXT: and a0, a0, a22351; RV32_NOZBB-NEXT: add a0, a1, a02352; RV32_NOZBB-NEXT: srli a1, a0, 42353; RV32_NOZBB-NEXT: add a0, a0, a12354; RV32_NOZBB-NEXT: andi a1, a0, 152355; RV32_NOZBB-NEXT: slli a0, a0, 202356; RV32_NOZBB-NEXT: srli a0, a0, 282357; RV32_NOZBB-NEXT: add a0, a1, a02358; RV32_NOZBB-NEXT: ret2359;2360; RV64NOZBB-LABEL: test_ctpop_i16:2361; RV64NOZBB: # %bb.0:2362; RV64NOZBB-NEXT: srli a1, a0, 12363; RV64NOZBB-NEXT: lui a2, 52364; RV64NOZBB-NEXT: addi a2, a2, 13652365; RV64NOZBB-NEXT: and a1, a1, a22366; RV64NOZBB-NEXT: lui a2, 32367; RV64NOZBB-NEXT: addi a2, a2, 8192368; RV64NOZBB-NEXT: sub a0, a0, a12369; RV64NOZBB-NEXT: and a1, a0, a22370; RV64NOZBB-NEXT: srli a0, a0, 22371; RV64NOZBB-NEXT: and a0, a0, a22372; RV64NOZBB-NEXT: add a0, a1, a02373; RV64NOZBB-NEXT: srli a1, a0, 42374; RV64NOZBB-NEXT: add a0, a0, a12375; RV64NOZBB-NEXT: andi a1, a0, 152376; RV64NOZBB-NEXT: slli a0, a0, 522377; RV64NOZBB-NEXT: srli a0, a0, 602378; RV64NOZBB-NEXT: add a0, a1, a02379; RV64NOZBB-NEXT: ret2380;2381; RV32ZBB-LABEL: test_ctpop_i16:2382; RV32ZBB: # %bb.0:2383; RV32ZBB-NEXT: zext.h a0, a02384; RV32ZBB-NEXT: cpop a0, a02385; RV32ZBB-NEXT: ret2386;2387; RV64ZBB-LABEL: test_ctpop_i16:2388; RV64ZBB: # %bb.0:2389; RV64ZBB-NEXT: zext.h a0, a02390; RV64ZBB-NEXT: cpopw a0, a02391; RV64ZBB-NEXT: ret2392;2393; RV32XTHEADBB-LABEL: test_ctpop_i16:2394; RV32XTHEADBB: # %bb.0:2395; RV32XTHEADBB-NEXT: srli a1, a0, 12396; RV32XTHEADBB-NEXT: lui a2, 52397; RV32XTHEADBB-NEXT: addi a2, a2, 13652398; RV32XTHEADBB-NEXT: and a1, a1, a22399; RV32XTHEADBB-NEXT: lui a2, 32400; RV32XTHEADBB-NEXT: addi a2, a2, 8192401; RV32XTHEADBB-NEXT: sub a0, a0, a12402; RV32XTHEADBB-NEXT: and a1, a0, a22403; RV32XTHEADBB-NEXT: srli a0, a0, 22404; RV32XTHEADBB-NEXT: and a0, a0, a22405; RV32XTHEADBB-NEXT: add a0, a1, a02406; RV32XTHEADBB-NEXT: srli a1, a0, 42407; RV32XTHEADBB-NEXT: add a0, a0, a12408; RV32XTHEADBB-NEXT: th.extu a1, a0, 11, 82409; RV32XTHEADBB-NEXT: andi a0, a0, 152410; RV32XTHEADBB-NEXT: add a0, a0, a12411; RV32XTHEADBB-NEXT: ret2412;2413; RV64XTHEADBB-LABEL: test_ctpop_i16:2414; RV64XTHEADBB: # %bb.0:2415; RV64XTHEADBB-NEXT: srli a1, a0, 12416; RV64XTHEADBB-NEXT: lui a2, 52417; RV64XTHEADBB-NEXT: addi a2, a2, 13652418; RV64XTHEADBB-NEXT: and a1, a1, a22419; RV64XTHEADBB-NEXT: lui a2, 32420; RV64XTHEADBB-NEXT: addi a2, a2, 8192421; RV64XTHEADBB-NEXT: sub a0, a0, a12422; RV64XTHEADBB-NEXT: and a1, a0, a22423; RV64XTHEADBB-NEXT: srli a0, a0, 22424; RV64XTHEADBB-NEXT: and a0, a0, a22425; RV64XTHEADBB-NEXT: add a0, a1, a02426; RV64XTHEADBB-NEXT: srli a1, a0, 42427; RV64XTHEADBB-NEXT: add a0, a0, a12428; RV64XTHEADBB-NEXT: th.extu a1, a0, 11, 82429; RV64XTHEADBB-NEXT: andi a0, a0, 152430; RV64XTHEADBB-NEXT: add a0, a0, a12431; RV64XTHEADBB-NEXT: ret2432 %1 = call i16 @llvm.ctpop.i16(i16 %a)2433 ret i16 %12434}2435 2436define i32 @test_ctpop_i32(i32 %a) nounwind {2437; RV32I-LABEL: test_ctpop_i32:2438; RV32I: # %bb.0:2439; RV32I-NEXT: srli a1, a0, 12440; RV32I-NEXT: lui a2, 3495252441; RV32I-NEXT: addi a2, a2, 13652442; RV32I-NEXT: and a1, a1, a22443; RV32I-NEXT: lui a2, 2097152444; RV32I-NEXT: addi a2, a2, 8192445; RV32I-NEXT: sub a0, a0, a12446; RV32I-NEXT: and a1, a0, a22447; RV32I-NEXT: srli a0, a0, 22448; RV32I-NEXT: and a0, a0, a22449; RV32I-NEXT: lui a2, 616812450; RV32I-NEXT: add a0, a1, a02451; RV32I-NEXT: srli a1, a0, 42452; RV32I-NEXT: add a0, a0, a12453; RV32I-NEXT: addi a1, a2, -2412454; RV32I-NEXT: and a0, a0, a12455; RV32I-NEXT: slli a1, a0, 82456; RV32I-NEXT: add a0, a0, a12457; RV32I-NEXT: slli a1, a0, 162458; RV32I-NEXT: add a0, a0, a12459; RV32I-NEXT: srli a0, a0, 242460; RV32I-NEXT: ret2461;2462; RV64I-LABEL: test_ctpop_i32:2463; RV64I: # %bb.0:2464; RV64I-NEXT: srli a1, a0, 12465; RV64I-NEXT: lui a2, 3495252466; RV64I-NEXT: addi a2, a2, 13652467; RV64I-NEXT: and a1, a1, a22468; RV64I-NEXT: lui a2, 2097152469; RV64I-NEXT: addi a2, a2, 8192470; RV64I-NEXT: sub a0, a0, a12471; RV64I-NEXT: and a1, a0, a22472; RV64I-NEXT: srli a0, a0, 22473; RV64I-NEXT: and a0, a0, a22474; RV64I-NEXT: lui a2, 616812475; RV64I-NEXT: add a0, a1, a02476; RV64I-NEXT: srli a1, a0, 42477; RV64I-NEXT: add a0, a0, a12478; RV64I-NEXT: addi a1, a2, -2412479; RV64I-NEXT: and a0, a0, a12480; RV64I-NEXT: slli a1, a0, 82481; RV64I-NEXT: add a0, a0, a12482; RV64I-NEXT: slli a1, a0, 162483; RV64I-NEXT: add a0, a0, a12484; RV64I-NEXT: srliw a0, a0, 242485; RV64I-NEXT: ret2486;2487; RV32M-LABEL: test_ctpop_i32:2488; RV32M: # %bb.0:2489; RV32M-NEXT: srli a1, a0, 12490; RV32M-NEXT: lui a2, 3495252491; RV32M-NEXT: addi a2, a2, 13652492; RV32M-NEXT: and a1, a1, a22493; RV32M-NEXT: lui a2, 2097152494; RV32M-NEXT: addi a2, a2, 8192495; RV32M-NEXT: sub a0, a0, a12496; RV32M-NEXT: and a1, a0, a22497; RV32M-NEXT: srli a0, a0, 22498; RV32M-NEXT: and a0, a0, a22499; RV32M-NEXT: lui a2, 616812500; RV32M-NEXT: add a0, a1, a02501; RV32M-NEXT: srli a1, a0, 42502; RV32M-NEXT: add a0, a0, a12503; RV32M-NEXT: lui a1, 41122504; RV32M-NEXT: addi a2, a2, -2412505; RV32M-NEXT: and a0, a0, a22506; RV32M-NEXT: addi a1, a1, 2572507; RV32M-NEXT: mul a0, a0, a12508; RV32M-NEXT: srli a0, a0, 242509; RV32M-NEXT: ret2510;2511; RV64M-LABEL: test_ctpop_i32:2512; RV64M: # %bb.0:2513; RV64M-NEXT: srli a1, a0, 12514; RV64M-NEXT: lui a2, 3495252515; RV64M-NEXT: addi a2, a2, 13652516; RV64M-NEXT: and a1, a1, a22517; RV64M-NEXT: lui a2, 2097152518; RV64M-NEXT: addi a2, a2, 8192519; RV64M-NEXT: sub a0, a0, a12520; RV64M-NEXT: and a1, a0, a22521; RV64M-NEXT: srli a0, a0, 22522; RV64M-NEXT: and a0, a0, a22523; RV64M-NEXT: lui a2, 616812524; RV64M-NEXT: add a0, a1, a02525; RV64M-NEXT: srli a1, a0, 42526; RV64M-NEXT: add a0, a0, a12527; RV64M-NEXT: lui a1, 41122528; RV64M-NEXT: addi a2, a2, -2412529; RV64M-NEXT: and a0, a0, a22530; RV64M-NEXT: addi a1, a1, 2572531; RV64M-NEXT: mul a0, a0, a12532; RV64M-NEXT: srliw a0, a0, 242533; RV64M-NEXT: ret2534;2535; RV32ZBB-LABEL: test_ctpop_i32:2536; RV32ZBB: # %bb.0:2537; RV32ZBB-NEXT: cpop a0, a02538; RV32ZBB-NEXT: ret2539;2540; RV64ZBB-LABEL: test_ctpop_i32:2541; RV64ZBB: # %bb.0:2542; RV64ZBB-NEXT: cpopw a0, a02543; RV64ZBB-NEXT: ret2544;2545; RV32XTHEADBB-LABEL: test_ctpop_i32:2546; RV32XTHEADBB: # %bb.0:2547; RV32XTHEADBB-NEXT: srli a1, a0, 12548; RV32XTHEADBB-NEXT: lui a2, 3495252549; RV32XTHEADBB-NEXT: addi a2, a2, 13652550; RV32XTHEADBB-NEXT: and a1, a1, a22551; RV32XTHEADBB-NEXT: lui a2, 2097152552; RV32XTHEADBB-NEXT: addi a2, a2, 8192553; RV32XTHEADBB-NEXT: sub a0, a0, a12554; RV32XTHEADBB-NEXT: and a1, a0, a22555; RV32XTHEADBB-NEXT: srli a0, a0, 22556; RV32XTHEADBB-NEXT: and a0, a0, a22557; RV32XTHEADBB-NEXT: lui a2, 616812558; RV32XTHEADBB-NEXT: add a0, a1, a02559; RV32XTHEADBB-NEXT: srli a1, a0, 42560; RV32XTHEADBB-NEXT: add a0, a0, a12561; RV32XTHEADBB-NEXT: addi a1, a2, -2412562; RV32XTHEADBB-NEXT: and a0, a0, a12563; RV32XTHEADBB-NEXT: slli a1, a0, 82564; RV32XTHEADBB-NEXT: add a0, a0, a12565; RV32XTHEADBB-NEXT: slli a1, a0, 162566; RV32XTHEADBB-NEXT: add a0, a0, a12567; RV32XTHEADBB-NEXT: srli a0, a0, 242568; RV32XTHEADBB-NEXT: ret2569;2570; RV64XTHEADBB-LABEL: test_ctpop_i32:2571; RV64XTHEADBB: # %bb.0:2572; RV64XTHEADBB-NEXT: srli a1, a0, 12573; RV64XTHEADBB-NEXT: lui a2, 3495252574; RV64XTHEADBB-NEXT: addi a2, a2, 13652575; RV64XTHEADBB-NEXT: and a1, a1, a22576; RV64XTHEADBB-NEXT: lui a2, 2097152577; RV64XTHEADBB-NEXT: addi a2, a2, 8192578; RV64XTHEADBB-NEXT: sub a0, a0, a12579; RV64XTHEADBB-NEXT: and a1, a0, a22580; RV64XTHEADBB-NEXT: srli a0, a0, 22581; RV64XTHEADBB-NEXT: and a0, a0, a22582; RV64XTHEADBB-NEXT: lui a2, 616812583; RV64XTHEADBB-NEXT: add a0, a1, a02584; RV64XTHEADBB-NEXT: srli a1, a0, 42585; RV64XTHEADBB-NEXT: add a0, a0, a12586; RV64XTHEADBB-NEXT: addi a1, a2, -2412587; RV64XTHEADBB-NEXT: and a0, a0, a12588; RV64XTHEADBB-NEXT: slli a1, a0, 82589; RV64XTHEADBB-NEXT: add a0, a0, a12590; RV64XTHEADBB-NEXT: slli a1, a0, 162591; RV64XTHEADBB-NEXT: add a0, a0, a12592; RV64XTHEADBB-NEXT: srliw a0, a0, 242593; RV64XTHEADBB-NEXT: ret2594 %1 = call i32 @llvm.ctpop.i32(i32 %a)2595 ret i32 %12596}2597 2598define i64 @test_ctpop_i64(i64 %a) nounwind {2599; RV32I-LABEL: test_ctpop_i64:2600; RV32I: # %bb.0:2601; RV32I-NEXT: srli a2, a1, 12602; RV32I-NEXT: lui a3, 3495252603; RV32I-NEXT: lui a4, 2097152604; RV32I-NEXT: srli a5, a0, 12605; RV32I-NEXT: addi a3, a3, 13652606; RV32I-NEXT: and a2, a2, a32607; RV32I-NEXT: and a3, a5, a32608; RV32I-NEXT: lui a5, 616812609; RV32I-NEXT: addi a4, a4, 8192610; RV32I-NEXT: addi a5, a5, -2412611; RV32I-NEXT: sub a1, a1, a22612; RV32I-NEXT: sub a0, a0, a32613; RV32I-NEXT: and a2, a1, a42614; RV32I-NEXT: srli a1, a1, 22615; RV32I-NEXT: and a3, a0, a42616; RV32I-NEXT: srli a0, a0, 22617; RV32I-NEXT: and a1, a1, a42618; RV32I-NEXT: and a0, a0, a42619; RV32I-NEXT: add a1, a2, a12620; RV32I-NEXT: add a0, a3, a02621; RV32I-NEXT: srli a2, a1, 42622; RV32I-NEXT: srli a3, a0, 42623; RV32I-NEXT: add a1, a1, a22624; RV32I-NEXT: add a0, a0, a32625; RV32I-NEXT: and a1, a1, a52626; RV32I-NEXT: and a0, a0, a52627; RV32I-NEXT: slli a2, a1, 82628; RV32I-NEXT: slli a3, a0, 82629; RV32I-NEXT: add a1, a1, a22630; RV32I-NEXT: add a0, a0, a32631; RV32I-NEXT: slli a2, a1, 162632; RV32I-NEXT: slli a3, a0, 162633; RV32I-NEXT: add a1, a1, a22634; RV32I-NEXT: add a0, a0, a32635; RV32I-NEXT: srli a1, a1, 242636; RV32I-NEXT: srli a0, a0, 242637; RV32I-NEXT: add a0, a0, a12638; RV32I-NEXT: li a1, 02639; RV32I-NEXT: ret2640;2641; RV64I-LABEL: test_ctpop_i64:2642; RV64I: # %bb.0:2643; RV64I-NEXT: lui a1, 3495252644; RV64I-NEXT: lui a2, 2097152645; RV64I-NEXT: addi a1, a1, 13652646; RV64I-NEXT: addi a2, a2, 8192647; RV64I-NEXT: slli a3, a1, 322648; RV64I-NEXT: add a1, a1, a32649; RV64I-NEXT: slli a3, a2, 322650; RV64I-NEXT: add a2, a2, a32651; RV64I-NEXT: srli a3, a0, 12652; RV64I-NEXT: and a1, a3, a12653; RV64I-NEXT: lui a3, 616812654; RV64I-NEXT: addi a3, a3, -2412655; RV64I-NEXT: sub a0, a0, a12656; RV64I-NEXT: and a1, a0, a22657; RV64I-NEXT: srli a0, a0, 22658; RV64I-NEXT: and a0, a0, a22659; RV64I-NEXT: slli a2, a3, 322660; RV64I-NEXT: add a0, a1, a02661; RV64I-NEXT: srli a1, a0, 42662; RV64I-NEXT: add a0, a0, a12663; RV64I-NEXT: add a2, a3, a22664; RV64I-NEXT: and a0, a0, a22665; RV64I-NEXT: slli a1, a0, 82666; RV64I-NEXT: add a0, a0, a12667; RV64I-NEXT: slli a1, a0, 162668; RV64I-NEXT: add a0, a0, a12669; RV64I-NEXT: slli a1, a0, 322670; RV64I-NEXT: add a0, a0, a12671; RV64I-NEXT: srli a0, a0, 562672; RV64I-NEXT: ret2673;2674; RV32M-LABEL: test_ctpop_i64:2675; RV32M: # %bb.0:2676; RV32M-NEXT: srli a2, a1, 12677; RV32M-NEXT: lui a3, 3495252678; RV32M-NEXT: lui a4, 2097152679; RV32M-NEXT: lui a5, 616812680; RV32M-NEXT: srli a6, a0, 12681; RV32M-NEXT: addi a3, a3, 13652682; RV32M-NEXT: and a2, a2, a32683; RV32M-NEXT: and a3, a6, a32684; RV32M-NEXT: lui a6, 41122685; RV32M-NEXT: addi a4, a4, 8192686; RV32M-NEXT: addi a5, a5, -2412687; RV32M-NEXT: addi a6, a6, 2572688; RV32M-NEXT: sub a1, a1, a22689; RV32M-NEXT: sub a0, a0, a32690; RV32M-NEXT: and a2, a1, a42691; RV32M-NEXT: srli a1, a1, 22692; RV32M-NEXT: and a3, a0, a42693; RV32M-NEXT: srli a0, a0, 22694; RV32M-NEXT: and a1, a1, a42695; RV32M-NEXT: and a0, a0, a42696; RV32M-NEXT: add a1, a2, a12697; RV32M-NEXT: add a0, a3, a02698; RV32M-NEXT: srli a2, a1, 42699; RV32M-NEXT: srli a3, a0, 42700; RV32M-NEXT: add a1, a1, a22701; RV32M-NEXT: add a0, a0, a32702; RV32M-NEXT: and a1, a1, a52703; RV32M-NEXT: and a0, a0, a52704; RV32M-NEXT: mul a1, a1, a62705; RV32M-NEXT: mul a0, a0, a62706; RV32M-NEXT: srli a1, a1, 242707; RV32M-NEXT: srli a0, a0, 242708; RV32M-NEXT: add a0, a0, a12709; RV32M-NEXT: li a1, 02710; RV32M-NEXT: ret2711;2712; RV64M-LABEL: test_ctpop_i64:2713; RV64M: # %bb.0:2714; RV64M-NEXT: lui a1, 3495252715; RV64M-NEXT: lui a2, 2097152716; RV64M-NEXT: lui a3, 616812717; RV64M-NEXT: addi a1, a1, 13652718; RV64M-NEXT: addi a2, a2, 8192719; RV64M-NEXT: addi a3, a3, -2412720; RV64M-NEXT: slli a4, a1, 322721; RV64M-NEXT: add a1, a1, a42722; RV64M-NEXT: slli a4, a2, 322723; RV64M-NEXT: add a2, a2, a42724; RV64M-NEXT: slli a4, a3, 322725; RV64M-NEXT: add a3, a3, a42726; RV64M-NEXT: srli a4, a0, 12727; RV64M-NEXT: and a1, a4, a12728; RV64M-NEXT: sub a0, a0, a12729; RV64M-NEXT: and a1, a0, a22730; RV64M-NEXT: srli a0, a0, 22731; RV64M-NEXT: and a0, a0, a22732; RV64M-NEXT: lui a2, 41122733; RV64M-NEXT: addi a2, a2, 2572734; RV64M-NEXT: add a0, a1, a02735; RV64M-NEXT: srli a1, a0, 42736; RV64M-NEXT: add a0, a0, a12737; RV64M-NEXT: slli a1, a2, 322738; RV64M-NEXT: and a0, a0, a32739; RV64M-NEXT: add a1, a2, a12740; RV64M-NEXT: mul a0, a0, a12741; RV64M-NEXT: srli a0, a0, 562742; RV64M-NEXT: ret2743;2744; RV32ZBB-LABEL: test_ctpop_i64:2745; RV32ZBB: # %bb.0:2746; RV32ZBB-NEXT: cpop a1, a12747; RV32ZBB-NEXT: cpop a0, a02748; RV32ZBB-NEXT: add a0, a0, a12749; RV32ZBB-NEXT: li a1, 02750; RV32ZBB-NEXT: ret2751;2752; RV64ZBB-LABEL: test_ctpop_i64:2753; RV64ZBB: # %bb.0:2754; RV64ZBB-NEXT: cpop a0, a02755; RV64ZBB-NEXT: ret2756;2757; RV32XTHEADBB-LABEL: test_ctpop_i64:2758; RV32XTHEADBB: # %bb.0:2759; RV32XTHEADBB-NEXT: srli a2, a1, 12760; RV32XTHEADBB-NEXT: lui a3, 3495252761; RV32XTHEADBB-NEXT: lui a4, 2097152762; RV32XTHEADBB-NEXT: srli a5, a0, 12763; RV32XTHEADBB-NEXT: addi a3, a3, 13652764; RV32XTHEADBB-NEXT: and a2, a2, a32765; RV32XTHEADBB-NEXT: and a3, a5, a32766; RV32XTHEADBB-NEXT: lui a5, 616812767; RV32XTHEADBB-NEXT: addi a4, a4, 8192768; RV32XTHEADBB-NEXT: addi a5, a5, -2412769; RV32XTHEADBB-NEXT: sub a1, a1, a22770; RV32XTHEADBB-NEXT: sub a0, a0, a32771; RV32XTHEADBB-NEXT: and a2, a1, a42772; RV32XTHEADBB-NEXT: srli a1, a1, 22773; RV32XTHEADBB-NEXT: and a3, a0, a42774; RV32XTHEADBB-NEXT: srli a0, a0, 22775; RV32XTHEADBB-NEXT: and a1, a1, a42776; RV32XTHEADBB-NEXT: and a0, a0, a42777; RV32XTHEADBB-NEXT: add a1, a2, a12778; RV32XTHEADBB-NEXT: add a0, a3, a02779; RV32XTHEADBB-NEXT: srli a2, a1, 42780; RV32XTHEADBB-NEXT: srli a3, a0, 42781; RV32XTHEADBB-NEXT: add a1, a1, a22782; RV32XTHEADBB-NEXT: add a0, a0, a32783; RV32XTHEADBB-NEXT: and a1, a1, a52784; RV32XTHEADBB-NEXT: and a0, a0, a52785; RV32XTHEADBB-NEXT: slli a2, a1, 82786; RV32XTHEADBB-NEXT: slli a3, a0, 82787; RV32XTHEADBB-NEXT: add a1, a1, a22788; RV32XTHEADBB-NEXT: add a0, a0, a32789; RV32XTHEADBB-NEXT: slli a2, a1, 162790; RV32XTHEADBB-NEXT: slli a3, a0, 162791; RV32XTHEADBB-NEXT: add a1, a1, a22792; RV32XTHEADBB-NEXT: add a0, a0, a32793; RV32XTHEADBB-NEXT: srli a1, a1, 242794; RV32XTHEADBB-NEXT: srli a0, a0, 242795; RV32XTHEADBB-NEXT: add a0, a0, a12796; RV32XTHEADBB-NEXT: li a1, 02797; RV32XTHEADBB-NEXT: ret2798;2799; RV64XTHEADBB-LABEL: test_ctpop_i64:2800; RV64XTHEADBB: # %bb.0:2801; RV64XTHEADBB-NEXT: lui a1, 3495252802; RV64XTHEADBB-NEXT: lui a2, 2097152803; RV64XTHEADBB-NEXT: addi a1, a1, 13652804; RV64XTHEADBB-NEXT: addi a2, a2, 8192805; RV64XTHEADBB-NEXT: slli a3, a1, 322806; RV64XTHEADBB-NEXT: add a1, a1, a32807; RV64XTHEADBB-NEXT: slli a3, a2, 322808; RV64XTHEADBB-NEXT: add a2, a2, a32809; RV64XTHEADBB-NEXT: srli a3, a0, 12810; RV64XTHEADBB-NEXT: and a1, a3, a12811; RV64XTHEADBB-NEXT: lui a3, 616812812; RV64XTHEADBB-NEXT: addi a3, a3, -2412813; RV64XTHEADBB-NEXT: sub a0, a0, a12814; RV64XTHEADBB-NEXT: and a1, a0, a22815; RV64XTHEADBB-NEXT: srli a0, a0, 22816; RV64XTHEADBB-NEXT: and a0, a0, a22817; RV64XTHEADBB-NEXT: slli a2, a3, 322818; RV64XTHEADBB-NEXT: add a0, a1, a02819; RV64XTHEADBB-NEXT: srli a1, a0, 42820; RV64XTHEADBB-NEXT: add a0, a0, a12821; RV64XTHEADBB-NEXT: add a2, a3, a22822; RV64XTHEADBB-NEXT: and a0, a0, a22823; RV64XTHEADBB-NEXT: slli a1, a0, 82824; RV64XTHEADBB-NEXT: add a0, a0, a12825; RV64XTHEADBB-NEXT: slli a1, a0, 162826; RV64XTHEADBB-NEXT: add a0, a0, a12827; RV64XTHEADBB-NEXT: slli a1, a0, 322828; RV64XTHEADBB-NEXT: add a0, a0, a12829; RV64XTHEADBB-NEXT: srli a0, a0, 562830; RV64XTHEADBB-NEXT: ret2831 %1 = call i64 @llvm.ctpop.i64(i64 %a)2832 ret i64 %12833}2834 2835define i8 @test_parity_i8(i8 %a) {2836; RV32_NOZBB-LABEL: test_parity_i8:2837; RV32_NOZBB: # %bb.0:2838; RV32_NOZBB-NEXT: zext.b a0, a02839; RV32_NOZBB-NEXT: srli a1, a0, 42840; RV32_NOZBB-NEXT: xor a0, a0, a12841; RV32_NOZBB-NEXT: srli a1, a0, 22842; RV32_NOZBB-NEXT: xor a0, a0, a12843; RV32_NOZBB-NEXT: srli a1, a0, 12844; RV32_NOZBB-NEXT: xor a0, a0, a12845; RV32_NOZBB-NEXT: andi a0, a0, 12846; RV32_NOZBB-NEXT: ret2847;2848; RV64NOZBB-LABEL: test_parity_i8:2849; RV64NOZBB: # %bb.0:2850; RV64NOZBB-NEXT: zext.b a0, a02851; RV64NOZBB-NEXT: srli a1, a0, 42852; RV64NOZBB-NEXT: xor a0, a0, a12853; RV64NOZBB-NEXT: srli a1, a0, 22854; RV64NOZBB-NEXT: xor a0, a0, a12855; RV64NOZBB-NEXT: srli a1, a0, 12856; RV64NOZBB-NEXT: xor a0, a0, a12857; RV64NOZBB-NEXT: andi a0, a0, 12858; RV64NOZBB-NEXT: ret2859;2860; RV32ZBB-LABEL: test_parity_i8:2861; RV32ZBB: # %bb.0:2862; RV32ZBB-NEXT: zext.b a0, a02863; RV32ZBB-NEXT: cpop a0, a02864; RV32ZBB-NEXT: andi a0, a0, 12865; RV32ZBB-NEXT: ret2866;2867; RV64ZBB-LABEL: test_parity_i8:2868; RV64ZBB: # %bb.0:2869; RV64ZBB-NEXT: zext.b a0, a02870; RV64ZBB-NEXT: cpopw a0, a02871; RV64ZBB-NEXT: andi a0, a0, 12872; RV64ZBB-NEXT: ret2873;2874; RV32XTHEADBB-LABEL: test_parity_i8:2875; RV32XTHEADBB: # %bb.0:2876; RV32XTHEADBB-NEXT: zext.b a0, a02877; RV32XTHEADBB-NEXT: srli a1, a0, 42878; RV32XTHEADBB-NEXT: xor a0, a0, a12879; RV32XTHEADBB-NEXT: srli a1, a0, 22880; RV32XTHEADBB-NEXT: xor a0, a0, a12881; RV32XTHEADBB-NEXT: srli a1, a0, 12882; RV32XTHEADBB-NEXT: xor a0, a0, a12883; RV32XTHEADBB-NEXT: andi a0, a0, 12884; RV32XTHEADBB-NEXT: ret2885;2886; RV64XTHEADBB-LABEL: test_parity_i8:2887; RV64XTHEADBB: # %bb.0:2888; RV64XTHEADBB-NEXT: zext.b a0, a02889; RV64XTHEADBB-NEXT: srli a1, a0, 42890; RV64XTHEADBB-NEXT: xor a0, a0, a12891; RV64XTHEADBB-NEXT: srli a1, a0, 22892; RV64XTHEADBB-NEXT: xor a0, a0, a12893; RV64XTHEADBB-NEXT: srli a1, a0, 12894; RV64XTHEADBB-NEXT: xor a0, a0, a12895; RV64XTHEADBB-NEXT: andi a0, a0, 12896; RV64XTHEADBB-NEXT: ret2897 %1 = call i8 @llvm.ctpop.i8(i8 %a)2898 %2 = and i8 %1, 12899 ret i8 %22900}2901 2902define i16 @test_parity_i16(i16 %a) {2903; RV32_NOZBB-LABEL: test_parity_i16:2904; RV32_NOZBB: # %bb.0:2905; RV32_NOZBB-NEXT: slli a0, a0, 162906; RV32_NOZBB-NEXT: srli a0, a0, 162907; RV32_NOZBB-NEXT: srli a1, a0, 82908; RV32_NOZBB-NEXT: xor a0, a0, a12909; RV32_NOZBB-NEXT: srli a1, a0, 42910; RV32_NOZBB-NEXT: xor a0, a0, a12911; RV32_NOZBB-NEXT: srli a1, a0, 22912; RV32_NOZBB-NEXT: xor a0, a0, a12913; RV32_NOZBB-NEXT: srli a1, a0, 12914; RV32_NOZBB-NEXT: xor a0, a0, a12915; RV32_NOZBB-NEXT: andi a0, a0, 12916; RV32_NOZBB-NEXT: ret2917;2918; RV64NOZBB-LABEL: test_parity_i16:2919; RV64NOZBB: # %bb.0:2920; RV64NOZBB-NEXT: slli a0, a0, 482921; RV64NOZBB-NEXT: srli a0, a0, 482922; RV64NOZBB-NEXT: srli a1, a0, 82923; RV64NOZBB-NEXT: xor a0, a0, a12924; RV64NOZBB-NEXT: srli a1, a0, 42925; RV64NOZBB-NEXT: xor a0, a0, a12926; RV64NOZBB-NEXT: srli a1, a0, 22927; RV64NOZBB-NEXT: xor a0, a0, a12928; RV64NOZBB-NEXT: srli a1, a0, 12929; RV64NOZBB-NEXT: xor a0, a0, a12930; RV64NOZBB-NEXT: andi a0, a0, 12931; RV64NOZBB-NEXT: ret2932;2933; RV32ZBB-LABEL: test_parity_i16:2934; RV32ZBB: # %bb.0:2935; RV32ZBB-NEXT: zext.h a0, a02936; RV32ZBB-NEXT: cpop a0, a02937; RV32ZBB-NEXT: andi a0, a0, 12938; RV32ZBB-NEXT: ret2939;2940; RV64ZBB-LABEL: test_parity_i16:2941; RV64ZBB: # %bb.0:2942; RV64ZBB-NEXT: zext.h a0, a02943; RV64ZBB-NEXT: cpopw a0, a02944; RV64ZBB-NEXT: andi a0, a0, 12945; RV64ZBB-NEXT: ret2946;2947; RV32XTHEADBB-LABEL: test_parity_i16:2948; RV32XTHEADBB: # %bb.0:2949; RV32XTHEADBB-NEXT: th.extu a0, a0, 15, 02950; RV32XTHEADBB-NEXT: srli a1, a0, 82951; RV32XTHEADBB-NEXT: xor a0, a0, a12952; RV32XTHEADBB-NEXT: srli a1, a0, 42953; RV32XTHEADBB-NEXT: xor a0, a0, a12954; RV32XTHEADBB-NEXT: srli a1, a0, 22955; RV32XTHEADBB-NEXT: xor a0, a0, a12956; RV32XTHEADBB-NEXT: srli a1, a0, 12957; RV32XTHEADBB-NEXT: xor a0, a0, a12958; RV32XTHEADBB-NEXT: andi a0, a0, 12959; RV32XTHEADBB-NEXT: ret2960;2961; RV64XTHEADBB-LABEL: test_parity_i16:2962; RV64XTHEADBB: # %bb.0:2963; RV64XTHEADBB-NEXT: th.extu a0, a0, 15, 02964; RV64XTHEADBB-NEXT: srli a1, a0, 82965; RV64XTHEADBB-NEXT: xor a0, a0, a12966; RV64XTHEADBB-NEXT: srli a1, a0, 42967; RV64XTHEADBB-NEXT: xor a0, a0, a12968; RV64XTHEADBB-NEXT: srli a1, a0, 22969; RV64XTHEADBB-NEXT: xor a0, a0, a12970; RV64XTHEADBB-NEXT: srli a1, a0, 12971; RV64XTHEADBB-NEXT: xor a0, a0, a12972; RV64XTHEADBB-NEXT: andi a0, a0, 12973; RV64XTHEADBB-NEXT: ret2974 %1 = call i16 @llvm.ctpop.i16(i16 %a)2975 %2 = and i16 %1, 12976 ret i16 %22977}2978 2979define i32 @test_parity_i32(i32 %a) {2980; RV32_NOZBB-LABEL: test_parity_i32:2981; RV32_NOZBB: # %bb.0:2982; RV32_NOZBB-NEXT: srli a1, a0, 162983; RV32_NOZBB-NEXT: xor a0, a0, a12984; RV32_NOZBB-NEXT: srli a1, a0, 82985; RV32_NOZBB-NEXT: xor a0, a0, a12986; RV32_NOZBB-NEXT: srli a1, a0, 42987; RV32_NOZBB-NEXT: xor a0, a0, a12988; RV32_NOZBB-NEXT: srli a1, a0, 22989; RV32_NOZBB-NEXT: xor a0, a0, a12990; RV32_NOZBB-NEXT: srli a1, a0, 12991; RV32_NOZBB-NEXT: xor a0, a0, a12992; RV32_NOZBB-NEXT: andi a0, a0, 12993; RV32_NOZBB-NEXT: ret2994;2995; RV64NOZBB-LABEL: test_parity_i32:2996; RV64NOZBB: # %bb.0:2997; RV64NOZBB-NEXT: slli a1, a0, 322998; RV64NOZBB-NEXT: srli a1, a1, 322999; RV64NOZBB-NEXT: srliw a0, a0, 163000; RV64NOZBB-NEXT: xor a0, a1, a03001; RV64NOZBB-NEXT: srli a1, a0, 83002; RV64NOZBB-NEXT: xor a0, a0, a13003; RV64NOZBB-NEXT: srli a1, a0, 43004; RV64NOZBB-NEXT: xor a0, a0, a13005; RV64NOZBB-NEXT: srli a1, a0, 23006; RV64NOZBB-NEXT: xor a0, a0, a13007; RV64NOZBB-NEXT: srli a1, a0, 13008; RV64NOZBB-NEXT: xor a0, a0, a13009; RV64NOZBB-NEXT: andi a0, a0, 13010; RV64NOZBB-NEXT: ret3011;3012; RV32ZBB-LABEL: test_parity_i32:3013; RV32ZBB: # %bb.0:3014; RV32ZBB-NEXT: cpop a0, a03015; RV32ZBB-NEXT: andi a0, a0, 13016; RV32ZBB-NEXT: ret3017;3018; RV64ZBB-LABEL: test_parity_i32:3019; RV64ZBB: # %bb.0:3020; RV64ZBB-NEXT: cpopw a0, a03021; RV64ZBB-NEXT: andi a0, a0, 13022; RV64ZBB-NEXT: ret3023;3024; RV32XTHEADBB-LABEL: test_parity_i32:3025; RV32XTHEADBB: # %bb.0:3026; RV32XTHEADBB-NEXT: srli a1, a0, 163027; RV32XTHEADBB-NEXT: xor a0, a0, a13028; RV32XTHEADBB-NEXT: srli a1, a0, 83029; RV32XTHEADBB-NEXT: xor a0, a0, a13030; RV32XTHEADBB-NEXT: srli a1, a0, 43031; RV32XTHEADBB-NEXT: xor a0, a0, a13032; RV32XTHEADBB-NEXT: srli a1, a0, 23033; RV32XTHEADBB-NEXT: xor a0, a0, a13034; RV32XTHEADBB-NEXT: srli a1, a0, 13035; RV32XTHEADBB-NEXT: xor a0, a0, a13036; RV32XTHEADBB-NEXT: andi a0, a0, 13037; RV32XTHEADBB-NEXT: ret3038;3039; RV64XTHEADBB-LABEL: test_parity_i32:3040; RV64XTHEADBB: # %bb.0:3041; RV64XTHEADBB-NEXT: th.extu a1, a0, 31, 03042; RV64XTHEADBB-NEXT: srliw a0, a0, 163043; RV64XTHEADBB-NEXT: xor a0, a1, a03044; RV64XTHEADBB-NEXT: srli a1, a0, 83045; RV64XTHEADBB-NEXT: xor a0, a0, a13046; RV64XTHEADBB-NEXT: srli a1, a0, 43047; RV64XTHEADBB-NEXT: xor a0, a0, a13048; RV64XTHEADBB-NEXT: srli a1, a0, 23049; RV64XTHEADBB-NEXT: xor a0, a0, a13050; RV64XTHEADBB-NEXT: srli a1, a0, 13051; RV64XTHEADBB-NEXT: xor a0, a0, a13052; RV64XTHEADBB-NEXT: andi a0, a0, 13053; RV64XTHEADBB-NEXT: ret3054 %1 = call i32 @llvm.ctpop.i32(i32 %a)3055 %2 = and i32 %1, 13056 ret i32 %23057}3058 3059define i64 @test_parity_i64(i64 %a) {3060; RV32_NOZBB-LABEL: test_parity_i64:3061; RV32_NOZBB: # %bb.0:3062; RV32_NOZBB-NEXT: xor a0, a0, a13063; RV32_NOZBB-NEXT: srli a1, a0, 163064; RV32_NOZBB-NEXT: xor a0, a0, a13065; RV32_NOZBB-NEXT: srli a1, a0, 83066; RV32_NOZBB-NEXT: xor a0, a0, a13067; RV32_NOZBB-NEXT: srli a1, a0, 43068; RV32_NOZBB-NEXT: xor a0, a0, a13069; RV32_NOZBB-NEXT: srli a1, a0, 23070; RV32_NOZBB-NEXT: xor a0, a0, a13071; RV32_NOZBB-NEXT: srli a1, a0, 13072; RV32_NOZBB-NEXT: xor a0, a0, a13073; RV32_NOZBB-NEXT: andi a0, a0, 13074; RV32_NOZBB-NEXT: li a1, 03075; RV32_NOZBB-NEXT: ret3076;3077; RV64NOZBB-LABEL: test_parity_i64:3078; RV64NOZBB: # %bb.0:3079; RV64NOZBB-NEXT: srli a1, a0, 323080; RV64NOZBB-NEXT: xor a0, a0, a13081; RV64NOZBB-NEXT: srli a1, a0, 163082; RV64NOZBB-NEXT: xor a0, a0, a13083; RV64NOZBB-NEXT: srli a1, a0, 83084; RV64NOZBB-NEXT: xor a0, a0, a13085; RV64NOZBB-NEXT: srli a1, a0, 43086; RV64NOZBB-NEXT: xor a0, a0, a13087; RV64NOZBB-NEXT: srli a1, a0, 23088; RV64NOZBB-NEXT: xor a0, a0, a13089; RV64NOZBB-NEXT: srli a1, a0, 13090; RV64NOZBB-NEXT: xor a0, a0, a13091; RV64NOZBB-NEXT: andi a0, a0, 13092; RV64NOZBB-NEXT: ret3093;3094; RV32ZBB-LABEL: test_parity_i64:3095; RV32ZBB: # %bb.0:3096; RV32ZBB-NEXT: xor a0, a0, a13097; RV32ZBB-NEXT: cpop a0, a03098; RV32ZBB-NEXT: andi a0, a0, 13099; RV32ZBB-NEXT: li a1, 03100; RV32ZBB-NEXT: ret3101;3102; RV64ZBB-LABEL: test_parity_i64:3103; RV64ZBB: # %bb.0:3104; RV64ZBB-NEXT: cpop a0, a03105; RV64ZBB-NEXT: andi a0, a0, 13106; RV64ZBB-NEXT: ret3107;3108; RV32XTHEADBB-LABEL: test_parity_i64:3109; RV32XTHEADBB: # %bb.0:3110; RV32XTHEADBB-NEXT: xor a0, a0, a13111; RV32XTHEADBB-NEXT: srli a1, a0, 163112; RV32XTHEADBB-NEXT: xor a0, a0, a13113; RV32XTHEADBB-NEXT: srli a1, a0, 83114; RV32XTHEADBB-NEXT: xor a0, a0, a13115; RV32XTHEADBB-NEXT: srli a1, a0, 43116; RV32XTHEADBB-NEXT: xor a0, a0, a13117; RV32XTHEADBB-NEXT: srli a1, a0, 23118; RV32XTHEADBB-NEXT: xor a0, a0, a13119; RV32XTHEADBB-NEXT: srli a1, a0, 13120; RV32XTHEADBB-NEXT: xor a0, a0, a13121; RV32XTHEADBB-NEXT: andi a0, a0, 13122; RV32XTHEADBB-NEXT: li a1, 03123; RV32XTHEADBB-NEXT: ret3124;3125; RV64XTHEADBB-LABEL: test_parity_i64:3126; RV64XTHEADBB: # %bb.0:3127; RV64XTHEADBB-NEXT: srli a1, a0, 323128; RV64XTHEADBB-NEXT: xor a0, a0, a13129; RV64XTHEADBB-NEXT: srli a1, a0, 163130; RV64XTHEADBB-NEXT: xor a0, a0, a13131; RV64XTHEADBB-NEXT: srli a1, a0, 83132; RV64XTHEADBB-NEXT: xor a0, a0, a13133; RV64XTHEADBB-NEXT: srli a1, a0, 43134; RV64XTHEADBB-NEXT: xor a0, a0, a13135; RV64XTHEADBB-NEXT: srli a1, a0, 23136; RV64XTHEADBB-NEXT: xor a0, a0, a13137; RV64XTHEADBB-NEXT: srli a1, a0, 13138; RV64XTHEADBB-NEXT: xor a0, a0, a13139; RV64XTHEADBB-NEXT: andi a0, a0, 13140; RV64XTHEADBB-NEXT: ret3141 %1 = call i64 @llvm.ctpop.i64(i64 %a)3142 %2 = and i64 %1, 13143 ret i64 %23144}3145