940 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=amdgcn-- -mcpu=tahiti | FileCheck %s --check-prefix=SI3; RUN: llc < %s -mtriple=amdgcn-- -mcpu=tonga -mattr=-flat-for-global | FileCheck %s --check-prefix=FLAT4; RUN: llc < %s -mtriple=amdgcn-- -mcpu=fiji -mattr=-flat-for-global | FileCheck %s --check-prefix=FLAT5; RUN: llc < %s -mtriple=amdgcn-- -mcpu=fiji -global-isel | FileCheck %s --check-prefix=GISEL6; RUN: llc < %s -mtriple=amdgcn-- -mcpu=gfx1100 -mattr=+real-true16 -mattr=-flat-for-global | FileCheck %s --check-prefixes=GFX11-FLAT,GFX11-FLAT-TRUE167; RUN: llc < %s -mtriple=amdgcn-- -mcpu=gfx1100 -mattr=-real-true16 -mattr=-flat-for-global | FileCheck %s --check-prefixes=GFX11-FLAT,GFX11-FLAT-FAKE168; RUN: llc < %s -mtriple=amdgcn-- -mcpu=gfx1100 -mattr=+real-true16 -global-isel | FileCheck %s --check-prefixes=GFX11-GISEL,GFX11-GISEL-TRUE169; RUN: llc < %s -mtriple=amdgcn-- -mcpu=gfx1100 -mattr=-real-true16 -global-isel | FileCheck %s --check-prefixes=GFX11-GISEL,GFX11-GISEL-FAKE1610 11declare i32 @llvm.amdgcn.workitem.id.x() #112 13declare i16 @llvm.bitreverse.i16(i16) #114declare i32 @llvm.bitreverse.i32(i32) #115declare i64 @llvm.bitreverse.i64(i64) #116 17declare <2 x i32> @llvm.bitreverse.v2i32(<2 x i32>) #118declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) #119 20declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) #121declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>) #122 23define amdgpu_kernel void @s_brev_i16(ptr addrspace(1) noalias %out, i16 %val) #0 {24; SI-LABEL: s_brev_i16:25; SI: ; %bb.0:26; SI-NEXT: s_load_dword s6, s[4:5], 0xb27; SI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x928; SI-NEXT: s_mov_b32 s3, 0xf00029; SI-NEXT: s_mov_b32 s2, -130; SI-NEXT: s_waitcnt lgkmcnt(0)31; SI-NEXT: s_brev_b32 s4, s632; SI-NEXT: s_lshr_b32 s4, s4, 1633; SI-NEXT: v_mov_b32_e32 v0, s434; SI-NEXT: buffer_store_short v0, off, s[0:3], 035; SI-NEXT: s_endpgm36;37; FLAT-LABEL: s_brev_i16:38; FLAT: ; %bb.0:39; FLAT-NEXT: s_load_dword s6, s[4:5], 0x2c40; FLAT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2441; FLAT-NEXT: s_mov_b32 s3, 0xf00042; FLAT-NEXT: s_mov_b32 s2, -143; FLAT-NEXT: s_waitcnt lgkmcnt(0)44; FLAT-NEXT: s_brev_b32 s4, s645; FLAT-NEXT: s_lshr_b32 s4, s4, 1646; FLAT-NEXT: v_mov_b32_e32 v0, s447; FLAT-NEXT: buffer_store_short v0, off, s[0:3], 048; FLAT-NEXT: s_endpgm49;50; GISEL-LABEL: s_brev_i16:51; GISEL: ; %bb.0:52; GISEL-NEXT: s_load_dword s2, s[4:5], 0x2c53; GISEL-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x2454; GISEL-NEXT: s_waitcnt lgkmcnt(0)55; GISEL-NEXT: s_brev_b32 s2, s256; GISEL-NEXT: s_lshr_b32 s2, s2, 1657; GISEL-NEXT: v_mov_b32_e32 v0, s058; GISEL-NEXT: v_mov_b32_e32 v2, s259; GISEL-NEXT: v_mov_b32_e32 v1, s160; GISEL-NEXT: flat_store_short v[0:1], v261; GISEL-NEXT: s_endpgm62;63; GFX11-FLAT-LABEL: s_brev_i16:64; GFX11-FLAT: ; %bb.0:65; GFX11-FLAT-NEXT: s_clause 0x166; GFX11-FLAT-NEXT: s_load_b32 s2, s[4:5], 0x2c67; GFX11-FLAT-NEXT: s_load_b64 s[0:1], s[4:5], 0x2468; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)69; GFX11-FLAT-NEXT: s_brev_b32 s2, s270; GFX11-FLAT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)71; GFX11-FLAT-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s272; GFX11-FLAT-NEXT: global_store_d16_hi_b16 v0, v1, s[0:1]73; GFX11-FLAT-NEXT: s_endpgm74;75; GFX11-GISEL-TRUE16-LABEL: s_brev_i16:76; GFX11-GISEL-TRUE16: ; %bb.0:77; GFX11-GISEL-TRUE16-NEXT: s_clause 0x178; GFX11-GISEL-TRUE16-NEXT: s_load_b32 s2, s[4:5], 0x2c79; GFX11-GISEL-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x2480; GFX11-GISEL-TRUE16-NEXT: v_mov_b32_e32 v1, 081; GFX11-GISEL-TRUE16-NEXT: s_waitcnt lgkmcnt(0)82; GFX11-GISEL-TRUE16-NEXT: s_brev_b32 s2, s283; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)84; GFX11-GISEL-TRUE16-NEXT: s_lshr_b32 s2, s2, 1685; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v0.l, s286; GFX11-GISEL-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]87; GFX11-GISEL-TRUE16-NEXT: s_endpgm88;89; GFX11-GISEL-FAKE16-LABEL: s_brev_i16:90; GFX11-GISEL-FAKE16: ; %bb.0:91; GFX11-GISEL-FAKE16-NEXT: s_clause 0x192; GFX11-GISEL-FAKE16-NEXT: s_load_b32 s2, s[4:5], 0x2c93; GFX11-GISEL-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x2494; GFX11-GISEL-FAKE16-NEXT: v_mov_b32_e32 v1, 095; GFX11-GISEL-FAKE16-NEXT: s_waitcnt lgkmcnt(0)96; GFX11-GISEL-FAKE16-NEXT: s_brev_b32 s2, s297; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)98; GFX11-GISEL-FAKE16-NEXT: s_lshr_b32 s2, s2, 1699; GFX11-GISEL-FAKE16-NEXT: v_mov_b32_e32 v0, s2100; GFX11-GISEL-FAKE16-NEXT: global_store_b16 v1, v0, s[0:1]101; GFX11-GISEL-FAKE16-NEXT: s_endpgm102 %brev = call i16 @llvm.bitreverse.i16(i16 %val) #1103 store i16 %brev, ptr addrspace(1) %out104 ret void105}106 107define amdgpu_kernel void @v_brev_i16(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %valptr) #0 {108; SI-LABEL: v_brev_i16:109; SI: ; %bb.0:110; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9111; SI-NEXT: s_mov_b32 s7, 0xf000112; SI-NEXT: s_mov_b32 s6, -1113; SI-NEXT: s_mov_b32 s10, s6114; SI-NEXT: s_mov_b32 s11, s7115; SI-NEXT: s_waitcnt lgkmcnt(0)116; SI-NEXT: s_mov_b32 s8, s2117; SI-NEXT: s_mov_b32 s9, s3118; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0119; SI-NEXT: s_mov_b32 s4, s0120; SI-NEXT: s_mov_b32 s5, s1121; SI-NEXT: s_waitcnt vmcnt(0)122; SI-NEXT: v_bfrev_b32_e32 v0, v0123; SI-NEXT: v_lshrrev_b32_e32 v0, 16, v0124; SI-NEXT: buffer_store_short v0, off, s[4:7], 0125; SI-NEXT: s_endpgm126;127; FLAT-LABEL: v_brev_i16:128; FLAT: ; %bb.0:129; FLAT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24130; FLAT-NEXT: s_mov_b32 s7, 0xf000131; FLAT-NEXT: s_mov_b32 s6, -1132; FLAT-NEXT: s_mov_b32 s10, s6133; FLAT-NEXT: s_mov_b32 s11, s7134; FLAT-NEXT: s_waitcnt lgkmcnt(0)135; FLAT-NEXT: s_mov_b32 s8, s2136; FLAT-NEXT: s_mov_b32 s9, s3137; FLAT-NEXT: buffer_load_ushort v0, off, s[8:11], 0138; FLAT-NEXT: s_mov_b32 s4, s0139; FLAT-NEXT: s_mov_b32 s5, s1140; FLAT-NEXT: s_waitcnt vmcnt(0)141; FLAT-NEXT: v_bfrev_b32_e32 v0, v0142; FLAT-NEXT: v_lshrrev_b32_e32 v0, 16, v0143; FLAT-NEXT: buffer_store_short v0, off, s[4:7], 0144; FLAT-NEXT: s_endpgm145;146; GISEL-LABEL: v_brev_i16:147; GISEL: ; %bb.0:148; GISEL-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24149; GISEL-NEXT: s_waitcnt lgkmcnt(0)150; GISEL-NEXT: v_mov_b32_e32 v0, s2151; GISEL-NEXT: v_mov_b32_e32 v1, s3152; GISEL-NEXT: flat_load_ushort v0, v[0:1]153; GISEL-NEXT: s_waitcnt vmcnt(0)154; GISEL-NEXT: v_bfrev_b32_e32 v0, v0155; GISEL-NEXT: v_lshrrev_b32_e32 v2, 16, v0156; GISEL-NEXT: v_mov_b32_e32 v0, s0157; GISEL-NEXT: v_mov_b32_e32 v1, s1158; GISEL-NEXT: flat_store_short v[0:1], v2159; GISEL-NEXT: s_endpgm160;161; GFX11-FLAT-LABEL: v_brev_i16:162; GFX11-FLAT: ; %bb.0:163; GFX11-FLAT-NEXT: s_load_b128 s[0:3], s[4:5], 0x24164; GFX11-FLAT-NEXT: s_mov_b32 s7, 0x31016000165; GFX11-FLAT-NEXT: s_mov_b32 s6, -1166; GFX11-FLAT-NEXT: v_mov_b32_e32 v1, 0167; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)168; GFX11-FLAT-NEXT: s_mov_b32 s4, s2169; GFX11-FLAT-NEXT: s_mov_b32 s5, s3170; GFX11-FLAT-NEXT: buffer_load_u16 v0, off, s[4:7], 0171; GFX11-FLAT-NEXT: s_waitcnt vmcnt(0)172; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v0, v0173; GFX11-FLAT-NEXT: global_store_d16_hi_b16 v1, v0, s[0:1]174; GFX11-FLAT-NEXT: s_endpgm175;176; GFX11-GISEL-TRUE16-LABEL: v_brev_i16:177; GFX11-GISEL-TRUE16: ; %bb.0:178; GFX11-GISEL-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24179; GFX11-GISEL-TRUE16-NEXT: v_mov_b32_e32 v0, 0180; GFX11-GISEL-TRUE16-NEXT: s_waitcnt lgkmcnt(0)181; GFX11-GISEL-TRUE16-NEXT: global_load_u16 v1, v0, s[2:3]182; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0)183; GFX11-GISEL-TRUE16-NEXT: v_bfrev_b32_e32 v1, v1184; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)185; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v1186; GFX11-GISEL-TRUE16-NEXT: global_store_b16 v0, v1, s[0:1]187; GFX11-GISEL-TRUE16-NEXT: s_endpgm188;189; GFX11-GISEL-FAKE16-LABEL: v_brev_i16:190; GFX11-GISEL-FAKE16: ; %bb.0:191; GFX11-GISEL-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24192; GFX11-GISEL-FAKE16-NEXT: v_mov_b32_e32 v0, 0193; GFX11-GISEL-FAKE16-NEXT: s_waitcnt lgkmcnt(0)194; GFX11-GISEL-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]195; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0)196; GFX11-GISEL-FAKE16-NEXT: v_bfrev_b32_e32 v1, v1197; GFX11-GISEL-FAKE16-NEXT: global_store_d16_hi_b16 v0, v1, s[0:1]198; GFX11-GISEL-FAKE16-NEXT: s_endpgm199 %val = load i16, ptr addrspace(1) %valptr200 %brev = call i16 @llvm.bitreverse.i16(i16 %val) #1201 store i16 %brev, ptr addrspace(1) %out202 ret void203}204 205define amdgpu_kernel void @s_brev_i32(ptr addrspace(1) noalias %out, i32 %val) #0 {206; SI-LABEL: s_brev_i32:207; SI: ; %bb.0:208; SI-NEXT: s_load_dword s6, s[4:5], 0xb209; SI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9210; SI-NEXT: s_mov_b32 s3, 0xf000211; SI-NEXT: s_mov_b32 s2, -1212; SI-NEXT: s_waitcnt lgkmcnt(0)213; SI-NEXT: s_brev_b32 s4, s6214; SI-NEXT: v_mov_b32_e32 v0, s4215; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0216; SI-NEXT: s_endpgm217;218; FLAT-LABEL: s_brev_i32:219; FLAT: ; %bb.0:220; FLAT-NEXT: s_load_dword s6, s[4:5], 0x2c221; FLAT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24222; FLAT-NEXT: s_mov_b32 s3, 0xf000223; FLAT-NEXT: s_mov_b32 s2, -1224; FLAT-NEXT: s_waitcnt lgkmcnt(0)225; FLAT-NEXT: s_brev_b32 s4, s6226; FLAT-NEXT: v_mov_b32_e32 v0, s4227; FLAT-NEXT: buffer_store_dword v0, off, s[0:3], 0228; FLAT-NEXT: s_endpgm229;230; GISEL-LABEL: s_brev_i32:231; GISEL: ; %bb.0:232; GISEL-NEXT: s_load_dword s2, s[4:5], 0x2c233; GISEL-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24234; GISEL-NEXT: s_waitcnt lgkmcnt(0)235; GISEL-NEXT: s_brev_b32 s2, s2236; GISEL-NEXT: v_mov_b32_e32 v0, s0237; GISEL-NEXT: v_mov_b32_e32 v2, s2238; GISEL-NEXT: v_mov_b32_e32 v1, s1239; GISEL-NEXT: flat_store_dword v[0:1], v2240; GISEL-NEXT: s_endpgm241;242; GFX11-FLAT-LABEL: s_brev_i32:243; GFX11-FLAT: ; %bb.0:244; GFX11-FLAT-NEXT: s_clause 0x1245; GFX11-FLAT-NEXT: s_load_b32 s2, s[4:5], 0x2c246; GFX11-FLAT-NEXT: s_load_b64 s[0:1], s[4:5], 0x24247; GFX11-FLAT-NEXT: s_mov_b32 s3, 0x31016000248; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)249; GFX11-FLAT-NEXT: s_brev_b32 s2, s2250; GFX11-FLAT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)251; GFX11-FLAT-NEXT: v_mov_b32_e32 v0, s2252; GFX11-FLAT-NEXT: s_mov_b32 s2, -1253; GFX11-FLAT-NEXT: buffer_store_b32 v0, off, s[0:3], 0254; GFX11-FLAT-NEXT: s_endpgm255;256; GFX11-GISEL-LABEL: s_brev_i32:257; GFX11-GISEL: ; %bb.0:258; GFX11-GISEL-NEXT: s_clause 0x1259; GFX11-GISEL-NEXT: s_load_b32 s2, s[4:5], 0x2c260; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[4:5], 0x24261; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 0262; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)263; GFX11-GISEL-NEXT: s_brev_b32 s2, s2264; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1)265; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, s2266; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]267; GFX11-GISEL-NEXT: s_endpgm268 %brev = call i32 @llvm.bitreverse.i32(i32 %val) #1269 store i32 %brev, ptr addrspace(1) %out270 ret void271}272 273define amdgpu_kernel void @v_brev_i32(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %valptr) #0 {274; SI-LABEL: v_brev_i32:275; SI: ; %bb.0:276; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9277; SI-NEXT: s_mov_b32 s7, 0xf000278; SI-NEXT: s_mov_b32 s10, 0279; SI-NEXT: s_mov_b32 s11, s7280; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0281; SI-NEXT: s_waitcnt lgkmcnt(0)282; SI-NEXT: s_mov_b64 s[8:9], s[2:3]283; SI-NEXT: v_mov_b32_e32 v1, 0284; SI-NEXT: buffer_load_dword v0, v[0:1], s[8:11], 0 addr64285; SI-NEXT: s_mov_b32 s6, -1286; SI-NEXT: s_mov_b32 s4, s0287; SI-NEXT: s_mov_b32 s5, s1288; SI-NEXT: s_waitcnt vmcnt(0)289; SI-NEXT: v_bfrev_b32_e32 v0, v0290; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0291; SI-NEXT: s_endpgm292;293; FLAT-LABEL: v_brev_i32:294; FLAT: ; %bb.0:295; FLAT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24296; FLAT-NEXT: v_lshlrev_b32_e32 v0, 2, v0297; FLAT-NEXT: s_waitcnt lgkmcnt(0)298; FLAT-NEXT: v_mov_b32_e32 v1, s3299; FLAT-NEXT: v_add_u32_e32 v0, vcc, s2, v0300; FLAT-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc301; FLAT-NEXT: flat_load_dword v0, v[0:1]302; FLAT-NEXT: s_mov_b32 s3, 0xf000303; FLAT-NEXT: s_mov_b32 s2, -1304; FLAT-NEXT: s_waitcnt vmcnt(0)305; FLAT-NEXT: v_bfrev_b32_e32 v0, v0306; FLAT-NEXT: buffer_store_dword v0, off, s[0:3], 0307; FLAT-NEXT: s_endpgm308;309; GISEL-LABEL: v_brev_i32:310; GISEL: ; %bb.0:311; GISEL-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24312; GISEL-NEXT: v_lshlrev_b32_e32 v2, 2, v0313; GISEL-NEXT: s_waitcnt lgkmcnt(0)314; GISEL-NEXT: v_mov_b32_e32 v0, s2315; GISEL-NEXT: v_mov_b32_e32 v1, s3316; GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2317; GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc318; GISEL-NEXT: flat_load_dword v0, v[0:1]319; GISEL-NEXT: s_waitcnt vmcnt(0)320; GISEL-NEXT: v_bfrev_b32_e32 v2, v0321; GISEL-NEXT: v_mov_b32_e32 v0, s0322; GISEL-NEXT: v_mov_b32_e32 v1, s1323; GISEL-NEXT: flat_store_dword v[0:1], v2324; GISEL-NEXT: s_endpgm325;326; GFX11-FLAT-LABEL: v_brev_i32:327; GFX11-FLAT: ; %bb.0:328; GFX11-FLAT-NEXT: s_load_b128 s[0:3], s[4:5], 0x24329; GFX11-FLAT-NEXT: v_and_b32_e32 v0, 0x3ff, v0330; GFX11-FLAT-NEXT: s_delay_alu instid0(VALU_DEP_1)331; GFX11-FLAT-NEXT: v_lshlrev_b32_e32 v0, 2, v0332; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)333; GFX11-FLAT-NEXT: global_load_b32 v0, v0, s[2:3]334; GFX11-FLAT-NEXT: s_mov_b32 s3, 0x31016000335; GFX11-FLAT-NEXT: s_mov_b32 s2, -1336; GFX11-FLAT-NEXT: s_waitcnt vmcnt(0)337; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v0, v0338; GFX11-FLAT-NEXT: buffer_store_b32 v0, off, s[0:3], 0339; GFX11-FLAT-NEXT: s_endpgm340;341; GFX11-GISEL-LABEL: v_brev_i32:342; GFX11-GISEL: ; %bb.0:343; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x24344; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0345; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)346; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0347; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)348; GFX11-GISEL-NEXT: global_load_b32 v0, v0, s[2:3]349; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0)350; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v0, v0351; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1]352; GFX11-GISEL-NEXT: s_endpgm353 %tid = call i32 @llvm.amdgcn.workitem.id.x()354 %gep = getelementptr i32, ptr addrspace(1) %valptr, i32 %tid355 %val = load i32, ptr addrspace(1) %gep356 %brev = call i32 @llvm.bitreverse.i32(i32 %val) #1357 store i32 %brev, ptr addrspace(1) %out358 ret void359}360 361define amdgpu_kernel void @s_brev_v2i32(ptr addrspace(1) noalias %out, <2 x i32> %val) #0 {362; SI-LABEL: s_brev_v2i32:363; SI: ; %bb.0:364; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9365; SI-NEXT: s_waitcnt lgkmcnt(0)366; SI-NEXT: s_mov_b64 s[4:5], s[2:3]367; SI-NEXT: s_brev_b32 s5, s5368; SI-NEXT: s_brev_b32 s4, s4369; SI-NEXT: s_mov_b32 s3, 0xf000370; SI-NEXT: s_mov_b32 s2, -1371; SI-NEXT: v_mov_b32_e32 v0, s4372; SI-NEXT: v_mov_b32_e32 v1, s5373; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0374; SI-NEXT: s_endpgm375;376; FLAT-LABEL: s_brev_v2i32:377; FLAT: ; %bb.0:378; FLAT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24379; FLAT-NEXT: s_waitcnt lgkmcnt(0)380; FLAT-NEXT: s_mov_b64 s[4:5], s[2:3]381; FLAT-NEXT: s_brev_b32 s5, s5382; FLAT-NEXT: s_brev_b32 s4, s4383; FLAT-NEXT: s_mov_b32 s3, 0xf000384; FLAT-NEXT: s_mov_b32 s2, -1385; FLAT-NEXT: v_mov_b32_e32 v0, s4386; FLAT-NEXT: v_mov_b32_e32 v1, s5387; FLAT-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0388; FLAT-NEXT: s_endpgm389;390; GISEL-LABEL: s_brev_v2i32:391; GISEL: ; %bb.0:392; GISEL-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24393; GISEL-NEXT: s_waitcnt lgkmcnt(0)394; GISEL-NEXT: s_brev_b32 s2, s2395; GISEL-NEXT: s_brev_b32 s3, s3396; GISEL-NEXT: v_mov_b32_e32 v0, s2397; GISEL-NEXT: v_mov_b32_e32 v3, s1398; GISEL-NEXT: v_mov_b32_e32 v1, s3399; GISEL-NEXT: v_mov_b32_e32 v2, s0400; GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]401; GISEL-NEXT: s_endpgm402;403; GFX11-FLAT-LABEL: s_brev_v2i32:404; GFX11-FLAT: ; %bb.0:405; GFX11-FLAT-NEXT: s_load_b128 s[0:3], s[4:5], 0x24406; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)407; GFX11-FLAT-NEXT: s_brev_b32 s2, s2408; GFX11-FLAT-NEXT: s_brev_b32 s3, s3409; GFX11-FLAT-NEXT: s_delay_alu instid0(SALU_CYCLE_1)410; GFX11-FLAT-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3411; GFX11-FLAT-NEXT: s_mov_b32 s3, 0x31016000412; GFX11-FLAT-NEXT: s_mov_b32 s2, -1413; GFX11-FLAT-NEXT: buffer_store_b64 v[0:1], off, s[0:3], 0414; GFX11-FLAT-NEXT: s_endpgm415;416; GFX11-GISEL-LABEL: s_brev_v2i32:417; GFX11-GISEL: ; %bb.0:418; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x24419; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0420; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)421; GFX11-GISEL-NEXT: s_brev_b32 s2, s2422; GFX11-GISEL-NEXT: s_brev_b32 s3, s3423; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1)424; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3425; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]426; GFX11-GISEL-NEXT: s_endpgm427 %brev = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %val) #1428 store <2 x i32> %brev, ptr addrspace(1) %out429 ret void430}431 432define amdgpu_kernel void @v_brev_v2i32(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %valptr) #0 {433; SI-LABEL: v_brev_v2i32:434; SI: ; %bb.0:435; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9436; SI-NEXT: s_mov_b32 s7, 0xf000437; SI-NEXT: s_mov_b32 s10, 0438; SI-NEXT: s_mov_b32 s11, s7439; SI-NEXT: v_lshlrev_b32_e32 v0, 3, v0440; SI-NEXT: s_waitcnt lgkmcnt(0)441; SI-NEXT: s_mov_b64 s[8:9], s[2:3]442; SI-NEXT: v_mov_b32_e32 v1, 0443; SI-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[8:11], 0 addr64444; SI-NEXT: s_mov_b32 s6, -1445; SI-NEXT: s_mov_b32 s4, s0446; SI-NEXT: s_mov_b32 s5, s1447; SI-NEXT: s_waitcnt vmcnt(0)448; SI-NEXT: v_bfrev_b32_e32 v1, v1449; SI-NEXT: v_bfrev_b32_e32 v0, v0450; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0451; SI-NEXT: s_endpgm452;453; FLAT-LABEL: v_brev_v2i32:454; FLAT: ; %bb.0:455; FLAT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24456; FLAT-NEXT: v_lshlrev_b32_e32 v0, 3, v0457; FLAT-NEXT: s_waitcnt lgkmcnt(0)458; FLAT-NEXT: v_mov_b32_e32 v1, s3459; FLAT-NEXT: v_add_u32_e32 v0, vcc, s2, v0460; FLAT-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc461; FLAT-NEXT: flat_load_dwordx2 v[0:1], v[0:1]462; FLAT-NEXT: s_mov_b32 s3, 0xf000463; FLAT-NEXT: s_mov_b32 s2, -1464; FLAT-NEXT: s_waitcnt vmcnt(0)465; FLAT-NEXT: v_bfrev_b32_e32 v1, v1466; FLAT-NEXT: v_bfrev_b32_e32 v0, v0467; FLAT-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0468; FLAT-NEXT: s_endpgm469;470; GISEL-LABEL: v_brev_v2i32:471; GISEL: ; %bb.0:472; GISEL-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24473; GISEL-NEXT: v_lshlrev_b32_e32 v2, 3, v0474; GISEL-NEXT: s_waitcnt lgkmcnt(0)475; GISEL-NEXT: v_mov_b32_e32 v0, s2476; GISEL-NEXT: v_mov_b32_e32 v1, s3477; GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2478; GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc479; GISEL-NEXT: flat_load_dwordx2 v[0:1], v[0:1]480; GISEL-NEXT: v_mov_b32_e32 v3, s1481; GISEL-NEXT: v_mov_b32_e32 v2, s0482; GISEL-NEXT: s_waitcnt vmcnt(0)483; GISEL-NEXT: v_bfrev_b32_e32 v0, v0484; GISEL-NEXT: v_bfrev_b32_e32 v1, v1485; GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]486; GISEL-NEXT: s_endpgm487;488; GFX11-FLAT-LABEL: v_brev_v2i32:489; GFX11-FLAT: ; %bb.0:490; GFX11-FLAT-NEXT: s_load_b128 s[0:3], s[4:5], 0x24491; GFX11-FLAT-NEXT: v_and_b32_e32 v0, 0x3ff, v0492; GFX11-FLAT-NEXT: s_delay_alu instid0(VALU_DEP_1)493; GFX11-FLAT-NEXT: v_lshlrev_b32_e32 v0, 3, v0494; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)495; GFX11-FLAT-NEXT: global_load_b64 v[0:1], v0, s[2:3]496; GFX11-FLAT-NEXT: s_mov_b32 s3, 0x31016000497; GFX11-FLAT-NEXT: s_mov_b32 s2, -1498; GFX11-FLAT-NEXT: s_waitcnt vmcnt(0)499; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v1, v1500; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v0, v0501; GFX11-FLAT-NEXT: buffer_store_b64 v[0:1], off, s[0:3], 0502; GFX11-FLAT-NEXT: s_endpgm503;504; GFX11-GISEL-LABEL: v_brev_v2i32:505; GFX11-GISEL: ; %bb.0:506; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x24507; GFX11-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0508; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0509; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2)510; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 3, v0511; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)512; GFX11-GISEL-NEXT: global_load_b64 v[0:1], v0, s[2:3]513; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0)514; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v0, v0515; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v1, v1516; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]517; GFX11-GISEL-NEXT: s_endpgm518 %tid = call i32 @llvm.amdgcn.workitem.id.x()519 %gep = getelementptr <2 x i32>, ptr addrspace(1) %valptr, i32 %tid520 %val = load <2 x i32>, ptr addrspace(1) %gep521 %brev = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %val) #1522 store <2 x i32> %brev, ptr addrspace(1) %out523 ret void524}525 526define amdgpu_kernel void @s_brev_i64(ptr addrspace(1) noalias %out, i64 %val) #0 {527; SI-LABEL: s_brev_i64:528; SI: ; %bb.0:529; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9530; SI-NEXT: s_mov_b32 s7, 0xf000531; SI-NEXT: s_mov_b32 s6, -1532; SI-NEXT: s_waitcnt lgkmcnt(0)533; SI-NEXT: s_mov_b32 s4, s0534; SI-NEXT: s_mov_b32 s5, s1535; SI-NEXT: s_brev_b64 s[0:1], s[2:3]536; SI-NEXT: v_mov_b32_e32 v0, s0537; SI-NEXT: v_mov_b32_e32 v1, s1538; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0539; SI-NEXT: s_endpgm540;541; FLAT-LABEL: s_brev_i64:542; FLAT: ; %bb.0:543; FLAT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24544; FLAT-NEXT: s_mov_b32 s7, 0xf000545; FLAT-NEXT: s_mov_b32 s6, -1546; FLAT-NEXT: s_waitcnt lgkmcnt(0)547; FLAT-NEXT: s_mov_b32 s4, s0548; FLAT-NEXT: s_mov_b32 s5, s1549; FLAT-NEXT: s_brev_b64 s[0:1], s[2:3]550; FLAT-NEXT: v_mov_b32_e32 v0, s0551; FLAT-NEXT: v_mov_b32_e32 v1, s1552; FLAT-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0553; FLAT-NEXT: s_endpgm554;555; GISEL-LABEL: s_brev_i64:556; GISEL: ; %bb.0:557; GISEL-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24558; GISEL-NEXT: s_waitcnt lgkmcnt(0)559; GISEL-NEXT: s_brev_b64 s[2:3], s[2:3]560; GISEL-NEXT: v_mov_b32_e32 v0, s2561; GISEL-NEXT: v_mov_b32_e32 v3, s1562; GISEL-NEXT: v_mov_b32_e32 v1, s3563; GISEL-NEXT: v_mov_b32_e32 v2, s0564; GISEL-NEXT: flat_store_dwordx2 v[2:3], v[0:1]565; GISEL-NEXT: s_endpgm566;567; GFX11-FLAT-LABEL: s_brev_i64:568; GFX11-FLAT: ; %bb.0:569; GFX11-FLAT-NEXT: s_load_b128 s[0:3], s[4:5], 0x24570; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)571; GFX11-FLAT-NEXT: s_brev_b64 s[4:5], s[2:3]572; GFX11-FLAT-NEXT: s_mov_b32 s3, 0x31016000573; GFX11-FLAT-NEXT: v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v1, s5574; GFX11-FLAT-NEXT: s_mov_b32 s2, -1575; GFX11-FLAT-NEXT: buffer_store_b64 v[0:1], off, s[0:3], 0576; GFX11-FLAT-NEXT: s_endpgm577;578; GFX11-GISEL-LABEL: s_brev_i64:579; GFX11-GISEL: ; %bb.0:580; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x24581; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 0582; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)583; GFX11-GISEL-NEXT: s_brev_b64 s[2:3], s[2:3]584; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1)585; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3586; GFX11-GISEL-NEXT: global_store_b64 v2, v[0:1], s[0:1]587; GFX11-GISEL-NEXT: s_endpgm588 %brev = call i64 @llvm.bitreverse.i64(i64 %val) #1589 store i64 %brev, ptr addrspace(1) %out590 ret void591}592 593define amdgpu_kernel void @v_brev_i64(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %valptr) #0 {594; SI-LABEL: v_brev_i64:595; SI: ; %bb.0:596; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9597; SI-NEXT: s_mov_b32 s7, 0xf000598; SI-NEXT: s_mov_b32 s10, 0599; SI-NEXT: s_mov_b32 s11, s7600; SI-NEXT: v_lshlrev_b32_e32 v0, 3, v0601; SI-NEXT: s_waitcnt lgkmcnt(0)602; SI-NEXT: s_mov_b64 s[8:9], s[2:3]603; SI-NEXT: v_mov_b32_e32 v1, 0604; SI-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[8:11], 0 addr64605; SI-NEXT: s_mov_b32 s6, -1606; SI-NEXT: s_mov_b32 s4, s0607; SI-NEXT: s_mov_b32 s5, s1608; SI-NEXT: s_waitcnt vmcnt(0)609; SI-NEXT: v_bfrev_b32_e32 v2, v0610; SI-NEXT: v_bfrev_b32_e32 v1, v1611; SI-NEXT: buffer_store_dwordx2 v[1:2], off, s[4:7], 0612; SI-NEXT: s_endpgm613;614; FLAT-LABEL: v_brev_i64:615; FLAT: ; %bb.0:616; FLAT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24617; FLAT-NEXT: v_lshlrev_b32_e32 v0, 3, v0618; FLAT-NEXT: s_waitcnt lgkmcnt(0)619; FLAT-NEXT: v_mov_b32_e32 v1, s3620; FLAT-NEXT: v_add_u32_e32 v0, vcc, s2, v0621; FLAT-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc622; FLAT-NEXT: flat_load_dwordx2 v[0:1], v[0:1]623; FLAT-NEXT: s_mov_b32 s3, 0xf000624; FLAT-NEXT: s_mov_b32 s2, -1625; FLAT-NEXT: s_waitcnt vmcnt(0)626; FLAT-NEXT: v_bfrev_b32_e32 v2, v0627; FLAT-NEXT: v_bfrev_b32_e32 v1, v1628; FLAT-NEXT: buffer_store_dwordx2 v[1:2], off, s[0:3], 0629; FLAT-NEXT: s_endpgm630;631; GISEL-LABEL: v_brev_i64:632; GISEL: ; %bb.0:633; GISEL-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24634; GISEL-NEXT: v_lshlrev_b32_e32 v2, 3, v0635; GISEL-NEXT: s_waitcnt lgkmcnt(0)636; GISEL-NEXT: v_mov_b32_e32 v0, s2637; GISEL-NEXT: v_mov_b32_e32 v1, s3638; GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2639; GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc640; GISEL-NEXT: flat_load_dwordx2 v[0:1], v[0:1]641; GISEL-NEXT: v_mov_b32_e32 v4, s1642; GISEL-NEXT: v_mov_b32_e32 v3, s0643; GISEL-NEXT: s_waitcnt vmcnt(0)644; GISEL-NEXT: v_bfrev_b32_e32 v1, v1645; GISEL-NEXT: v_bfrev_b32_e32 v2, v0646; GISEL-NEXT: flat_store_dwordx2 v[3:4], v[1:2]647; GISEL-NEXT: s_endpgm648;649; GFX11-FLAT-LABEL: v_brev_i64:650; GFX11-FLAT: ; %bb.0:651; GFX11-FLAT-NEXT: s_load_b128 s[0:3], s[4:5], 0x24652; GFX11-FLAT-NEXT: v_and_b32_e32 v0, 0x3ff, v0653; GFX11-FLAT-NEXT: s_delay_alu instid0(VALU_DEP_1)654; GFX11-FLAT-NEXT: v_lshlrev_b32_e32 v0, 3, v0655; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)656; GFX11-FLAT-NEXT: global_load_b64 v[0:1], v0, s[2:3]657; GFX11-FLAT-NEXT: s_mov_b32 s3, 0x31016000658; GFX11-FLAT-NEXT: s_mov_b32 s2, -1659; GFX11-FLAT-NEXT: s_waitcnt vmcnt(0)660; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v2, v0661; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v1, v1662; GFX11-FLAT-NEXT: buffer_store_b64 v[1:2], off, s[0:3], 0663; GFX11-FLAT-NEXT: s_endpgm664;665; GFX11-GISEL-LABEL: v_brev_i64:666; GFX11-GISEL: ; %bb.0:667; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x24668; GFX11-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0669; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)670; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 3, v0671; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)672; GFX11-GISEL-NEXT: global_load_b64 v[0:1], v0, s[2:3]673; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0)674; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v1, v1675; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v2, v0676; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0677; GFX11-GISEL-NEXT: global_store_b64 v0, v[1:2], s[0:1]678; GFX11-GISEL-NEXT: s_endpgm679 %tid = call i32 @llvm.amdgcn.workitem.id.x()680 %gep = getelementptr i64, ptr addrspace(1) %valptr, i32 %tid681 %val = load i64, ptr addrspace(1) %gep682 %brev = call i64 @llvm.bitreverse.i64(i64 %val) #1683 store i64 %brev, ptr addrspace(1) %out684 ret void685}686 687define amdgpu_kernel void @s_brev_v2i64(ptr addrspace(1) noalias %out, <2 x i64> %val) #0 {688; SI-LABEL: s_brev_v2i64:689; SI: ; %bb.0:690; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0xd691; SI-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x9692; SI-NEXT: s_mov_b32 s7, 0xf000693; SI-NEXT: s_mov_b32 s6, -1694; SI-NEXT: s_waitcnt lgkmcnt(0)695; SI-NEXT: s_brev_b64 s[2:3], s[2:3]696; SI-NEXT: s_brev_b64 s[0:1], s[0:1]697; SI-NEXT: v_mov_b32_e32 v0, s0698; SI-NEXT: v_mov_b32_e32 v1, s1699; SI-NEXT: v_mov_b32_e32 v2, s2700; SI-NEXT: v_mov_b32_e32 v3, s3701; SI-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0702; SI-NEXT: s_endpgm703;704; FLAT-LABEL: s_brev_v2i64:705; FLAT: ; %bb.0:706; FLAT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x34707; FLAT-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x24708; FLAT-NEXT: s_mov_b32 s7, 0xf000709; FLAT-NEXT: s_mov_b32 s6, -1710; FLAT-NEXT: s_waitcnt lgkmcnt(0)711; FLAT-NEXT: s_brev_b64 s[2:3], s[2:3]712; FLAT-NEXT: s_brev_b64 s[0:1], s[0:1]713; FLAT-NEXT: v_mov_b32_e32 v0, s0714; FLAT-NEXT: v_mov_b32_e32 v1, s1715; FLAT-NEXT: v_mov_b32_e32 v2, s2716; FLAT-NEXT: v_mov_b32_e32 v3, s3717; FLAT-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0718; FLAT-NEXT: s_endpgm719;720; GISEL-LABEL: s_brev_v2i64:721; GISEL: ; %bb.0:722; GISEL-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x34723; GISEL-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x24724; GISEL-NEXT: s_waitcnt lgkmcnt(0)725; GISEL-NEXT: s_brev_b64 s[0:1], s[0:1]726; GISEL-NEXT: s_brev_b64 s[2:3], s[2:3]727; GISEL-NEXT: v_mov_b32_e32 v0, s0728; GISEL-NEXT: v_mov_b32_e32 v4, s4729; GISEL-NEXT: v_mov_b32_e32 v1, s1730; GISEL-NEXT: v_mov_b32_e32 v2, s2731; GISEL-NEXT: v_mov_b32_e32 v3, s3732; GISEL-NEXT: v_mov_b32_e32 v5, s5733; GISEL-NEXT: flat_store_dwordx4 v[4:5], v[0:3]734; GISEL-NEXT: s_endpgm735;736; GFX11-FLAT-LABEL: s_brev_v2i64:737; GFX11-FLAT: ; %bb.0:738; GFX11-FLAT-NEXT: s_clause 0x1739; GFX11-FLAT-NEXT: s_load_b128 s[0:3], s[4:5], 0x34740; GFX11-FLAT-NEXT: s_load_b64 s[4:5], s[4:5], 0x24741; GFX11-FLAT-NEXT: s_mov_b32 s7, 0x31016000742; GFX11-FLAT-NEXT: s_mov_b32 s6, -1743; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)744; GFX11-FLAT-NEXT: s_brev_b64 s[0:1], s[0:1]745; GFX11-FLAT-NEXT: s_brev_b64 s[2:3], s[2:3]746; GFX11-FLAT-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1747; GFX11-FLAT-NEXT: v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3748; GFX11-FLAT-NEXT: buffer_store_b128 v[0:3], off, s[4:7], 0749; GFX11-FLAT-NEXT: s_endpgm750;751; GFX11-GISEL-LABEL: s_brev_v2i64:752; GFX11-GISEL: ; %bb.0:753; GFX11-GISEL-NEXT: s_clause 0x1754; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x34755; GFX11-GISEL-NEXT: s_load_b64 s[4:5], s[4:5], 0x24756; GFX11-GISEL-NEXT: v_mov_b32_e32 v4, 0757; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)758; GFX11-GISEL-NEXT: s_brev_b64 s[0:1], s[0:1]759; GFX11-GISEL-NEXT: s_brev_b64 s[2:3], s[2:3]760; GFX11-GISEL-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1761; GFX11-GISEL-NEXT: v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3762; GFX11-GISEL-NEXT: global_store_b128 v4, v[0:3], s[4:5]763; GFX11-GISEL-NEXT: s_endpgm764 %brev = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %val) #1765 store <2 x i64> %brev, ptr addrspace(1) %out766 ret void767}768 769define amdgpu_kernel void @v_brev_v2i64(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %valptr) #0 {770; SI-LABEL: v_brev_v2i64:771; SI: ; %bb.0:772; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9773; SI-NEXT: s_mov_b32 s7, 0xf000774; SI-NEXT: s_mov_b32 s10, 0775; SI-NEXT: s_mov_b32 s11, s7776; SI-NEXT: v_lshlrev_b32_e32 v0, 4, v0777; SI-NEXT: s_waitcnt lgkmcnt(0)778; SI-NEXT: s_mov_b64 s[8:9], s[2:3]779; SI-NEXT: v_mov_b32_e32 v1, 0780; SI-NEXT: buffer_load_dwordx4 v[0:3], v[0:1], s[8:11], 0 addr64781; SI-NEXT: s_mov_b32 s6, -1782; SI-NEXT: s_mov_b32 s4, s0783; SI-NEXT: s_mov_b32 s5, s1784; SI-NEXT: s_waitcnt vmcnt(0)785; SI-NEXT: v_bfrev_b32_e32 v4, v2786; SI-NEXT: v_bfrev_b32_e32 v3, v3787; SI-NEXT: v_bfrev_b32_e32 v2, v0788; SI-NEXT: v_bfrev_b32_e32 v1, v1789; SI-NEXT: buffer_store_dwordx4 v[1:4], off, s[4:7], 0790; SI-NEXT: s_endpgm791;792; FLAT-LABEL: v_brev_v2i64:793; FLAT: ; %bb.0:794; FLAT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24795; FLAT-NEXT: v_lshlrev_b32_e32 v0, 4, v0796; FLAT-NEXT: s_waitcnt lgkmcnt(0)797; FLAT-NEXT: v_mov_b32_e32 v1, s3798; FLAT-NEXT: v_add_u32_e32 v0, vcc, s2, v0799; FLAT-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc800; FLAT-NEXT: flat_load_dwordx4 v[0:3], v[0:1]801; FLAT-NEXT: s_mov_b32 s3, 0xf000802; FLAT-NEXT: s_mov_b32 s2, -1803; FLAT-NEXT: s_waitcnt vmcnt(0)804; FLAT-NEXT: v_bfrev_b32_e32 v4, v2805; FLAT-NEXT: v_bfrev_b32_e32 v3, v3806; FLAT-NEXT: v_bfrev_b32_e32 v2, v0807; FLAT-NEXT: v_bfrev_b32_e32 v1, v1808; FLAT-NEXT: buffer_store_dwordx4 v[1:4], off, s[0:3], 0809; FLAT-NEXT: s_endpgm810;811; GISEL-LABEL: v_brev_v2i64:812; GISEL: ; %bb.0:813; GISEL-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24814; GISEL-NEXT: v_lshlrev_b32_e32 v2, 4, v0815; GISEL-NEXT: s_waitcnt lgkmcnt(0)816; GISEL-NEXT: v_mov_b32_e32 v0, s2817; GISEL-NEXT: v_mov_b32_e32 v1, s3818; GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2819; GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc820; GISEL-NEXT: flat_load_dwordx4 v[0:3], v[0:1]821; GISEL-NEXT: s_waitcnt vmcnt(0)822; GISEL-NEXT: v_bfrev_b32_e32 v4, v1823; GISEL-NEXT: v_bfrev_b32_e32 v5, v0824; GISEL-NEXT: v_mov_b32_e32 v0, s0825; GISEL-NEXT: v_bfrev_b32_e32 v6, v3826; GISEL-NEXT: v_bfrev_b32_e32 v7, v2827; GISEL-NEXT: v_mov_b32_e32 v1, s1828; GISEL-NEXT: flat_store_dwordx4 v[0:1], v[4:7]829; GISEL-NEXT: s_endpgm830;831; GFX11-FLAT-LABEL: v_brev_v2i64:832; GFX11-FLAT: ; %bb.0:833; GFX11-FLAT-NEXT: s_load_b128 s[0:3], s[4:5], 0x24834; GFX11-FLAT-NEXT: v_and_b32_e32 v0, 0x3ff, v0835; GFX11-FLAT-NEXT: s_delay_alu instid0(VALU_DEP_1)836; GFX11-FLAT-NEXT: v_lshlrev_b32_e32 v0, 4, v0837; GFX11-FLAT-NEXT: s_waitcnt lgkmcnt(0)838; GFX11-FLAT-NEXT: global_load_b128 v[0:3], v0, s[2:3]839; GFX11-FLAT-NEXT: s_mov_b32 s3, 0x31016000840; GFX11-FLAT-NEXT: s_mov_b32 s2, -1841; GFX11-FLAT-NEXT: s_waitcnt vmcnt(0)842; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v4, v2843; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v3, v3844; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v2, v0845; GFX11-FLAT-NEXT: v_bfrev_b32_e32 v1, v1846; GFX11-FLAT-NEXT: buffer_store_b128 v[1:4], off, s[0:3], 0847; GFX11-FLAT-NEXT: s_endpgm848;849; GFX11-GISEL-LABEL: v_brev_v2i64:850; GFX11-GISEL: ; %bb.0:851; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x24852; GFX11-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff, v0853; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)854; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 4, v0855; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)856; GFX11-GISEL-NEXT: global_load_b128 v[0:3], v0, s[2:3]857; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0)858; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v4, v1859; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v5, v0860; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v6, v3861; GFX11-GISEL-NEXT: v_bfrev_b32_e32 v7, v2862; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0863; GFX11-GISEL-NEXT: global_store_b128 v0, v[4:7], s[0:1]864; GFX11-GISEL-NEXT: s_endpgm865 %tid = call i32 @llvm.amdgcn.workitem.id.x()866 %gep = getelementptr <2 x i64> , ptr addrspace(1) %valptr, i32 %tid867 %val = load <2 x i64>, ptr addrspace(1) %gep868 %brev = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %val) #1869 store <2 x i64> %brev, ptr addrspace(1) %out870 ret void871}872 873define float @missing_truncate_promote_bitreverse(i32 %arg) {874; SI-LABEL: missing_truncate_promote_bitreverse:875; SI: ; %bb.0: ; %bb876; SI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)877; SI-NEXT: v_bfrev_b32_e32 v0, v0878; SI-NEXT: v_lshrrev_b32_e32 v0, 16, v0879; SI-NEXT: v_cvt_f32_f16_e32 v0, v0880; SI-NEXT: s_setpc_b64 s[30:31]881;882; FLAT-LABEL: missing_truncate_promote_bitreverse:883; FLAT: ; %bb.0: ; %bb884; FLAT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)885; FLAT-NEXT: v_bfrev_b32_e32 v0, v0886; FLAT-NEXT: v_cvt_f32_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1887; FLAT-NEXT: s_setpc_b64 s[30:31]888;889; GISEL-LABEL: missing_truncate_promote_bitreverse:890; GISEL: ; %bb.0: ; %bb891; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)892; GISEL-NEXT: v_bfrev_b32_e32 v0, v0893; GISEL-NEXT: v_cvt_f32_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1894; GISEL-NEXT: s_setpc_b64 s[30:31]895;896; GFX11-FLAT-TRUE16-LABEL: missing_truncate_promote_bitreverse:897; GFX11-FLAT-TRUE16: ; %bb.0: ; %bb898; GFX11-FLAT-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)899; GFX11-FLAT-TRUE16-NEXT: v_bfrev_b32_e32 v0, v0900; GFX11-FLAT-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)901; GFX11-FLAT-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.h902; GFX11-FLAT-TRUE16-NEXT: s_setpc_b64 s[30:31]903;904; GFX11-FLAT-FAKE16-LABEL: missing_truncate_promote_bitreverse:905; GFX11-FLAT-FAKE16: ; %bb.0: ; %bb906; GFX11-FLAT-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)907; GFX11-FLAT-FAKE16-NEXT: v_bfrev_b32_e32 v0, v0908; GFX11-FLAT-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)909; GFX11-FLAT-FAKE16-NEXT: v_lshrrev_b32_e32 v0, 16, v0910; GFX11-FLAT-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0911; GFX11-FLAT-FAKE16-NEXT: s_setpc_b64 s[30:31]912;913; GFX11-GISEL-TRUE16-LABEL: missing_truncate_promote_bitreverse:914; GFX11-GISEL-TRUE16: ; %bb.0: ; %bb915; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)916; GFX11-GISEL-TRUE16-NEXT: v_bfrev_b32_e32 v0, v0917; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)918; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v0, 16, v0919; GFX11-GISEL-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l920; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31]921;922; GFX11-GISEL-FAKE16-LABEL: missing_truncate_promote_bitreverse:923; GFX11-GISEL-FAKE16: ; %bb.0: ; %bb924; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)925; GFX11-GISEL-FAKE16-NEXT: v_bfrev_b32_e32 v0, v0926; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)927; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v0, 16, v0928; GFX11-GISEL-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0929; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31]930bb:931 %tmp = trunc i32 %arg to i16932 %tmp1 = call i16 @llvm.bitreverse.i16(i16 %tmp)933 %tmp2 = bitcast i16 %tmp1 to half934 %tmp3 = fpext half %tmp2 to float935 ret float %tmp3936}937 938attributes #0 = { nounwind }939attributes #1 = { nounwind readnone }940