brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.2 KiB · a043d53 Raw
641 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 < %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 @fptosi_f16_to_i16(9; SI-LABEL: fptosi_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_i32_f32_e32 v0, v025; SI-NEXT:    buffer_store_short v0, off, s[4:7], 026; SI-NEXT:    s_endpgm27;28; VI-LABEL: fptosi_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_i16_f16_e32 v0, v043; VI-NEXT:    buffer_store_short v0, off, s[4:7], 044; VI-NEXT:    s_endpgm45;46; GFX11-TRUE16-LABEL: fptosi_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_i16_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: fptosi_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_i16_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 = fptosi half %a.val to i1686  store i16 %r.val, ptr addrspace(1) %r87  ret void88}89 90define amdgpu_kernel void @fptosi_f16_to_i32(91; SI-LABEL: fptosi_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_i32_f32_e32 v0, v0107; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0108; SI-NEXT:    s_endpgm109;110; VI-LABEL: fptosi_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_i32_f32_e32 v0, v0126; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0127; VI-NEXT:    s_endpgm128;129; GFX11-TRUE16-LABEL: fptosi_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_i32_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: fptosi_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_i32_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 = fptosi 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_sint f32'.179 180define amdgpu_kernel void @fptosi_f16_to_i64(181; SI-LABEL: fptosi_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:    s_waitcnt vmcnt(0)195; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0196; SI-NEXT:    v_cvt_i32_f32_e32 v0, v0197; SI-NEXT:    v_ashrrev_i32_e32 v1, 31, v0198; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0199; SI-NEXT:    s_endpgm200;201; VI-LABEL: fptosi_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:    s_waitcnt vmcnt(0)215; VI-NEXT:    v_cvt_f32_f16_e32 v0, v0216; VI-NEXT:    v_cvt_i32_f32_e32 v0, v0217; VI-NEXT:    v_ashrrev_i32_e32 v1, 31, v0218; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0219; VI-NEXT:    s_endpgm220;221; GFX11-TRUE16-LABEL: fptosi_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:    s_waitcnt lgkmcnt(0)229; GFX11-TRUE16-NEXT:    s_mov_b32 s8, s2230; GFX11-TRUE16-NEXT:    s_mov_b32 s9, s3231; GFX11-TRUE16-NEXT:    s_mov_b32 s4, s0232; GFX11-TRUE16-NEXT:    buffer_load_u16 v0, off, s[8:11], 0233; GFX11-TRUE16-NEXT:    s_mov_b32 s5, s1234; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)235; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v0, v0.l236; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)237; GFX11-TRUE16-NEXT:    v_cvt_i32_f32_e32 v0, v0238; GFX11-TRUE16-NEXT:    v_ashrrev_i32_e32 v1, 31, v0239; GFX11-TRUE16-NEXT:    buffer_store_b64 v[0:1], off, s[4:7], 0240; GFX11-TRUE16-NEXT:    s_endpgm241;242; GFX11-FAKE16-LABEL: fptosi_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:    s_waitcnt lgkmcnt(0)250; GFX11-FAKE16-NEXT:    s_mov_b32 s8, s2251; GFX11-FAKE16-NEXT:    s_mov_b32 s9, s3252; GFX11-FAKE16-NEXT:    s_mov_b32 s4, s0253; GFX11-FAKE16-NEXT:    buffer_load_u16 v0, off, s[8:11], 0254; GFX11-FAKE16-NEXT:    s_mov_b32 s5, s1255; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)256; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0257; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)258; GFX11-FAKE16-NEXT:    v_cvt_i32_f32_e32 v0, v0259; GFX11-FAKE16-NEXT:    v_ashrrev_i32_e32 v1, 31, 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 = fptosi half %a.val to i64267  store i64 %r.val, ptr addrspace(1) %r268  ret void269}270 271define amdgpu_kernel void @fptosi_v2f16_to_v2i16(272; SI-LABEL: fptosi_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 v0, v0288; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1289; SI-NEXT:    v_cvt_i32_f32_e32 v0, v0290; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0291; SI-NEXT:    v_cvt_i32_f32_e32 v1, v1292; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1293; SI-NEXT:    v_or_b32_e32 v0, v0, v1294; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0295; SI-NEXT:    s_endpgm296;297; VI-LABEL: fptosi_v2f16_to_v2i16:298; VI:       ; %bb.0: ; %entry299; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24300; VI-NEXT:    s_mov_b32 s7, 0xf000301; VI-NEXT:    s_mov_b32 s6, -1302; VI-NEXT:    s_mov_b32 s10, s6303; VI-NEXT:    s_mov_b32 s11, s7304; VI-NEXT:    s_waitcnt lgkmcnt(0)305; VI-NEXT:    s_mov_b32 s8, s2306; VI-NEXT:    s_mov_b32 s9, s3307; VI-NEXT:    buffer_load_dword v0, off, s[8:11], 0308; VI-NEXT:    s_mov_b32 s4, s0309; VI-NEXT:    s_mov_b32 s5, s1310; VI-NEXT:    s_waitcnt vmcnt(0)311; VI-NEXT:    v_cvt_i16_f16_e32 v1, v0312; VI-NEXT:    v_cvt_i16_f16_sdwa v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1313; VI-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD314; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0315; VI-NEXT:    s_endpgm316;317; GFX11-TRUE16-LABEL: fptosi_v2f16_to_v2i16:318; GFX11-TRUE16:       ; %bb.0: ; %entry319; GFX11-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24320; GFX11-TRUE16-NEXT:    s_mov_b32 s6, -1321; GFX11-TRUE16-NEXT:    s_mov_b32 s7, 0x31016000322; GFX11-TRUE16-NEXT:    s_mov_b32 s10, s6323; GFX11-TRUE16-NEXT:    s_mov_b32 s11, s7324; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)325; GFX11-TRUE16-NEXT:    s_mov_b32 s8, s2326; GFX11-TRUE16-NEXT:    s_mov_b32 s9, s3327; GFX11-TRUE16-NEXT:    s_mov_b32 s4, s0328; GFX11-TRUE16-NEXT:    buffer_load_b32 v0, off, s[8:11], 0329; GFX11-TRUE16-NEXT:    s_mov_b32 s5, s1330; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)331; GFX11-TRUE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0332; GFX11-TRUE16-NEXT:    v_cvt_i16_f16_e32 v0.l, v0.l333; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)334; GFX11-TRUE16-NEXT:    v_cvt_i16_f16_e32 v0.h, v1.l335; GFX11-TRUE16-NEXT:    buffer_store_b32 v0, off, s[4:7], 0336; GFX11-TRUE16-NEXT:    s_endpgm337;338; GFX11-FAKE16-LABEL: fptosi_v2f16_to_v2i16:339; GFX11-FAKE16:       ; %bb.0: ; %entry340; GFX11-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24341; GFX11-FAKE16-NEXT:    s_mov_b32 s6, -1342; GFX11-FAKE16-NEXT:    s_mov_b32 s7, 0x31016000343; GFX11-FAKE16-NEXT:    s_mov_b32 s10, s6344; GFX11-FAKE16-NEXT:    s_mov_b32 s11, s7345; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)346; GFX11-FAKE16-NEXT:    s_mov_b32 s8, s2347; GFX11-FAKE16-NEXT:    s_mov_b32 s9, s3348; GFX11-FAKE16-NEXT:    s_mov_b32 s4, s0349; GFX11-FAKE16-NEXT:    buffer_load_b32 v0, off, s[8:11], 0350; GFX11-FAKE16-NEXT:    s_mov_b32 s5, s1351; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)352; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0353; GFX11-FAKE16-NEXT:    v_cvt_i16_f16_e32 v0, v0354; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)355; GFX11-FAKE16-NEXT:    v_cvt_i16_f16_e32 v1, v1356; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0357; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)358; GFX11-FAKE16-NEXT:    v_lshl_or_b32 v0, v1, 16, v0359; GFX11-FAKE16-NEXT:    buffer_store_b32 v0, off, s[4:7], 0360; GFX11-FAKE16-NEXT:    s_endpgm361    ptr addrspace(1) %r,362    ptr addrspace(1) %a) {363entry:364  %a.val = load <2 x half>, ptr addrspace(1) %a365  %r.val = fptosi <2 x half> %a.val to <2 x i16>366  store <2 x i16> %r.val, ptr addrspace(1) %r367  ret void368}369 370define amdgpu_kernel void @fptosi_v2f16_to_v2i32(371; SI-LABEL: fptosi_v2f16_to_v2i32:372; SI:       ; %bb.0: ; %entry373; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9374; SI-NEXT:    s_mov_b32 s7, 0xf000375; SI-NEXT:    s_mov_b32 s6, -1376; SI-NEXT:    s_mov_b32 s10, s6377; SI-NEXT:    s_mov_b32 s11, s7378; SI-NEXT:    s_waitcnt lgkmcnt(0)379; SI-NEXT:    s_mov_b32 s8, s2380; SI-NEXT:    s_mov_b32 s9, s3381; SI-NEXT:    buffer_load_dword v0, off, s[8:11], 0382; SI-NEXT:    s_mov_b32 s4, s0383; SI-NEXT:    s_mov_b32 s5, s1384; SI-NEXT:    s_waitcnt vmcnt(0)385; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0386; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0387; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1388; SI-NEXT:    v_cvt_i32_f32_e32 v0, v0389; SI-NEXT:    v_cvt_i32_f32_e32 v1, v1390; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0391; SI-NEXT:    s_endpgm392;393; VI-LABEL: fptosi_v2f16_to_v2i32:394; VI:       ; %bb.0: ; %entry395; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24396; VI-NEXT:    s_mov_b32 s7, 0xf000397; VI-NEXT:    s_mov_b32 s6, -1398; VI-NEXT:    s_mov_b32 s10, s6399; VI-NEXT:    s_mov_b32 s11, s7400; VI-NEXT:    s_waitcnt lgkmcnt(0)401; VI-NEXT:    s_mov_b32 s8, s2402; VI-NEXT:    s_mov_b32 s9, s3403; VI-NEXT:    buffer_load_dword v0, off, s[8:11], 0404; VI-NEXT:    s_mov_b32 s4, s0405; VI-NEXT:    s_mov_b32 s5, s1406; VI-NEXT:    s_waitcnt vmcnt(0)407; VI-NEXT:    v_cvt_f32_f16_e32 v1, v0408; VI-NEXT:    v_cvt_f32_f16_sdwa v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1409; VI-NEXT:    v_cvt_i32_f32_e32 v0, v1410; VI-NEXT:    v_cvt_i32_f32_e32 v1, v2411; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0412; VI-NEXT:    s_endpgm413;414; GFX11-TRUE16-LABEL: fptosi_v2f16_to_v2i32:415; GFX11-TRUE16:       ; %bb.0: ; %entry416; GFX11-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24417; GFX11-TRUE16-NEXT:    s_mov_b32 s6, -1418; GFX11-TRUE16-NEXT:    s_mov_b32 s7, 0x31016000419; GFX11-TRUE16-NEXT:    s_mov_b32 s10, s6420; GFX11-TRUE16-NEXT:    s_mov_b32 s11, s7421; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)422; GFX11-TRUE16-NEXT:    s_mov_b32 s8, s2423; GFX11-TRUE16-NEXT:    s_mov_b32 s9, s3424; GFX11-TRUE16-NEXT:    s_mov_b32 s4, s0425; GFX11-TRUE16-NEXT:    buffer_load_b32 v0, off, s[8:11], 0426; GFX11-TRUE16-NEXT:    s_mov_b32 s5, s1427; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)428; GFX11-TRUE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0429; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v0, v0.l430; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)431; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v1, v1.l432; GFX11-TRUE16-NEXT:    v_cvt_i32_f32_e32 v0, v0433; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)434; GFX11-TRUE16-NEXT:    v_cvt_i32_f32_e32 v1, v1435; GFX11-TRUE16-NEXT:    buffer_store_b64 v[0:1], off, s[4:7], 0436; GFX11-TRUE16-NEXT:    s_endpgm437;438; GFX11-FAKE16-LABEL: fptosi_v2f16_to_v2i32:439; GFX11-FAKE16:       ; %bb.0: ; %entry440; GFX11-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24441; GFX11-FAKE16-NEXT:    s_mov_b32 s6, -1442; GFX11-FAKE16-NEXT:    s_mov_b32 s7, 0x31016000443; GFX11-FAKE16-NEXT:    s_mov_b32 s10, s6444; GFX11-FAKE16-NEXT:    s_mov_b32 s11, s7445; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)446; GFX11-FAKE16-NEXT:    s_mov_b32 s8, s2447; GFX11-FAKE16-NEXT:    s_mov_b32 s9, s3448; GFX11-FAKE16-NEXT:    s_mov_b32 s4, s0449; GFX11-FAKE16-NEXT:    buffer_load_b32 v0, off, s[8:11], 0450; GFX11-FAKE16-NEXT:    s_mov_b32 s5, s1451; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)452; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0453; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0454; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)455; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v1, v1456; GFX11-FAKE16-NEXT:    v_cvt_i32_f32_e32 v0, v0457; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)458; GFX11-FAKE16-NEXT:    v_cvt_i32_f32_e32 v1, v1459; GFX11-FAKE16-NEXT:    buffer_store_b64 v[0:1], off, s[4:7], 0460; GFX11-FAKE16-NEXT:    s_endpgm461    ptr addrspace(1) %r,462    ptr addrspace(1) %a) {463entry:464  %a.val = load <2 x half>, ptr addrspace(1) %a465  %r.val = fptosi <2 x half> %a.val to <2 x i32>466  store <2 x i32> %r.val, ptr addrspace(1) %r467  ret void468}469 470; Need to make sure we promote f16 to f32 when converting f16 to i64. Existing471; test checks code generated for 'i64 = fp_to_sint f32'.472 473define amdgpu_kernel void @fptosi_v2f16_to_v2i64(474; SI-LABEL: fptosi_v2f16_to_v2i64:475; SI:       ; %bb.0: ; %entry476; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9477; SI-NEXT:    s_mov_b32 s7, 0xf000478; SI-NEXT:    s_mov_b32 s6, -1479; SI-NEXT:    s_mov_b32 s10, s6480; SI-NEXT:    s_mov_b32 s11, s7481; SI-NEXT:    s_waitcnt lgkmcnt(0)482; SI-NEXT:    s_mov_b32 s8, s2483; SI-NEXT:    s_mov_b32 s9, s3484; SI-NEXT:    buffer_load_dword v0, off, s[8:11], 0485; SI-NEXT:    s_mov_b32 s4, s0486; SI-NEXT:    s_mov_b32 s5, s1487; SI-NEXT:    s_waitcnt vmcnt(0)488; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0489; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0490; SI-NEXT:    v_cvt_f32_f16_e32 v2, v1491; SI-NEXT:    v_cvt_i32_f32_e32 v0, v0492; SI-NEXT:    v_ashrrev_i32_e32 v1, 31, v0493; SI-NEXT:    v_cvt_i32_f32_e32 v2, v2494; SI-NEXT:    v_ashrrev_i32_e32 v3, 31, v2495; SI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[4:7], 0496; SI-NEXT:    s_endpgm497;498; VI-LABEL: fptosi_v2f16_to_v2i64:499; VI:       ; %bb.0: ; %entry500; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24501; VI-NEXT:    s_mov_b32 s7, 0xf000502; VI-NEXT:    s_mov_b32 s6, -1503; VI-NEXT:    s_mov_b32 s10, s6504; VI-NEXT:    s_mov_b32 s11, s7505; VI-NEXT:    s_waitcnt lgkmcnt(0)506; VI-NEXT:    s_mov_b32 s8, s2507; VI-NEXT:    s_mov_b32 s9, s3508; VI-NEXT:    buffer_load_dword v0, off, s[8:11], 0509; VI-NEXT:    s_mov_b32 s4, s0510; VI-NEXT:    s_mov_b32 s5, s1511; VI-NEXT:    s_waitcnt vmcnt(0)512; VI-NEXT:    v_cvt_f32_f16_e32 v1, v0513; VI-NEXT:    v_cvt_f32_f16_sdwa v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1514; VI-NEXT:    v_cvt_i32_f32_e32 v0, v1515; VI-NEXT:    v_cvt_i32_f32_e32 v2, v2516; VI-NEXT:    v_ashrrev_i32_e32 v1, 31, v0517; VI-NEXT:    v_ashrrev_i32_e32 v3, 31, v2518; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[4:7], 0519; VI-NEXT:    s_endpgm520;521; GFX11-TRUE16-LABEL: fptosi_v2f16_to_v2i64:522; GFX11-TRUE16:       ; %bb.0: ; %entry523; GFX11-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24524; GFX11-TRUE16-NEXT:    s_mov_b32 s6, -1525; GFX11-TRUE16-NEXT:    s_mov_b32 s7, 0x31016000526; GFX11-TRUE16-NEXT:    s_mov_b32 s10, s6527; GFX11-TRUE16-NEXT:    s_mov_b32 s11, s7528; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)529; GFX11-TRUE16-NEXT:    s_mov_b32 s8, s2530; GFX11-TRUE16-NEXT:    s_mov_b32 s9, s3531; GFX11-TRUE16-NEXT:    s_mov_b32 s4, s0532; GFX11-TRUE16-NEXT:    buffer_load_b32 v0, off, s[8:11], 0533; GFX11-TRUE16-NEXT:    s_mov_b32 s5, s1534; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)535; GFX11-TRUE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0536; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v0, v0.l537; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)538; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v1, v1.l539; GFX11-TRUE16-NEXT:    v_cvt_i32_f32_e32 v0, v0540; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)541; GFX11-TRUE16-NEXT:    v_cvt_i32_f32_e32 v2, v1542; GFX11-TRUE16-NEXT:    v_ashrrev_i32_e32 v1, 31, v0543; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)544; GFX11-TRUE16-NEXT:    v_ashrrev_i32_e32 v3, 31, v2545; GFX11-TRUE16-NEXT:    buffer_store_b128 v[0:3], off, s[4:7], 0546; GFX11-TRUE16-NEXT:    s_endpgm547;548; GFX11-FAKE16-LABEL: fptosi_v2f16_to_v2i64:549; GFX11-FAKE16:       ; %bb.0: ; %entry550; GFX11-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24551; GFX11-FAKE16-NEXT:    s_mov_b32 s6, -1552; GFX11-FAKE16-NEXT:    s_mov_b32 s7, 0x31016000553; GFX11-FAKE16-NEXT:    s_mov_b32 s10, s6554; GFX11-FAKE16-NEXT:    s_mov_b32 s11, s7555; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)556; GFX11-FAKE16-NEXT:    s_mov_b32 s8, s2557; GFX11-FAKE16-NEXT:    s_mov_b32 s9, s3558; GFX11-FAKE16-NEXT:    s_mov_b32 s4, s0559; GFX11-FAKE16-NEXT:    buffer_load_b32 v0, off, s[8:11], 0560; GFX11-FAKE16-NEXT:    s_mov_b32 s5, s1561; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)562; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0563; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0564; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)565; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v1, v1566; GFX11-FAKE16-NEXT:    v_cvt_i32_f32_e32 v0, v0567; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)568; GFX11-FAKE16-NEXT:    v_cvt_i32_f32_e32 v2, v1569; GFX11-FAKE16-NEXT:    v_ashrrev_i32_e32 v1, 31, v0570; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)571; GFX11-FAKE16-NEXT:    v_ashrrev_i32_e32 v3, 31, v2572; GFX11-FAKE16-NEXT:    buffer_store_b128 v[0:3], off, s[4:7], 0573; GFX11-FAKE16-NEXT:    s_endpgm574    ptr addrspace(1) %r,575    ptr addrspace(1) %a) {576entry:577  %a.val = load <2 x half>, ptr addrspace(1) %a578  %r.val = fptosi <2 x half> %a.val to <2 x i64>579  store <2 x i64> %r.val, ptr addrspace(1) %r580  ret void581}582 583define amdgpu_kernel void @fptosi_f16_to_i1(ptr addrspace(1) %out, half %in) {584; SI-LABEL: fptosi_f16_to_i1:585; SI:       ; %bb.0: ; %entry586; SI-NEXT:    s_load_dword s6, s[4:5], 0xb587; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9588; SI-NEXT:    s_mov_b32 s3, 0xf000589; SI-NEXT:    s_mov_b32 s2, -1590; SI-NEXT:    s_waitcnt lgkmcnt(0)591; SI-NEXT:    v_cvt_f32_f16_e32 v0, s6592; SI-NEXT:    v_cmp_eq_f32_e32 vcc, -1.0, v0593; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc594; SI-NEXT:    buffer_store_byte v0, off, s[0:3], 0595; SI-NEXT:    s_endpgm596;597; VI-LABEL: fptosi_f16_to_i1:598; VI:       ; %bb.0: ; %entry599; VI-NEXT:    s_load_dword s6, s[4:5], 0x2c600; VI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24601; VI-NEXT:    s_mov_b32 s3, 0xf000602; VI-NEXT:    s_mov_b32 s2, -1603; VI-NEXT:    s_waitcnt lgkmcnt(0)604; VI-NEXT:    v_cmp_eq_f16_e64 s[4:5], -1.0, s6605; VI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]606; VI-NEXT:    buffer_store_byte v0, off, s[0:3], 0607; VI-NEXT:    s_endpgm608;609; GFX11-TRUE16-LABEL: fptosi_f16_to_i1:610; GFX11-TRUE16:       ; %bb.0: ; %entry611; GFX11-TRUE16-NEXT:    s_clause 0x1612; GFX11-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x2c613; GFX11-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24614; GFX11-TRUE16-NEXT:    s_mov_b32 s3, 0x31016000615; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)616; GFX11-TRUE16-NEXT:    v_cmp_eq_f16_e64 s2, -1.0, s2617; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)618; GFX11-TRUE16-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s2619; GFX11-TRUE16-NEXT:    s_mov_b32 s2, -1620; GFX11-TRUE16-NEXT:    buffer_store_b8 v0, off, s[0:3], 0621; GFX11-TRUE16-NEXT:    s_endpgm622;623; GFX11-FAKE16-LABEL: fptosi_f16_to_i1:624; GFX11-FAKE16:       ; %bb.0: ; %entry625; GFX11-FAKE16-NEXT:    s_clause 0x1626; GFX11-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x2c627; GFX11-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24628; GFX11-FAKE16-NEXT:    s_mov_b32 s3, 0x31016000629; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)630; GFX11-FAKE16-NEXT:    v_cmp_eq_f16_e64 s2, -1.0, s2631; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)632; GFX11-FAKE16-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s2633; GFX11-FAKE16-NEXT:    s_mov_b32 s2, -1634; GFX11-FAKE16-NEXT:    buffer_store_b8 v0, off, s[0:3], 0635; GFX11-FAKE16-NEXT:    s_endpgm636entry:637  %conv = fptosi half %in to i1638  store i1 %conv, ptr addrspace(1) %out639  ret void640}641