brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.0 KiB · 482a7de Raw
283 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=-flat-for-global,+real-true16 < %s | FileCheck -check-prefixes=GFX11-TRUE16 %s5; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=-flat-for-global,-real-true16 < %s | FileCheck -check-prefixes=GFX11-FAKE16 %s6; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 -mattr=-flat-for-global < %s | FileCheck -check-prefixes=GFX12,GFX12-TRUE16 %s7; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 -mattr=-flat-for-global < %s | FileCheck -check-prefixes=GFX12,GFX12-FAKE16 %s8 9declare half @llvm.trunc.f16(half %a)10declare <2 x half> @llvm.trunc.v2f16(<2 x half> %a)11 12define amdgpu_kernel void @trunc_f16(13; SI-LABEL: trunc_f16:14; SI:       ; %bb.0: ; %entry15; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x916; SI-NEXT:    s_mov_b32 s7, 0xf00017; SI-NEXT:    s_mov_b32 s6, -118; SI-NEXT:    s_mov_b32 s10, s619; SI-NEXT:    s_mov_b32 s11, s720; SI-NEXT:    s_waitcnt lgkmcnt(0)21; SI-NEXT:    s_mov_b32 s8, s222; SI-NEXT:    s_mov_b32 s9, s323; SI-NEXT:    buffer_load_ushort v0, off, s[8:11], 024; SI-NEXT:    s_mov_b32 s4, s025; SI-NEXT:    s_mov_b32 s5, s126; SI-NEXT:    s_waitcnt vmcnt(0)27; SI-NEXT:    v_cvt_f32_f16_e32 v0, v028; SI-NEXT:    v_trunc_f32_e32 v0, v029; SI-NEXT:    v_cvt_f16_f32_e32 v0, v030; SI-NEXT:    buffer_store_short v0, off, s[4:7], 031; SI-NEXT:    s_endpgm32;33; VI-LABEL: trunc_f16:34; VI:       ; %bb.0: ; %entry35; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x2436; VI-NEXT:    s_mov_b32 s7, 0xf00037; VI-NEXT:    s_mov_b32 s6, -138; VI-NEXT:    s_mov_b32 s10, s639; VI-NEXT:    s_mov_b32 s11, s740; VI-NEXT:    s_waitcnt lgkmcnt(0)41; VI-NEXT:    s_mov_b32 s8, s242; VI-NEXT:    s_mov_b32 s9, s343; VI-NEXT:    buffer_load_ushort v0, off, s[8:11], 044; VI-NEXT:    s_mov_b32 s4, s045; VI-NEXT:    s_mov_b32 s5, s146; VI-NEXT:    s_waitcnt vmcnt(0)47; VI-NEXT:    v_trunc_f16_e32 v0, v048; VI-NEXT:    buffer_store_short v0, off, s[4:7], 049; VI-NEXT:    s_endpgm50;51; GFX11-TRUE16-LABEL: trunc_f16:52; GFX11-TRUE16:       ; %bb.0: ; %entry53; GFX11-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x2454; GFX11-TRUE16-NEXT:    s_mov_b32 s6, -155; GFX11-TRUE16-NEXT:    s_mov_b32 s7, 0x3101600056; GFX11-TRUE16-NEXT:    s_mov_b32 s10, s657; GFX11-TRUE16-NEXT:    s_mov_b32 s11, s758; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)59; GFX11-TRUE16-NEXT:    s_mov_b32 s8, s260; GFX11-TRUE16-NEXT:    s_mov_b32 s9, s361; GFX11-TRUE16-NEXT:    s_mov_b32 s4, s062; GFX11-TRUE16-NEXT:    buffer_load_u16 v0, off, s[8:11], 063; GFX11-TRUE16-NEXT:    s_mov_b32 s5, s164; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)65; GFX11-TRUE16-NEXT:    v_trunc_f16_e32 v0.l, v0.l66; GFX11-TRUE16-NEXT:    buffer_store_b16 v0, off, s[4:7], 067; GFX11-TRUE16-NEXT:    s_endpgm68;69; GFX11-FAKE16-LABEL: trunc_f16:70; GFX11-FAKE16:       ; %bb.0: ; %entry71; GFX11-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x2472; GFX11-FAKE16-NEXT:    s_mov_b32 s6, -173; GFX11-FAKE16-NEXT:    s_mov_b32 s7, 0x3101600074; GFX11-FAKE16-NEXT:    s_mov_b32 s10, s675; GFX11-FAKE16-NEXT:    s_mov_b32 s11, s776; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)77; GFX11-FAKE16-NEXT:    s_mov_b32 s8, s278; GFX11-FAKE16-NEXT:    s_mov_b32 s9, s379; GFX11-FAKE16-NEXT:    s_mov_b32 s4, s080; GFX11-FAKE16-NEXT:    buffer_load_u16 v0, off, s[8:11], 081; GFX11-FAKE16-NEXT:    s_mov_b32 s5, s182; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)83; GFX11-FAKE16-NEXT:    v_trunc_f16_e32 v0, v084; GFX11-FAKE16-NEXT:    buffer_store_b16 v0, off, s[4:7], 085; GFX11-FAKE16-NEXT:    s_endpgm86;87; GFX12-TRUE16-LABEL: trunc_f16:88; GFX12-TRUE16:       ; %bb.0: ; %entry89; GFX12-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x2490; GFX12-TRUE16-NEXT:    s_mov_b32 s6, -191; GFX12-TRUE16-NEXT:    s_mov_b32 s7, 0x3101600092; GFX12-TRUE16-NEXT:    s_mov_b32 s10, s693; GFX12-TRUE16-NEXT:    s_mov_b32 s11, s794; GFX12-TRUE16-NEXT:    s_wait_kmcnt 0x095; GFX12-TRUE16-NEXT:    s_mov_b32 s8, s296; GFX12-TRUE16-NEXT:    s_mov_b32 s9, s397; GFX12-TRUE16-NEXT:    s_mov_b32 s4, s098; GFX12-TRUE16-NEXT:    buffer_load_u16 v0, off, s[8:11], null99; GFX12-TRUE16-NEXT:    s_mov_b32 s5, s1100; GFX12-TRUE16-NEXT:    s_wait_loadcnt 0x0101; GFX12-TRUE16-NEXT:    v_trunc_f16_e32 v0.l, v0.l102; GFX12-TRUE16-NEXT:    buffer_store_b16 v0, off, s[4:7], null103; GFX12-TRUE16-NEXT:    s_endpgm104;105; GFX12-FAKE16-LABEL: trunc_f16:106; GFX12-FAKE16:       ; %bb.0: ; %entry107; GFX12-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24108; GFX12-FAKE16-NEXT:    s_mov_b32 s6, -1109; GFX12-FAKE16-NEXT:    s_mov_b32 s7, 0x31016000110; GFX12-FAKE16-NEXT:    s_mov_b32 s10, s6111; GFX12-FAKE16-NEXT:    s_mov_b32 s11, s7112; GFX12-FAKE16-NEXT:    s_wait_kmcnt 0x0113; GFX12-FAKE16-NEXT:    s_mov_b32 s8, s2114; GFX12-FAKE16-NEXT:    s_mov_b32 s9, s3115; GFX12-FAKE16-NEXT:    s_mov_b32 s4, s0116; GFX12-FAKE16-NEXT:    buffer_load_u16 v0, off, s[8:11], null117; GFX12-FAKE16-NEXT:    s_mov_b32 s5, s1118; GFX12-FAKE16-NEXT:    s_wait_loadcnt 0x0119; GFX12-FAKE16-NEXT:    v_trunc_f16_e32 v0, v0120; GFX12-FAKE16-NEXT:    buffer_store_b16 v0, off, s[4:7], null121; GFX12-FAKE16-NEXT:    s_endpgm122    ptr addrspace(1) %r,123    ptr addrspace(1) %a) {124entry:125  %a.val = load half, ptr addrspace(1) %a126  %r.val = call half @llvm.trunc.f16(half %a.val)127  store half %r.val, ptr addrspace(1) %r128  ret void129}130 131; The original test with manual checks also had these NOT directives:132; COM: SI-DAG: v_lshlrev_b32_e32 v[[R_F16_HI:[0-9]+]], 16, v[[R_F16_1]]133; COM: SI-NOT: v_and_b32134; COM: SI: v_or_b32_e32 v[[R_V2_F16:[0-9]+]], v[[R_F16_0]], v[[R_F16_HI]]135; COM: VI-DAG: v_trunc_f16_e32 v[[R_F16_0:[0-9]+]], v[[A_V2_F16]]136; COM: VI-DAG: v_trunc_f16_sdwa v[[R_F16_1:[0-9]+]], v[[A_V2_F16]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1137; COM: VI-NOT: v_and_b32138; COM: VI: v_or_b32_e32 v[[R_V2_F16:[0-9]+]], v[[R_F16_0]], v[[R_F16_1]]139define amdgpu_kernel void @trunc_v2f16(140; SI-LABEL: trunc_v2f16:141; SI:       ; %bb.0: ; %entry142; SI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9143; SI-NEXT:    s_mov_b32 s7, 0xf000144; SI-NEXT:    s_mov_b32 s6, -1145; SI-NEXT:    s_mov_b32 s10, s6146; SI-NEXT:    s_mov_b32 s11, s7147; SI-NEXT:    s_waitcnt lgkmcnt(0)148; SI-NEXT:    s_mov_b32 s8, s2149; SI-NEXT:    s_mov_b32 s9, s3150; SI-NEXT:    buffer_load_dword v0, off, s[8:11], 0151; SI-NEXT:    s_mov_b32 s4, s0152; SI-NEXT:    s_mov_b32 s5, s1153; SI-NEXT:    s_waitcnt vmcnt(0)154; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v0155; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1156; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0157; SI-NEXT:    v_trunc_f32_e32 v1, v1158; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1159; SI-NEXT:    v_trunc_f32_e32 v0, v0160; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0161; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1162; SI-NEXT:    v_or_b32_e32 v0, v0, v1163; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0164; SI-NEXT:    s_endpgm165;166; VI-LABEL: trunc_v2f16:167; VI:       ; %bb.0: ; %entry168; VI-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24169; VI-NEXT:    s_mov_b32 s7, 0xf000170; VI-NEXT:    s_mov_b32 s6, -1171; VI-NEXT:    s_mov_b32 s10, s6172; VI-NEXT:    s_mov_b32 s11, s7173; VI-NEXT:    s_waitcnt lgkmcnt(0)174; VI-NEXT:    s_mov_b32 s8, s2175; VI-NEXT:    s_mov_b32 s9, s3176; VI-NEXT:    buffer_load_dword v0, off, s[8:11], 0177; VI-NEXT:    s_mov_b32 s4, s0178; VI-NEXT:    s_mov_b32 s5, s1179; VI-NEXT:    s_waitcnt vmcnt(0)180; VI-NEXT:    v_trunc_f16_sdwa v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1181; VI-NEXT:    v_trunc_f16_e32 v0, v0182; VI-NEXT:    v_or_b32_e32 v0, v0, v1183; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0184; VI-NEXT:    s_endpgm185;186; GFX11-TRUE16-LABEL: trunc_v2f16:187; GFX11-TRUE16:       ; %bb.0: ; %entry188; GFX11-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24189; GFX11-TRUE16-NEXT:    s_mov_b32 s6, -1190; GFX11-TRUE16-NEXT:    s_mov_b32 s7, 0x31016000191; GFX11-TRUE16-NEXT:    s_mov_b32 s10, s6192; GFX11-TRUE16-NEXT:    s_mov_b32 s11, s7193; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)194; GFX11-TRUE16-NEXT:    s_mov_b32 s8, s2195; GFX11-TRUE16-NEXT:    s_mov_b32 s9, s3196; GFX11-TRUE16-NEXT:    s_mov_b32 s4, s0197; GFX11-TRUE16-NEXT:    buffer_load_b32 v0, off, s[8:11], 0198; GFX11-TRUE16-NEXT:    s_mov_b32 s5, s1199; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)200; GFX11-TRUE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0201; GFX11-TRUE16-NEXT:    v_trunc_f16_e32 v0.l, v0.l202; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)203; GFX11-TRUE16-NEXT:    v_trunc_f16_e32 v0.h, v1.l204; GFX11-TRUE16-NEXT:    v_pack_b32_f16 v0, v0.l, v0.h205; GFX11-TRUE16-NEXT:    buffer_store_b32 v0, off, s[4:7], 0206; GFX11-TRUE16-NEXT:    s_endpgm207;208; GFX11-FAKE16-LABEL: trunc_v2f16:209; GFX11-FAKE16:       ; %bb.0: ; %entry210; GFX11-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24211; GFX11-FAKE16-NEXT:    s_mov_b32 s6, -1212; GFX11-FAKE16-NEXT:    s_mov_b32 s7, 0x31016000213; GFX11-FAKE16-NEXT:    s_mov_b32 s10, s6214; GFX11-FAKE16-NEXT:    s_mov_b32 s11, s7215; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)216; GFX11-FAKE16-NEXT:    s_mov_b32 s8, s2217; GFX11-FAKE16-NEXT:    s_mov_b32 s9, s3218; GFX11-FAKE16-NEXT:    s_mov_b32 s4, s0219; GFX11-FAKE16-NEXT:    buffer_load_b32 v0, off, s[8:11], 0220; GFX11-FAKE16-NEXT:    s_mov_b32 s5, s1221; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)222; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0223; GFX11-FAKE16-NEXT:    v_trunc_f16_e32 v0, v0224; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)225; GFX11-FAKE16-NEXT:    v_trunc_f16_e32 v1, v1226; GFX11-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v1227; GFX11-FAKE16-NEXT:    buffer_store_b32 v0, off, s[4:7], 0228; GFX11-FAKE16-NEXT:    s_endpgm229;230; GFX12-TRUE16-LABEL: trunc_v2f16:231; GFX12-TRUE16:       ; %bb.0: ; %entry232; GFX12-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24233; GFX12-TRUE16-NEXT:    s_mov_b32 s6, -1234; GFX12-TRUE16-NEXT:    s_mov_b32 s7, 0x31016000235; GFX12-TRUE16-NEXT:    s_mov_b32 s10, s6236; GFX12-TRUE16-NEXT:    s_mov_b32 s11, s7237; GFX12-TRUE16-NEXT:    s_wait_kmcnt 0x0238; GFX12-TRUE16-NEXT:    s_mov_b32 s8, s2239; GFX12-TRUE16-NEXT:    s_mov_b32 s9, s3240; GFX12-TRUE16-NEXT:    s_mov_b32 s4, s0241; GFX12-TRUE16-NEXT:    buffer_load_b32 v0, off, s[8:11], null242; GFX12-TRUE16-NEXT:    s_mov_b32 s5, s1243; GFX12-TRUE16-NEXT:    s_wait_loadcnt 0x0244; GFX12-TRUE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0245; GFX12-TRUE16-NEXT:    v_trunc_f16_e32 v0.l, v0.l246; GFX12-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)247; GFX12-TRUE16-NEXT:    v_trunc_f16_e32 v0.h, v1.l248; GFX12-TRUE16-NEXT:    v_pack_b32_f16 v0, v0.l, v0.h249; GFX12-TRUE16-NEXT:    buffer_store_b32 v0, off, s[4:7], null250; GFX12-TRUE16-NEXT:    s_endpgm251;252; GFX12-FAKE16-LABEL: trunc_v2f16:253; GFX12-FAKE16:       ; %bb.0: ; %entry254; GFX12-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24255; GFX12-FAKE16-NEXT:    s_mov_b32 s6, -1256; GFX12-FAKE16-NEXT:    s_mov_b32 s7, 0x31016000257; GFX12-FAKE16-NEXT:    s_mov_b32 s10, s6258; GFX12-FAKE16-NEXT:    s_mov_b32 s11, s7259; GFX12-FAKE16-NEXT:    s_wait_kmcnt 0x0260; GFX12-FAKE16-NEXT:    s_mov_b32 s8, s2261; GFX12-FAKE16-NEXT:    s_mov_b32 s9, s3262; GFX12-FAKE16-NEXT:    s_mov_b32 s4, s0263; GFX12-FAKE16-NEXT:    buffer_load_b32 v0, off, s[8:11], null264; GFX12-FAKE16-NEXT:    s_mov_b32 s5, s1265; GFX12-FAKE16-NEXT:    s_wait_loadcnt 0x0266; GFX12-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0267; GFX12-FAKE16-NEXT:    v_trunc_f16_e32 v0, v0268; GFX12-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)269; GFX12-FAKE16-NEXT:    v_trunc_f16_e32 v1, v1270; GFX12-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v1271; GFX12-FAKE16-NEXT:    buffer_store_b32 v0, off, s[4:7], null272; GFX12-FAKE16-NEXT:    s_endpgm273    ptr addrspace(1) %r,274    ptr addrspace(1) %a) {275entry:276  %a.val = load <2 x half>, ptr addrspace(1) %a277  %r.val = call <2 x half> @llvm.trunc.v2f16(<2 x half> %a.val)278  store <2 x half> %r.val, ptr addrspace(1) %r279  ret void280}281;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:282; GFX12: {{.*}}283