2275 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -enable-var-scope -check-prefixes=SI %s3; RUN: llc -mtriple=amdgcn -mcpu=fiji < %s | FileCheck -enable-var-scope -check-prefixes=GFX8 %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -enable-var-scope -check-prefixes=GFX9 %s5; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-TRUE16 %s6; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-FAKE16 %s7 8define amdgpu_kernel void @v_clamp_add_src_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {9; SI-LABEL: v_clamp_add_src_f32:10; SI: ; %bb.0:11; 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, 014; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v015; SI-NEXT: v_mov_b32_e32 v1, 016; SI-NEXT: s_waitcnt lgkmcnt(0)17; SI-NEXT: s_mov_b64 s[4:5], s[2:3]18; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr6419; SI-NEXT: s_mov_b64 s[2:3], s[6:7]20; SI-NEXT: s_waitcnt vmcnt(0)21; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp22; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr6423; SI-NEXT: s_endpgm24;25; GFX8-LABEL: v_clamp_add_src_f32:26; GFX8: ; %bb.0:27; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2428; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v029; GFX8-NEXT: s_waitcnt lgkmcnt(0)30; GFX8-NEXT: v_mov_b32_e32 v1, s331; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v232; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc33; GFX8-NEXT: flat_load_dword v3, v[0:1]34; GFX8-NEXT: v_mov_b32_e32 v1, s135; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v236; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc37; GFX8-NEXT: s_waitcnt vmcnt(0)38; GFX8-NEXT: v_add_f32_e64 v2, v3, 1.0 clamp39; GFX8-NEXT: flat_store_dword v[0:1], v240; GFX8-NEXT: s_endpgm41;42; GFX9-LABEL: v_clamp_add_src_f32:43; GFX9: ; %bb.0:44; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2445; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v046; GFX9-NEXT: s_waitcnt lgkmcnt(0)47; GFX9-NEXT: global_load_dword v1, v0, s[2:3]48; GFX9-NEXT: s_waitcnt vmcnt(0)49; GFX9-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp50; GFX9-NEXT: global_store_dword v0, v1, s[0:1]51; GFX9-NEXT: s_endpgm52;53; GFX11-LABEL: v_clamp_add_src_f32:54; GFX11: ; %bb.0:55; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x2456; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v057; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)58; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v059; GFX11-NEXT: s_waitcnt lgkmcnt(0)60; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]61; GFX11-NEXT: s_waitcnt vmcnt(0)62; GFX11-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp63; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]64; GFX11-NEXT: s_endpgm65 %tid = call i32 @llvm.amdgcn.workitem.id.x()66 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid67 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid68 %a = load float, ptr addrspace(1) %gep069 %add = fadd float %a, 1.070 %max = call float @llvm.maxnum.f32(float %add, float 0.0)71 %clamp = call float @llvm.minnum.f32(float %max, float 1.0)72 store float %clamp, ptr addrspace(1) %out.gep73 ret void74}75 76define amdgpu_kernel void @v_clamp_multi_use_src_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {77; SI-LABEL: v_clamp_multi_use_src_f32:78; SI: ; %bb.0:79; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x980; SI-NEXT: s_mov_b32 s6, 081; SI-NEXT: s_mov_b32 s7, 0xf00082; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v083; SI-NEXT: v_mov_b32_e32 v1, 084; SI-NEXT: s_waitcnt lgkmcnt(0)85; SI-NEXT: s_mov_b64 s[4:5], s[2:3]86; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr6487; SI-NEXT: s_mov_b64 s[2:3], s[6:7]88; SI-NEXT: s_mov_b32 s6, -189; SI-NEXT: s_waitcnt vmcnt(0)90; SI-NEXT: v_add_f32_e32 v2, 1.0, v291; SI-NEXT: v_max_f32_e64 v3, v2, v2 clamp92; SI-NEXT: buffer_store_dword v3, v[0:1], s[0:3], 0 addr6493; SI-NEXT: buffer_store_dword v2, off, s[4:7], 094; SI-NEXT: s_waitcnt vmcnt(0)95; SI-NEXT: s_endpgm96;97; GFX8-LABEL: v_clamp_multi_use_src_f32:98; GFX8: ; %bb.0:99; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24100; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0101; GFX8-NEXT: s_waitcnt lgkmcnt(0)102; GFX8-NEXT: v_mov_b32_e32 v1, s3103; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2104; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc105; GFX8-NEXT: flat_load_dword v3, v[0:1]106; GFX8-NEXT: v_mov_b32_e32 v1, s1107; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2108; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc109; GFX8-NEXT: s_waitcnt vmcnt(0)110; GFX8-NEXT: v_add_f32_e32 v2, 1.0, v3111; GFX8-NEXT: v_max_f32_e64 v3, v2, v2 clamp112; GFX8-NEXT: flat_store_dword v[0:1], v3113; GFX8-NEXT: flat_store_dword v[0:1], v2114; GFX8-NEXT: s_waitcnt vmcnt(0)115; GFX8-NEXT: s_endpgm116;117; GFX9-LABEL: v_clamp_multi_use_src_f32:118; GFX9: ; %bb.0:119; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24120; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0121; GFX9-NEXT: s_waitcnt lgkmcnt(0)122; GFX9-NEXT: global_load_dword v1, v0, s[2:3]123; GFX9-NEXT: s_waitcnt vmcnt(0)124; GFX9-NEXT: v_add_f32_e32 v1, 1.0, v1125; GFX9-NEXT: v_max_f32_e64 v2, v1, v1 clamp126; GFX9-NEXT: global_store_dword v0, v2, s[0:1]127; GFX9-NEXT: global_store_dword v[0:1], v1, off128; GFX9-NEXT: s_waitcnt vmcnt(0)129; GFX9-NEXT: s_endpgm130;131; GFX11-LABEL: v_clamp_multi_use_src_f32:132; GFX11: ; %bb.0:133; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24134; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0135; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)136; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0137; GFX11-NEXT: s_waitcnt lgkmcnt(0)138; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]139; GFX11-NEXT: s_waitcnt vmcnt(0)140; GFX11-NEXT: v_add_f32_e32 v1, 1.0, v1141; GFX11-NEXT: v_max_f32_e64 v2, v1, v1 clamp142; GFX11-NEXT: global_store_b32 v0, v2, s[0:1]143; GFX11-NEXT: global_store_b32 v[0:1], v1, off dlc144; GFX11-NEXT: s_waitcnt_vscnt null, 0x0145; GFX11-NEXT: s_endpgm146 %tid = call i32 @llvm.amdgcn.workitem.id.x()147 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid148 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid149 %a = load float, ptr addrspace(1) %gep0150 %add = fadd float %a, 1.0151 %max = call float @llvm.maxnum.f32(float %add, float 0.0)152 %clamp = call float @llvm.minnum.f32(float %max, float 1.0)153 store float %clamp, ptr addrspace(1) %out.gep154 store volatile float %add, ptr addrspace(1) poison155 ret void156}157 158define amdgpu_kernel void @v_clamp_dbg_use_src_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {159; SI-LABEL: v_clamp_dbg_use_src_f32:160; SI: ; %bb.0:161; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9162; SI-NEXT: s_mov_b32 s7, 0xf000163; SI-NEXT: s_mov_b32 s6, 0164; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0165; SI-NEXT: v_mov_b32_e32 v1, 0166; SI-NEXT: s_waitcnt lgkmcnt(0)167; SI-NEXT: s_mov_b64 s[4:5], s[2:3]168; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64169; SI-NEXT: s_mov_b64 s[2:3], s[6:7]170; SI-NEXT: s_waitcnt vmcnt(0)171; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp172; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64173; SI-NEXT: s_endpgm174;175; GFX8-LABEL: v_clamp_dbg_use_src_f32:176; GFX8: ; %bb.0:177; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24178; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0179; GFX8-NEXT: s_waitcnt lgkmcnt(0)180; GFX8-NEXT: v_mov_b32_e32 v1, s3181; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2182; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc183; GFX8-NEXT: flat_load_dword v3, v[0:1]184; GFX8-NEXT: v_mov_b32_e32 v1, s1185; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2186; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc187; GFX8-NEXT: s_waitcnt vmcnt(0)188; GFX8-NEXT: v_add_f32_e64 v2, v3, 1.0 clamp189; GFX8-NEXT: flat_store_dword v[0:1], v2190; GFX8-NEXT: s_endpgm191;192; GFX9-LABEL: v_clamp_dbg_use_src_f32:193; GFX9: ; %bb.0:194; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24195; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0196; GFX9-NEXT: s_waitcnt lgkmcnt(0)197; GFX9-NEXT: global_load_dword v1, v0, s[2:3]198; GFX9-NEXT: s_waitcnt vmcnt(0)199; GFX9-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp200; GFX9-NEXT: global_store_dword v0, v1, s[0:1]201; GFX9-NEXT: s_endpgm202;203; GFX11-LABEL: v_clamp_dbg_use_src_f32:204; GFX11: ; %bb.0:205; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24206; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0207; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)208; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0209; GFX11-NEXT: s_waitcnt lgkmcnt(0)210; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]211; GFX11-NEXT: s_waitcnt vmcnt(0)212; GFX11-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp213; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]214; GFX11-NEXT: s_endpgm215 %tid = call i32 @llvm.amdgcn.workitem.id.x()216 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid217 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid218 %a = load float, ptr addrspace(1) %gep0219 %add = fadd float %a, 1.0220 call void @llvm.dbg.value(metadata float %add, i64 0, metadata !4, metadata !9), !dbg !10221 %max = call float @llvm.maxnum.f32(float %add, float 0.0)222 %clamp = call float @llvm.minnum.f32(float %max, float 1.0)223 store float %clamp, ptr addrspace(1) %out.gep224 ret void225}226 227define amdgpu_kernel void @v_clamp_add_neg_src_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {228; SI-LABEL: v_clamp_add_neg_src_f32:229; SI: ; %bb.0:230; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9231; SI-NEXT: s_mov_b32 s7, 0xf000232; SI-NEXT: s_mov_b32 s6, 0233; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0234; SI-NEXT: v_mov_b32_e32 v1, 0235; SI-NEXT: s_waitcnt lgkmcnt(0)236; SI-NEXT: s_mov_b64 s[4:5], s[2:3]237; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64238; SI-NEXT: s_mov_b64 s[2:3], s[6:7]239; SI-NEXT: s_waitcnt vmcnt(0)240; SI-NEXT: v_floor_f32_e32 v2, v2241; SI-NEXT: v_max_f32_e64 v2, -v2, -v2 clamp242; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64243; SI-NEXT: s_endpgm244;245; GFX8-LABEL: v_clamp_add_neg_src_f32:246; GFX8: ; %bb.0:247; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24248; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0249; GFX8-NEXT: s_waitcnt lgkmcnt(0)250; GFX8-NEXT: v_mov_b32_e32 v1, s3251; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2252; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc253; GFX8-NEXT: flat_load_dword v3, v[0:1]254; GFX8-NEXT: v_mov_b32_e32 v1, s1255; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2256; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc257; GFX8-NEXT: s_waitcnt vmcnt(0)258; GFX8-NEXT: v_floor_f32_e32 v2, v3259; GFX8-NEXT: v_max_f32_e64 v2, -v2, -v2 clamp260; GFX8-NEXT: flat_store_dword v[0:1], v2261; GFX8-NEXT: s_endpgm262;263; GFX9-LABEL: v_clamp_add_neg_src_f32:264; GFX9: ; %bb.0:265; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24266; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0267; GFX9-NEXT: s_waitcnt lgkmcnt(0)268; GFX9-NEXT: global_load_dword v1, v0, s[2:3]269; GFX9-NEXT: s_waitcnt vmcnt(0)270; GFX9-NEXT: v_floor_f32_e32 v1, v1271; GFX9-NEXT: v_max_f32_e64 v1, -v1, -v1 clamp272; GFX9-NEXT: global_store_dword v0, v1, s[0:1]273; GFX9-NEXT: s_endpgm274;275; GFX11-LABEL: v_clamp_add_neg_src_f32:276; GFX11: ; %bb.0:277; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24278; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0279; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)280; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0281; GFX11-NEXT: s_waitcnt lgkmcnt(0)282; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]283; GFX11-NEXT: s_waitcnt vmcnt(0)284; GFX11-NEXT: v_floor_f32_e32 v1, v1285; GFX11-NEXT: v_max_f32_e64 v1, -v1, -v1 clamp286; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]287; GFX11-NEXT: s_endpgm288 %tid = call i32 @llvm.amdgcn.workitem.id.x()289 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid290 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid291 %a = load float, ptr addrspace(1) %gep0292 %floor = call float @llvm.floor.f32(float %a)293 %neg.floor = fneg float %floor294 %max = call float @llvm.maxnum.f32(float %neg.floor, float 0.0)295 %clamp = call float @llvm.minnum.f32(float %max, float 1.0)296 store float %clamp, ptr addrspace(1) %out.gep297 ret void298}299 300define amdgpu_kernel void @v_non_clamp_max_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {301; SI-LABEL: v_non_clamp_max_f32:302; SI: ; %bb.0:303; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9304; SI-NEXT: s_mov_b32 s7, 0xf000305; SI-NEXT: s_mov_b32 s6, 0306; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0307; SI-NEXT: v_mov_b32_e32 v1, 0308; SI-NEXT: s_waitcnt lgkmcnt(0)309; SI-NEXT: s_mov_b64 s[4:5], s[2:3]310; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64311; SI-NEXT: s_mov_b64 s[2:3], s[6:7]312; SI-NEXT: s_waitcnt vmcnt(0)313; SI-NEXT: v_add_f32_e32 v2, 1.0, v2314; SI-NEXT: v_max_f32_e32 v2, 0, v2315; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64316; SI-NEXT: s_endpgm317;318; GFX8-LABEL: v_non_clamp_max_f32:319; GFX8: ; %bb.0:320; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24321; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0322; GFX8-NEXT: s_waitcnt lgkmcnt(0)323; GFX8-NEXT: v_mov_b32_e32 v1, s3324; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2325; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc326; GFX8-NEXT: flat_load_dword v3, v[0:1]327; GFX8-NEXT: v_mov_b32_e32 v1, s1328; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2329; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc330; GFX8-NEXT: s_waitcnt vmcnt(0)331; GFX8-NEXT: v_add_f32_e32 v2, 1.0, v3332; GFX8-NEXT: v_max_f32_e32 v2, 0, v2333; GFX8-NEXT: flat_store_dword v[0:1], v2334; GFX8-NEXT: s_endpgm335;336; GFX9-LABEL: v_non_clamp_max_f32:337; GFX9: ; %bb.0:338; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24339; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0340; GFX9-NEXT: s_waitcnt lgkmcnt(0)341; GFX9-NEXT: global_load_dword v1, v0, s[2:3]342; GFX9-NEXT: s_waitcnt vmcnt(0)343; GFX9-NEXT: v_add_f32_e32 v1, 1.0, v1344; GFX9-NEXT: v_max_f32_e32 v1, 0, v1345; GFX9-NEXT: global_store_dword v0, v1, s[0:1]346; GFX9-NEXT: s_endpgm347;348; GFX11-LABEL: v_non_clamp_max_f32:349; GFX11: ; %bb.0:350; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24351; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0352; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)353; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0354; GFX11-NEXT: s_waitcnt lgkmcnt(0)355; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]356; GFX11-NEXT: s_waitcnt vmcnt(0)357; GFX11-NEXT: v_add_f32_e32 v1, 1.0, v1358; GFX11-NEXT: v_max_f32_e32 v1, 0, v1359; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]360; GFX11-NEXT: s_endpgm361 %tid = call i32 @llvm.amdgcn.workitem.id.x()362 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid363 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid364 %a = load float, ptr addrspace(1) %gep0365 %add = fadd float %a, 1.0366 %max = call float @llvm.maxnum.f32(float %add, float 0.0)367 store float %max, ptr addrspace(1) %out.gep368 ret void369}370 371define amdgpu_kernel void @v_clamp_add_src_f32_denormals(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {372; SI-LABEL: v_clamp_add_src_f32_denormals:373; SI: ; %bb.0:374; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9375; SI-NEXT: s_mov_b32 s7, 0xf000376; SI-NEXT: s_mov_b32 s6, 0377; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0378; SI-NEXT: v_mov_b32_e32 v1, 0379; SI-NEXT: s_waitcnt lgkmcnt(0)380; SI-NEXT: s_mov_b64 s[4:5], s[2:3]381; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64382; SI-NEXT: s_mov_b64 s[2:3], s[6:7]383; SI-NEXT: s_waitcnt vmcnt(0)384; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp385; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64386; SI-NEXT: s_endpgm387;388; GFX8-LABEL: v_clamp_add_src_f32_denormals:389; GFX8: ; %bb.0:390; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24391; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0392; GFX8-NEXT: s_waitcnt lgkmcnt(0)393; GFX8-NEXT: v_mov_b32_e32 v1, s3394; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2395; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc396; GFX8-NEXT: flat_load_dword v3, v[0:1]397; GFX8-NEXT: v_mov_b32_e32 v1, s1398; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2399; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc400; GFX8-NEXT: s_waitcnt vmcnt(0)401; GFX8-NEXT: v_add_f32_e64 v2, v3, 1.0 clamp402; GFX8-NEXT: flat_store_dword v[0:1], v2403; GFX8-NEXT: s_endpgm404;405; GFX9-LABEL: v_clamp_add_src_f32_denormals:406; GFX9: ; %bb.0:407; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24408; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0409; GFX9-NEXT: s_waitcnt lgkmcnt(0)410; GFX9-NEXT: global_load_dword v1, v0, s[2:3]411; GFX9-NEXT: s_waitcnt vmcnt(0)412; GFX9-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp413; GFX9-NEXT: global_store_dword v0, v1, s[0:1]414; GFX9-NEXT: s_endpgm415;416; GFX11-LABEL: v_clamp_add_src_f32_denormals:417; GFX11: ; %bb.0:418; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24419; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0420; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)421; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0422; GFX11-NEXT: s_waitcnt lgkmcnt(0)423; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]424; GFX11-NEXT: s_waitcnt vmcnt(0)425; GFX11-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp426; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]427; GFX11-NEXT: s_endpgm428 %tid = call i32 @llvm.amdgcn.workitem.id.x()429 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid430 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid431 %a = load float, ptr addrspace(1) %gep0432 %add = fadd float %a, 1.0433 %max = call float @llvm.maxnum.f32(float %add, float 0.0)434 %clamp = call float @llvm.minnum.f32(float %max, float 1.0)435 store float %clamp, ptr addrspace(1) %out.gep436 ret void437}438 439define amdgpu_kernel void @v_clamp_add_src_f16_denorm(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {440; SI-LABEL: v_clamp_add_src_f16_denorm:441; SI: ; %bb.0:442; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9443; SI-NEXT: s_mov_b32 s7, 0xf000444; SI-NEXT: s_mov_b32 s6, 0445; SI-NEXT: v_lshlrev_b32_e32 v0, 1, v0446; SI-NEXT: v_mov_b32_e32 v1, 0447; SI-NEXT: s_waitcnt lgkmcnt(0)448; SI-NEXT: s_mov_b64 s[4:5], s[2:3]449; SI-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64450; SI-NEXT: s_mov_b64 s[2:3], s[6:7]451; SI-NEXT: s_waitcnt vmcnt(0)452; SI-NEXT: v_cvt_f32_f16_e32 v2, v2453; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp454; SI-NEXT: v_cvt_f16_f32_e32 v2, v2455; SI-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr64456; SI-NEXT: s_endpgm457;458; GFX8-LABEL: v_clamp_add_src_f16_denorm:459; GFX8: ; %bb.0:460; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24461; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0462; GFX8-NEXT: s_waitcnt lgkmcnt(0)463; GFX8-NEXT: v_mov_b32_e32 v1, s3464; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2465; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc466; GFX8-NEXT: flat_load_ushort v3, v[0:1]467; GFX8-NEXT: v_mov_b32_e32 v1, s1468; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2469; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc470; GFX8-NEXT: s_waitcnt vmcnt(0)471; GFX8-NEXT: v_add_f16_e64 v2, v3, 1.0 clamp472; GFX8-NEXT: flat_store_short v[0:1], v2473; GFX8-NEXT: s_endpgm474;475; GFX9-LABEL: v_clamp_add_src_f16_denorm:476; GFX9: ; %bb.0:477; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24478; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0479; GFX9-NEXT: s_waitcnt lgkmcnt(0)480; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]481; GFX9-NEXT: s_waitcnt vmcnt(0)482; GFX9-NEXT: v_add_f16_e64 v1, v1, 1.0 clamp483; GFX9-NEXT: global_store_short v0, v1, s[0:1]484; GFX9-NEXT: s_endpgm485;486; GFX11-TRUE16-LABEL: v_clamp_add_src_f16_denorm:487; GFX11-TRUE16: ; %bb.0:488; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24489; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0490; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)491; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0492; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)493; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]494; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)495; GFX11-TRUE16-NEXT: v_add_f16_e64 v0.l, v0.l, 1.0 clamp496; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]497; GFX11-TRUE16-NEXT: s_endpgm498;499; GFX11-FAKE16-LABEL: v_clamp_add_src_f16_denorm:500; GFX11-FAKE16: ; %bb.0:501; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24502; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0503; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)504; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0505; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)506; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]507; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)508; GFX11-FAKE16-NEXT: v_add_f16_e64 v1, v1, 1.0 clamp509; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]510; GFX11-FAKE16-NEXT: s_endpgm511 %tid = call i32 @llvm.amdgcn.workitem.id.x()512 %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid513 %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid514 %a = load half, ptr addrspace(1) %gep0515 %add = fadd half %a, 1.0516 %max = call half @llvm.maxnum.f16(half %add, half 0.0)517 %clamp = call half @llvm.minnum.f16(half %max, half 1.0)518 store half %clamp, ptr addrspace(1) %out.gep519 ret void520}521 522define amdgpu_kernel void @v_clamp_add_src_f16_no_denormals(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #3 {523; SI-LABEL: v_clamp_add_src_f16_no_denormals:524; SI: ; %bb.0:525; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9526; SI-NEXT: s_mov_b32 s7, 0xf000527; SI-NEXT: s_mov_b32 s6, 0528; SI-NEXT: v_lshlrev_b32_e32 v0, 1, v0529; SI-NEXT: v_mov_b32_e32 v1, 0530; SI-NEXT: s_waitcnt lgkmcnt(0)531; SI-NEXT: s_mov_b64 s[4:5], s[2:3]532; SI-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64533; SI-NEXT: s_mov_b64 s[2:3], s[6:7]534; SI-NEXT: s_waitcnt vmcnt(0)535; SI-NEXT: v_cvt_f32_f16_e32 v2, v2536; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp537; SI-NEXT: v_cvt_f16_f32_e32 v2, v2538; SI-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr64539; SI-NEXT: s_endpgm540;541; GFX8-LABEL: v_clamp_add_src_f16_no_denormals:542; GFX8: ; %bb.0:543; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24544; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0545; GFX8-NEXT: s_waitcnt lgkmcnt(0)546; GFX8-NEXT: v_mov_b32_e32 v1, s3547; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2548; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc549; GFX8-NEXT: flat_load_ushort v3, v[0:1]550; GFX8-NEXT: v_mov_b32_e32 v1, s1551; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2552; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc553; GFX8-NEXT: s_waitcnt vmcnt(0)554; GFX8-NEXT: v_add_f16_e64 v2, v3, 1.0 clamp555; GFX8-NEXT: flat_store_short v[0:1], v2556; GFX8-NEXT: s_endpgm557;558; GFX9-LABEL: v_clamp_add_src_f16_no_denormals:559; GFX9: ; %bb.0:560; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24561; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0562; GFX9-NEXT: s_waitcnt lgkmcnt(0)563; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]564; GFX9-NEXT: s_waitcnt vmcnt(0)565; GFX9-NEXT: v_add_f16_e64 v1, v1, 1.0 clamp566; GFX9-NEXT: global_store_short v0, v1, s[0:1]567; GFX9-NEXT: s_endpgm568;569; GFX11-TRUE16-LABEL: v_clamp_add_src_f16_no_denormals:570; GFX11-TRUE16: ; %bb.0:571; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24572; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0573; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)574; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0575; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)576; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]577; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)578; GFX11-TRUE16-NEXT: v_add_f16_e64 v0.l, v0.l, 1.0 clamp579; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]580; GFX11-TRUE16-NEXT: s_endpgm581;582; GFX11-FAKE16-LABEL: v_clamp_add_src_f16_no_denormals:583; GFX11-FAKE16: ; %bb.0:584; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24585; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0586; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)587; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0588; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)589; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]590; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)591; GFX11-FAKE16-NEXT: v_add_f16_e64 v1, v1, 1.0 clamp592; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]593; GFX11-FAKE16-NEXT: s_endpgm594 %tid = call i32 @llvm.amdgcn.workitem.id.x()595 %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid596 %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid597 %a = load half, ptr addrspace(1) %gep0598 %add = fadd half %a, 1.0599 %max = call half @llvm.maxnum.f16(half %add, half 0.0)600 %clamp = call half @llvm.minnum.f16(half %max, half 1.0)601 store half %clamp, ptr addrspace(1) %out.gep602 ret void603}604 605define amdgpu_kernel void @v_clamp_add_src_v2f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {606; SI-LABEL: v_clamp_add_src_v2f32:607; SI: ; %bb.0:608; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9609; SI-NEXT: s_mov_b32 s7, 0xf000610; SI-NEXT: s_mov_b32 s6, 0611; SI-NEXT: v_lshlrev_b32_e32 v0, 3, v0612; SI-NEXT: v_mov_b32_e32 v1, 0613; SI-NEXT: s_waitcnt lgkmcnt(0)614; SI-NEXT: s_mov_b64 s[4:5], s[2:3]615; SI-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64616; SI-NEXT: s_mov_b64 s[2:3], s[6:7]617; SI-NEXT: s_waitcnt vmcnt(0)618; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp619; SI-NEXT: v_add_f32_e64 v3, v3, 1.0 clamp620; SI-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64621; SI-NEXT: s_endpgm622;623; GFX8-LABEL: v_clamp_add_src_v2f32:624; GFX8: ; %bb.0:625; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24626; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0627; GFX8-NEXT: s_waitcnt lgkmcnt(0)628; GFX8-NEXT: v_mov_b32_e32 v1, s3629; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2630; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc631; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]632; GFX8-NEXT: v_mov_b32_e32 v3, s1633; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v2634; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc635; GFX8-NEXT: s_waitcnt vmcnt(0)636; GFX8-NEXT: v_add_f32_e64 v0, v0, 1.0 clamp637; GFX8-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp638; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]639; GFX8-NEXT: s_endpgm640;641; GFX9-LABEL: v_clamp_add_src_v2f32:642; GFX9: ; %bb.0:643; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24644; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0645; GFX9-NEXT: s_waitcnt lgkmcnt(0)646; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]647; GFX9-NEXT: s_waitcnt vmcnt(0)648; GFX9-NEXT: v_add_f32_e64 v0, v0, 1.0 clamp649; GFX9-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp650; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]651; GFX9-NEXT: s_endpgm652;653; GFX11-LABEL: v_clamp_add_src_v2f32:654; GFX11: ; %bb.0:655; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24656; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0657; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)658; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0659; GFX11-NEXT: s_waitcnt lgkmcnt(0)660; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]661; GFX11-NEXT: s_waitcnt vmcnt(0)662; GFX11-NEXT: v_add_f32_e64 v0, v0, 1.0 clamp663; GFX11-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp664; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]665; GFX11-NEXT: s_endpgm666 %tid = call i32 @llvm.amdgcn.workitem.id.x()667 %gep0 = getelementptr <2 x float>, ptr addrspace(1) %aptr, i32 %tid668 %out.gep = getelementptr <2 x float>, ptr addrspace(1) %out, i32 %tid669 %a = load <2 x float>, ptr addrspace(1) %gep0670 %add = fadd <2 x float> %a, <float 1.0, float 1.0>671 %max = call <2 x float> @llvm.maxnum.v2f32(<2 x float> %add, <2 x float> zeroinitializer)672 %clamp = call <2 x float> @llvm.minnum.v2f32(<2 x float> %max, <2 x float> <float 1.0, float 1.0>)673 store <2 x float> %clamp, ptr addrspace(1) %out.gep674 ret void675}676 677define amdgpu_kernel void @v_clamp_add_src_f64(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {678; SI-LABEL: v_clamp_add_src_f64:679; SI: ; %bb.0:680; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9681; SI-NEXT: s_mov_b32 s7, 0xf000682; SI-NEXT: s_mov_b32 s6, 0683; SI-NEXT: v_lshlrev_b32_e32 v0, 3, v0684; SI-NEXT: v_mov_b32_e32 v1, 0685; SI-NEXT: s_waitcnt lgkmcnt(0)686; SI-NEXT: s_mov_b64 s[4:5], s[2:3]687; SI-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64688; SI-NEXT: s_mov_b64 s[2:3], s[6:7]689; SI-NEXT: s_waitcnt vmcnt(0)690; SI-NEXT: v_add_f64 v[2:3], v[2:3], 1.0 clamp691; SI-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64692; SI-NEXT: s_endpgm693;694; GFX8-LABEL: v_clamp_add_src_f64:695; GFX8: ; %bb.0:696; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24697; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0698; GFX8-NEXT: s_waitcnt lgkmcnt(0)699; GFX8-NEXT: v_mov_b32_e32 v1, s3700; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2701; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc702; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]703; GFX8-NEXT: v_mov_b32_e32 v3, s1704; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v2705; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc706; GFX8-NEXT: s_waitcnt vmcnt(0)707; GFX8-NEXT: v_add_f64 v[0:1], v[0:1], 1.0 clamp708; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]709; GFX8-NEXT: s_endpgm710;711; GFX9-LABEL: v_clamp_add_src_f64:712; GFX9: ; %bb.0:713; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24714; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0715; GFX9-NEXT: s_waitcnt lgkmcnt(0)716; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]717; GFX9-NEXT: s_waitcnt vmcnt(0)718; GFX9-NEXT: v_add_f64 v[0:1], v[0:1], 1.0 clamp719; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]720; GFX9-NEXT: s_endpgm721;722; GFX11-LABEL: v_clamp_add_src_f64:723; GFX11: ; %bb.0:724; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24725; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0726; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)727; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0728; GFX11-NEXT: s_waitcnt lgkmcnt(0)729; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]730; GFX11-NEXT: s_waitcnt vmcnt(0)731; GFX11-NEXT: v_add_f64 v[0:1], v[0:1], 1.0 clamp732; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]733; GFX11-NEXT: s_endpgm734 %tid = call i32 @llvm.amdgcn.workitem.id.x()735 %gep0 = getelementptr double, ptr addrspace(1) %aptr, i32 %tid736 %out.gep = getelementptr double, ptr addrspace(1) %out, i32 %tid737 %a = load double, ptr addrspace(1) %gep0738 %add = fadd double %a, 1.0739 %max = call double @llvm.maxnum.f64(double %add, double 0.0)740 %clamp = call double @llvm.minnum.f64(double %max, double 1.0)741 store double %clamp, ptr addrspace(1) %out.gep742 ret void743}744 745define amdgpu_kernel void @v_clamp_mac_to_mad(ptr addrspace(1) %out, ptr addrspace(1) %aptr, float %a) #0 {746; SI-LABEL: v_clamp_mac_to_mad:747; SI: ; %bb.0:748; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9749; SI-NEXT: s_load_dword s8, s[4:5], 0xd750; SI-NEXT: s_mov_b32 s7, 0xf000751; SI-NEXT: s_mov_b32 s6, 0752; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0753; SI-NEXT: s_waitcnt lgkmcnt(0)754; SI-NEXT: s_mov_b64 s[4:5], s[2:3]755; SI-NEXT: v_mov_b32_e32 v1, 0756; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64757; SI-NEXT: s_mov_b64 s[2:3], s[6:7]758; SI-NEXT: s_waitcnt vmcnt(0)759; SI-NEXT: v_mad_f32 v3, s8, s8, v2 clamp760; SI-NEXT: v_add_f32_e32 v2, v3, v2761; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64762; SI-NEXT: s_endpgm763;764; GFX8-LABEL: v_clamp_mac_to_mad:765; GFX8: ; %bb.0:766; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24767; GFX8-NEXT: s_load_dword s4, s[4:5], 0x34768; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0769; GFX8-NEXT: s_waitcnt lgkmcnt(0)770; GFX8-NEXT: v_mov_b32_e32 v1, s3771; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2772; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc773; GFX8-NEXT: flat_load_dword v3, v[0:1]774; GFX8-NEXT: v_mov_b32_e32 v1, s1775; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2776; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc777; GFX8-NEXT: s_waitcnt vmcnt(0)778; GFX8-NEXT: v_mad_f32 v2, s4, s4, v3 clamp779; GFX8-NEXT: v_add_f32_e32 v2, v2, v3780; GFX8-NEXT: flat_store_dword v[0:1], v2781; GFX8-NEXT: s_endpgm782;783; GFX9-LABEL: v_clamp_mac_to_mad:784; GFX9: ; %bb.0:785; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24786; GFX9-NEXT: s_load_dword s6, s[4:5], 0x34787; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0788; GFX9-NEXT: s_waitcnt lgkmcnt(0)789; GFX9-NEXT: global_load_dword v1, v0, s[2:3]790; GFX9-NEXT: s_waitcnt vmcnt(0)791; GFX9-NEXT: v_mad_f32 v2, s6, s6, v1 clamp792; GFX9-NEXT: v_add_f32_e32 v1, v2, v1793; GFX9-NEXT: global_store_dword v0, v1, s[0:1]794; GFX9-NEXT: s_endpgm795;796; GFX11-LABEL: v_clamp_mac_to_mad:797; GFX11: ; %bb.0:798; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24799; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0800; GFX11-NEXT: s_load_b32 s4, s[4:5], 0x34801; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)802; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0803; GFX11-NEXT: s_waitcnt lgkmcnt(0)804; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]805; GFX11-NEXT: v_mul_f32_e64 v2, s4, s4806; GFX11-NEXT: s_waitcnt vmcnt(0)807; GFX11-NEXT: v_add_f32_e64 v2, v2, v1 clamp808; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)809; GFX11-NEXT: v_add_f32_e32 v1, v2, v1810; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]811; GFX11-NEXT: s_endpgm812 %tid = call i32 @llvm.amdgcn.workitem.id.x()813 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid814 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid815 %b = load float, ptr addrspace(1) %gep0816 817 %mul = fmul float %a, %a818 %add = fadd float %mul, %b819 %max = call float @llvm.maxnum.f32(float %add, float 0.0)820 %clamp = call float @llvm.minnum.f32(float %max, float 1.0)821 %res = fadd float %clamp, %b822 store float %res, ptr addrspace(1) %out.gep823 ret void824}825 826define amdgpu_kernel void @v_clamp_add_src_v2f16_denorm(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {827; SI-LABEL: v_clamp_add_src_v2f16_denorm:828; SI: ; %bb.0:829; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9830; SI-NEXT: s_mov_b32 s7, 0xf000831; SI-NEXT: s_mov_b32 s6, 0832; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0833; SI-NEXT: v_mov_b32_e32 v1, 0834; SI-NEXT: s_waitcnt lgkmcnt(0)835; SI-NEXT: s_mov_b64 s[4:5], s[2:3]836; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64837; SI-NEXT: s_mov_b64 s[2:3], s[6:7]838; SI-NEXT: s_waitcnt vmcnt(0)839; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v2840; SI-NEXT: v_cvt_f32_f16_e32 v3, v3841; SI-NEXT: v_cvt_f32_f16_e32 v2, v2842; SI-NEXT: v_add_f32_e64 v3, v3, 1.0 clamp843; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp844; SI-NEXT: v_cvt_f16_f32_e32 v3, v3845; SI-NEXT: v_cvt_f16_f32_e32 v2, v2846; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v3847; SI-NEXT: v_or_b32_e32 v2, v2, v3848; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64849; SI-NEXT: s_endpgm850;851; GFX8-LABEL: v_clamp_add_src_v2f16_denorm:852; GFX8: ; %bb.0:853; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24854; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0855; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c00856; GFX8-NEXT: s_waitcnt lgkmcnt(0)857; GFX8-NEXT: v_mov_b32_e32 v1, s3858; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2859; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc860; GFX8-NEXT: flat_load_dword v3, v[0:1]861; GFX8-NEXT: v_mov_b32_e32 v1, s1862; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2863; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc864; GFX8-NEXT: s_waitcnt vmcnt(0)865; GFX8-NEXT: v_add_f16_e64 v2, v3, 1.0 clamp866; GFX8-NEXT: v_add_f16_sdwa v3, v3, v4 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD867; GFX8-NEXT: v_or_b32_e32 v2, v2, v3868; GFX8-NEXT: flat_store_dword v[0:1], v2869; GFX8-NEXT: s_endpgm870;871; GFX9-LABEL: v_clamp_add_src_v2f16_denorm:872; GFX9: ; %bb.0:873; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24874; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0875; GFX9-NEXT: s_waitcnt lgkmcnt(0)876; GFX9-NEXT: global_load_dword v1, v0, s[2:3]877; GFX9-NEXT: s_waitcnt vmcnt(0)878; GFX9-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0] clamp879; GFX9-NEXT: global_store_dword v0, v1, s[0:1]880; GFX9-NEXT: s_endpgm881;882; GFX11-LABEL: v_clamp_add_src_v2f16_denorm:883; GFX11: ; %bb.0:884; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24885; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0886; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)887; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0888; GFX11-NEXT: s_waitcnt lgkmcnt(0)889; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]890; GFX11-NEXT: s_waitcnt vmcnt(0)891; GFX11-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0] clamp892; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]893; GFX11-NEXT: s_endpgm894 %tid = call i32 @llvm.amdgcn.workitem.id.x()895 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid896 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid897 %a = load <2 x half>, ptr addrspace(1) %gep0898 %add = fadd <2 x half> %a, <half 1.0, half 1.0>899 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %add, <2 x half> zeroinitializer)900 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)901 store <2 x half> %clamp, ptr addrspace(1) %out.gep902 ret void903}904 905define amdgpu_kernel void @v_clamp_add_src_v2f16_no_denormals(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #3 {906; SI-LABEL: v_clamp_add_src_v2f16_no_denormals:907; SI: ; %bb.0:908; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9909; SI-NEXT: s_mov_b32 s7, 0xf000910; SI-NEXT: s_mov_b32 s6, 0911; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0912; SI-NEXT: v_mov_b32_e32 v1, 0913; SI-NEXT: s_waitcnt lgkmcnt(0)914; SI-NEXT: s_mov_b64 s[4:5], s[2:3]915; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64916; SI-NEXT: s_mov_b64 s[2:3], s[6:7]917; SI-NEXT: s_waitcnt vmcnt(0)918; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v2919; SI-NEXT: v_cvt_f32_f16_e32 v3, v3920; SI-NEXT: v_cvt_f32_f16_e32 v2, v2921; SI-NEXT: v_add_f32_e64 v3, v3, 1.0 clamp922; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp923; SI-NEXT: v_cvt_f16_f32_e32 v3, v3924; SI-NEXT: v_cvt_f16_f32_e32 v2, v2925; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v3926; SI-NEXT: v_or_b32_e32 v2, v2, v3927; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64928; SI-NEXT: s_endpgm929;930; GFX8-LABEL: v_clamp_add_src_v2f16_no_denormals:931; GFX8: ; %bb.0:932; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24933; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0934; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c00935; GFX8-NEXT: s_waitcnt lgkmcnt(0)936; GFX8-NEXT: v_mov_b32_e32 v1, s3937; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2938; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc939; GFX8-NEXT: flat_load_dword v3, v[0:1]940; GFX8-NEXT: v_mov_b32_e32 v1, s1941; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2942; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc943; GFX8-NEXT: s_waitcnt vmcnt(0)944; GFX8-NEXT: v_add_f16_e64 v2, v3, 1.0 clamp945; GFX8-NEXT: v_add_f16_sdwa v3, v3, v4 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD946; GFX8-NEXT: v_or_b32_e32 v2, v2, v3947; GFX8-NEXT: flat_store_dword v[0:1], v2948; GFX8-NEXT: s_endpgm949;950; GFX9-LABEL: v_clamp_add_src_v2f16_no_denormals:951; GFX9: ; %bb.0:952; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24953; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0954; GFX9-NEXT: s_waitcnt lgkmcnt(0)955; GFX9-NEXT: global_load_dword v1, v0, s[2:3]956; GFX9-NEXT: s_waitcnt vmcnt(0)957; GFX9-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0] clamp958; GFX9-NEXT: global_store_dword v0, v1, s[0:1]959; GFX9-NEXT: s_endpgm960;961; GFX11-LABEL: v_clamp_add_src_v2f16_no_denormals:962; GFX11: ; %bb.0:963; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24964; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0965; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)966; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0967; GFX11-NEXT: s_waitcnt lgkmcnt(0)968; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]969; GFX11-NEXT: s_waitcnt vmcnt(0)970; GFX11-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0] clamp971; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]972; GFX11-NEXT: s_endpgm973 %tid = call i32 @llvm.amdgcn.workitem.id.x()974 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid975 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid976 %a = load <2 x half>, ptr addrspace(1) %gep0977 %add = fadd <2 x half> %a, <half 1.0, half 1.0>978 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %add, <2 x half> zeroinitializer)979 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)980 store <2 x half> %clamp, ptr addrspace(1) %out.gep981 ret void982}983 984define amdgpu_kernel void @v_clamp_add_src_v2f16_denorm_neg(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {985; SI-LABEL: v_clamp_add_src_v2f16_denorm_neg:986; SI: ; %bb.0:987; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9988; SI-NEXT: s_mov_b32 s7, 0xf000989; SI-NEXT: s_mov_b32 s6, 0990; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v0991; SI-NEXT: v_mov_b32_e32 v1, 0992; SI-NEXT: s_waitcnt lgkmcnt(0)993; SI-NEXT: s_mov_b64 s[4:5], s[2:3]994; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64995; SI-NEXT: s_mov_b64 s[2:3], s[6:7]996; SI-NEXT: s_waitcnt vmcnt(0)997; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v2998; SI-NEXT: v_cvt_f32_f16_e32 v3, v3999; SI-NEXT: v_cvt_f32_f16_e32 v2, v21000; SI-NEXT: v_add_f32_e32 v3, 1.0, v31001; SI-NEXT: v_cvt_f16_f32_e32 v3, v31002; SI-NEXT: v_add_f32_e32 v2, 1.0, v21003; SI-NEXT: v_cvt_f16_f32_e32 v2, v21004; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v31005; SI-NEXT: v_or_b32_e32 v2, v2, v31006; SI-NEXT: v_xor_b32_e32 v2, 0x80008000, v21007; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v21008; SI-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp1009; SI-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp1010; SI-NEXT: v_cvt_f16_f32_e32 v3, v31011; SI-NEXT: v_cvt_f16_f32_e32 v2, v21012; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v31013; SI-NEXT: v_or_b32_e32 v2, v2, v31014; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641015; SI-NEXT: s_endpgm1016;1017; GFX8-LABEL: v_clamp_add_src_v2f16_denorm_neg:1018; GFX8: ; %bb.0:1019; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241020; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01021; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c001022; GFX8-NEXT: s_waitcnt lgkmcnt(0)1023; GFX8-NEXT: v_mov_b32_e32 v1, s31024; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21025; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1026; GFX8-NEXT: flat_load_dword v3, v[0:1]1027; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21028; GFX8-NEXT: v_mov_b32_e32 v1, s11029; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1030; GFX8-NEXT: s_waitcnt vmcnt(0)1031; GFX8-NEXT: v_add_f16_e32 v2, 1.0, v31032; GFX8-NEXT: v_add_f16_sdwa v3, v3, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1033; GFX8-NEXT: v_max_f16_sdwa v3, -v3, -v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1034; GFX8-NEXT: v_max_f16_e64 v2, -v2, -v2 clamp1035; GFX8-NEXT: v_or_b32_e32 v2, v2, v31036; GFX8-NEXT: flat_store_dword v[0:1], v21037; GFX8-NEXT: s_endpgm1038;1039; GFX9-LABEL: v_clamp_add_src_v2f16_denorm_neg:1040; GFX9: ; %bb.0:1041; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241042; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01043; GFX9-NEXT: s_waitcnt lgkmcnt(0)1044; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1045; GFX9-NEXT: s_waitcnt vmcnt(0)1046; GFX9-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1047; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp1048; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1049; GFX9-NEXT: s_endpgm1050;1051; GFX11-LABEL: v_clamp_add_src_v2f16_denorm_neg:1052; GFX11: ; %bb.0:1053; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241054; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01055; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)1056; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01057; GFX11-NEXT: s_waitcnt lgkmcnt(0)1058; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1059; GFX11-NEXT: s_waitcnt vmcnt(0)1060; GFX11-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1061; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp1062; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1063; GFX11-NEXT: s_endpgm1064 %tid = call i32 @llvm.amdgcn.workitem.id.x()1065 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid1066 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid1067 %a = load <2 x half>, ptr addrspace(1) %gep01068 %add = fadd <2 x half> %a, <half 1.0, half 1.0>1069 %neg.add = fsub <2 x half> <half -0.0, half -0.0>, %add1070 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.add, <2 x half> zeroinitializer)1071 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)1072 store <2 x half> %clamp, ptr addrspace(1) %out.gep1073 ret void1074}1075 1076define amdgpu_kernel void @v_clamp_add_src_v2f16_denorm_neg_lo(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1077; SI-LABEL: v_clamp_add_src_v2f16_denorm_neg_lo:1078; SI: ; %bb.0:1079; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91080; SI-NEXT: s_mov_b32 s7, 0xf0001081; SI-NEXT: s_mov_b32 s6, 01082; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v01083; SI-NEXT: v_mov_b32_e32 v1, 01084; SI-NEXT: s_waitcnt lgkmcnt(0)1085; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1086; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641087; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1088; SI-NEXT: s_waitcnt vmcnt(0)1089; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v21090; SI-NEXT: v_cvt_f32_f16_e32 v2, v21091; SI-NEXT: v_cvt_f32_f16_e32 v3, v31092; SI-NEXT: v_add_f32_e32 v2, 1.0, v21093; SI-NEXT: v_add_f32_e64 v3, v3, 1.0 clamp1094; SI-NEXT: v_cvt_f16_f32_e32 v3, v31095; SI-NEXT: v_max_f32_e64 v2, -v2, -v2 clamp1096; SI-NEXT: v_cvt_f16_f32_e32 v2, v21097; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v31098; SI-NEXT: v_or_b32_e32 v2, v2, v31099; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641100; SI-NEXT: s_endpgm1101;1102; GFX8-LABEL: v_clamp_add_src_v2f16_denorm_neg_lo:1103; GFX8: ; %bb.0:1104; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241105; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01106; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c001107; GFX8-NEXT: s_waitcnt lgkmcnt(0)1108; GFX8-NEXT: v_mov_b32_e32 v1, s31109; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21110; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1111; GFX8-NEXT: flat_load_dword v3, v[0:1]1112; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21113; GFX8-NEXT: v_mov_b32_e32 v1, s11114; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1115; GFX8-NEXT: s_waitcnt vmcnt(0)1116; GFX8-NEXT: v_add_f16_e32 v2, 1.0, v31117; GFX8-NEXT: v_add_f16_sdwa v3, v3, v4 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1118; GFX8-NEXT: v_max_f16_e64 v2, -v2, -v2 clamp1119; GFX8-NEXT: v_or_b32_e32 v2, v2, v31120; GFX8-NEXT: flat_store_dword v[0:1], v21121; GFX8-NEXT: s_endpgm1122;1123; GFX9-LABEL: v_clamp_add_src_v2f16_denorm_neg_lo:1124; GFX9: ; %bb.0:1125; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241126; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01127; GFX9-NEXT: s_waitcnt lgkmcnt(0)1128; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1129; GFX9-NEXT: s_waitcnt vmcnt(0)1130; GFX9-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1131; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp1132; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1133; GFX9-NEXT: s_endpgm1134;1135; GFX11-LABEL: v_clamp_add_src_v2f16_denorm_neg_lo:1136; GFX11: ; %bb.0:1137; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241138; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01139; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)1140; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01141; GFX11-NEXT: s_waitcnt lgkmcnt(0)1142; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1143; GFX11-NEXT: s_waitcnt vmcnt(0)1144; GFX11-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1145; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp1146; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1147; GFX11-NEXT: s_endpgm1148 %tid = call i32 @llvm.amdgcn.workitem.id.x()1149 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid1150 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid1151 %a = load <2 x half>, ptr addrspace(1) %gep01152 %add = fadd <2 x half> %a, <half 1.0, half 1.0>1153 %lo = extractelement <2 x half> %add, i32 01154 %neg.lo = fsub half -0.0, %lo1155 %neg.lo.add = insertelement <2 x half> %add, half %neg.lo, i32 01156 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.lo.add, <2 x half> zeroinitializer)1157 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)1158 store <2 x half> %clamp, ptr addrspace(1) %out.gep1159 ret void1160}1161 1162define amdgpu_kernel void @v_clamp_add_src_v2f16_denorm_neg_hi(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1163; SI-LABEL: v_clamp_add_src_v2f16_denorm_neg_hi:1164; SI: ; %bb.0:1165; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91166; SI-NEXT: s_mov_b32 s7, 0xf0001167; SI-NEXT: s_mov_b32 s6, 01168; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v01169; SI-NEXT: v_mov_b32_e32 v1, 01170; SI-NEXT: s_waitcnt lgkmcnt(0)1171; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1172; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641173; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1174; SI-NEXT: s_waitcnt vmcnt(0)1175; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v21176; SI-NEXT: v_cvt_f32_f16_e32 v3, v31177; SI-NEXT: v_cvt_f32_f16_e32 v2, v21178; SI-NEXT: v_add_f32_e32 v3, 1.0, v31179; SI-NEXT: v_max_f32_e64 v3, -v3, -v3 clamp1180; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp1181; SI-NEXT: v_cvt_f16_f32_e32 v3, v31182; SI-NEXT: v_cvt_f16_f32_e32 v2, v21183; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v31184; SI-NEXT: v_or_b32_e32 v2, v2, v31185; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641186; SI-NEXT: s_endpgm1187;1188; GFX8-LABEL: v_clamp_add_src_v2f16_denorm_neg_hi:1189; GFX8: ; %bb.0:1190; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241191; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01192; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c001193; GFX8-NEXT: s_waitcnt lgkmcnt(0)1194; GFX8-NEXT: v_mov_b32_e32 v1, s31195; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21196; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1197; GFX8-NEXT: flat_load_dword v3, v[0:1]1198; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21199; GFX8-NEXT: v_mov_b32_e32 v1, s11200; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1201; GFX8-NEXT: s_waitcnt vmcnt(0)1202; GFX8-NEXT: v_add_f16_e64 v2, v3, 1.0 clamp1203; GFX8-NEXT: v_add_f16_sdwa v3, v3, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1204; GFX8-NEXT: v_max_f16_sdwa v3, -v3, -v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1205; GFX8-NEXT: v_or_b32_e32 v2, v2, v31206; GFX8-NEXT: flat_store_dword v[0:1], v21207; GFX8-NEXT: s_endpgm1208;1209; GFX9-LABEL: v_clamp_add_src_v2f16_denorm_neg_hi:1210; GFX9: ; %bb.0:1211; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241212; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01213; GFX9-NEXT: s_waitcnt lgkmcnt(0)1214; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1215; GFX9-NEXT: s_waitcnt vmcnt(0)1216; GFX9-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1217; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp1218; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1219; GFX9-NEXT: s_endpgm1220;1221; GFX11-LABEL: v_clamp_add_src_v2f16_denorm_neg_hi:1222; GFX11: ; %bb.0:1223; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241224; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01225; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)1226; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01227; GFX11-NEXT: s_waitcnt lgkmcnt(0)1228; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1229; GFX11-NEXT: s_waitcnt vmcnt(0)1230; GFX11-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1231; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp1232; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1233; GFX11-NEXT: s_endpgm1234 %tid = call i32 @llvm.amdgcn.workitem.id.x()1235 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid1236 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid1237 %a = load <2 x half>, ptr addrspace(1) %gep01238 %add = fadd <2 x half> %a, <half 1.0, half 1.0>1239 %hi = extractelement <2 x half> %add, i32 11240 %neg.hi = fsub half -0.0, %hi1241 %neg.hi.add = insertelement <2 x half> %add, half %neg.hi, i32 11242 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.hi.add, <2 x half> zeroinitializer)1243 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)1244 store <2 x half> %clamp, ptr addrspace(1) %out.gep1245 ret void1246}1247 1248define amdgpu_kernel void @v_clamp_add_src_v2f16_denorm_shuf(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1249; SI-LABEL: v_clamp_add_src_v2f16_denorm_shuf:1250; SI: ; %bb.0:1251; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91252; SI-NEXT: s_mov_b32 s7, 0xf0001253; SI-NEXT: s_mov_b32 s6, 01254; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v01255; SI-NEXT: v_mov_b32_e32 v1, 01256; SI-NEXT: s_waitcnt lgkmcnt(0)1257; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1258; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641259; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1260; SI-NEXT: s_waitcnt vmcnt(0)1261; SI-NEXT: v_cvt_f32_f16_e32 v3, v21262; SI-NEXT: v_lshrrev_b32_e32 v2, 16, v21263; SI-NEXT: v_cvt_f32_f16_e32 v2, v21264; SI-NEXT: v_add_f32_e64 v3, v3, 1.0 clamp1265; SI-NEXT: v_cvt_f16_f32_e32 v3, v31266; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp1267; SI-NEXT: v_cvt_f16_f32_e32 v2, v21268; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v31269; SI-NEXT: v_or_b32_e32 v2, v2, v31270; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641271; SI-NEXT: s_endpgm1272;1273; GFX8-LABEL: v_clamp_add_src_v2f16_denorm_shuf:1274; GFX8: ; %bb.0:1275; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241276; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01277; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c001278; GFX8-NEXT: s_waitcnt lgkmcnt(0)1279; GFX8-NEXT: v_mov_b32_e32 v1, s31280; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21281; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1282; GFX8-NEXT: flat_load_dword v3, v[0:1]1283; GFX8-NEXT: v_mov_b32_e32 v1, s11284; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21285; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1286; GFX8-NEXT: s_waitcnt vmcnt(0)1287; GFX8-NEXT: v_add_f16_sdwa v2, v3, v4 clamp dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1288; GFX8-NEXT: v_add_f16_sdwa v3, v3, v4 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1289; GFX8-NEXT: v_or_b32_e32 v2, v2, v31290; GFX8-NEXT: flat_store_dword v[0:1], v21291; GFX8-NEXT: s_endpgm1292;1293; GFX9-LABEL: v_clamp_add_src_v2f16_denorm_shuf:1294; GFX9: ; %bb.0:1295; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241296; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01297; GFX9-NEXT: s_waitcnt lgkmcnt(0)1298; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1299; GFX9-NEXT: s_waitcnt vmcnt(0)1300; GFX9-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1301; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp1302; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1303; GFX9-NEXT: s_endpgm1304;1305; GFX11-LABEL: v_clamp_add_src_v2f16_denorm_shuf:1306; GFX11: ; %bb.0:1307; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241308; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01309; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)1310; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01311; GFX11-NEXT: s_waitcnt lgkmcnt(0)1312; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1313; GFX11-NEXT: s_waitcnt vmcnt(0)1314; GFX11-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1315; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp1316; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1317; GFX11-NEXT: s_endpgm1318 %tid = call i32 @llvm.amdgcn.workitem.id.x()1319 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid1320 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid1321 %a = load <2 x half>, ptr addrspace(1) %gep01322 %add = fadd <2 x half> %a, <half 1.0, half 1.0>1323 %shuf = shufflevector <2 x half> %add, <2 x half> poison, <2 x i32> <i32 1, i32 0>1324 1325 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %shuf, <2 x half> zeroinitializer)1326 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)1327 store <2 x half> %clamp, ptr addrspace(1) %out.gep1328 ret void1329}1330 1331define amdgpu_kernel void @v_no_clamp_add_src_v2f16_f32_src(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1332; SI-LABEL: v_no_clamp_add_src_v2f16_f32_src:1333; SI: ; %bb.0:1334; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91335; SI-NEXT: s_mov_b32 s7, 0xf0001336; SI-NEXT: s_mov_b32 s6, 01337; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v01338; SI-NEXT: v_mov_b32_e32 v1, 01339; SI-NEXT: s_waitcnt lgkmcnt(0)1340; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1341; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641342; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1343; SI-NEXT: s_waitcnt vmcnt(0)1344; SI-NEXT: v_add_f32_e32 v2, 1.0, v21345; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v21346; SI-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp1347; SI-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp1348; SI-NEXT: v_cvt_f16_f32_e32 v3, v31349; SI-NEXT: v_cvt_f16_f32_e32 v2, v21350; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v31351; SI-NEXT: v_or_b32_e32 v2, v2, v31352; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641353; SI-NEXT: s_endpgm1354;1355; GFX8-LABEL: v_no_clamp_add_src_v2f16_f32_src:1356; GFX8: ; %bb.0:1357; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241358; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01359; GFX8-NEXT: s_waitcnt lgkmcnt(0)1360; GFX8-NEXT: v_mov_b32_e32 v1, s31361; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21362; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1363; GFX8-NEXT: flat_load_dword v3, v[0:1]1364; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21365; GFX8-NEXT: v_mov_b32_e32 v1, s11366; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1367; GFX8-NEXT: s_waitcnt vmcnt(0)1368; GFX8-NEXT: v_add_f32_e32 v2, 1.0, v31369; GFX8-NEXT: v_max_f16_sdwa v3, v2, v2 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11370; GFX8-NEXT: v_max_f16_e64 v2, v2, v2 clamp1371; GFX8-NEXT: v_or_b32_e32 v2, v2, v31372; GFX8-NEXT: flat_store_dword v[0:1], v21373; GFX8-NEXT: s_endpgm1374;1375; GFX9-LABEL: v_no_clamp_add_src_v2f16_f32_src:1376; GFX9: ; %bb.0:1377; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241378; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01379; GFX9-NEXT: s_waitcnt lgkmcnt(0)1380; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1381; GFX9-NEXT: s_waitcnt vmcnt(0)1382; GFX9-NEXT: v_add_f32_e32 v1, 1.0, v11383; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp1384; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1385; GFX9-NEXT: s_endpgm1386;1387; GFX11-LABEL: v_no_clamp_add_src_v2f16_f32_src:1388; GFX11: ; %bb.0:1389; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241390; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01391; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)1392; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01393; GFX11-NEXT: s_waitcnt lgkmcnt(0)1394; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1395; GFX11-NEXT: s_waitcnt vmcnt(0)1396; GFX11-NEXT: v_add_f32_e32 v1, 1.0, v11397; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp1398; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1399; GFX11-NEXT: s_endpgm1400 %tid = call i32 @llvm.amdgcn.workitem.id.x()1401 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid1402 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid1403 %a = load <2 x half>, ptr addrspace(1) %gep01404 %bc = bitcast <2 x half> %a to float1405 %f32.op = fadd float %bc, 1.01406 %f32.op.cast = bitcast float %f32.op to <2 x half>1407 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %f32.op.cast, <2 x half> zeroinitializer)1408 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)1409 store <2 x half> %clamp, ptr addrspace(1) %out.gep1410 ret void1411}1412 1413define amdgpu_kernel void @v_no_clamp_add_packed_src_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1414; SI-LABEL: v_no_clamp_add_packed_src_f32:1415; SI: ; %bb.0:1416; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91417; SI-NEXT: s_mov_b32 s7, 0xf0001418; SI-NEXT: s_mov_b32 s6, 01419; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v01420; SI-NEXT: v_mov_b32_e32 v1, 01421; SI-NEXT: s_waitcnt lgkmcnt(0)1422; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1423; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641424; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1425; SI-NEXT: s_waitcnt vmcnt(0)1426; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v21427; SI-NEXT: v_cvt_f32_f16_e32 v3, v31428; SI-NEXT: v_cvt_f32_f16_e32 v2, v21429; SI-NEXT: v_add_f32_e32 v3, 1.0, v31430; SI-NEXT: v_cvt_f16_f32_e32 v3, v31431; SI-NEXT: v_add_f32_e32 v2, 1.0, v21432; SI-NEXT: v_cvt_f16_f32_e32 v2, v21433; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v31434; SI-NEXT: v_or_b32_e32 v2, v2, v31435; SI-NEXT: v_max_f32_e64 v2, v2, v2 clamp1436; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641437; SI-NEXT: s_endpgm1438;1439; GFX8-LABEL: v_no_clamp_add_packed_src_f32:1440; GFX8: ; %bb.0:1441; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241442; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01443; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c001444; GFX8-NEXT: s_waitcnt lgkmcnt(0)1445; GFX8-NEXT: v_mov_b32_e32 v1, s31446; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21447; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1448; GFX8-NEXT: flat_load_dword v3, v[0:1]1449; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21450; GFX8-NEXT: v_mov_b32_e32 v1, s11451; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1452; GFX8-NEXT: s_waitcnt vmcnt(0)1453; GFX8-NEXT: v_add_f16_sdwa v2, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1454; GFX8-NEXT: v_add_f16_e32 v3, 1.0, v31455; GFX8-NEXT: v_or_b32_e32 v2, v3, v21456; GFX8-NEXT: v_max_f32_e64 v2, v2, v2 clamp1457; GFX8-NEXT: flat_store_dword v[0:1], v21458; GFX8-NEXT: s_endpgm1459;1460; GFX9-LABEL: v_no_clamp_add_packed_src_f32:1461; GFX9: ; %bb.0:1462; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241463; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01464; GFX9-NEXT: s_waitcnt lgkmcnt(0)1465; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1466; GFX9-NEXT: s_waitcnt vmcnt(0)1467; GFX9-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1468; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp1469; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1470; GFX9-NEXT: s_endpgm1471;1472; GFX11-LABEL: v_no_clamp_add_packed_src_f32:1473; GFX11: ; %bb.0:1474; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241475; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01476; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)1477; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01478; GFX11-NEXT: s_waitcnt lgkmcnt(0)1479; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1480; GFX11-NEXT: s_waitcnt vmcnt(0)1481; GFX11-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0]1482; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp1483; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1484; GFX11-NEXT: s_endpgm1485 %tid = call i32 @llvm.amdgcn.workitem.id.x()1486 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid1487 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1488 %a = load <2 x half>, ptr addrspace(1) %gep01489 %add = fadd <2 x half> %a, <half 1.0, half 1.0>1490 %bc.add = bitcast <2 x half> %add to float1491 %max = call float @llvm.maxnum.f32(float %bc.add, float 0.0)1492 %clamp = call float @llvm.minnum.f32(float %max, float 1.0)1493 store float %clamp, ptr addrspace(1) %out.gep1494 ret void1495}1496 1497; Since the high bits are zeroed, it probably would be OK in this case1498; to use clamp.1499define amdgpu_kernel void @v_no_clamp_add_src_v2f16_f16_src(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1500; SI-LABEL: v_no_clamp_add_src_v2f16_f16_src:1501; SI: ; %bb.0:1502; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91503; SI-NEXT: s_mov_b32 s7, 0xf0001504; SI-NEXT: s_mov_b32 s6, 01505; SI-NEXT: v_lshlrev_b32_e32 v1, 1, v01506; SI-NEXT: v_mov_b32_e32 v2, 01507; SI-NEXT: s_waitcnt lgkmcnt(0)1508; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1509; SI-NEXT: buffer_load_ushort v1, v[1:2], s[4:7], 0 addr641510; SI-NEXT: v_cvt_f16_f32_e32 v3, 01511; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1512; SI-NEXT: s_waitcnt vmcnt(0)1513; SI-NEXT: v_cvt_f32_f16_e32 v1, v11514; SI-NEXT: v_add_f32_e32 v1, 1.0, v11515; SI-NEXT: v_cvt_f16_f32_e32 v1, v11516; SI-NEXT: v_cvt_f32_f16_e64 v1, v1 clamp1517; SI-NEXT: v_cvt_f16_f32_e32 v4, v11518; SI-NEXT: v_lshlrev_b32_e32 v1, 2, v01519; SI-NEXT: v_lshlrev_b32_e32 v0, 16, v31520; SI-NEXT: v_or_b32_e32 v0, v4, v01521; SI-NEXT: buffer_store_dword v0, v[1:2], s[0:3], 0 addr641522; SI-NEXT: s_endpgm1523;1524; GFX8-LABEL: v_no_clamp_add_src_v2f16_f16_src:1525; GFX8: ; %bb.0:1526; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241527; GFX8-NEXT: v_lshlrev_b32_e32 v1, 1, v01528; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v01529; GFX8-NEXT: s_waitcnt lgkmcnt(0)1530; GFX8-NEXT: v_mov_b32_e32 v2, s31531; GFX8-NEXT: v_add_u32_e32 v1, vcc, s2, v11532; GFX8-NEXT: v_addc_u32_e32 v2, vcc, 0, v2, vcc1533; GFX8-NEXT: flat_load_ushort v2, v[1:2]1534; GFX8-NEXT: v_mov_b32_e32 v1, s11535; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v01536; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1537; GFX8-NEXT: s_waitcnt vmcnt(0)1538; GFX8-NEXT: v_add_f16_e64 v2, v2, 1.0 clamp1539; GFX8-NEXT: flat_store_dword v[0:1], v21540; GFX8-NEXT: s_endpgm1541;1542; GFX9-LABEL: v_no_clamp_add_src_v2f16_f16_src:1543; GFX9: ; %bb.0:1544; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241545; GFX9-NEXT: v_lshlrev_b32_e32 v1, 1, v01546; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01547; GFX9-NEXT: s_waitcnt lgkmcnt(0)1548; GFX9-NEXT: global_load_ushort v1, v1, s[2:3]1549; GFX9-NEXT: s_waitcnt vmcnt(0)1550; GFX9-NEXT: v_add_f16_e32 v1, 1.0, v11551; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp1552; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1553; GFX9-NEXT: s_endpgm1554;1555; GFX11-TRUE16-LABEL: v_no_clamp_add_src_v2f16_f16_src:1556; GFX11-TRUE16: ; %bb.0:1557; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241558; GFX11-TRUE16-NEXT: v_and_b32_e32 v1, 0x3ff, v01559; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1560; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v0, 1, v11561; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 2, v11562; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)1563; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3]1564; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)1565; GFX11-TRUE16-NEXT: v_mov_b16_e32 v0.h, 01566; GFX11-TRUE16-NEXT: v_add_f16_e32 v0.l, 1.0, v0.l1567; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1568; GFX11-TRUE16-NEXT: v_pk_max_f16 v0, v0, v0 clamp1569; GFX11-TRUE16-NEXT: global_store_b32 v1, v0, s[0:1]1570; GFX11-TRUE16-NEXT: s_endpgm1571;1572; GFX11-FAKE16-LABEL: v_no_clamp_add_src_v2f16_f16_src:1573; GFX11-FAKE16: ; %bb.0:1574; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241575; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v01576; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1577; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v1, 1, v01578; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 2, v01579; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)1580; GFX11-FAKE16-NEXT: global_load_u16 v1, v1, s[2:3]1581; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)1582; GFX11-FAKE16-NEXT: v_add_f16_e32 v1, 1.0, v11583; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1584; GFX11-FAKE16-NEXT: v_and_b32_e32 v1, 0xffff, v11585; GFX11-FAKE16-NEXT: v_pk_max_f16 v1, v1, v1 clamp1586; GFX11-FAKE16-NEXT: global_store_b32 v0, v1, s[0:1]1587; GFX11-FAKE16-NEXT: s_endpgm1588 %tid = call i32 @llvm.amdgcn.workitem.id.x()1589 %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid1590 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid1591 %a = load half, ptr addrspace(1) %gep01592 %add = fadd half %a, 1.01593 %bc = bitcast half %add to i161594 %zext = zext i16 %bc to i321595 %v2f16 = bitcast i32 %zext to <2 x half>1596 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %v2f16, <2 x half> zeroinitializer)1597 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)1598 store <2 x half> %clamp, ptr addrspace(1) %out.gep1599 ret void1600}1601 1602; FIXME: Worse code pre-gfx91603 1604define <2 x half> @v_clamp_cvt_pkrtz_src_v2f16_denorm(float %a, float %b) #0 {1605; SI-LABEL: v_clamp_cvt_pkrtz_src_v2f16_denorm:1606; SI: ; %bb.0:1607; SI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1608; SI-NEXT: v_cvt_pkrtz_f16_f32_e32 v0, v0, v11609; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v01610; SI-NEXT: v_cvt_f32_f16_e64 v0, v0 clamp1611; SI-NEXT: v_cvt_f32_f16_e64 v1, v1 clamp1612; SI-NEXT: s_setpc_b64 s[30:31]1613;1614; GFX8-LABEL: v_clamp_cvt_pkrtz_src_v2f16_denorm:1615; GFX8: ; %bb.0:1616; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1617; GFX8-NEXT: v_cvt_pkrtz_f16_f32 v0, v0, v11618; GFX8-NEXT: v_max_f16_sdwa v1, v0, v0 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_11619; GFX8-NEXT: v_max_f16_e64 v0, v0, v0 clamp1620; GFX8-NEXT: v_or_b32_e32 v0, v0, v11621; GFX8-NEXT: s_setpc_b64 s[30:31]1622;1623; GFX9-LABEL: v_clamp_cvt_pkrtz_src_v2f16_denorm:1624; GFX9: ; %bb.0:1625; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1626; GFX9-NEXT: v_cvt_pkrtz_f16_f32 v0, v0, v1 clamp1627; GFX9-NEXT: s_setpc_b64 s[30:31]1628;1629; GFX11-LABEL: v_clamp_cvt_pkrtz_src_v2f16_denorm:1630; GFX11: ; %bb.0:1631; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1632; GFX11-NEXT: v_cvt_pk_rtz_f16_f32_e64 v0, v0, v1 clamp1633; GFX11-NEXT: s_setpc_b64 s[30:31]1634 %add = call <2 x half> @llvm.amdgcn.cvt.pkrtz(float %a, float %b)1635 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %add, <2 x half> zeroinitializer)1636 %clamp = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)1637 ret <2 x half> %clamp1638}1639 1640define amdgpu_kernel void @v_clamp_add_src_f32_minimumnum_maximumnum(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1641; SI-LABEL: v_clamp_add_src_f32_minimumnum_maximumnum:1642; SI: ; %bb.0:1643; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91644; SI-NEXT: s_mov_b32 s7, 0xf0001645; SI-NEXT: s_mov_b32 s6, 01646; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v01647; SI-NEXT: v_mov_b32_e32 v1, 01648; SI-NEXT: s_waitcnt lgkmcnt(0)1649; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1650; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641651; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1652; SI-NEXT: s_waitcnt vmcnt(0)1653; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp1654; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641655; SI-NEXT: s_endpgm1656;1657; GFX8-LABEL: v_clamp_add_src_f32_minimumnum_maximumnum:1658; GFX8: ; %bb.0:1659; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241660; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01661; GFX8-NEXT: s_waitcnt lgkmcnt(0)1662; GFX8-NEXT: v_mov_b32_e32 v1, s31663; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21664; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1665; GFX8-NEXT: flat_load_dword v3, v[0:1]1666; GFX8-NEXT: v_mov_b32_e32 v1, s11667; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21668; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1669; GFX8-NEXT: s_waitcnt vmcnt(0)1670; GFX8-NEXT: v_add_f32_e64 v2, v3, 1.0 clamp1671; GFX8-NEXT: flat_store_dword v[0:1], v21672; GFX8-NEXT: s_endpgm1673;1674; GFX9-LABEL: v_clamp_add_src_f32_minimumnum_maximumnum:1675; GFX9: ; %bb.0:1676; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241677; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01678; GFX9-NEXT: s_waitcnt lgkmcnt(0)1679; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1680; GFX9-NEXT: s_waitcnt vmcnt(0)1681; GFX9-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp1682; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1683; GFX9-NEXT: s_endpgm1684;1685; GFX11-LABEL: v_clamp_add_src_f32_minimumnum_maximumnum:1686; GFX11: ; %bb.0:1687; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241688; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01689; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1690; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01691; GFX11-NEXT: s_waitcnt lgkmcnt(0)1692; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1693; GFX11-NEXT: s_waitcnt vmcnt(0)1694; GFX11-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp1695; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1696; GFX11-NEXT: s_endpgm1697 %tid = call i32 @llvm.amdgcn.workitem.id.x()1698 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1699 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1700 %a = load float, ptr addrspace(1) %gep01701 %add = fadd float %a, 1.01702 %max = call float @llvm.maximumnum.f32(float %add, float 0.0)1703 %clamp = call float @llvm.minimumnum.f32(float %max, float 1.0)1704 store float %clamp, ptr addrspace(1) %out.gep1705 ret void1706}1707 1708define amdgpu_kernel void @v_clamp_add_neg_src_f32_minimumnum_maximumnum(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1709; SI-LABEL: v_clamp_add_neg_src_f32_minimumnum_maximumnum:1710; SI: ; %bb.0:1711; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91712; SI-NEXT: s_mov_b32 s7, 0xf0001713; SI-NEXT: s_mov_b32 s6, 01714; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v01715; SI-NEXT: v_mov_b32_e32 v1, 01716; SI-NEXT: s_waitcnt lgkmcnt(0)1717; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1718; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641719; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1720; SI-NEXT: s_waitcnt vmcnt(0)1721; SI-NEXT: v_floor_f32_e32 v2, v21722; SI-NEXT: v_max_f32_e64 v2, -v2, -v2 clamp1723; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641724; SI-NEXT: s_endpgm1725;1726; GFX8-LABEL: v_clamp_add_neg_src_f32_minimumnum_maximumnum:1727; GFX8: ; %bb.0:1728; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241729; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01730; GFX8-NEXT: s_waitcnt lgkmcnt(0)1731; GFX8-NEXT: v_mov_b32_e32 v1, s31732; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21733; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1734; GFX8-NEXT: flat_load_dword v3, v[0:1]1735; GFX8-NEXT: v_mov_b32_e32 v1, s11736; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21737; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1738; GFX8-NEXT: s_waitcnt vmcnt(0)1739; GFX8-NEXT: v_floor_f32_e32 v2, v31740; GFX8-NEXT: v_max_f32_e64 v2, -v2, -v2 clamp1741; GFX8-NEXT: flat_store_dword v[0:1], v21742; GFX8-NEXT: s_endpgm1743;1744; GFX9-LABEL: v_clamp_add_neg_src_f32_minimumnum_maximumnum:1745; GFX9: ; %bb.0:1746; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241747; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01748; GFX9-NEXT: s_waitcnt lgkmcnt(0)1749; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1750; GFX9-NEXT: s_waitcnt vmcnt(0)1751; GFX9-NEXT: v_floor_f32_e32 v1, v11752; GFX9-NEXT: v_max_f32_e64 v1, -v1, -v1 clamp1753; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1754; GFX9-NEXT: s_endpgm1755;1756; GFX11-LABEL: v_clamp_add_neg_src_f32_minimumnum_maximumnum:1757; GFX11: ; %bb.0:1758; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241759; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01760; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)1761; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01762; GFX11-NEXT: s_waitcnt lgkmcnt(0)1763; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1764; GFX11-NEXT: s_waitcnt vmcnt(0)1765; GFX11-NEXT: v_floor_f32_e32 v1, v11766; GFX11-NEXT: v_max_f32_e64 v1, -v1, -v1 clamp1767; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1768; GFX11-NEXT: s_endpgm1769 %tid = call i32 @llvm.amdgcn.workitem.id.x()1770 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1771 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1772 %a = load float, ptr addrspace(1) %gep01773 %floor = call float @llvm.floor.f32(float %a)1774 %neg.floor = fneg float %floor1775 %max = call float @llvm.maximumnum.f32(float %neg.floor, float 0.0)1776 %clamp = call float @llvm.minimumnum.f32(float %max, float 1.0)1777 store float %clamp, ptr addrspace(1) %out.gep1778 ret void1779}1780 1781 1782define amdgpu_kernel void @v_clamp_add_src_f64_minimumnum_maximumnum(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1783; SI-LABEL: v_clamp_add_src_f64_minimumnum_maximumnum:1784; SI: ; %bb.0:1785; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91786; SI-NEXT: s_mov_b32 s7, 0xf0001787; SI-NEXT: s_mov_b32 s6, 01788; SI-NEXT: v_lshlrev_b32_e32 v0, 3, v01789; SI-NEXT: v_mov_b32_e32 v1, 01790; SI-NEXT: s_waitcnt lgkmcnt(0)1791; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1792; SI-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr641793; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1794; SI-NEXT: s_waitcnt vmcnt(0)1795; SI-NEXT: v_add_f64 v[2:3], v[2:3], 1.0 clamp1796; SI-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr641797; SI-NEXT: s_endpgm1798;1799; GFX8-LABEL: v_clamp_add_src_f64_minimumnum_maximumnum:1800; GFX8: ; %bb.0:1801; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241802; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v01803; GFX8-NEXT: s_waitcnt lgkmcnt(0)1804; GFX8-NEXT: v_mov_b32_e32 v1, s31805; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21806; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1807; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]1808; GFX8-NEXT: v_mov_b32_e32 v3, s11809; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v21810; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1811; GFX8-NEXT: s_waitcnt vmcnt(0)1812; GFX8-NEXT: v_add_f64 v[0:1], v[0:1], 1.0 clamp1813; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1814; GFX8-NEXT: s_endpgm1815;1816; GFX9-LABEL: v_clamp_add_src_f64_minimumnum_maximumnum:1817; GFX9: ; %bb.0:1818; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241819; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v01820; GFX9-NEXT: s_waitcnt lgkmcnt(0)1821; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]1822; GFX9-NEXT: s_waitcnt vmcnt(0)1823; GFX9-NEXT: v_add_f64 v[0:1], v[0:1], 1.0 clamp1824; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1825; GFX9-NEXT: s_endpgm1826;1827; GFX11-LABEL: v_clamp_add_src_f64_minimumnum_maximumnum:1828; GFX11: ; %bb.0:1829; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241830; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01831; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1832; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v01833; GFX11-NEXT: s_waitcnt lgkmcnt(0)1834; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]1835; GFX11-NEXT: s_waitcnt vmcnt(0)1836; GFX11-NEXT: v_add_f64 v[0:1], v[0:1], 1.0 clamp1837; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1838; GFX11-NEXT: s_endpgm1839 %tid = call i32 @llvm.amdgcn.workitem.id.x()1840 %gep0 = getelementptr double, ptr addrspace(1) %aptr, i32 %tid1841 %out.gep = getelementptr double, ptr addrspace(1) %out, i32 %tid1842 %a = load double, ptr addrspace(1) %gep01843 %add = fadd double %a, 1.01844 %max = call double @llvm.maximumnum.f64(double %add, double 0.0)1845 %clamp = call double @llvm.minimumnum.f64(double %max, double 1.0)1846 store double %clamp, ptr addrspace(1) %out.gep1847 ret void1848}1849 1850define amdgpu_kernel void @v_clamp_add_src_f32_denormals_minimumnum_maximumnum(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {1851; SI-LABEL: v_clamp_add_src_f32_denormals_minimumnum_maximumnum:1852; SI: ; %bb.0:1853; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91854; SI-NEXT: s_mov_b32 s7, 0xf0001855; SI-NEXT: s_mov_b32 s6, 01856; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v01857; SI-NEXT: v_mov_b32_e32 v1, 01858; SI-NEXT: s_waitcnt lgkmcnt(0)1859; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1860; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641861; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1862; SI-NEXT: s_waitcnt vmcnt(0)1863; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp1864; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641865; SI-NEXT: s_endpgm1866;1867; GFX8-LABEL: v_clamp_add_src_f32_denormals_minimumnum_maximumnum:1868; GFX8: ; %bb.0:1869; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241870; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01871; GFX8-NEXT: s_waitcnt lgkmcnt(0)1872; GFX8-NEXT: v_mov_b32_e32 v1, s31873; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21874; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1875; GFX8-NEXT: flat_load_dword v3, v[0:1]1876; GFX8-NEXT: v_mov_b32_e32 v1, s11877; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21878; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1879; GFX8-NEXT: s_waitcnt vmcnt(0)1880; GFX8-NEXT: v_add_f32_e64 v2, v3, 1.0 clamp1881; GFX8-NEXT: flat_store_dword v[0:1], v21882; GFX8-NEXT: s_endpgm1883;1884; GFX9-LABEL: v_clamp_add_src_f32_denormals_minimumnum_maximumnum:1885; GFX9: ; %bb.0:1886; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241887; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01888; GFX9-NEXT: s_waitcnt lgkmcnt(0)1889; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1890; GFX9-NEXT: s_waitcnt vmcnt(0)1891; GFX9-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp1892; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1893; GFX9-NEXT: s_endpgm1894;1895; GFX11-LABEL: v_clamp_add_src_f32_denormals_minimumnum_maximumnum:1896; GFX11: ; %bb.0:1897; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241898; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01899; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1900; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01901; GFX11-NEXT: s_waitcnt lgkmcnt(0)1902; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1903; GFX11-NEXT: s_waitcnt vmcnt(0)1904; GFX11-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp1905; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1906; GFX11-NEXT: s_endpgm1907 %tid = call i32 @llvm.amdgcn.workitem.id.x()1908 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1909 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1910 %a = load float, ptr addrspace(1) %gep01911 %add = fadd float %a, 1.01912 %max = call float @llvm.maximumnum.f32(float %add, float 0.0)1913 %clamp = call float @llvm.minimumnum.f32(float %max, float 1.0)1914 store float %clamp, ptr addrspace(1) %out.gep1915 ret void1916}1917 1918define amdgpu_kernel void @v_clamp_add_src_f16_denorm_minimumnum_maximumnum(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1919; SI-LABEL: v_clamp_add_src_f16_denorm_minimumnum_maximumnum:1920; SI: ; %bb.0:1921; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91922; SI-NEXT: s_mov_b32 s7, 0xf0001923; SI-NEXT: s_mov_b32 s6, 01924; SI-NEXT: v_lshlrev_b32_e32 v0, 1, v01925; SI-NEXT: v_mov_b32_e32 v1, 01926; SI-NEXT: s_waitcnt lgkmcnt(0)1927; SI-NEXT: s_mov_b64 s[4:5], s[2:3]1928; SI-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr641929; SI-NEXT: s_mov_b64 s[2:3], s[6:7]1930; SI-NEXT: s_waitcnt vmcnt(0)1931; SI-NEXT: v_cvt_f32_f16_e32 v2, v21932; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp1933; SI-NEXT: v_cvt_f16_f32_e32 v2, v21934; SI-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr641935; SI-NEXT: s_endpgm1936;1937; GFX8-LABEL: v_clamp_add_src_f16_denorm_minimumnum_maximumnum:1938; GFX8: ; %bb.0:1939; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241940; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v01941; GFX8-NEXT: s_waitcnt lgkmcnt(0)1942; GFX8-NEXT: v_mov_b32_e32 v1, s31943; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21944; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1945; GFX8-NEXT: flat_load_ushort v3, v[0:1]1946; GFX8-NEXT: v_mov_b32_e32 v1, s11947; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21948; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1949; GFX8-NEXT: s_waitcnt vmcnt(0)1950; GFX8-NEXT: v_add_f16_e64 v2, v3, 1.0 clamp1951; GFX8-NEXT: flat_store_short v[0:1], v21952; GFX8-NEXT: s_endpgm1953;1954; GFX9-LABEL: v_clamp_add_src_f16_denorm_minimumnum_maximumnum:1955; GFX9: ; %bb.0:1956; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241957; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v01958; GFX9-NEXT: s_waitcnt lgkmcnt(0)1959; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]1960; GFX9-NEXT: s_waitcnt vmcnt(0)1961; GFX9-NEXT: v_add_f16_e64 v1, v1, 1.0 clamp1962; GFX9-NEXT: global_store_short v0, v1, s[0:1]1963; GFX9-NEXT: s_endpgm1964;1965; GFX11-TRUE16-LABEL: v_clamp_add_src_f16_denorm_minimumnum_maximumnum:1966; GFX11-TRUE16: ; %bb.0:1967; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241968; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v01969; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1970; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v01971; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)1972; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]1973; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)1974; GFX11-TRUE16-NEXT: v_add_f16_e64 v0.l, v0.l, 1.0 clamp1975; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]1976; GFX11-TRUE16-NEXT: s_endpgm1977;1978; GFX11-FAKE16-LABEL: v_clamp_add_src_f16_denorm_minimumnum_maximumnum:1979; GFX11-FAKE16: ; %bb.0:1980; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x241981; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v01982; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)1983; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v01984; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)1985; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]1986; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)1987; GFX11-FAKE16-NEXT: v_add_f16_e64 v1, v1, 1.0 clamp1988; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]1989; GFX11-FAKE16-NEXT: s_endpgm1990 %tid = call i32 @llvm.amdgcn.workitem.id.x()1991 %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid1992 %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid1993 %a = load half, ptr addrspace(1) %gep01994 %add = fadd half %a, 1.01995 %max = call half @llvm.maximumnum.f16(half %add, half 0.0)1996 %clamp = call half @llvm.minimumnum.f16(half %max, half 1.0)1997 store half %clamp, ptr addrspace(1) %out.gep1998 ret void1999}2000 2001define amdgpu_kernel void @v_clamp_add_src_f16_no_denormals_minimumnum_maximumnum(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #3 {2002; SI-LABEL: v_clamp_add_src_f16_no_denormals_minimumnum_maximumnum:2003; SI: ; %bb.0:2004; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92005; SI-NEXT: s_mov_b32 s7, 0xf0002006; SI-NEXT: s_mov_b32 s6, 02007; SI-NEXT: v_lshlrev_b32_e32 v0, 1, v02008; SI-NEXT: v_mov_b32_e32 v1, 02009; SI-NEXT: s_waitcnt lgkmcnt(0)2010; SI-NEXT: s_mov_b64 s[4:5], s[2:3]2011; SI-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr642012; SI-NEXT: s_mov_b64 s[2:3], s[6:7]2013; SI-NEXT: s_waitcnt vmcnt(0)2014; SI-NEXT: v_cvt_f32_f16_e32 v2, v22015; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp2016; SI-NEXT: v_cvt_f16_f32_e32 v2, v22017; SI-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr642018; SI-NEXT: s_endpgm2019;2020; GFX8-LABEL: v_clamp_add_src_f16_no_denormals_minimumnum_maximumnum:2021; GFX8: ; %bb.0:2022; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242023; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v02024; GFX8-NEXT: s_waitcnt lgkmcnt(0)2025; GFX8-NEXT: v_mov_b32_e32 v1, s32026; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22027; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2028; GFX8-NEXT: flat_load_ushort v3, v[0:1]2029; GFX8-NEXT: v_mov_b32_e32 v1, s12030; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22031; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2032; GFX8-NEXT: s_waitcnt vmcnt(0)2033; GFX8-NEXT: v_add_f16_e64 v2, v3, 1.0 clamp2034; GFX8-NEXT: flat_store_short v[0:1], v22035; GFX8-NEXT: s_endpgm2036;2037; GFX9-LABEL: v_clamp_add_src_f16_no_denormals_minimumnum_maximumnum:2038; GFX9: ; %bb.0:2039; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242040; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v02041; GFX9-NEXT: s_waitcnt lgkmcnt(0)2042; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]2043; GFX9-NEXT: s_waitcnt vmcnt(0)2044; GFX9-NEXT: v_add_f16_e64 v1, v1, 1.0 clamp2045; GFX9-NEXT: global_store_short v0, v1, s[0:1]2046; GFX9-NEXT: s_endpgm2047;2048; GFX11-TRUE16-LABEL: v_clamp_add_src_f16_no_denormals_minimumnum_maximumnum:2049; GFX11-TRUE16: ; %bb.0:2050; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x242051; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02052; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2053; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v02054; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)2055; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]2056; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)2057; GFX11-TRUE16-NEXT: v_add_f16_e64 v0.l, v0.l, 1.0 clamp2058; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]2059; GFX11-TRUE16-NEXT: s_endpgm2060;2061; GFX11-FAKE16-LABEL: v_clamp_add_src_f16_no_denormals_minimumnum_maximumnum:2062; GFX11-FAKE16: ; %bb.0:2063; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x242064; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02065; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2066; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v02067; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)2068; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]2069; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)2070; GFX11-FAKE16-NEXT: v_add_f16_e64 v1, v1, 1.0 clamp2071; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]2072; GFX11-FAKE16-NEXT: s_endpgm2073 %tid = call i32 @llvm.amdgcn.workitem.id.x()2074 %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid2075 %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid2076 %a = load half, ptr addrspace(1) %gep02077 %add = fadd half %a, 1.02078 %max = call half @llvm.maximumnum.f16(half %add, half 0.0)2079 %clamp = call half @llvm.minimumnum.f16(half %max, half 1.0)2080 store half %clamp, ptr addrspace(1) %out.gep2081 ret void2082}2083 2084define amdgpu_kernel void @v_clamp_add_src_v2f32_minimumnum_maximumnum(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {2085; SI-LABEL: v_clamp_add_src_v2f32_minimumnum_maximumnum:2086; SI: ; %bb.0:2087; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92088; SI-NEXT: s_mov_b32 s7, 0xf0002089; SI-NEXT: s_mov_b32 s6, 02090; SI-NEXT: v_lshlrev_b32_e32 v0, 3, v02091; SI-NEXT: v_mov_b32_e32 v1, 02092; SI-NEXT: s_waitcnt lgkmcnt(0)2093; SI-NEXT: s_mov_b64 s[4:5], s[2:3]2094; SI-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr642095; SI-NEXT: s_mov_b64 s[2:3], s[6:7]2096; SI-NEXT: s_waitcnt vmcnt(0)2097; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp2098; SI-NEXT: v_add_f32_e64 v3, v3, 1.0 clamp2099; SI-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr642100; SI-NEXT: s_endpgm2101;2102; GFX8-LABEL: v_clamp_add_src_v2f32_minimumnum_maximumnum:2103; GFX8: ; %bb.0:2104; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242105; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v02106; GFX8-NEXT: s_waitcnt lgkmcnt(0)2107; GFX8-NEXT: v_mov_b32_e32 v1, s32108; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22109; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2110; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]2111; GFX8-NEXT: v_mov_b32_e32 v3, s12112; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v22113; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc2114; GFX8-NEXT: s_waitcnt vmcnt(0)2115; GFX8-NEXT: v_add_f32_e64 v0, v0, 1.0 clamp2116; GFX8-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp2117; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2118; GFX8-NEXT: s_endpgm2119;2120; GFX9-LABEL: v_clamp_add_src_v2f32_minimumnum_maximumnum:2121; GFX9: ; %bb.0:2122; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242123; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v02124; GFX9-NEXT: s_waitcnt lgkmcnt(0)2125; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]2126; GFX9-NEXT: s_waitcnt vmcnt(0)2127; GFX9-NEXT: v_add_f32_e64 v0, v0, 1.0 clamp2128; GFX9-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp2129; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]2130; GFX9-NEXT: s_endpgm2131;2132; GFX11-LABEL: v_clamp_add_src_v2f32_minimumnum_maximumnum:2133; GFX11: ; %bb.0:2134; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242135; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02136; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2137; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v02138; GFX11-NEXT: s_waitcnt lgkmcnt(0)2139; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]2140; GFX11-NEXT: s_waitcnt vmcnt(0)2141; GFX11-NEXT: v_add_f32_e64 v0, v0, 1.0 clamp2142; GFX11-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp2143; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]2144; GFX11-NEXT: s_endpgm2145 %tid = call i32 @llvm.amdgcn.workitem.id.x()2146 %gep0 = getelementptr <2 x float>, ptr addrspace(1) %aptr, i32 %tid2147 %out.gep = getelementptr <2 x float>, ptr addrspace(1) %out, i32 %tid2148 %a = load <2 x float>, ptr addrspace(1) %gep02149 %add = fadd <2 x float> %a, <float 1.0, float 1.0>2150 %max = call <2 x float> @llvm.maximumnum.v2f32(<2 x float> %add, <2 x float> zeroinitializer)2151 %clamp = call <2 x float> @llvm.minimumnum.v2f32(<2 x float> %max, <2 x float> <float 1.0, float 1.0>)2152 store <2 x float> %clamp, ptr addrspace(1) %out.gep2153 ret void2154}2155 2156define amdgpu_kernel void @v_clamp_add_src_v2f16_denorm_minimumnum_maximumnum(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {2157; SI-LABEL: v_clamp_add_src_v2f16_denorm_minimumnum_maximumnum:2158; SI: ; %bb.0:2159; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92160; SI-NEXT: s_mov_b32 s7, 0xf0002161; SI-NEXT: s_mov_b32 s6, 02162; SI-NEXT: v_lshlrev_b32_e32 v0, 2, v02163; SI-NEXT: v_mov_b32_e32 v1, 02164; SI-NEXT: s_waitcnt lgkmcnt(0)2165; SI-NEXT: s_mov_b64 s[4:5], s[2:3]2166; SI-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642167; SI-NEXT: s_mov_b64 s[2:3], s[6:7]2168; SI-NEXT: s_waitcnt vmcnt(0)2169; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v22170; SI-NEXT: v_cvt_f32_f16_e32 v3, v32171; SI-NEXT: v_cvt_f32_f16_e32 v2, v22172; SI-NEXT: v_add_f32_e64 v3, v3, 1.0 clamp2173; SI-NEXT: v_add_f32_e64 v2, v2, 1.0 clamp2174; SI-NEXT: v_cvt_f16_f32_e32 v3, v32175; SI-NEXT: v_cvt_f16_f32_e32 v2, v22176; SI-NEXT: v_lshlrev_b32_e32 v3, 16, v32177; SI-NEXT: v_or_b32_e32 v2, v2, v32178; SI-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642179; SI-NEXT: s_endpgm2180;2181; GFX8-LABEL: v_clamp_add_src_v2f16_denorm_minimumnum_maximumnum:2182; GFX8: ; %bb.0:2183; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242184; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02185; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c002186; GFX8-NEXT: s_waitcnt lgkmcnt(0)2187; GFX8-NEXT: v_mov_b32_e32 v1, s32188; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22189; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2190; GFX8-NEXT: flat_load_dword v3, v[0:1]2191; GFX8-NEXT: v_mov_b32_e32 v1, s12192; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22193; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2194; GFX8-NEXT: s_waitcnt vmcnt(0)2195; GFX8-NEXT: v_add_f16_e64 v2, v3, 1.0 clamp2196; GFX8-NEXT: v_add_f16_sdwa v3, v3, v4 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2197; GFX8-NEXT: v_or_b32_e32 v2, v2, v32198; GFX8-NEXT: flat_store_dword v[0:1], v22199; GFX8-NEXT: s_endpgm2200;2201; GFX9-LABEL: v_clamp_add_src_v2f16_denorm_minimumnum_maximumnum:2202; GFX9: ; %bb.0:2203; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242204; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02205; GFX9-NEXT: s_waitcnt lgkmcnt(0)2206; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2207; GFX9-NEXT: s_waitcnt vmcnt(0)2208; GFX9-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0] clamp2209; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2210; GFX9-NEXT: s_endpgm2211;2212; GFX11-LABEL: v_clamp_add_src_v2f16_denorm_minimumnum_maximumnum:2213; GFX11: ; %bb.0:2214; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242215; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02216; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2217; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02218; GFX11-NEXT: s_waitcnt lgkmcnt(0)2219; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2220; GFX11-NEXT: s_waitcnt vmcnt(0)2221; GFX11-NEXT: v_pk_add_f16 v1, v1, 1.0 op_sel_hi:[1,0] clamp2222; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2223; GFX11-NEXT: s_endpgm2224 %tid = call i32 @llvm.amdgcn.workitem.id.x()2225 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid2226 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid2227 %a = load <2 x half>, ptr addrspace(1) %gep02228 %add = fadd <2 x half> %a, <half 1.0, half 1.0>2229 %max = call <2 x half> @llvm.maximumnum.v2f16(<2 x half> %add, <2 x half> zeroinitializer)2230 %clamp = call <2 x half> @llvm.minimumnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)2231 store <2 x half> %clamp, ptr addrspace(1) %out.gep2232 ret void2233}2234 2235declare i32 @llvm.amdgcn.workitem.id.x() #12236declare float @llvm.fabs.f32(float) #12237declare float @llvm.floor.f32(float) #12238declare float @llvm.minnum.f32(float, float) #12239declare float @llvm.maxnum.f32(float, float) #12240declare float @llvm.amdgcn.fmed3.f32(float, float, float) #12241declare double @llvm.fabs.f64(double) #12242declare double @llvm.minnum.f64(double, double) #12243declare double @llvm.maxnum.f64(double, double) #12244declare half @llvm.fabs.f16(half) #12245declare half @llvm.minnum.f16(half, half) #12246declare half @llvm.maxnum.f16(half, half) #12247declare <2 x half> @llvm.minnum.v2f16(<2 x half>, <2 x half>) #12248declare <2 x half> @llvm.maxnum.v2f16(<2 x half>, <2 x half>) #12249declare <2 x float> @llvm.minnum.v2f32(<2 x float>, <2 x float>) #12250declare <2 x float> @llvm.maxnum.v2f32(<2 x float>, <2 x float>) #12251declare <2 x half> @llvm.amdgcn.cvt.pkrtz(float, float) #12252 2253 2254declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #12255 2256attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }2257attributes #1 = { nounwind readnone }2258attributes #2 = { nounwind "denormal-fp-math-f32"="ieee,ieee" }2259attributes #3 = { nounwind "denormal-fp-math-f32"="ieee,ieee" "denormal-fp-math"="preserve-sign,preserve-sign" }2260 2261!llvm.dbg.cu = !{!0}2262!llvm.module.flags = !{!2, !3}2263 2264!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: NoDebug)2265!1 = !DIFile(filename: "/tmp/foo.cl", directory: "/dev/null")2266!2 = !{i32 2, !"Dwarf Version", i32 4}2267!3 = !{i32 2, !"Debug Info Version", i32 3}2268!4 = !DILocalVariable(name: "add", arg: 1, scope: !5, file: !1, line: 1)2269!5 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !0)2270!6 = !DISubroutineType(types: !7)2271!7 = !{null, !8}2272!8 = !DIBasicType(name: "float", size: 32, align: 32)2273!9 = !DIExpression()2274!10 = !DILocation(line: 1, column: 42, scope: !5)2275