639 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=SI %s3; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=fiji -mattr=-flat-for-global < %s | FileCheck -check-prefixes=VI %s4; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 -mattr=-flat-for-global < %s | FileCheck -check-prefixes=GFX11-TRUE16 %s5; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 -mattr=-flat-for-global < %s | FileCheck -check-prefixes=GFX11-FAKE16 %s6 7 8define amdgpu_kernel void @fptoui_f16_to_i16(9; SI-LABEL: fptoui_f16_to_i16:10; SI: ; %bb.0: ; %entry11; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x912; SI-NEXT: s_mov_b32 s7, 0xf00013; SI-NEXT: s_mov_b32 s6, -114; SI-NEXT: s_mov_b32 s10, s615; SI-NEXT: s_mov_b32 s11, s716; SI-NEXT: s_waitcnt lgkmcnt(0)17; SI-NEXT: s_mov_b32 s8, s218; SI-NEXT: s_mov_b32 s9, s319; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 020; SI-NEXT: s_mov_b32 s4, s021; SI-NEXT: s_mov_b32 s5, s122; SI-NEXT: s_waitcnt vmcnt(0)23; SI-NEXT: v_cvt_f32_f16_e32 v0, v024; SI-NEXT: v_cvt_u32_f32_e32 v0, v025; SI-NEXT: buffer_store_short v0, off, s[4:7], 026; SI-NEXT: s_endpgm27;28; VI-LABEL: fptoui_f16_to_i16:29; VI: ; %bb.0: ; %entry30; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2431; VI-NEXT: s_mov_b32 s7, 0xf00032; VI-NEXT: s_mov_b32 s6, -133; VI-NEXT: s_mov_b32 s10, s634; VI-NEXT: s_mov_b32 s11, s735; VI-NEXT: s_waitcnt lgkmcnt(0)36; VI-NEXT: s_mov_b32 s8, s237; VI-NEXT: s_mov_b32 s9, s338; VI-NEXT: buffer_load_ushort v0, off, s[8:11], 039; VI-NEXT: s_mov_b32 s4, s040; VI-NEXT: s_mov_b32 s5, s141; VI-NEXT: s_waitcnt vmcnt(0)42; VI-NEXT: v_cvt_u16_f16_e32 v0, v043; VI-NEXT: buffer_store_short v0, off, s[4:7], 044; VI-NEXT: s_endpgm45;46; GFX11-TRUE16-LABEL: fptoui_f16_to_i16:47; GFX11-TRUE16: ; %bb.0: ; %entry48; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2449; GFX11-TRUE16-NEXT: s_mov_b32 s6, -150; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x3101600051; GFX11-TRUE16-NEXT: s_mov_b32 s10, s652; GFX11-TRUE16-NEXT: s_mov_b32 s11, s753; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)54; GFX11-TRUE16-NEXT: s_mov_b32 s8, s255; GFX11-TRUE16-NEXT: s_mov_b32 s9, s356; GFX11-TRUE16-NEXT: s_mov_b32 s4, s057; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 058; GFX11-TRUE16-NEXT: s_mov_b32 s5, s159; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)60; GFX11-TRUE16-NEXT: v_cvt_u16_f16_e32 v0.l, v0.l61; GFX11-TRUE16-NEXT: buffer_store_b16 v0, off, s[4:7], 062; GFX11-TRUE16-NEXT: s_endpgm63;64; GFX11-FAKE16-LABEL: fptoui_f16_to_i16:65; GFX11-FAKE16: ; %bb.0: ; %entry66; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2467; GFX11-FAKE16-NEXT: s_mov_b32 s6, -168; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x3101600069; GFX11-FAKE16-NEXT: s_mov_b32 s10, s670; GFX11-FAKE16-NEXT: s_mov_b32 s11, s771; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)72; GFX11-FAKE16-NEXT: s_mov_b32 s8, s273; GFX11-FAKE16-NEXT: s_mov_b32 s9, s374; GFX11-FAKE16-NEXT: s_mov_b32 s4, s075; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 076; GFX11-FAKE16-NEXT: s_mov_b32 s5, s177; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)78; GFX11-FAKE16-NEXT: v_cvt_u16_f16_e32 v0, v079; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 080; GFX11-FAKE16-NEXT: s_endpgm81 ptr addrspace(1) %r,82 ptr addrspace(1) %a) {83entry:84 %a.val = load half, ptr addrspace(1) %a85 %r.val = fptoui half %a.val to i1686 store i16 %r.val, ptr addrspace(1) %r87 ret void88}89 90define amdgpu_kernel void @fptoui_f16_to_i32(91; SI-LABEL: fptoui_f16_to_i32:92; SI: ; %bb.0: ; %entry93; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x994; SI-NEXT: s_mov_b32 s7, 0xf00095; SI-NEXT: s_mov_b32 s6, -196; SI-NEXT: s_mov_b32 s10, s697; SI-NEXT: s_mov_b32 s11, s798; SI-NEXT: s_waitcnt lgkmcnt(0)99; SI-NEXT: s_mov_b32 s8, s2100; SI-NEXT: s_mov_b32 s9, s3101; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0102; SI-NEXT: s_mov_b32 s4, s0103; SI-NEXT: s_mov_b32 s5, s1104; SI-NEXT: s_waitcnt vmcnt(0)105; SI-NEXT: v_cvt_f32_f16_e32 v0, v0106; SI-NEXT: v_cvt_u32_f32_e32 v0, v0107; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0108; SI-NEXT: s_endpgm109;110; VI-LABEL: fptoui_f16_to_i32:111; VI: ; %bb.0: ; %entry112; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24113; VI-NEXT: s_mov_b32 s7, 0xf000114; VI-NEXT: s_mov_b32 s6, -1115; VI-NEXT: s_mov_b32 s10, s6116; VI-NEXT: s_mov_b32 s11, s7117; VI-NEXT: s_waitcnt lgkmcnt(0)118; VI-NEXT: s_mov_b32 s8, s2119; VI-NEXT: s_mov_b32 s9, s3120; VI-NEXT: buffer_load_ushort v0, off, s[8:11], 0121; VI-NEXT: s_mov_b32 s4, s0122; VI-NEXT: s_mov_b32 s5, s1123; VI-NEXT: s_waitcnt vmcnt(0)124; VI-NEXT: v_cvt_f32_f16_e32 v0, v0125; VI-NEXT: v_cvt_u32_f32_e32 v0, v0126; VI-NEXT: buffer_store_dword v0, off, s[4:7], 0127; VI-NEXT: s_endpgm128;129; GFX11-TRUE16-LABEL: fptoui_f16_to_i32:130; GFX11-TRUE16: ; %bb.0: ; %entry131; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24132; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1133; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000134; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6135; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7136; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)137; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2138; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3139; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0140; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0141; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1142; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)143; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l144; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)145; GFX11-TRUE16-NEXT: v_cvt_u32_f32_e32 v0, v0146; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0147; GFX11-TRUE16-NEXT: s_endpgm148;149; GFX11-FAKE16-LABEL: fptoui_f16_to_i32:150; GFX11-FAKE16: ; %bb.0: ; %entry151; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24152; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1153; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000154; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6155; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7156; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)157; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2158; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3159; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0160; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0161; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1162; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)163; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0164; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)165; GFX11-FAKE16-NEXT: v_cvt_u32_f32_e32 v0, v0166; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0167; GFX11-FAKE16-NEXT: s_endpgm168 ptr addrspace(1) %r,169 ptr addrspace(1) %a) {170entry:171 %a.val = load half, ptr addrspace(1) %a172 %r.val = fptoui half %a.val to i32173 store i32 %r.val, ptr addrspace(1) %r174 ret void175}176 177; Need to make sure we promote f16 to f32 when converting f16 to i64. Existing178; test checks code generated for 'i64 = fp_to_uint f32'.179 180define amdgpu_kernel void @fptoui_f16_to_i64(181; SI-LABEL: fptoui_f16_to_i64:182; SI: ; %bb.0: ; %entry183; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9184; SI-NEXT: s_mov_b32 s7, 0xf000185; SI-NEXT: s_mov_b32 s6, -1186; SI-NEXT: s_mov_b32 s10, s6187; SI-NEXT: s_mov_b32 s11, s7188; SI-NEXT: s_waitcnt lgkmcnt(0)189; SI-NEXT: s_mov_b32 s8, s2190; SI-NEXT: s_mov_b32 s9, s3191; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 0192; SI-NEXT: s_mov_b32 s4, s0193; SI-NEXT: s_mov_b32 s5, s1194; SI-NEXT: v_mov_b32_e32 v1, 0195; SI-NEXT: s_waitcnt vmcnt(0)196; SI-NEXT: v_cvt_f32_f16_e32 v0, v0197; SI-NEXT: v_cvt_u32_f32_e32 v0, v0198; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0199; SI-NEXT: s_endpgm200;201; VI-LABEL: fptoui_f16_to_i64:202; VI: ; %bb.0: ; %entry203; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24204; VI-NEXT: s_mov_b32 s7, 0xf000205; VI-NEXT: s_mov_b32 s6, -1206; VI-NEXT: s_mov_b32 s10, s6207; VI-NEXT: s_mov_b32 s11, s7208; VI-NEXT: s_waitcnt lgkmcnt(0)209; VI-NEXT: s_mov_b32 s8, s2210; VI-NEXT: s_mov_b32 s9, s3211; VI-NEXT: buffer_load_ushort v0, off, s[8:11], 0212; VI-NEXT: s_mov_b32 s4, s0213; VI-NEXT: s_mov_b32 s5, s1214; VI-NEXT: v_mov_b32_e32 v1, 0215; VI-NEXT: s_waitcnt vmcnt(0)216; VI-NEXT: v_cvt_f32_f16_e32 v0, v0217; VI-NEXT: v_cvt_u32_f32_e32 v0, v0218; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0219; VI-NEXT: s_endpgm220;221; GFX11-TRUE16-LABEL: fptoui_f16_to_i64:222; GFX11-TRUE16: ; %bb.0: ; %entry223; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24224; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1225; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000226; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6227; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7228; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 0229; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)230; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2231; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3232; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0233; GFX11-TRUE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0234; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1235; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)236; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l237; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)238; GFX11-TRUE16-NEXT: v_cvt_u32_f32_e32 v0, v0239; GFX11-TRUE16-NEXT: buffer_store_b64 v[0:1], off, s[4:7], 0240; GFX11-TRUE16-NEXT: s_endpgm241;242; GFX11-FAKE16-LABEL: fptoui_f16_to_i64:243; GFX11-FAKE16: ; %bb.0: ; %entry244; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24245; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1246; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000247; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6248; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7249; GFX11-FAKE16-NEXT: v_mov_b32_e32 v1, 0250; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)251; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2252; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3253; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0254; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 0255; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1256; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)257; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0258; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)259; GFX11-FAKE16-NEXT: v_cvt_u32_f32_e32 v0, v0260; GFX11-FAKE16-NEXT: buffer_store_b64 v[0:1], off, s[4:7], 0261; GFX11-FAKE16-NEXT: s_endpgm262 ptr addrspace(1) %r,263 ptr addrspace(1) %a) {264entry:265 %a.val = load half, ptr addrspace(1) %a266 %r.val = fptoui half %a.val to i64267 store i64 %r.val, ptr addrspace(1) %r268 ret void269}270 271define amdgpu_kernel void @fptoui_v2f16_to_v2i16(272; SI-LABEL: fptoui_v2f16_to_v2i16:273; SI: ; %bb.0: ; %entry274; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9275; SI-NEXT: s_mov_b32 s7, 0xf000276; SI-NEXT: s_mov_b32 s6, -1277; SI-NEXT: s_mov_b32 s10, s6278; SI-NEXT: s_mov_b32 s11, s7279; SI-NEXT: s_waitcnt lgkmcnt(0)280; SI-NEXT: s_mov_b32 s8, s2281; SI-NEXT: s_mov_b32 s9, s3282; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0283; SI-NEXT: s_mov_b32 s4, s0284; SI-NEXT: s_mov_b32 s5, s1285; SI-NEXT: s_waitcnt vmcnt(0)286; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v0287; SI-NEXT: v_cvt_f32_f16_e32 v1, v1288; SI-NEXT: v_cvt_f32_f16_e32 v0, v0289; SI-NEXT: v_cvt_u32_f32_e32 v1, v1290; SI-NEXT: v_cvt_u32_f32_e32 v0, v0291; SI-NEXT: v_lshlrev_b32_e32 v1, 16, v1292; SI-NEXT: v_or_b32_e32 v0, v0, v1293; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0294; SI-NEXT: s_endpgm295;296; VI-LABEL: fptoui_v2f16_to_v2i16:297; VI: ; %bb.0: ; %entry298; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24299; VI-NEXT: s_mov_b32 s7, 0xf000300; VI-NEXT: s_mov_b32 s6, -1301; VI-NEXT: s_mov_b32 s10, s6302; VI-NEXT: s_mov_b32 s11, s7303; VI-NEXT: s_waitcnt lgkmcnt(0)304; VI-NEXT: s_mov_b32 s8, s2305; VI-NEXT: s_mov_b32 s9, s3306; VI-NEXT: buffer_load_dword v0, off, s[8:11], 0307; VI-NEXT: s_mov_b32 s4, s0308; VI-NEXT: s_mov_b32 s5, s1309; VI-NEXT: s_waitcnt vmcnt(0)310; VI-NEXT: v_cvt_u16_f16_e32 v1, v0311; VI-NEXT: v_cvt_u16_f16_sdwa v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1312; VI-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD313; VI-NEXT: buffer_store_dword v0, off, s[4:7], 0314; VI-NEXT: s_endpgm315;316; GFX11-TRUE16-LABEL: fptoui_v2f16_to_v2i16:317; GFX11-TRUE16: ; %bb.0: ; %entry318; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24319; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1320; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000321; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6322; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7323; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)324; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2325; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3326; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0327; GFX11-TRUE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0328; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1329; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)330; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0331; GFX11-TRUE16-NEXT: v_cvt_u16_f16_e32 v0.l, v0.l332; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)333; GFX11-TRUE16-NEXT: v_cvt_u16_f16_e32 v0.h, v1.l334; GFX11-TRUE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0335; GFX11-TRUE16-NEXT: s_endpgm336;337; GFX11-FAKE16-LABEL: fptoui_v2f16_to_v2i16:338; GFX11-FAKE16: ; %bb.0: ; %entry339; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24340; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1341; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000342; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6343; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7344; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)345; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2346; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3347; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0348; GFX11-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0349; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1350; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)351; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0352; GFX11-FAKE16-NEXT: v_cvt_u16_f16_e32 v0, v0353; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)354; GFX11-FAKE16-NEXT: v_cvt_u16_f16_e32 v1, v1355; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0356; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)357; GFX11-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0358; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0359; GFX11-FAKE16-NEXT: s_endpgm360 ptr addrspace(1) %r,361 ptr addrspace(1) %a) {362entry:363 %a.val = load <2 x half>, ptr addrspace(1) %a364 %r.val = fptoui <2 x half> %a.val to <2 x i16>365 store <2 x i16> %r.val, ptr addrspace(1) %r366 ret void367}368 369define amdgpu_kernel void @fptoui_v2f16_to_v2i32(370; SI-LABEL: fptoui_v2f16_to_v2i32:371; SI: ; %bb.0: ; %entry372; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9373; SI-NEXT: s_mov_b32 s7, 0xf000374; SI-NEXT: s_mov_b32 s6, -1375; SI-NEXT: s_mov_b32 s10, s6376; SI-NEXT: s_mov_b32 s11, s7377; SI-NEXT: s_waitcnt lgkmcnt(0)378; SI-NEXT: s_mov_b32 s8, s2379; SI-NEXT: s_mov_b32 s9, s3380; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0381; SI-NEXT: s_mov_b32 s4, s0382; SI-NEXT: s_mov_b32 s5, s1383; SI-NEXT: s_waitcnt vmcnt(0)384; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v0385; SI-NEXT: v_cvt_f32_f16_e32 v0, v0386; SI-NEXT: v_cvt_f32_f16_e32 v1, v1387; SI-NEXT: v_cvt_u32_f32_e32 v0, v0388; SI-NEXT: v_cvt_u32_f32_e32 v1, v1389; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0390; SI-NEXT: s_endpgm391;392; VI-LABEL: fptoui_v2f16_to_v2i32:393; VI: ; %bb.0: ; %entry394; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24395; VI-NEXT: s_mov_b32 s7, 0xf000396; VI-NEXT: s_mov_b32 s6, -1397; VI-NEXT: s_mov_b32 s10, s6398; VI-NEXT: s_mov_b32 s11, s7399; VI-NEXT: s_waitcnt lgkmcnt(0)400; VI-NEXT: s_mov_b32 s8, s2401; VI-NEXT: s_mov_b32 s9, s3402; VI-NEXT: buffer_load_dword v0, off, s[8:11], 0403; VI-NEXT: s_mov_b32 s4, s0404; VI-NEXT: s_mov_b32 s5, s1405; VI-NEXT: s_waitcnt vmcnt(0)406; VI-NEXT: v_cvt_f32_f16_e32 v1, v0407; VI-NEXT: v_cvt_f32_f16_sdwa v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1408; VI-NEXT: v_cvt_u32_f32_e32 v0, v1409; VI-NEXT: v_cvt_u32_f32_e32 v1, v2410; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0411; VI-NEXT: s_endpgm412;413; GFX11-TRUE16-LABEL: fptoui_v2f16_to_v2i32:414; GFX11-TRUE16: ; %bb.0: ; %entry415; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24416; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1417; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000418; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6419; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7420; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)421; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2422; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3423; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0424; GFX11-TRUE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0425; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1426; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)427; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0428; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l429; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)430; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v1, v1.l431; GFX11-TRUE16-NEXT: v_cvt_u32_f32_e32 v0, v0432; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)433; GFX11-TRUE16-NEXT: v_cvt_u32_f32_e32 v1, v1434; GFX11-TRUE16-NEXT: buffer_store_b64 v[0:1], off, s[4:7], 0435; GFX11-TRUE16-NEXT: s_endpgm436;437; GFX11-FAKE16-LABEL: fptoui_v2f16_to_v2i32:438; GFX11-FAKE16: ; %bb.0: ; %entry439; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24440; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1441; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000442; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6443; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7444; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)445; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2446; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3447; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0448; GFX11-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0449; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1450; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)451; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0452; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0453; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)454; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v1, v1455; GFX11-FAKE16-NEXT: v_cvt_u32_f32_e32 v0, v0456; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2)457; GFX11-FAKE16-NEXT: v_cvt_u32_f32_e32 v1, v1458; GFX11-FAKE16-NEXT: buffer_store_b64 v[0:1], off, s[4:7], 0459; GFX11-FAKE16-NEXT: s_endpgm460 ptr addrspace(1) %r,461 ptr addrspace(1) %a) {462entry:463 %a.val = load <2 x half>, ptr addrspace(1) %a464 %r.val = fptoui <2 x half> %a.val to <2 x i32>465 store <2 x i32> %r.val, ptr addrspace(1) %r466 ret void467}468 469; Need to make sure we promote f16 to f32 when converting f16 to i64. Existing470; test checks code generated for 'i64 = fp_to_uint f32'.471 472define amdgpu_kernel void @fptoui_v2f16_to_v2i64(473; SI-LABEL: fptoui_v2f16_to_v2i64:474; SI: ; %bb.0: ; %entry475; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9476; SI-NEXT: s_mov_b32 s7, 0xf000477; SI-NEXT: s_mov_b32 s6, -1478; SI-NEXT: s_mov_b32 s10, s6479; SI-NEXT: s_mov_b32 s11, s7480; SI-NEXT: s_waitcnt lgkmcnt(0)481; SI-NEXT: s_mov_b32 s8, s2482; SI-NEXT: s_mov_b32 s9, s3483; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0484; SI-NEXT: s_mov_b32 s4, s0485; SI-NEXT: s_mov_b32 s5, s1486; SI-NEXT: s_waitcnt vmcnt(0)487; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v0488; SI-NEXT: v_cvt_f32_f16_e32 v0, v0489; SI-NEXT: v_cvt_f32_f16_e32 v1, v1490; SI-NEXT: v_cvt_u32_f32_e32 v0, v0491; SI-NEXT: v_cvt_u32_f32_e32 v2, v1492; SI-NEXT: v_mov_b32_e32 v1, 0493; SI-NEXT: v_mov_b32_e32 v3, v1494; SI-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0495; SI-NEXT: s_endpgm496;497; VI-LABEL: fptoui_v2f16_to_v2i64:498; VI: ; %bb.0: ; %entry499; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24500; VI-NEXT: s_mov_b32 s7, 0xf000501; VI-NEXT: s_mov_b32 s6, -1502; VI-NEXT: s_mov_b32 s10, s6503; VI-NEXT: s_mov_b32 s11, s7504; VI-NEXT: s_waitcnt lgkmcnt(0)505; VI-NEXT: s_mov_b32 s8, s2506; VI-NEXT: s_mov_b32 s9, s3507; VI-NEXT: buffer_load_dword v0, off, s[8:11], 0508; VI-NEXT: s_mov_b32 s4, s0509; VI-NEXT: s_mov_b32 s5, s1510; VI-NEXT: s_waitcnt vmcnt(0)511; VI-NEXT: v_cvt_f32_f16_e32 v1, v0512; VI-NEXT: v_cvt_f32_f16_sdwa v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1513; VI-NEXT: v_cvt_u32_f32_e32 v0, v1514; VI-NEXT: v_cvt_u32_f32_e32 v2, v2515; VI-NEXT: v_mov_b32_e32 v1, 0516; VI-NEXT: v_mov_b32_e32 v3, v1517; VI-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0518; VI-NEXT: s_endpgm519;520; GFX11-TRUE16-LABEL: fptoui_v2f16_to_v2i64:521; GFX11-TRUE16: ; %bb.0: ; %entry522; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24523; GFX11-TRUE16-NEXT: s_mov_b32 s6, -1524; GFX11-TRUE16-NEXT: s_mov_b32 s7, 0x31016000525; GFX11-TRUE16-NEXT: s_mov_b32 s10, s6526; GFX11-TRUE16-NEXT: s_mov_b32 s11, s7527; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)528; GFX11-TRUE16-NEXT: s_mov_b32 s8, s2529; GFX11-TRUE16-NEXT: s_mov_b32 s9, s3530; GFX11-TRUE16-NEXT: s_mov_b32 s4, s0531; GFX11-TRUE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0532; GFX11-TRUE16-NEXT: s_mov_b32 s5, s1533; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)534; GFX11-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0535; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.l536; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)537; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v2, v1.l538; GFX11-TRUE16-NEXT: v_mov_b32_e32 v1, 0539; GFX11-TRUE16-NEXT: v_cvt_u32_f32_e32 v0, v0540; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)541; GFX11-TRUE16-NEXT: v_cvt_u32_f32_e32 v2, v2542; GFX11-TRUE16-NEXT: v_mov_b32_e32 v3, v1543; GFX11-TRUE16-NEXT: buffer_store_b128 v[0:3], off, s[4:7], 0544; GFX11-TRUE16-NEXT: s_endpgm545;546; GFX11-FAKE16-LABEL: fptoui_v2f16_to_v2i64:547; GFX11-FAKE16: ; %bb.0: ; %entry548; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24549; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1550; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000551; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6552; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7553; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)554; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2555; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3556; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0557; GFX11-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0558; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1559; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)560; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0561; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v0562; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)563; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v2, v1564; GFX11-FAKE16-NEXT: v_mov_b32_e32 v1, 0565; GFX11-FAKE16-NEXT: v_cvt_u32_f32_e32 v0, v0566; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)567; GFX11-FAKE16-NEXT: v_cvt_u32_f32_e32 v2, v2568; GFX11-FAKE16-NEXT: v_mov_b32_e32 v3, v1569; GFX11-FAKE16-NEXT: buffer_store_b128 v[0:3], off, s[4:7], 0570; GFX11-FAKE16-NEXT: s_endpgm571 ptr addrspace(1) %r,572 ptr addrspace(1) %a) {573entry:574 %a.val = load <2 x half>, ptr addrspace(1) %a575 %r.val = fptoui <2 x half> %a.val to <2 x i64>576 store <2 x i64> %r.val, ptr addrspace(1) %r577 ret void578}579 580define amdgpu_kernel void @fptoui_f16_to_i1(ptr addrspace(1) %out, half %in) {581; SI-LABEL: fptoui_f16_to_i1:582; SI: ; %bb.0: ; %entry583; SI-NEXT: s_load_dword s0, s[4:5], 0xb584; SI-NEXT: s_mov_b32 s3, 0xf000585; SI-NEXT: s_mov_b32 s2, -1586; SI-NEXT: s_waitcnt lgkmcnt(0)587; SI-NEXT: v_cvt_f32_f16_e32 v0, s0588; SI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9589; SI-NEXT: v_cmp_eq_f32_e32 vcc, 1.0, v0590; SI-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc591; SI-NEXT: s_waitcnt lgkmcnt(0)592; SI-NEXT: buffer_store_byte v0, off, s[0:3], 0593; SI-NEXT: s_endpgm594;595; VI-LABEL: fptoui_f16_to_i1:596; VI: ; %bb.0: ; %entry597; VI-NEXT: s_load_dword s6, s[4:5], 0x2c598; VI-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24599; VI-NEXT: s_mov_b32 s3, 0xf000600; VI-NEXT: s_mov_b32 s2, -1601; VI-NEXT: s_waitcnt lgkmcnt(0)602; VI-NEXT: v_cmp_eq_f16_e64 s[4:5], 1.0, s6603; VI-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]604; VI-NEXT: buffer_store_byte v0, off, s[0:3], 0605; VI-NEXT: s_endpgm606;607; GFX11-TRUE16-LABEL: fptoui_f16_to_i1:608; GFX11-TRUE16: ; %bb.0: ; %entry609; GFX11-TRUE16-NEXT: s_clause 0x1610; GFX11-TRUE16-NEXT: s_load_b32 s2, s[4:5], 0x2c611; GFX11-TRUE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x24612; GFX11-TRUE16-NEXT: s_mov_b32 s3, 0x31016000613; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)614; GFX11-TRUE16-NEXT: v_cmp_eq_f16_e64 s2, 1.0, s2615; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)616; GFX11-TRUE16-NEXT: v_cndmask_b32_e64 v0, 0, 1, s2617; GFX11-TRUE16-NEXT: s_mov_b32 s2, -1618; GFX11-TRUE16-NEXT: buffer_store_b8 v0, off, s[0:3], 0619; GFX11-TRUE16-NEXT: s_endpgm620;621; GFX11-FAKE16-LABEL: fptoui_f16_to_i1:622; GFX11-FAKE16: ; %bb.0: ; %entry623; GFX11-FAKE16-NEXT: s_clause 0x1624; GFX11-FAKE16-NEXT: s_load_b32 s2, s[4:5], 0x2c625; GFX11-FAKE16-NEXT: s_load_b64 s[0:1], s[4:5], 0x24626; GFX11-FAKE16-NEXT: s_mov_b32 s3, 0x31016000627; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)628; GFX11-FAKE16-NEXT: v_cmp_eq_f16_e64 s2, 1.0, s2629; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)630; GFX11-FAKE16-NEXT: v_cndmask_b32_e64 v0, 0, 1, s2631; GFX11-FAKE16-NEXT: s_mov_b32 s2, -1632; GFX11-FAKE16-NEXT: buffer_store_b8 v0, off, s[0:3], 0633; GFX11-FAKE16-NEXT: s_endpgm634entry:635 %conv = fptoui half %in to i1636 store i1 %conv, ptr addrspace(1) %out637 ret void638}639