4739 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GFX6 %s3; RUN: llc -mtriple=amdgcn -mcpu=fiji < %s | FileCheck -check-prefixes=GFX8 %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9 %s5; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s6; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s7; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-TRUE16 %s8; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-FAKE16 %s9 10define amdgpu_kernel void @v_clamp_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {11; GFX6-LABEL: v_clamp_f32:12; GFX6: ; %bb.0:13; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x914; GFX6-NEXT: s_mov_b32 s7, 0xf00015; GFX6-NEXT: s_mov_b32 s6, 016; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v017; GFX6-NEXT: v_mov_b32_e32 v1, 018; GFX6-NEXT: s_waitcnt lgkmcnt(0)19; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]20; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr6421; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]22; GFX6-NEXT: s_waitcnt vmcnt(0)23; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp24; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr6425; GFX6-NEXT: s_endpgm26;27; GFX8-LABEL: v_clamp_f32:28; GFX8: ; %bb.0:29; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2430; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v031; GFX8-NEXT: s_waitcnt lgkmcnt(0)32; GFX8-NEXT: v_mov_b32_e32 v1, s333; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v234; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc35; GFX8-NEXT: flat_load_dword v3, v[0:1]36; GFX8-NEXT: v_mov_b32_e32 v1, s137; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v238; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc39; GFX8-NEXT: s_waitcnt vmcnt(0)40; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp41; GFX8-NEXT: flat_store_dword v[0:1], v242; GFX8-NEXT: s_endpgm43;44; GFX9-LABEL: v_clamp_f32:45; GFX9: ; %bb.0:46; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2447; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v048; GFX9-NEXT: s_waitcnt lgkmcnt(0)49; GFX9-NEXT: global_load_dword v1, v0, s[2:3]50; GFX9-NEXT: s_waitcnt vmcnt(0)51; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp52; GFX9-NEXT: global_store_dword v0, v1, s[0:1]53; GFX9-NEXT: s_endpgm54;55; GFX11-LABEL: v_clamp_f32:56; GFX11: ; %bb.0:57; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x2458; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v059; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)60; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v061; GFX11-NEXT: s_waitcnt lgkmcnt(0)62; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]63; GFX11-NEXT: s_waitcnt vmcnt(0)64; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp65; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]66; GFX11-NEXT: s_endpgm67;68; GFX12-LABEL: v_clamp_f32:69; GFX12: ; %bb.0:70; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x2471; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v072; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)73; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v074; GFX12-NEXT: s_wait_kmcnt 0x075; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]76; GFX12-NEXT: s_wait_loadcnt 0x077; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp78; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]79; GFX12-NEXT: s_endpgm80 %tid = call i32 @llvm.amdgcn.workitem.id.x()81 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid82 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid83 %a = load float, ptr addrspace(1) %gep084 %max = call float @llvm.maxnum.f32(float %a, float 0.0)85 %med = call float @llvm.minnum.f32(float %max, float 1.0)86 87 store float %med, ptr addrspace(1) %out.gep88 ret void89}90 91define amdgpu_kernel void @v_clamp_neg_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {92; GFX6-LABEL: v_clamp_neg_f32:93; GFX6: ; %bb.0:94; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x995; GFX6-NEXT: s_mov_b32 s7, 0xf00096; GFX6-NEXT: s_mov_b32 s6, 097; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v098; GFX6-NEXT: v_mov_b32_e32 v1, 099; GFX6-NEXT: s_waitcnt lgkmcnt(0)100; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]101; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64102; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]103; GFX6-NEXT: s_waitcnt vmcnt(0)104; GFX6-NEXT: v_max_f32_e64 v2, -v2, -v2 clamp105; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64106; GFX6-NEXT: s_endpgm107;108; GFX8-LABEL: v_clamp_neg_f32:109; GFX8: ; %bb.0:110; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24111; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0112; GFX8-NEXT: s_waitcnt lgkmcnt(0)113; GFX8-NEXT: v_mov_b32_e32 v1, s3114; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2115; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc116; GFX8-NEXT: flat_load_dword v3, v[0:1]117; GFX8-NEXT: v_mov_b32_e32 v1, s1118; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2119; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc120; GFX8-NEXT: s_waitcnt vmcnt(0)121; GFX8-NEXT: v_max_f32_e64 v2, -v3, -v3 clamp122; GFX8-NEXT: flat_store_dword v[0:1], v2123; GFX8-NEXT: s_endpgm124;125; GFX9-LABEL: v_clamp_neg_f32:126; GFX9: ; %bb.0:127; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24128; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0129; GFX9-NEXT: s_waitcnt lgkmcnt(0)130; GFX9-NEXT: global_load_dword v1, v0, s[2:3]131; GFX9-NEXT: s_waitcnt vmcnt(0)132; GFX9-NEXT: v_max_f32_e64 v1, -v1, -v1 clamp133; GFX9-NEXT: global_store_dword v0, v1, s[0:1]134; GFX9-NEXT: s_endpgm135;136; GFX11-LABEL: v_clamp_neg_f32:137; GFX11: ; %bb.0:138; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24139; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0140; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)141; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0142; GFX11-NEXT: s_waitcnt lgkmcnt(0)143; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]144; GFX11-NEXT: s_waitcnt vmcnt(0)145; GFX11-NEXT: v_max_f32_e64 v1, -v1, -v1 clamp146; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]147; GFX11-NEXT: s_endpgm148;149; GFX12-LABEL: v_clamp_neg_f32:150; GFX12: ; %bb.0:151; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x24152; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v0153; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)154; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v0155; GFX12-NEXT: s_wait_kmcnt 0x0156; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]157; GFX12-NEXT: s_wait_loadcnt 0x0158; GFX12-NEXT: v_max_num_f32_e64 v1, -v1, -v1 clamp159; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]160; GFX12-NEXT: s_endpgm161 %tid = call i32 @llvm.amdgcn.workitem.id.x()162 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid163 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid164 %a = load float, ptr addrspace(1) %gep0165 %fneg.a = fneg float %a166 %max = call float @llvm.maxnum.f32(float %fneg.a, float 0.0)167 %med = call float @llvm.minnum.f32(float %max, float 1.0)168 169 store float %med, ptr addrspace(1) %out.gep170 ret void171}172 173define amdgpu_kernel void @v_clamp_negabs_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {174; GFX6-LABEL: v_clamp_negabs_f32:175; GFX6: ; %bb.0:176; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9177; GFX6-NEXT: s_mov_b32 s7, 0xf000178; GFX6-NEXT: s_mov_b32 s6, 0179; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0180; GFX6-NEXT: v_mov_b32_e32 v1, 0181; GFX6-NEXT: s_waitcnt lgkmcnt(0)182; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]183; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64184; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]185; GFX6-NEXT: s_waitcnt vmcnt(0)186; GFX6-NEXT: v_max_f32_e64 v2, -|v2|, -|v2| clamp187; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64188; GFX6-NEXT: s_endpgm189;190; GFX8-LABEL: v_clamp_negabs_f32:191; GFX8: ; %bb.0:192; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24193; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0194; GFX8-NEXT: s_waitcnt lgkmcnt(0)195; GFX8-NEXT: v_mov_b32_e32 v1, s3196; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2197; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc198; GFX8-NEXT: flat_load_dword v3, v[0:1]199; GFX8-NEXT: v_mov_b32_e32 v1, s1200; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2201; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc202; GFX8-NEXT: s_waitcnt vmcnt(0)203; GFX8-NEXT: v_max_f32_e64 v2, -|v3|, -|v3| clamp204; GFX8-NEXT: flat_store_dword v[0:1], v2205; GFX8-NEXT: s_endpgm206;207; GFX9-LABEL: v_clamp_negabs_f32:208; GFX9: ; %bb.0:209; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24210; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0211; GFX9-NEXT: s_waitcnt lgkmcnt(0)212; GFX9-NEXT: global_load_dword v1, v0, s[2:3]213; GFX9-NEXT: s_waitcnt vmcnt(0)214; GFX9-NEXT: v_max_f32_e64 v1, -|v1|, -|v1| clamp215; GFX9-NEXT: global_store_dword v0, v1, s[0:1]216; GFX9-NEXT: s_endpgm217;218; GFX11-LABEL: v_clamp_negabs_f32:219; GFX11: ; %bb.0:220; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24221; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0222; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)223; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0224; GFX11-NEXT: s_waitcnt lgkmcnt(0)225; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]226; GFX11-NEXT: s_waitcnt vmcnt(0)227; GFX11-NEXT: v_max_f32_e64 v1, -|v1|, -|v1| clamp228; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]229; GFX11-NEXT: s_endpgm230;231; GFX12-LABEL: v_clamp_negabs_f32:232; GFX12: ; %bb.0:233; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x24234; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v0235; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)236; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v0237; GFX12-NEXT: s_wait_kmcnt 0x0238; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]239; GFX12-NEXT: s_wait_loadcnt 0x0240; GFX12-NEXT: v_max_num_f32_e64 v1, -|v1|, -|v1| clamp241; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]242; GFX12-NEXT: s_endpgm243 %tid = call i32 @llvm.amdgcn.workitem.id.x()244 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid245 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid246 %a = load float, ptr addrspace(1) %gep0247 %fabs.a = call float @llvm.fabs.f32(float %a)248 %fneg.fabs.a = fneg float %fabs.a249 250 %max = call float @llvm.maxnum.f32(float %fneg.fabs.a, float 0.0)251 %med = call float @llvm.minnum.f32(float %max, float 1.0)252 253 store float %med, ptr addrspace(1) %out.gep254 ret void255}256 257define amdgpu_kernel void @v_clamp_negzero_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {258; GFX6-LABEL: v_clamp_negzero_f32:259; GFX6: ; %bb.0:260; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9261; GFX6-NEXT: s_mov_b32 s7, 0xf000262; GFX6-NEXT: s_mov_b32 s6, 0263; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0264; GFX6-NEXT: v_mov_b32_e32 v1, 0265; GFX6-NEXT: s_waitcnt lgkmcnt(0)266; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]267; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64268; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]269; GFX6-NEXT: s_waitcnt vmcnt(0)270; GFX6-NEXT: v_add_f32_e32 v2, 0.5, v2271; GFX6-NEXT: v_max_f32_e32 v2, 0x80000000, v2272; GFX6-NEXT: v_min_f32_e32 v2, 1.0, v2273; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64274; GFX6-NEXT: s_endpgm275;276; GFX8-LABEL: v_clamp_negzero_f32:277; GFX8: ; %bb.0:278; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24279; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0280; GFX8-NEXT: s_waitcnt lgkmcnt(0)281; GFX8-NEXT: v_mov_b32_e32 v1, s3282; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2283; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc284; GFX8-NEXT: flat_load_dword v3, v[0:1]285; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2286; GFX8-NEXT: v_mov_b32_e32 v1, s1287; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc288; GFX8-NEXT: s_waitcnt vmcnt(0)289; GFX8-NEXT: v_add_f32_e32 v2, 0.5, v3290; GFX8-NEXT: v_max_f32_e32 v2, 0x80000000, v2291; GFX8-NEXT: v_min_f32_e32 v2, 1.0, v2292; GFX8-NEXT: flat_store_dword v[0:1], v2293; GFX8-NEXT: s_endpgm294;295; GFX9-LABEL: v_clamp_negzero_f32:296; GFX9: ; %bb.0:297; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24298; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0299; GFX9-NEXT: s_waitcnt lgkmcnt(0)300; GFX9-NEXT: global_load_dword v1, v0, s[2:3]301; GFX9-NEXT: s_waitcnt vmcnt(0)302; GFX9-NEXT: v_add_f32_e32 v1, 0.5, v1303; GFX9-NEXT: v_max_f32_e32 v1, 0x80000000, v1304; GFX9-NEXT: v_min_f32_e32 v1, 1.0, v1305; GFX9-NEXT: global_store_dword v0, v1, s[0:1]306; GFX9-NEXT: s_endpgm307;308; GFX11-LABEL: v_clamp_negzero_f32:309; GFX11: ; %bb.0:310; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24311; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0312; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)313; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0314; GFX11-NEXT: s_waitcnt lgkmcnt(0)315; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]316; GFX11-NEXT: s_waitcnt vmcnt(0)317; GFX11-NEXT: v_add_f32_e32 v1, 0.5, v1318; GFX11-NEXT: v_maxmin_f32 v1, v1, 0x80000000, 1.0319; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]320; GFX11-NEXT: s_endpgm321;322; GFX12-LABEL: v_clamp_negzero_f32:323; GFX12: ; %bb.0:324; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x24325; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v0326; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)327; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v0328; GFX12-NEXT: s_wait_kmcnt 0x0329; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]330; GFX12-NEXT: s_wait_loadcnt 0x0331; GFX12-NEXT: v_add_f32_e32 v1, 0.5, v1332; GFX12-NEXT: v_maxmin_num_f32 v1, v1, 0x80000000, 1.0333; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]334; GFX12-NEXT: s_endpgm335 %tid = call i32 @llvm.amdgcn.workitem.id.x()336 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid337 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid338 %a = load float, ptr addrspace(1) %gep0339 %add = fadd nnan float %a, 0.5340 %max = call float @llvm.maxnum.f32(float %add, float -0.0)341 %med = call float @llvm.minnum.f32(float %max, float 1.0)342 343 store float %med, ptr addrspace(1) %out.gep344 ret void345}346 347; FIXME: Weird inconsistency in how -0.0 is treated. Accepted if clamp348; matched through med3, not if directly. Is this correct?349define amdgpu_kernel void @v_clamp_negzero_maybe_snan_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {350; GFX6-LABEL: v_clamp_negzero_maybe_snan_f32:351; GFX6: ; %bb.0:352; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9353; GFX6-NEXT: s_mov_b32 s7, 0xf000354; GFX6-NEXT: s_mov_b32 s6, 0355; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0356; GFX6-NEXT: v_mov_b32_e32 v1, 0357; GFX6-NEXT: s_waitcnt lgkmcnt(0)358; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]359; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64360; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]361; GFX6-NEXT: s_waitcnt vmcnt(0)362; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2363; GFX6-NEXT: v_max_f32_e32 v2, 0x80000000, v2364; GFX6-NEXT: v_min_f32_e32 v2, 1.0, v2365; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64366; GFX6-NEXT: s_endpgm367;368; GFX8-LABEL: v_clamp_negzero_maybe_snan_f32:369; GFX8: ; %bb.0:370; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24371; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0372; GFX8-NEXT: s_waitcnt lgkmcnt(0)373; GFX8-NEXT: v_mov_b32_e32 v1, s3374; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2375; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc376; GFX8-NEXT: flat_load_dword v3, v[0:1]377; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2378; GFX8-NEXT: v_mov_b32_e32 v1, s1379; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc380; GFX8-NEXT: s_waitcnt vmcnt(0)381; GFX8-NEXT: v_mul_f32_e32 v2, 1.0, v3382; GFX8-NEXT: v_max_f32_e32 v2, 0x80000000, v2383; GFX8-NEXT: v_min_f32_e32 v2, 1.0, v2384; GFX8-NEXT: flat_store_dword v[0:1], v2385; GFX8-NEXT: s_endpgm386;387; GFX9-LABEL: v_clamp_negzero_maybe_snan_f32:388; GFX9: ; %bb.0:389; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24390; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0391; GFX9-NEXT: s_waitcnt lgkmcnt(0)392; GFX9-NEXT: global_load_dword v1, v0, s[2:3]393; GFX9-NEXT: s_waitcnt vmcnt(0)394; GFX9-NEXT: v_max_f32_e32 v1, v1, v1395; GFX9-NEXT: v_max_f32_e32 v1, 0x80000000, v1396; GFX9-NEXT: v_min_f32_e32 v1, 1.0, v1397; GFX9-NEXT: global_store_dword v0, v1, s[0:1]398; GFX9-NEXT: s_endpgm399;400; GFX11-LABEL: v_clamp_negzero_maybe_snan_f32:401; GFX11: ; %bb.0:402; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24403; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0404; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)405; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0406; GFX11-NEXT: s_waitcnt lgkmcnt(0)407; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]408; GFX11-NEXT: s_waitcnt vmcnt(0)409; GFX11-NEXT: v_max_f32_e32 v1, v1, v1410; GFX11-NEXT: v_maxmin_f32 v1, v1, 0x80000000, 1.0411; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]412; GFX11-NEXT: s_endpgm413;414; GFX12-LABEL: v_clamp_negzero_maybe_snan_f32:415; GFX12: ; %bb.0:416; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x24417; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v0418; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)419; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v0420; GFX12-NEXT: s_wait_kmcnt 0x0421; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]422; GFX12-NEXT: s_wait_loadcnt 0x0423; GFX12-NEXT: v_max_num_f32_e32 v1, v1, v1424; GFX12-NEXT: v_maxmin_num_f32 v1, v1, 0x80000000, 1.0425; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]426; GFX12-NEXT: s_endpgm427 %tid = call i32 @llvm.amdgcn.workitem.id.x()428 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid429 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid430 %a = load float, ptr addrspace(1) %gep0431 %max = call float @llvm.maxnum.f32(float %a, float -0.0)432 %med = call float @llvm.minnum.f32(float %max, float 1.0)433 434 store float %med, ptr addrspace(1) %out.gep435 ret void436}437 438define amdgpu_kernel void @v_clamp_multi_use_max_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {439; GFX6-LABEL: v_clamp_multi_use_max_f32:440; GFX6: ; %bb.0:441; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9442; GFX6-NEXT: s_mov_b32 s6, 0443; GFX6-NEXT: s_mov_b32 s7, 0xf000444; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0445; GFX6-NEXT: v_mov_b32_e32 v1, 0446; GFX6-NEXT: s_waitcnt lgkmcnt(0)447; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]448; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64449; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]450; GFX6-NEXT: s_mov_b32 s6, -1451; GFX6-NEXT: s_waitcnt vmcnt(0)452; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2453; GFX6-NEXT: v_max_f32_e32 v2, 0, v2454; GFX6-NEXT: v_min_f32_e32 v3, 1.0, v2455; GFX6-NEXT: buffer_store_dword v3, v[0:1], s[0:3], 0 addr64456; GFX6-NEXT: buffer_store_dword v2, off, s[4:7], 0457; GFX6-NEXT: s_waitcnt vmcnt(0)458; GFX6-NEXT: s_endpgm459;460; GFX8-LABEL: v_clamp_multi_use_max_f32:461; GFX8: ; %bb.0:462; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24463; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0464; GFX8-NEXT: s_waitcnt lgkmcnt(0)465; GFX8-NEXT: v_mov_b32_e32 v1, s3466; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2467; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc468; GFX8-NEXT: flat_load_dword v3, v[0:1]469; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2470; GFX8-NEXT: v_mov_b32_e32 v1, s1471; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc472; GFX8-NEXT: s_waitcnt vmcnt(0)473; GFX8-NEXT: v_mul_f32_e32 v2, 1.0, v3474; GFX8-NEXT: v_max_f32_e32 v2, 0, v2475; GFX8-NEXT: v_min_f32_e32 v3, 1.0, v2476; GFX8-NEXT: flat_store_dword v[0:1], v3477; GFX8-NEXT: flat_store_dword v[0:1], v2478; GFX8-NEXT: s_waitcnt vmcnt(0)479; GFX8-NEXT: s_endpgm480;481; GFX9-LABEL: v_clamp_multi_use_max_f32:482; GFX9: ; %bb.0:483; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24484; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0485; GFX9-NEXT: s_waitcnt lgkmcnt(0)486; GFX9-NEXT: global_load_dword v1, v0, s[2:3]487; GFX9-NEXT: s_waitcnt vmcnt(0)488; GFX9-NEXT: v_max_f32_e32 v1, v1, v1489; GFX9-NEXT: v_max_f32_e32 v1, 0, v1490; GFX9-NEXT: v_min_f32_e32 v2, 1.0, v1491; GFX9-NEXT: global_store_dword v0, v2, s[0:1]492; GFX9-NEXT: global_store_dword v[0:1], v1, off493; GFX9-NEXT: s_waitcnt vmcnt(0)494; GFX9-NEXT: s_endpgm495;496; GFX11-LABEL: v_clamp_multi_use_max_f32:497; GFX11: ; %bb.0:498; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24499; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0500; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)501; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0502; GFX11-NEXT: s_waitcnt lgkmcnt(0)503; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]504; GFX11-NEXT: s_waitcnt vmcnt(0)505; GFX11-NEXT: v_max_f32_e32 v1, v1, v1506; GFX11-NEXT: v_max_f32_e32 v1, 0, v1507; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)508; GFX11-NEXT: v_min_f32_e32 v2, 1.0, v1509; GFX11-NEXT: global_store_b32 v0, v2, s[0:1]510; GFX11-NEXT: global_store_b32 v[0:1], v1, off dlc511; GFX11-NEXT: s_waitcnt_vscnt null, 0x0512; GFX11-NEXT: s_endpgm513;514; GFX12-LABEL: v_clamp_multi_use_max_f32:515; GFX12: ; %bb.0:516; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x24517; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v0518; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)519; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v0520; GFX12-NEXT: s_wait_kmcnt 0x0521; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]522; GFX12-NEXT: s_wait_loadcnt 0x0523; GFX12-NEXT: v_max_num_f32_e32 v1, v1, v1524; GFX12-NEXT: v_max_num_f32_e32 v1, 0, v1525; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)526; GFX12-NEXT: v_min_num_f32_e32 v2, 1.0, v1527; GFX12-NEXT: global_store_b32 v0, v2, s[0:1]528; GFX12-NEXT: s_wait_storecnt 0x0529; GFX12-NEXT: global_store_b32 v[0:1], v1, off scope:SCOPE_SYS530; GFX12-NEXT: s_wait_storecnt 0x0531; GFX12-NEXT: s_endpgm532 %tid = call i32 @llvm.amdgcn.workitem.id.x()533 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid534 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid535 %a = load float, ptr addrspace(1) %gep0536 %max = call float @llvm.maxnum.f32(float %a, float 0.0)537 %med = call float @llvm.minnum.f32(float %max, float 1.0)538 539 store float %med, ptr addrspace(1) %out.gep540 store volatile float %max, ptr addrspace(1) poison541 ret void542}543 544define amdgpu_kernel void @v_clamp_f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {545; GFX6-LABEL: v_clamp_f16:546; GFX6: ; %bb.0:547; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9548; GFX6-NEXT: s_mov_b32 s7, 0xf000549; GFX6-NEXT: s_mov_b32 s6, 0550; GFX6-NEXT: v_lshlrev_b32_e32 v0, 1, v0551; GFX6-NEXT: v_mov_b32_e32 v1, 0552; GFX6-NEXT: s_waitcnt lgkmcnt(0)553; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]554; GFX6-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64555; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]556; GFX6-NEXT: s_waitcnt vmcnt(0)557; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp558; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2559; GFX6-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr64560; GFX6-NEXT: s_endpgm561;562; GFX8-LABEL: v_clamp_f16:563; GFX8: ; %bb.0:564; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24565; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0566; GFX8-NEXT: s_waitcnt lgkmcnt(0)567; GFX8-NEXT: v_mov_b32_e32 v1, s3568; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2569; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc570; GFX8-NEXT: flat_load_ushort v3, v[0:1]571; GFX8-NEXT: v_mov_b32_e32 v1, s1572; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2573; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc574; GFX8-NEXT: s_waitcnt vmcnt(0)575; GFX8-NEXT: v_max_f16_e64 v2, v3, v3 clamp576; GFX8-NEXT: flat_store_short v[0:1], v2577; GFX8-NEXT: s_endpgm578;579; GFX9-LABEL: v_clamp_f16:580; GFX9: ; %bb.0:581; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24582; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0583; GFX9-NEXT: s_waitcnt lgkmcnt(0)584; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]585; GFX9-NEXT: s_waitcnt vmcnt(0)586; GFX9-NEXT: v_max_f16_e64 v1, v1, v1 clamp587; GFX9-NEXT: global_store_short v0, v1, s[0:1]588; GFX9-NEXT: s_endpgm589;590; GFX11-TRUE16-LABEL: v_clamp_f16:591; GFX11-TRUE16: ; %bb.0:592; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24593; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0594; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)595; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0596; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)597; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]598; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)599; GFX11-TRUE16-NEXT: v_max_f16_e64 v0.l, v0.l, v0.l clamp600; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]601; GFX11-TRUE16-NEXT: s_endpgm602;603; GFX11-FAKE16-LABEL: v_clamp_f16:604; GFX11-FAKE16: ; %bb.0:605; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24606; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0607; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)608; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0609; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)610; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]611; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)612; GFX11-FAKE16-NEXT: v_max_f16_e64 v1, v1, v1 clamp613; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]614; GFX11-FAKE16-NEXT: s_endpgm615;616; GFX12-TRUE16-LABEL: v_clamp_f16:617; GFX12-TRUE16: ; %bb.0:618; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24619; GFX12-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0620; GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)621; GFX12-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0622; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0623; GFX12-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]624; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0625; GFX12-TRUE16-NEXT: v_max_num_f16_e64 v0.l, v0.l, v0.l clamp626; GFX12-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]627; GFX12-TRUE16-NEXT: s_endpgm628;629; GFX12-FAKE16-LABEL: v_clamp_f16:630; GFX12-FAKE16: ; %bb.0:631; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24632; GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0633; GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)634; GFX12-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0635; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0636; GFX12-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]637; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x0638; GFX12-FAKE16-NEXT: v_max_num_f16_e64 v1, v1, v1 clamp639; GFX12-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]640; GFX12-FAKE16-NEXT: s_endpgm641 %tid = call i32 @llvm.amdgcn.workitem.id.x()642 %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid643 %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid644 %a = load half, ptr addrspace(1) %gep0645 %max = call half @llvm.maxnum.f16(half %a, half 0.0)646 %med = call half @llvm.minnum.f16(half %max, half 1.0)647 648 store half %med, ptr addrspace(1) %out.gep649 ret void650}651 652define amdgpu_kernel void @v_clamp_neg_f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {653; GFX6-LABEL: v_clamp_neg_f16:654; GFX6: ; %bb.0:655; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9656; GFX6-NEXT: s_mov_b32 s7, 0xf000657; GFX6-NEXT: s_mov_b32 s6, 0658; GFX6-NEXT: v_lshlrev_b32_e32 v0, 1, v0659; GFX6-NEXT: v_mov_b32_e32 v1, 0660; GFX6-NEXT: s_waitcnt lgkmcnt(0)661; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]662; GFX6-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64663; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]664; GFX6-NEXT: s_waitcnt vmcnt(0)665; GFX6-NEXT: v_cvt_f32_f16_e64 v2, -v2 clamp666; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2667; GFX6-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr64668; GFX6-NEXT: s_endpgm669;670; GFX8-LABEL: v_clamp_neg_f16:671; GFX8: ; %bb.0:672; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24673; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0674; GFX8-NEXT: s_waitcnt lgkmcnt(0)675; GFX8-NEXT: v_mov_b32_e32 v1, s3676; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2677; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc678; GFX8-NEXT: flat_load_ushort v3, v[0:1]679; GFX8-NEXT: v_mov_b32_e32 v1, s1680; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2681; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc682; GFX8-NEXT: s_waitcnt vmcnt(0)683; GFX8-NEXT: v_max_f16_e64 v2, -v3, -v3 clamp684; GFX8-NEXT: flat_store_short v[0:1], v2685; GFX8-NEXT: s_endpgm686;687; GFX9-LABEL: v_clamp_neg_f16:688; GFX9: ; %bb.0:689; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24690; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0691; GFX9-NEXT: s_waitcnt lgkmcnt(0)692; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]693; GFX9-NEXT: s_waitcnt vmcnt(0)694; GFX9-NEXT: v_max_f16_e64 v1, -v1, -v1 clamp695; GFX9-NEXT: global_store_short v0, v1, s[0:1]696; GFX9-NEXT: s_endpgm697;698; GFX11-TRUE16-LABEL: v_clamp_neg_f16:699; GFX11-TRUE16: ; %bb.0:700; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24701; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0702; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)703; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0704; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)705; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]706; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)707; GFX11-TRUE16-NEXT: v_max_f16_e64 v0.l, -v0.l, -v0.l clamp708; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]709; GFX11-TRUE16-NEXT: s_endpgm710;711; GFX11-FAKE16-LABEL: v_clamp_neg_f16:712; GFX11-FAKE16: ; %bb.0:713; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24714; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0715; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)716; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0717; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)718; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]719; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)720; GFX11-FAKE16-NEXT: v_max_f16_e64 v1, -v1, -v1 clamp721; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]722; GFX11-FAKE16-NEXT: s_endpgm723;724; GFX12-TRUE16-LABEL: v_clamp_neg_f16:725; GFX12-TRUE16: ; %bb.0:726; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24727; GFX12-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0728; GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)729; GFX12-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0730; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0731; GFX12-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]732; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0733; GFX12-TRUE16-NEXT: v_max_num_f16_e64 v0.l, -v0.l, -v0.l clamp734; GFX12-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]735; GFX12-TRUE16-NEXT: s_endpgm736;737; GFX12-FAKE16-LABEL: v_clamp_neg_f16:738; GFX12-FAKE16: ; %bb.0:739; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24740; GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0741; GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)742; GFX12-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0743; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0744; GFX12-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]745; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x0746; GFX12-FAKE16-NEXT: v_max_num_f16_e64 v1, -v1, -v1 clamp747; GFX12-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]748; GFX12-FAKE16-NEXT: s_endpgm749 %tid = call i32 @llvm.amdgcn.workitem.id.x()750 %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid751 %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid752 %a = load half, ptr addrspace(1) %gep0753 %fneg.a = fneg half %a754 %max = call half @llvm.maxnum.f16(half %fneg.a, half 0.0)755 %med = call half @llvm.minnum.f16(half %max, half 1.0)756 757 store half %med, ptr addrspace(1) %out.gep758 ret void759}760 761define amdgpu_kernel void @v_clamp_negabs_f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {762; GFX6-LABEL: v_clamp_negabs_f16:763; GFX6: ; %bb.0:764; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9765; GFX6-NEXT: s_mov_b32 s7, 0xf000766; GFX6-NEXT: s_mov_b32 s6, 0767; GFX6-NEXT: v_lshlrev_b32_e32 v0, 1, v0768; GFX6-NEXT: v_mov_b32_e32 v1, 0769; GFX6-NEXT: s_waitcnt lgkmcnt(0)770; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]771; GFX6-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64772; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]773; GFX6-NEXT: s_waitcnt vmcnt(0)774; GFX6-NEXT: v_cvt_f32_f16_e64 v2, -|v2| clamp775; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2776; GFX6-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr64777; GFX6-NEXT: s_endpgm778;779; GFX8-LABEL: v_clamp_negabs_f16:780; GFX8: ; %bb.0:781; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24782; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0783; GFX8-NEXT: s_waitcnt lgkmcnt(0)784; GFX8-NEXT: v_mov_b32_e32 v1, s3785; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2786; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc787; GFX8-NEXT: flat_load_ushort v3, v[0:1]788; GFX8-NEXT: v_mov_b32_e32 v1, s1789; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2790; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc791; GFX8-NEXT: s_waitcnt vmcnt(0)792; GFX8-NEXT: v_max_f16_e64 v2, -|v3|, -|v3| clamp793; GFX8-NEXT: flat_store_short v[0:1], v2794; GFX8-NEXT: s_endpgm795;796; GFX9-LABEL: v_clamp_negabs_f16:797; GFX9: ; %bb.0:798; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24799; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0800; GFX9-NEXT: s_waitcnt lgkmcnt(0)801; GFX9-NEXT: global_load_ushort v1, v0, s[2:3]802; GFX9-NEXT: s_waitcnt vmcnt(0)803; GFX9-NEXT: v_max_f16_e64 v1, -|v1|, -|v1| clamp804; GFX9-NEXT: global_store_short v0, v1, s[0:1]805; GFX9-NEXT: s_endpgm806;807; GFX11-TRUE16-LABEL: v_clamp_negabs_f16:808; GFX11-TRUE16: ; %bb.0:809; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24810; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0811; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)812; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0813; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)814; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]815; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)816; GFX11-TRUE16-NEXT: v_max_f16_e64 v0.l, -|v0.l|, -|v0.l| clamp817; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]818; GFX11-TRUE16-NEXT: s_endpgm819;820; GFX11-FAKE16-LABEL: v_clamp_negabs_f16:821; GFX11-FAKE16: ; %bb.0:822; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24823; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0824; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)825; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0826; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)827; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]828; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)829; GFX11-FAKE16-NEXT: v_max_f16_e64 v1, -|v1|, -|v1| clamp830; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]831; GFX11-FAKE16-NEXT: s_endpgm832;833; GFX12-TRUE16-LABEL: v_clamp_negabs_f16:834; GFX12-TRUE16: ; %bb.0:835; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24836; GFX12-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0837; GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)838; GFX12-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v0839; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x0840; GFX12-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[2:3]841; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x0842; GFX12-TRUE16-NEXT: v_max_num_f16_e64 v0.l, -|v0.l|, -|v0.l| clamp843; GFX12-TRUE16-NEXT: global_store_b16 v1, v0, s[0:1]844; GFX12-TRUE16-NEXT: s_endpgm845;846; GFX12-FAKE16-LABEL: v_clamp_negabs_f16:847; GFX12-FAKE16: ; %bb.0:848; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24849; GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v0850; GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)851; GFX12-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v0852; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x0853; GFX12-FAKE16-NEXT: global_load_u16 v1, v0, s[2:3]854; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x0855; GFX12-FAKE16-NEXT: v_max_num_f16_e64 v1, -|v1|, -|v1| clamp856; GFX12-FAKE16-NEXT: global_store_b16 v0, v1, s[0:1]857; GFX12-FAKE16-NEXT: s_endpgm858 %tid = call i32 @llvm.amdgcn.workitem.id.x()859 %gep0 = getelementptr half, ptr addrspace(1) %aptr, i32 %tid860 %out.gep = getelementptr half, ptr addrspace(1) %out, i32 %tid861 %a = load half, ptr addrspace(1) %gep0862 %fabs.a = call half @llvm.fabs.f16(half %a)863 %fneg.fabs.a = fneg half %fabs.a864 865 %max = call half @llvm.maxnum.f16(half %fneg.fabs.a, half 0.0)866 %med = call half @llvm.minnum.f16(half %max, half 1.0)867 868 store half %med, ptr addrspace(1) %out.gep869 ret void870}871 872define amdgpu_kernel void @v_clamp_f64(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {873; GFX6-LABEL: v_clamp_f64:874; GFX6: ; %bb.0:875; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9876; GFX6-NEXT: s_mov_b32 s7, 0xf000877; GFX6-NEXT: s_mov_b32 s6, 0878; GFX6-NEXT: v_lshlrev_b32_e32 v0, 3, v0879; GFX6-NEXT: v_mov_b32_e32 v1, 0880; GFX6-NEXT: s_waitcnt lgkmcnt(0)881; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]882; GFX6-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64883; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]884; GFX6-NEXT: s_waitcnt vmcnt(0)885; GFX6-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3] clamp886; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64887; GFX6-NEXT: s_endpgm888;889; GFX8-LABEL: v_clamp_f64:890; GFX8: ; %bb.0:891; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24892; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0893; GFX8-NEXT: s_waitcnt lgkmcnt(0)894; GFX8-NEXT: v_mov_b32_e32 v1, s3895; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2896; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc897; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]898; GFX8-NEXT: v_mov_b32_e32 v3, s1899; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v2900; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc901; GFX8-NEXT: s_waitcnt vmcnt(0)902; GFX8-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1] clamp903; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]904; GFX8-NEXT: s_endpgm905;906; GFX9-LABEL: v_clamp_f64:907; GFX9: ; %bb.0:908; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24909; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0910; GFX9-NEXT: s_waitcnt lgkmcnt(0)911; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]912; GFX9-NEXT: s_waitcnt vmcnt(0)913; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1] clamp914; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]915; GFX9-NEXT: s_endpgm916;917; GFX11-LABEL: v_clamp_f64:918; GFX11: ; %bb.0:919; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24920; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0921; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)922; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0923; GFX11-NEXT: s_waitcnt lgkmcnt(0)924; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]925; GFX11-NEXT: s_waitcnt vmcnt(0)926; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1] clamp927; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]928; GFX11-NEXT: s_endpgm929;930; GFX12-LABEL: v_clamp_f64:931; GFX12: ; %bb.0:932; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x24933; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v0934; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)935; GFX12-NEXT: v_lshlrev_b32_e32 v2, 3, v0936; GFX12-NEXT: s_wait_kmcnt 0x0937; GFX12-NEXT: global_load_b64 v[0:1], v2, s[2:3]938; GFX12-NEXT: s_wait_loadcnt 0x0939; GFX12-NEXT: v_max_num_f64_e64 v[0:1], v[0:1], v[0:1] clamp940; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]941; GFX12-NEXT: s_endpgm942 %tid = call i32 @llvm.amdgcn.workitem.id.x()943 %gep0 = getelementptr double, ptr addrspace(1) %aptr, i32 %tid944 %out.gep = getelementptr double, ptr addrspace(1) %out, i32 %tid945 %a = load double, ptr addrspace(1) %gep0946 %max = call double @llvm.maxnum.f64(double %a, double 0.0)947 %med = call double @llvm.minnum.f64(double %max, double 1.0)948 949 store double %med, ptr addrspace(1) %out.gep950 ret void951}952 953define amdgpu_kernel void @v_clamp_neg_f64(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {954; GFX6-LABEL: v_clamp_neg_f64:955; GFX6: ; %bb.0:956; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9957; GFX6-NEXT: s_mov_b32 s7, 0xf000958; GFX6-NEXT: s_mov_b32 s6, 0959; GFX6-NEXT: v_lshlrev_b32_e32 v0, 3, v0960; GFX6-NEXT: v_mov_b32_e32 v1, 0961; GFX6-NEXT: s_waitcnt lgkmcnt(0)962; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]963; GFX6-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64964; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]965; GFX6-NEXT: s_waitcnt vmcnt(0)966; GFX6-NEXT: v_max_f64 v[2:3], -v[2:3], -v[2:3] clamp967; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64968; GFX6-NEXT: s_endpgm969;970; GFX8-LABEL: v_clamp_neg_f64:971; GFX8: ; %bb.0:972; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24973; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0974; GFX8-NEXT: s_waitcnt lgkmcnt(0)975; GFX8-NEXT: v_mov_b32_e32 v1, s3976; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2977; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc978; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]979; GFX8-NEXT: v_mov_b32_e32 v3, s1980; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v2981; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc982; GFX8-NEXT: s_waitcnt vmcnt(0)983; GFX8-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp984; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]985; GFX8-NEXT: s_endpgm986;987; GFX9-LABEL: v_clamp_neg_f64:988; GFX9: ; %bb.0:989; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24990; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0991; GFX9-NEXT: s_waitcnt lgkmcnt(0)992; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]993; GFX9-NEXT: s_waitcnt vmcnt(0)994; GFX9-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp995; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]996; GFX9-NEXT: s_endpgm997;998; GFX11-LABEL: v_clamp_neg_f64:999; GFX11: ; %bb.0:1000; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241001; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01002; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1003; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v01004; GFX11-NEXT: s_waitcnt lgkmcnt(0)1005; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]1006; GFX11-NEXT: s_waitcnt vmcnt(0)1007; GFX11-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp1008; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1009; GFX11-NEXT: s_endpgm1010;1011; GFX12-LABEL: v_clamp_neg_f64:1012; GFX12: ; %bb.0:1013; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241014; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01015; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1016; GFX12-NEXT: v_lshlrev_b32_e32 v2, 3, v01017; GFX12-NEXT: s_wait_kmcnt 0x01018; GFX12-NEXT: global_load_b64 v[0:1], v2, s[2:3]1019; GFX12-NEXT: s_wait_loadcnt 0x01020; GFX12-NEXT: v_max_num_f64_e64 v[0:1], -v[0:1], -v[0:1] clamp1021; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1022; GFX12-NEXT: s_endpgm1023 %tid = call i32 @llvm.amdgcn.workitem.id.x()1024 %gep0 = getelementptr double, ptr addrspace(1) %aptr, i32 %tid1025 %out.gep = getelementptr double, ptr addrspace(1) %out, i32 %tid1026 %a = load double, ptr addrspace(1) %gep01027 %fneg.a = fneg double %a1028 %max = call double @llvm.maxnum.f64(double %fneg.a, double 0.0)1029 %med = call double @llvm.minnum.f64(double %max, double 1.0)1030 1031 store double %med, ptr addrspace(1) %out.gep1032 ret void1033}1034 1035define amdgpu_kernel void @v_clamp_negabs_f64(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1036; GFX6-LABEL: v_clamp_negabs_f64:1037; GFX6: ; %bb.0:1038; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91039; GFX6-NEXT: s_mov_b32 s7, 0xf0001040; GFX6-NEXT: s_mov_b32 s6, 01041; GFX6-NEXT: v_lshlrev_b32_e32 v0, 3, v01042; GFX6-NEXT: v_mov_b32_e32 v1, 01043; GFX6-NEXT: s_waitcnt lgkmcnt(0)1044; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]1045; GFX6-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr641046; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]1047; GFX6-NEXT: s_waitcnt vmcnt(0)1048; GFX6-NEXT: v_max_f64 v[2:3], -|v[2:3]|, -|v[2:3]| clamp1049; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr641050; GFX6-NEXT: s_endpgm1051;1052; GFX8-LABEL: v_clamp_negabs_f64:1053; GFX8: ; %bb.0:1054; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241055; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v01056; GFX8-NEXT: s_waitcnt lgkmcnt(0)1057; GFX8-NEXT: v_mov_b32_e32 v1, s31058; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21059; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1060; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]1061; GFX8-NEXT: v_mov_b32_e32 v3, s11062; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v21063; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1064; GFX8-NEXT: s_waitcnt vmcnt(0)1065; GFX8-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp1066; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1067; GFX8-NEXT: s_endpgm1068;1069; GFX9-LABEL: v_clamp_negabs_f64:1070; GFX9: ; %bb.0:1071; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241072; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v01073; GFX9-NEXT: s_waitcnt lgkmcnt(0)1074; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3]1075; GFX9-NEXT: s_waitcnt vmcnt(0)1076; GFX9-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp1077; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1078; GFX9-NEXT: s_endpgm1079;1080; GFX11-LABEL: v_clamp_negabs_f64:1081; GFX11: ; %bb.0:1082; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241083; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01084; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1085; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v01086; GFX11-NEXT: s_waitcnt lgkmcnt(0)1087; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3]1088; GFX11-NEXT: s_waitcnt vmcnt(0)1089; GFX11-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp1090; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1091; GFX11-NEXT: s_endpgm1092;1093; GFX12-LABEL: v_clamp_negabs_f64:1094; GFX12: ; %bb.0:1095; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241096; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01097; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1098; GFX12-NEXT: v_lshlrev_b32_e32 v2, 3, v01099; GFX12-NEXT: s_wait_kmcnt 0x01100; GFX12-NEXT: global_load_b64 v[0:1], v2, s[2:3]1101; GFX12-NEXT: s_wait_loadcnt 0x01102; GFX12-NEXT: v_max_num_f64_e64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp1103; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1104; GFX12-NEXT: s_endpgm1105 %tid = call i32 @llvm.amdgcn.workitem.id.x()1106 %gep0 = getelementptr double, ptr addrspace(1) %aptr, i32 %tid1107 %out.gep = getelementptr double, ptr addrspace(1) %out, i32 %tid1108 %a = load double, ptr addrspace(1) %gep01109 %fabs.a = call double @llvm.fabs.f64(double %a)1110 %fneg.fabs.a = fneg double %fabs.a1111 1112 %max = call double @llvm.maxnum.f64(double %fneg.fabs.a, double 0.0)1113 %med = call double @llvm.minnum.f64(double %max, double 1.0)1114 1115 store double %med, ptr addrspace(1) %out.gep1116 ret void1117}1118 1119define amdgpu_kernel void @v_clamp_med3_aby_negzero_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1120; GFX6-LABEL: v_clamp_med3_aby_negzero_f32:1121; GFX6: ; %bb.0:1122; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91123; GFX6-NEXT: s_mov_b32 s7, 0xf0001124; GFX6-NEXT: s_mov_b32 s6, 01125; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01126; GFX6-NEXT: v_mov_b32_e32 v1, 01127; GFX6-NEXT: s_waitcnt lgkmcnt(0)1128; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]1129; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641130; GFX6-NEXT: s_brev_b32 s4, 11131; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]1132; GFX6-NEXT: s_waitcnt vmcnt(0)1133; GFX6-NEXT: v_med3_f32 v2, s4, 1.0, v21134; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641135; GFX6-NEXT: s_endpgm1136;1137; GFX8-LABEL: v_clamp_med3_aby_negzero_f32:1138; GFX8: ; %bb.0:1139; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241140; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01141; GFX8-NEXT: s_waitcnt lgkmcnt(0)1142; GFX8-NEXT: v_mov_b32_e32 v1, s31143; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21144; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1145; GFX8-NEXT: flat_load_dword v3, v[0:1]1146; GFX8-NEXT: v_mov_b32_e32 v1, s11147; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21148; GFX8-NEXT: s_brev_b32 s0, 11149; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1150; GFX8-NEXT: s_waitcnt vmcnt(0)1151; GFX8-NEXT: v_med3_f32 v2, s0, 1.0, v31152; GFX8-NEXT: flat_store_dword v[0:1], v21153; GFX8-NEXT: s_endpgm1154;1155; GFX9-LABEL: v_clamp_med3_aby_negzero_f32:1156; GFX9: ; %bb.0:1157; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241158; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01159; GFX9-NEXT: s_waitcnt lgkmcnt(0)1160; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1161; GFX9-NEXT: s_brev_b32 s2, 11162; GFX9-NEXT: s_waitcnt vmcnt(0)1163; GFX9-NEXT: v_med3_f32 v1, s2, 1.0, v11164; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1165; GFX9-NEXT: s_endpgm1166;1167; GFX11-LABEL: v_clamp_med3_aby_negzero_f32:1168; GFX11: ; %bb.0:1169; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241170; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01171; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1172; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01173; GFX11-NEXT: s_waitcnt lgkmcnt(0)1174; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1175; GFX11-NEXT: s_waitcnt vmcnt(0)1176; GFX11-NEXT: v_med3_f32 v1, 0x80000000, 1.0, v11177; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1178; GFX11-NEXT: s_endpgm1179;1180; GFX12-LABEL: v_clamp_med3_aby_negzero_f32:1181; GFX12: ; %bb.0:1182; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241183; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01184; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1185; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01186; GFX12-NEXT: s_wait_kmcnt 0x01187; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]1188; GFX12-NEXT: s_wait_loadcnt 0x01189; GFX12-NEXT: v_med3_num_f32 v1, 0x80000000, 1.0, v11190; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1191; GFX12-NEXT: s_endpgm1192 %tid = call i32 @llvm.amdgcn.workitem.id.x()1193 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1194 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1195 %a = load float, ptr addrspace(1) %gep01196 %med = call float @llvm.amdgcn.fmed3.f32(float -0.0, float 1.0, float %a)1197 store float %med, ptr addrspace(1) %out.gep1198 ret void1199}1200 1201define amdgpu_kernel void @v_clamp_med3_aby_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1202; GFX6-LABEL: v_clamp_med3_aby_f32:1203; GFX6: ; %bb.0:1204; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91205; GFX6-NEXT: s_mov_b32 s7, 0xf0001206; GFX6-NEXT: s_mov_b32 s6, 01207; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01208; GFX6-NEXT: v_mov_b32_e32 v1, 01209; GFX6-NEXT: s_waitcnt lgkmcnt(0)1210; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]1211; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641212; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]1213; GFX6-NEXT: s_waitcnt vmcnt(0)1214; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp1215; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641216; GFX6-NEXT: s_endpgm1217;1218; GFX8-LABEL: v_clamp_med3_aby_f32:1219; GFX8: ; %bb.0:1220; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241221; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01222; GFX8-NEXT: s_waitcnt lgkmcnt(0)1223; GFX8-NEXT: v_mov_b32_e32 v1, s31224; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21225; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1226; GFX8-NEXT: flat_load_dword v3, v[0:1]1227; GFX8-NEXT: v_mov_b32_e32 v1, s11228; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21229; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1230; GFX8-NEXT: s_waitcnt vmcnt(0)1231; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp1232; GFX8-NEXT: flat_store_dword v[0:1], v21233; GFX8-NEXT: s_endpgm1234;1235; GFX9-LABEL: v_clamp_med3_aby_f32:1236; GFX9: ; %bb.0:1237; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241238; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01239; GFX9-NEXT: s_waitcnt lgkmcnt(0)1240; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1241; GFX9-NEXT: s_waitcnt vmcnt(0)1242; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp1243; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1244; GFX9-NEXT: s_endpgm1245;1246; GFX11-LABEL: v_clamp_med3_aby_f32:1247; GFX11: ; %bb.0:1248; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241249; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01250; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1251; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01252; GFX11-NEXT: s_waitcnt lgkmcnt(0)1253; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1254; GFX11-NEXT: s_waitcnt vmcnt(0)1255; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp1256; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1257; GFX11-NEXT: s_endpgm1258;1259; GFX12-LABEL: v_clamp_med3_aby_f32:1260; GFX12: ; %bb.0:1261; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241262; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01263; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1264; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01265; GFX12-NEXT: s_wait_kmcnt 0x01266; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]1267; GFX12-NEXT: s_wait_loadcnt 0x01268; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp1269; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1270; GFX12-NEXT: s_endpgm1271 %tid = call i32 @llvm.amdgcn.workitem.id.x()1272 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1273 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1274 %a = load float, ptr addrspace(1) %gep01275 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %a)1276 store float %med, ptr addrspace(1) %out.gep1277 ret void1278}1279 1280define amdgpu_kernel void @v_clamp_med3_bay_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1281; GFX6-LABEL: v_clamp_med3_bay_f32:1282; GFX6: ; %bb.0:1283; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91284; GFX6-NEXT: s_mov_b32 s7, 0xf0001285; GFX6-NEXT: s_mov_b32 s6, 01286; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01287; GFX6-NEXT: v_mov_b32_e32 v1, 01288; GFX6-NEXT: s_waitcnt lgkmcnt(0)1289; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]1290; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641291; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]1292; GFX6-NEXT: s_waitcnt vmcnt(0)1293; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp1294; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641295; GFX6-NEXT: s_endpgm1296;1297; GFX8-LABEL: v_clamp_med3_bay_f32:1298; GFX8: ; %bb.0:1299; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241300; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01301; GFX8-NEXT: s_waitcnt lgkmcnt(0)1302; GFX8-NEXT: v_mov_b32_e32 v1, s31303; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21304; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1305; GFX8-NEXT: flat_load_dword v3, v[0:1]1306; GFX8-NEXT: v_mov_b32_e32 v1, s11307; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21308; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1309; GFX8-NEXT: s_waitcnt vmcnt(0)1310; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp1311; GFX8-NEXT: flat_store_dword v[0:1], v21312; GFX8-NEXT: s_endpgm1313;1314; GFX9-LABEL: v_clamp_med3_bay_f32:1315; GFX9: ; %bb.0:1316; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241317; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01318; GFX9-NEXT: s_waitcnt lgkmcnt(0)1319; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1320; GFX9-NEXT: s_waitcnt vmcnt(0)1321; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp1322; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1323; GFX9-NEXT: s_endpgm1324;1325; GFX11-LABEL: v_clamp_med3_bay_f32:1326; GFX11: ; %bb.0:1327; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241328; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01329; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1330; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01331; GFX11-NEXT: s_waitcnt lgkmcnt(0)1332; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1333; GFX11-NEXT: s_waitcnt vmcnt(0)1334; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp1335; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1336; GFX11-NEXT: s_endpgm1337;1338; GFX12-LABEL: v_clamp_med3_bay_f32:1339; GFX12: ; %bb.0:1340; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241341; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01342; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1343; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01344; GFX12-NEXT: s_wait_kmcnt 0x01345; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]1346; GFX12-NEXT: s_wait_loadcnt 0x01347; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp1348; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1349; GFX12-NEXT: s_endpgm1350 %tid = call i32 @llvm.amdgcn.workitem.id.x()1351 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1352 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1353 %a = load float, ptr addrspace(1) %gep01354 %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float 0.0, float %a)1355 store float %med, ptr addrspace(1) %out.gep1356 ret void1357}1358 1359define amdgpu_kernel void @v_clamp_med3_yab_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1360; GFX6-LABEL: v_clamp_med3_yab_f32:1361; GFX6: ; %bb.0:1362; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91363; GFX6-NEXT: s_mov_b32 s7, 0xf0001364; GFX6-NEXT: s_mov_b32 s6, 01365; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01366; GFX6-NEXT: v_mov_b32_e32 v1, 01367; GFX6-NEXT: s_waitcnt lgkmcnt(0)1368; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]1369; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641370; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]1371; GFX6-NEXT: s_waitcnt vmcnt(0)1372; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp1373; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641374; GFX6-NEXT: s_endpgm1375;1376; GFX8-LABEL: v_clamp_med3_yab_f32:1377; GFX8: ; %bb.0:1378; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241379; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01380; GFX8-NEXT: s_waitcnt lgkmcnt(0)1381; GFX8-NEXT: v_mov_b32_e32 v1, s31382; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21383; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1384; GFX8-NEXT: flat_load_dword v3, v[0:1]1385; GFX8-NEXT: v_mov_b32_e32 v1, s11386; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21387; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1388; GFX8-NEXT: s_waitcnt vmcnt(0)1389; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp1390; GFX8-NEXT: flat_store_dword v[0:1], v21391; GFX8-NEXT: s_endpgm1392;1393; GFX9-LABEL: v_clamp_med3_yab_f32:1394; GFX9: ; %bb.0:1395; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241396; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01397; GFX9-NEXT: s_waitcnt lgkmcnt(0)1398; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1399; GFX9-NEXT: s_waitcnt vmcnt(0)1400; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp1401; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1402; GFX9-NEXT: s_endpgm1403;1404; GFX11-LABEL: v_clamp_med3_yab_f32:1405; GFX11: ; %bb.0:1406; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241407; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01408; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1409; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01410; GFX11-NEXT: s_waitcnt lgkmcnt(0)1411; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1412; GFX11-NEXT: s_waitcnt vmcnt(0)1413; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp1414; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1415; GFX11-NEXT: s_endpgm1416;1417; GFX12-LABEL: v_clamp_med3_yab_f32:1418; GFX12: ; %bb.0:1419; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241420; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01421; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1422; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01423; GFX12-NEXT: s_wait_kmcnt 0x01424; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]1425; GFX12-NEXT: s_wait_loadcnt 0x01426; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp1427; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1428; GFX12-NEXT: s_endpgm1429 %tid = call i32 @llvm.amdgcn.workitem.id.x()1430 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1431 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1432 %a = load float, ptr addrspace(1) %gep01433 %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 0.0, float 1.0)1434 store float %med, ptr addrspace(1) %out.gep1435 ret void1436}1437 1438define amdgpu_kernel void @v_clamp_med3_yba_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1439; GFX6-LABEL: v_clamp_med3_yba_f32:1440; GFX6: ; %bb.0:1441; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91442; GFX6-NEXT: s_mov_b32 s7, 0xf0001443; GFX6-NEXT: s_mov_b32 s6, 01444; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01445; GFX6-NEXT: v_mov_b32_e32 v1, 01446; GFX6-NEXT: s_waitcnt lgkmcnt(0)1447; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]1448; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641449; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]1450; GFX6-NEXT: s_waitcnt vmcnt(0)1451; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp1452; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641453; GFX6-NEXT: s_endpgm1454;1455; GFX8-LABEL: v_clamp_med3_yba_f32:1456; GFX8: ; %bb.0:1457; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241458; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01459; GFX8-NEXT: s_waitcnt lgkmcnt(0)1460; GFX8-NEXT: v_mov_b32_e32 v1, s31461; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21462; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1463; GFX8-NEXT: flat_load_dword v3, v[0:1]1464; GFX8-NEXT: v_mov_b32_e32 v1, s11465; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21466; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1467; GFX8-NEXT: s_waitcnt vmcnt(0)1468; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp1469; GFX8-NEXT: flat_store_dword v[0:1], v21470; GFX8-NEXT: s_endpgm1471;1472; GFX9-LABEL: v_clamp_med3_yba_f32:1473; GFX9: ; %bb.0:1474; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241475; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01476; GFX9-NEXT: s_waitcnt lgkmcnt(0)1477; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1478; GFX9-NEXT: s_waitcnt vmcnt(0)1479; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp1480; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1481; GFX9-NEXT: s_endpgm1482;1483; GFX11-LABEL: v_clamp_med3_yba_f32:1484; GFX11: ; %bb.0:1485; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241486; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01487; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1488; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01489; GFX11-NEXT: s_waitcnt lgkmcnt(0)1490; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1491; GFX11-NEXT: s_waitcnt vmcnt(0)1492; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp1493; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1494; GFX11-NEXT: s_endpgm1495;1496; GFX12-LABEL: v_clamp_med3_yba_f32:1497; GFX12: ; %bb.0:1498; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241499; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01500; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1501; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01502; GFX12-NEXT: s_wait_kmcnt 0x01503; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]1504; GFX12-NEXT: s_wait_loadcnt 0x01505; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp1506; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1507; GFX12-NEXT: s_endpgm1508 %tid = call i32 @llvm.amdgcn.workitem.id.x()1509 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1510 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1511 %a = load float, ptr addrspace(1) %gep01512 %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 1.0, float 0.0)1513 store float %med, ptr addrspace(1) %out.gep1514 ret void1515}1516 1517define amdgpu_kernel void @v_clamp_med3_ayb_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1518; GFX6-LABEL: v_clamp_med3_ayb_f32:1519; GFX6: ; %bb.0:1520; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91521; GFX6-NEXT: s_mov_b32 s7, 0xf0001522; GFX6-NEXT: s_mov_b32 s6, 01523; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01524; GFX6-NEXT: v_mov_b32_e32 v1, 01525; GFX6-NEXT: s_waitcnt lgkmcnt(0)1526; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]1527; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641528; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]1529; GFX6-NEXT: s_waitcnt vmcnt(0)1530; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp1531; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641532; GFX6-NEXT: s_endpgm1533;1534; GFX8-LABEL: v_clamp_med3_ayb_f32:1535; GFX8: ; %bb.0:1536; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241537; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01538; GFX8-NEXT: s_waitcnt lgkmcnt(0)1539; GFX8-NEXT: v_mov_b32_e32 v1, s31540; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21541; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1542; GFX8-NEXT: flat_load_dword v3, v[0:1]1543; GFX8-NEXT: v_mov_b32_e32 v1, s11544; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21545; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1546; GFX8-NEXT: s_waitcnt vmcnt(0)1547; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp1548; GFX8-NEXT: flat_store_dword v[0:1], v21549; GFX8-NEXT: s_endpgm1550;1551; GFX9-LABEL: v_clamp_med3_ayb_f32:1552; GFX9: ; %bb.0:1553; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241554; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01555; GFX9-NEXT: s_waitcnt lgkmcnt(0)1556; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1557; GFX9-NEXT: s_waitcnt vmcnt(0)1558; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp1559; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1560; GFX9-NEXT: s_endpgm1561;1562; GFX11-LABEL: v_clamp_med3_ayb_f32:1563; GFX11: ; %bb.0:1564; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241565; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01566; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1567; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01568; GFX11-NEXT: s_waitcnt lgkmcnt(0)1569; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1570; GFX11-NEXT: s_waitcnt vmcnt(0)1571; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp1572; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1573; GFX11-NEXT: s_endpgm1574;1575; GFX12-LABEL: v_clamp_med3_ayb_f32:1576; GFX12: ; %bb.0:1577; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241578; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01579; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1580; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01581; GFX12-NEXT: s_wait_kmcnt 0x01582; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]1583; GFX12-NEXT: s_wait_loadcnt 0x01584; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp1585; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1586; GFX12-NEXT: s_endpgm1587 %tid = call i32 @llvm.amdgcn.workitem.id.x()1588 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1589 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1590 %a = load float, ptr addrspace(1) %gep01591 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %a, float 1.0)1592 store float %med, ptr addrspace(1) %out.gep1593 ret void1594}1595 1596define amdgpu_kernel void @v_clamp_med3_bya_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {1597; GFX6-LABEL: v_clamp_med3_bya_f32:1598; GFX6: ; %bb.0:1599; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91600; GFX6-NEXT: s_mov_b32 s7, 0xf0001601; GFX6-NEXT: s_mov_b32 s6, 01602; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01603; GFX6-NEXT: v_mov_b32_e32 v1, 01604; GFX6-NEXT: s_waitcnt lgkmcnt(0)1605; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]1606; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr641607; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]1608; GFX6-NEXT: s_waitcnt vmcnt(0)1609; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp1610; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641611; GFX6-NEXT: s_endpgm1612;1613; GFX8-LABEL: v_clamp_med3_bya_f32:1614; GFX8: ; %bb.0:1615; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241616; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01617; GFX8-NEXT: s_waitcnt lgkmcnt(0)1618; GFX8-NEXT: v_mov_b32_e32 v1, s31619; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v21620; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1621; GFX8-NEXT: flat_load_dword v3, v[0:1]1622; GFX8-NEXT: v_mov_b32_e32 v1, s11623; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v21624; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1625; GFX8-NEXT: s_waitcnt vmcnt(0)1626; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp1627; GFX8-NEXT: flat_store_dword v[0:1], v21628; GFX8-NEXT: s_endpgm1629;1630; GFX9-LABEL: v_clamp_med3_bya_f32:1631; GFX9: ; %bb.0:1632; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241633; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01634; GFX9-NEXT: s_waitcnt lgkmcnt(0)1635; GFX9-NEXT: global_load_dword v1, v0, s[2:3]1636; GFX9-NEXT: s_waitcnt vmcnt(0)1637; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp1638; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1639; GFX9-NEXT: s_endpgm1640;1641; GFX11-LABEL: v_clamp_med3_bya_f32:1642; GFX11: ; %bb.0:1643; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241644; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01645; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1646; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01647; GFX11-NEXT: s_waitcnt lgkmcnt(0)1648; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]1649; GFX11-NEXT: s_waitcnt vmcnt(0)1650; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp1651; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1652; GFX11-NEXT: s_endpgm1653;1654; GFX12-LABEL: v_clamp_med3_bya_f32:1655; GFX12: ; %bb.0:1656; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x241657; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01658; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1659; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01660; GFX12-NEXT: s_wait_kmcnt 0x01661; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]1662; GFX12-NEXT: s_wait_loadcnt 0x01663; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp1664; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1665; GFX12-NEXT: s_endpgm1666 %tid = call i32 @llvm.amdgcn.workitem.id.x()1667 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid1668 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1669 %a = load float, ptr addrspace(1) %gep01670 %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %a, float 0.0)1671 store float %med, ptr addrspace(1) %out.gep1672 ret void1673}1674 1675define amdgpu_kernel void @v_clamp_constants_to_one_f32(ptr addrspace(1) %out) #0 {1676; GFX6-LABEL: v_clamp_constants_to_one_f32:1677; GFX6: ; %bb.0:1678; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91679; GFX6-NEXT: s_mov_b32 s3, 0xf0001680; GFX6-NEXT: s_mov_b32 s2, 01681; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01682; GFX6-NEXT: v_mov_b32_e32 v1, 01683; GFX6-NEXT: v_mov_b32_e32 v2, 1.01684; GFX6-NEXT: s_waitcnt lgkmcnt(0)1685; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641686; GFX6-NEXT: s_endpgm1687;1688; GFX8-LABEL: v_clamp_constants_to_one_f32:1689; GFX8: ; %bb.0:1690; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241691; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v01692; GFX8-NEXT: v_mov_b32_e32 v2, 1.01693; GFX8-NEXT: s_waitcnt lgkmcnt(0)1694; GFX8-NEXT: v_mov_b32_e32 v1, s11695; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v01696; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1697; GFX8-NEXT: flat_store_dword v[0:1], v21698; GFX8-NEXT: s_endpgm1699;1700; GFX9-LABEL: v_clamp_constants_to_one_f32:1701; GFX9: ; %bb.0:1702; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241703; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01704; GFX9-NEXT: v_mov_b32_e32 v1, 1.01705; GFX9-NEXT: s_waitcnt lgkmcnt(0)1706; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1707; GFX9-NEXT: s_endpgm1708;1709; GFX11-LABEL: v_clamp_constants_to_one_f32:1710; GFX11: ; %bb.0:1711; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241712; GFX11-NEXT: v_dual_mov_b32 v1, 1.0 :: v_dual_and_b32 v0, 0x3ff, v01713; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1714; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01715; GFX11-NEXT: s_waitcnt lgkmcnt(0)1716; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1717; GFX11-NEXT: s_endpgm1718;1719; GFX12-LABEL: v_clamp_constants_to_one_f32:1720; GFX12: ; %bb.0:1721; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x241722; GFX12-NEXT: v_dual_mov_b32 v1, 1.0 :: v_dual_and_b32 v0, 0x3ff, v01723; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1724; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01725; GFX12-NEXT: s_wait_kmcnt 0x01726; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1727; GFX12-NEXT: s_endpgm1728 %tid = call i32 @llvm.amdgcn.workitem.id.x()1729 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1730 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 4.0)1731 store float %med, ptr addrspace(1) %out.gep1732 ret void1733}1734 1735define amdgpu_kernel void @v_clamp_constants_to_zero_f32(ptr addrspace(1) %out) #0 {1736; GFX6-LABEL: v_clamp_constants_to_zero_f32:1737; GFX6: ; %bb.0:1738; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91739; GFX6-NEXT: s_mov_b32 s3, 0xf0001740; GFX6-NEXT: s_mov_b32 s2, 01741; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01742; GFX6-NEXT: v_mov_b32_e32 v1, 01743; GFX6-NEXT: s_waitcnt lgkmcnt(0)1744; GFX6-NEXT: buffer_store_dword v1, v[0:1], s[0:3], 0 addr641745; GFX6-NEXT: s_endpgm1746;1747; GFX8-LABEL: v_clamp_constants_to_zero_f32:1748; GFX8: ; %bb.0:1749; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241750; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v01751; GFX8-NEXT: v_mov_b32_e32 v2, 01752; GFX8-NEXT: s_waitcnt lgkmcnt(0)1753; GFX8-NEXT: v_mov_b32_e32 v1, s11754; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v01755; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1756; GFX8-NEXT: flat_store_dword v[0:1], v21757; GFX8-NEXT: s_endpgm1758;1759; GFX9-LABEL: v_clamp_constants_to_zero_f32:1760; GFX9: ; %bb.0:1761; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241762; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01763; GFX9-NEXT: v_mov_b32_e32 v1, 01764; GFX9-NEXT: s_waitcnt lgkmcnt(0)1765; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1766; GFX9-NEXT: s_endpgm1767;1768; GFX11-LABEL: v_clamp_constants_to_zero_f32:1769; GFX11: ; %bb.0:1770; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241771; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v01772; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1773; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01774; GFX11-NEXT: s_waitcnt lgkmcnt(0)1775; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1776; GFX11-NEXT: s_endpgm1777;1778; GFX12-LABEL: v_clamp_constants_to_zero_f32:1779; GFX12: ; %bb.0:1780; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x241781; GFX12-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v01782; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1783; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01784; GFX12-NEXT: s_wait_kmcnt 0x01785; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1786; GFX12-NEXT: s_endpgm1787 %tid = call i32 @llvm.amdgcn.workitem.id.x()1788 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1789 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float -4.0)1790 store float %med, ptr addrspace(1) %out.gep1791 ret void1792}1793 1794define amdgpu_kernel void @v_clamp_constant_preserve_f32(ptr addrspace(1) %out) #0 {1795; GFX6-LABEL: v_clamp_constant_preserve_f32:1796; GFX6: ; %bb.0:1797; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91798; GFX6-NEXT: s_mov_b32 s3, 0xf0001799; GFX6-NEXT: s_mov_b32 s2, 01800; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01801; GFX6-NEXT: v_mov_b32_e32 v1, 01802; GFX6-NEXT: v_mov_b32_e32 v2, 0.51803; GFX6-NEXT: s_waitcnt lgkmcnt(0)1804; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641805; GFX6-NEXT: s_endpgm1806;1807; GFX8-LABEL: v_clamp_constant_preserve_f32:1808; GFX8: ; %bb.0:1809; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241810; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v01811; GFX8-NEXT: v_mov_b32_e32 v2, 0.51812; GFX8-NEXT: s_waitcnt lgkmcnt(0)1813; GFX8-NEXT: v_mov_b32_e32 v1, s11814; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v01815; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1816; GFX8-NEXT: flat_store_dword v[0:1], v21817; GFX8-NEXT: s_endpgm1818;1819; GFX9-LABEL: v_clamp_constant_preserve_f32:1820; GFX9: ; %bb.0:1821; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241822; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01823; GFX9-NEXT: v_mov_b32_e32 v1, 0.51824; GFX9-NEXT: s_waitcnt lgkmcnt(0)1825; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1826; GFX9-NEXT: s_endpgm1827;1828; GFX11-LABEL: v_clamp_constant_preserve_f32:1829; GFX11: ; %bb.0:1830; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241831; GFX11-NEXT: v_dual_mov_b32 v1, 0.5 :: v_dual_and_b32 v0, 0x3ff, v01832; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1833; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01834; GFX11-NEXT: s_waitcnt lgkmcnt(0)1835; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1836; GFX11-NEXT: s_endpgm1837;1838; GFX12-LABEL: v_clamp_constant_preserve_f32:1839; GFX12: ; %bb.0:1840; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x241841; GFX12-NEXT: v_dual_mov_b32 v1, 0.5 :: v_dual_and_b32 v0, 0x3ff, v01842; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1843; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01844; GFX12-NEXT: s_wait_kmcnt 0x01845; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1846; GFX12-NEXT: s_endpgm1847 %tid = call i32 @llvm.amdgcn.workitem.id.x()1848 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1849 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0.5)1850 store float %med, ptr addrspace(1) %out.gep1851 ret void1852}1853 1854define amdgpu_kernel void @v_clamp_constant_preserve_denorm_f32(ptr addrspace(1) %out) #0 {1855; GFX6-LABEL: v_clamp_constant_preserve_denorm_f32:1856; GFX6: ; %bb.0:1857; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91858; GFX6-NEXT: s_mov_b32 s3, 0xf0001859; GFX6-NEXT: s_mov_b32 s2, 01860; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01861; GFX6-NEXT: v_mov_b32_e32 v1, 01862; GFX6-NEXT: v_mov_b32_e32 v2, 0x7fffff1863; GFX6-NEXT: s_waitcnt lgkmcnt(0)1864; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr641865; GFX6-NEXT: s_endpgm1866;1867; GFX8-LABEL: v_clamp_constant_preserve_denorm_f32:1868; GFX8: ; %bb.0:1869; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241870; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v01871; GFX8-NEXT: v_mov_b32_e32 v2, 0x7fffff1872; GFX8-NEXT: s_waitcnt lgkmcnt(0)1873; GFX8-NEXT: v_mov_b32_e32 v1, s11874; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v01875; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1876; GFX8-NEXT: flat_store_dword v[0:1], v21877; GFX8-NEXT: s_endpgm1878;1879; GFX9-LABEL: v_clamp_constant_preserve_denorm_f32:1880; GFX9: ; %bb.0:1881; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241882; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01883; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fffff1884; GFX9-NEXT: s_waitcnt lgkmcnt(0)1885; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1886; GFX9-NEXT: s_endpgm1887;1888; GFX11-LABEL: v_clamp_constant_preserve_denorm_f32:1889; GFX11: ; %bb.0:1890; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241891; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01892; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1893; GFX11-NEXT: v_dual_mov_b32 v1, 0x7fffff :: v_dual_lshlrev_b32 v0, 2, v01894; GFX11-NEXT: s_waitcnt lgkmcnt(0)1895; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1896; GFX11-NEXT: s_endpgm1897;1898; GFX12-LABEL: v_clamp_constant_preserve_denorm_f32:1899; GFX12: ; %bb.0:1900; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x241901; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v01902; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1903; GFX12-NEXT: v_dual_mov_b32 v1, 0x7fffff :: v_dual_lshlrev_b32 v0, 2, v01904; GFX12-NEXT: s_wait_kmcnt 0x01905; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1906; GFX12-NEXT: s_endpgm1907 %tid = call i32 @llvm.amdgcn.workitem.id.x()1908 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1909 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 8388607 to float))1910 store float %med, ptr addrspace(1) %out.gep1911 ret void1912}1913 1914define amdgpu_kernel void @v_clamp_constant_qnan_f32(ptr addrspace(1) %out) #0 {1915; GFX6-LABEL: v_clamp_constant_qnan_f32:1916; GFX6: ; %bb.0:1917; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91918; GFX6-NEXT: s_mov_b32 s3, 0xf0001919; GFX6-NEXT: s_mov_b32 s2, 01920; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01921; GFX6-NEXT: v_mov_b32_e32 v1, 01922; GFX6-NEXT: s_waitcnt lgkmcnt(0)1923; GFX6-NEXT: buffer_store_dword v1, v[0:1], s[0:3], 0 addr641924; GFX6-NEXT: s_endpgm1925;1926; GFX8-LABEL: v_clamp_constant_qnan_f32:1927; GFX8: ; %bb.0:1928; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241929; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v01930; GFX8-NEXT: v_mov_b32_e32 v2, 01931; GFX8-NEXT: s_waitcnt lgkmcnt(0)1932; GFX8-NEXT: v_mov_b32_e32 v1, s11933; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v01934; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1935; GFX8-NEXT: flat_store_dword v[0:1], v21936; GFX8-NEXT: s_endpgm1937;1938; GFX9-LABEL: v_clamp_constant_qnan_f32:1939; GFX9: ; %bb.0:1940; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241941; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v01942; GFX9-NEXT: v_mov_b32_e32 v1, 01943; GFX9-NEXT: s_waitcnt lgkmcnt(0)1944; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1945; GFX9-NEXT: s_endpgm1946;1947; GFX11-LABEL: v_clamp_constant_qnan_f32:1948; GFX11: ; %bb.0:1949; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241950; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v01951; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1952; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01953; GFX11-NEXT: s_waitcnt lgkmcnt(0)1954; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1955; GFX11-NEXT: s_endpgm1956;1957; GFX12-LABEL: v_clamp_constant_qnan_f32:1958; GFX12: ; %bb.0:1959; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x241960; GFX12-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v01961; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1962; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v01963; GFX12-NEXT: s_wait_kmcnt 0x01964; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1965; GFX12-NEXT: s_endpgm1966 %tid = call i32 @llvm.amdgcn.workitem.id.x()1967 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid1968 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8000000000000)1969 store float %med, ptr addrspace(1) %out.gep1970 ret void1971}1972 1973define amdgpu_kernel void @v_clamp_constant_snan_f32(ptr addrspace(1) %out) #0 {1974; GFX6-LABEL: v_clamp_constant_snan_f32:1975; GFX6: ; %bb.0:1976; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91977; GFX6-NEXT: s_mov_b32 s3, 0xf0001978; GFX6-NEXT: s_mov_b32 s2, 01979; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v01980; GFX6-NEXT: v_mov_b32_e32 v1, 01981; GFX6-NEXT: s_waitcnt lgkmcnt(0)1982; GFX6-NEXT: buffer_store_dword v1, v[0:1], s[0:3], 0 addr641983; GFX6-NEXT: s_endpgm1984;1985; GFX8-LABEL: v_clamp_constant_snan_f32:1986; GFX8: ; %bb.0:1987; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241988; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v01989; GFX8-NEXT: v_mov_b32_e32 v2, 01990; GFX8-NEXT: s_waitcnt lgkmcnt(0)1991; GFX8-NEXT: v_mov_b32_e32 v1, s11992; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v01993; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1994; GFX8-NEXT: flat_store_dword v[0:1], v21995; GFX8-NEXT: s_endpgm1996;1997; GFX9-LABEL: v_clamp_constant_snan_f32:1998; GFX9: ; %bb.0:1999; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x242000; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02001; GFX9-NEXT: v_mov_b32_e32 v1, 02002; GFX9-NEXT: s_waitcnt lgkmcnt(0)2003; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2004; GFX9-NEXT: s_endpgm2005;2006; GFX11-LABEL: v_clamp_constant_snan_f32:2007; GFX11: ; %bb.0:2008; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x242009; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v02010; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2011; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02012; GFX11-NEXT: s_waitcnt lgkmcnt(0)2013; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2014; GFX11-NEXT: s_endpgm2015;2016; GFX12-LABEL: v_clamp_constant_snan_f32:2017; GFX12: ; %bb.0:2018; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x242019; GFX12-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v02020; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2021; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02022; GFX12-NEXT: s_wait_kmcnt 0x02023; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2024; GFX12-NEXT: s_endpgm2025 %tid = call i32 @llvm.amdgcn.workitem.id.x()2026 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2027 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 2139095041 to float))2028 store float %med, ptr addrspace(1) %out.gep2029 ret void2030}2031 2032; ---------------------------------------------------------------------2033; Test non-default behaviors enabling snans and disabling dx10_clamp2034; ---------------------------------------------------------------------2035 2036define amdgpu_kernel void @v_clamp_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {2037; GFX6-LABEL: v_clamp_f32_no_dx10_clamp:2038; GFX6: ; %bb.0:2039; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92040; GFX6-NEXT: s_mov_b32 s7, 0xf0002041; GFX6-NEXT: s_mov_b32 s6, 02042; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02043; GFX6-NEXT: v_mov_b32_e32 v1, 02044; GFX6-NEXT: s_waitcnt lgkmcnt(0)2045; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2046; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642047; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2048; GFX6-NEXT: s_waitcnt vmcnt(0)2049; GFX6-NEXT: v_add_f32_e32 v2, 0.5, v22050; GFX6-NEXT: v_med3_f32 v2, v2, 0, 1.02051; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642052; GFX6-NEXT: s_endpgm2053;2054; GFX8-LABEL: v_clamp_f32_no_dx10_clamp:2055; GFX8: ; %bb.0:2056; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242057; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02058; GFX8-NEXT: s_waitcnt lgkmcnt(0)2059; GFX8-NEXT: v_mov_b32_e32 v1, s32060; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22061; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2062; GFX8-NEXT: flat_load_dword v3, v[0:1]2063; GFX8-NEXT: v_mov_b32_e32 v1, s12064; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22065; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2066; GFX8-NEXT: s_waitcnt vmcnt(0)2067; GFX8-NEXT: v_add_f32_e32 v2, 0.5, v32068; GFX8-NEXT: v_med3_f32 v2, v2, 0, 1.02069; GFX8-NEXT: flat_store_dword v[0:1], v22070; GFX8-NEXT: s_endpgm2071;2072; GFX9-LABEL: v_clamp_f32_no_dx10_clamp:2073; GFX9: ; %bb.0:2074; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242075; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02076; GFX9-NEXT: s_waitcnt lgkmcnt(0)2077; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2078; GFX9-NEXT: s_waitcnt vmcnt(0)2079; GFX9-NEXT: v_add_f32_e32 v1, 0.5, v12080; GFX9-NEXT: v_med3_f32 v1, v1, 0, 1.02081; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2082; GFX9-NEXT: s_endpgm2083;2084; GFX11-LABEL: v_clamp_f32_no_dx10_clamp:2085; GFX11: ; %bb.0:2086; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242087; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02088; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)2089; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02090; GFX11-NEXT: s_waitcnt lgkmcnt(0)2091; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2092; GFX11-NEXT: s_waitcnt vmcnt(0)2093; GFX11-NEXT: v_add_f32_e32 v1, 0.5, v12094; GFX11-NEXT: v_med3_f32 v1, v1, 0, 1.02095; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2096; GFX11-NEXT: s_endpgm2097;2098; GFX12-LABEL: v_clamp_f32_no_dx10_clamp:2099; GFX12: ; %bb.0:2100; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242101; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02102; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2103; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02104; GFX12-NEXT: s_wait_kmcnt 0x02105; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2106; GFX12-NEXT: s_wait_loadcnt 0x02107; GFX12-NEXT: v_add_f32_e64 v1, v1, 0.5 clamp2108; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2109; GFX12-NEXT: s_endpgm2110 %tid = call i32 @llvm.amdgcn.workitem.id.x()2111 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2112 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2113 %a = load float, ptr addrspace(1) %gep02114 %a.nnan = fadd nnan float %a, 0.52115 %max = call float @llvm.maxnum.f32(float %a.nnan, float 0.0)2116 %med = call float @llvm.minnum.f32(float %max, float 1.0)2117 2118 store float %med, ptr addrspace(1) %out.gep2119 ret void2120}2121 2122define amdgpu_kernel void @v_clamp_f32_snan_dx10clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #3 {2123; GFX6-LABEL: v_clamp_f32_snan_dx10clamp:2124; GFX6: ; %bb.0:2125; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92126; GFX6-NEXT: s_mov_b32 s7, 0xf0002127; GFX6-NEXT: s_mov_b32 s6, 02128; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02129; GFX6-NEXT: v_mov_b32_e32 v1, 02130; GFX6-NEXT: s_waitcnt lgkmcnt(0)2131; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2132; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642133; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2134; GFX6-NEXT: s_waitcnt vmcnt(0)2135; GFX6-NEXT: v_add_f32_e64 v2, v2, 0.5 clamp2136; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642137; GFX6-NEXT: s_endpgm2138;2139; GFX8-LABEL: v_clamp_f32_snan_dx10clamp:2140; GFX8: ; %bb.0:2141; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242142; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02143; GFX8-NEXT: s_waitcnt lgkmcnt(0)2144; GFX8-NEXT: v_mov_b32_e32 v1, s32145; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22146; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2147; GFX8-NEXT: flat_load_dword v3, v[0:1]2148; GFX8-NEXT: v_mov_b32_e32 v1, s12149; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22150; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2151; GFX8-NEXT: s_waitcnt vmcnt(0)2152; GFX8-NEXT: v_add_f32_e64 v2, v3, 0.5 clamp2153; GFX8-NEXT: flat_store_dword v[0:1], v22154; GFX8-NEXT: s_endpgm2155;2156; GFX9-LABEL: v_clamp_f32_snan_dx10clamp:2157; GFX9: ; %bb.0:2158; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242159; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02160; GFX9-NEXT: s_waitcnt lgkmcnt(0)2161; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2162; GFX9-NEXT: s_waitcnt vmcnt(0)2163; GFX9-NEXT: v_add_f32_e64 v1, v1, 0.5 clamp2164; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2165; GFX9-NEXT: s_endpgm2166;2167; GFX11-LABEL: v_clamp_f32_snan_dx10clamp:2168; GFX11: ; %bb.0:2169; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242170; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02171; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2172; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02173; GFX11-NEXT: s_waitcnt lgkmcnt(0)2174; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2175; GFX11-NEXT: s_waitcnt vmcnt(0)2176; GFX11-NEXT: v_add_f32_e64 v1, v1, 0.5 clamp2177; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2178; GFX11-NEXT: s_endpgm2179;2180; GFX12-LABEL: v_clamp_f32_snan_dx10clamp:2181; GFX12: ; %bb.0:2182; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242183; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02184; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2185; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02186; GFX12-NEXT: s_wait_kmcnt 0x02187; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2188; GFX12-NEXT: s_wait_loadcnt 0x02189; GFX12-NEXT: v_add_f32_e64 v1, v1, 0.5 clamp2190; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2191; GFX12-NEXT: s_endpgm2192 %tid = call i32 @llvm.amdgcn.workitem.id.x()2193 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2194 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2195 %a = load float, ptr addrspace(1) %gep02196 %add = fadd float %a, 0.52197 %max = call float @llvm.maxnum.f32(float %add, float 0.0)2198 %med = call float @llvm.minnum.f32(float %max, float 1.0)2199 2200 store float %med, ptr addrspace(1) %out.gep2201 ret void2202}2203 2204define amdgpu_kernel void @v_clamp_f32_snan_no_dx10clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #4 {2205; GFX6-LABEL: v_clamp_f32_snan_no_dx10clamp:2206; GFX6: ; %bb.0:2207; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92208; GFX6-NEXT: s_mov_b32 s7, 0xf0002209; GFX6-NEXT: s_mov_b32 s6, 02210; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02211; GFX6-NEXT: v_mov_b32_e32 v1, 02212; GFX6-NEXT: s_waitcnt lgkmcnt(0)2213; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2214; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642215; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2216; GFX6-NEXT: s_waitcnt vmcnt(0)2217; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v22218; GFX6-NEXT: v_med3_f32 v2, v2, 0, 1.02219; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642220; GFX6-NEXT: s_endpgm2221;2222; GFX8-LABEL: v_clamp_f32_snan_no_dx10clamp:2223; GFX8: ; %bb.0:2224; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242225; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02226; GFX8-NEXT: s_waitcnt lgkmcnt(0)2227; GFX8-NEXT: v_mov_b32_e32 v1, s32228; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22229; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2230; GFX8-NEXT: flat_load_dword v3, v[0:1]2231; GFX8-NEXT: v_mov_b32_e32 v1, s12232; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22233; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2234; GFX8-NEXT: s_waitcnt vmcnt(0)2235; GFX8-NEXT: v_mul_f32_e32 v2, 1.0, v32236; GFX8-NEXT: v_med3_f32 v2, v2, 0, 1.02237; GFX8-NEXT: flat_store_dword v[0:1], v22238; GFX8-NEXT: s_endpgm2239;2240; GFX9-LABEL: v_clamp_f32_snan_no_dx10clamp:2241; GFX9: ; %bb.0:2242; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242243; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02244; GFX9-NEXT: s_waitcnt lgkmcnt(0)2245; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2246; GFX9-NEXT: s_waitcnt vmcnt(0)2247; GFX9-NEXT: v_max_f32_e32 v1, v1, v12248; GFX9-NEXT: v_med3_f32 v1, v1, 0, 1.02249; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2250; GFX9-NEXT: s_endpgm2251;2252; GFX11-LABEL: v_clamp_f32_snan_no_dx10clamp:2253; GFX11: ; %bb.0:2254; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242255; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02256; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)2257; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02258; GFX11-NEXT: s_waitcnt lgkmcnt(0)2259; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2260; GFX11-NEXT: s_waitcnt vmcnt(0)2261; GFX11-NEXT: v_max_f32_e32 v1, v1, v12262; GFX11-NEXT: v_med3_f32 v1, v1, 0, 1.02263; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2264; GFX11-NEXT: s_endpgm2265;2266; GFX12-LABEL: v_clamp_f32_snan_no_dx10clamp:2267; GFX12: ; %bb.0:2268; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242269; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02270; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2271; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02272; GFX12-NEXT: s_wait_kmcnt 0x02273; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2274; GFX12-NEXT: s_wait_loadcnt 0x02275; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp2276; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2277; GFX12-NEXT: s_endpgm2278 %tid = call i32 @llvm.amdgcn.workitem.id.x()2279 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2280 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2281 %a = load float, ptr addrspace(1) %gep02282 %max = call float @llvm.maxnum.f32(float %a, float 0.0)2283 %med = call float @llvm.minnum.f32(float %max, float 1.0)2284 2285 store float %med, ptr addrspace(1) %out.gep2286 ret void2287}2288 2289define amdgpu_kernel void @v_clamp_f32_snan_no_dx10clamp_nnan_src(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #4 {2290; GFX6-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:2291; GFX6: ; %bb.0:2292; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92293; GFX6-NEXT: s_mov_b32 s7, 0xf0002294; GFX6-NEXT: s_mov_b32 s6, 02295; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02296; GFX6-NEXT: v_mov_b32_e32 v1, 02297; GFX6-NEXT: s_waitcnt lgkmcnt(0)2298; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2299; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642300; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2301; GFX6-NEXT: s_waitcnt vmcnt(0)2302; GFX6-NEXT: v_add_f32_e32 v2, 1.0, v22303; GFX6-NEXT: v_med3_f32 v2, v2, 0, 1.02304; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642305; GFX6-NEXT: s_endpgm2306;2307; GFX8-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:2308; GFX8: ; %bb.0:2309; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242310; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02311; GFX8-NEXT: s_waitcnt lgkmcnt(0)2312; GFX8-NEXT: v_mov_b32_e32 v1, s32313; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22314; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2315; GFX8-NEXT: flat_load_dword v3, v[0:1]2316; GFX8-NEXT: v_mov_b32_e32 v1, s12317; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22318; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2319; GFX8-NEXT: s_waitcnt vmcnt(0)2320; GFX8-NEXT: v_add_f32_e32 v2, 1.0, v32321; GFX8-NEXT: v_med3_f32 v2, v2, 0, 1.02322; GFX8-NEXT: flat_store_dword v[0:1], v22323; GFX8-NEXT: s_endpgm2324;2325; GFX9-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:2326; GFX9: ; %bb.0:2327; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242328; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02329; GFX9-NEXT: s_waitcnt lgkmcnt(0)2330; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2331; GFX9-NEXT: s_waitcnt vmcnt(0)2332; GFX9-NEXT: v_add_f32_e32 v1, 1.0, v12333; GFX9-NEXT: v_med3_f32 v1, v1, 0, 1.02334; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2335; GFX9-NEXT: s_endpgm2336;2337; GFX11-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:2338; GFX11: ; %bb.0:2339; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242340; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02341; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)2342; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02343; GFX11-NEXT: s_waitcnt lgkmcnt(0)2344; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2345; GFX11-NEXT: s_waitcnt vmcnt(0)2346; GFX11-NEXT: v_add_f32_e32 v1, 1.0, v12347; GFX11-NEXT: v_med3_f32 v1, v1, 0, 1.02348; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2349; GFX11-NEXT: s_endpgm2350;2351; GFX12-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:2352; GFX12: ; %bb.0:2353; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242354; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02355; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2356; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02357; GFX12-NEXT: s_wait_kmcnt 0x02358; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2359; GFX12-NEXT: s_wait_loadcnt 0x02360; GFX12-NEXT: v_add_f32_e64 v1, v1, 1.0 clamp2361; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2362; GFX12-NEXT: s_endpgm2363 %tid = call i32 @llvm.amdgcn.workitem.id.x()2364 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2365 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2366 %a = load float, ptr addrspace(1) %gep02367 %add = fadd nnan float %a, 1.02368 %max = call float @llvm.maxnum.f32(float %add, float 0.0)2369 %med = call float @llvm.minnum.f32(float %max, float 1.0)2370 2371 store float %med, ptr addrspace(1) %out.gep2372 ret void2373}2374 2375define amdgpu_kernel void @v_clamp_med3_aby_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {2376; GFX6-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:2377; GFX6: ; %bb.0:2378; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92379; GFX6-NEXT: s_mov_b32 s7, 0xf0002380; GFX6-NEXT: s_mov_b32 s6, 02381; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02382; GFX6-NEXT: v_mov_b32_e32 v1, 02383; GFX6-NEXT: s_waitcnt lgkmcnt(0)2384; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2385; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642386; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2387; GFX6-NEXT: s_waitcnt vmcnt(0)2388; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp2389; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642390; GFX6-NEXT: s_endpgm2391;2392; GFX8-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:2393; GFX8: ; %bb.0:2394; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242395; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02396; GFX8-NEXT: s_waitcnt lgkmcnt(0)2397; GFX8-NEXT: v_mov_b32_e32 v1, s32398; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22399; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2400; GFX8-NEXT: flat_load_dword v3, v[0:1]2401; GFX8-NEXT: v_mov_b32_e32 v1, s12402; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22403; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2404; GFX8-NEXT: s_waitcnt vmcnt(0)2405; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp2406; GFX8-NEXT: flat_store_dword v[0:1], v22407; GFX8-NEXT: s_endpgm2408;2409; GFX9-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:2410; GFX9: ; %bb.0:2411; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242412; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02413; GFX9-NEXT: s_waitcnt lgkmcnt(0)2414; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2415; GFX9-NEXT: s_waitcnt vmcnt(0)2416; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp2417; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2418; GFX9-NEXT: s_endpgm2419;2420; GFX11-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:2421; GFX11: ; %bb.0:2422; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242423; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02424; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2425; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02426; GFX11-NEXT: s_waitcnt lgkmcnt(0)2427; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2428; GFX11-NEXT: s_waitcnt vmcnt(0)2429; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp2430; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2431; GFX11-NEXT: s_endpgm2432;2433; GFX12-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:2434; GFX12: ; %bb.0:2435; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242436; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02437; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2438; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02439; GFX12-NEXT: s_wait_kmcnt 0x02440; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2441; GFX12-NEXT: s_wait_loadcnt 0x02442; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp2443; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2444; GFX12-NEXT: s_endpgm2445 %tid = call i32 @llvm.amdgcn.workitem.id.x()2446 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2447 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2448 %a = load float, ptr addrspace(1) %gep02449 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %a)2450 store float %med, ptr addrspace(1) %out.gep2451 ret void2452}2453 2454define amdgpu_kernel void @v_clamp_med3_bay_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {2455; GFX6-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:2456; GFX6: ; %bb.0:2457; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92458; GFX6-NEXT: s_mov_b32 s7, 0xf0002459; GFX6-NEXT: s_mov_b32 s6, 02460; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02461; GFX6-NEXT: v_mov_b32_e32 v1, 02462; GFX6-NEXT: s_waitcnt lgkmcnt(0)2463; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2464; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642465; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2466; GFX6-NEXT: s_waitcnt vmcnt(0)2467; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp2468; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642469; GFX6-NEXT: s_endpgm2470;2471; GFX8-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:2472; GFX8: ; %bb.0:2473; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242474; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02475; GFX8-NEXT: s_waitcnt lgkmcnt(0)2476; GFX8-NEXT: v_mov_b32_e32 v1, s32477; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22478; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2479; GFX8-NEXT: flat_load_dword v3, v[0:1]2480; GFX8-NEXT: v_mov_b32_e32 v1, s12481; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22482; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2483; GFX8-NEXT: s_waitcnt vmcnt(0)2484; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp2485; GFX8-NEXT: flat_store_dword v[0:1], v22486; GFX8-NEXT: s_endpgm2487;2488; GFX9-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:2489; GFX9: ; %bb.0:2490; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242491; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02492; GFX9-NEXT: s_waitcnt lgkmcnt(0)2493; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2494; GFX9-NEXT: s_waitcnt vmcnt(0)2495; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp2496; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2497; GFX9-NEXT: s_endpgm2498;2499; GFX11-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:2500; GFX11: ; %bb.0:2501; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242502; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02503; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2504; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02505; GFX11-NEXT: s_waitcnt lgkmcnt(0)2506; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2507; GFX11-NEXT: s_waitcnt vmcnt(0)2508; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp2509; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2510; GFX11-NEXT: s_endpgm2511;2512; GFX12-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:2513; GFX12: ; %bb.0:2514; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242515; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02516; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2517; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02518; GFX12-NEXT: s_wait_kmcnt 0x02519; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2520; GFX12-NEXT: s_wait_loadcnt 0x02521; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp2522; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2523; GFX12-NEXT: s_endpgm2524 %tid = call i32 @llvm.amdgcn.workitem.id.x()2525 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2526 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2527 %a = load float, ptr addrspace(1) %gep02528 %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float 0.0, float %a)2529 store float %med, ptr addrspace(1) %out.gep2530 ret void2531}2532 2533define amdgpu_kernel void @v_clamp_med3_yab_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {2534; GFX6-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:2535; GFX6: ; %bb.0:2536; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92537; GFX6-NEXT: s_mov_b32 s7, 0xf0002538; GFX6-NEXT: s_mov_b32 s6, 02539; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02540; GFX6-NEXT: v_mov_b32_e32 v1, 02541; GFX6-NEXT: s_waitcnt lgkmcnt(0)2542; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2543; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642544; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2545; GFX6-NEXT: s_waitcnt vmcnt(0)2546; GFX6-NEXT: v_med3_f32 v2, v2, 0, 1.02547; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642548; GFX6-NEXT: s_endpgm2549;2550; GFX8-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:2551; GFX8: ; %bb.0:2552; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242553; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02554; GFX8-NEXT: s_waitcnt lgkmcnt(0)2555; GFX8-NEXT: v_mov_b32_e32 v1, s32556; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22557; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2558; GFX8-NEXT: flat_load_dword v3, v[0:1]2559; GFX8-NEXT: v_mov_b32_e32 v1, s12560; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22561; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2562; GFX8-NEXT: s_waitcnt vmcnt(0)2563; GFX8-NEXT: v_med3_f32 v2, v3, 0, 1.02564; GFX8-NEXT: flat_store_dword v[0:1], v22565; GFX8-NEXT: s_endpgm2566;2567; GFX9-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:2568; GFX9: ; %bb.0:2569; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242570; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02571; GFX9-NEXT: s_waitcnt lgkmcnt(0)2572; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2573; GFX9-NEXT: s_waitcnt vmcnt(0)2574; GFX9-NEXT: v_med3_f32 v1, v1, 0, 1.02575; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2576; GFX9-NEXT: s_endpgm2577;2578; GFX11-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:2579; GFX11: ; %bb.0:2580; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242581; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02582; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2583; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02584; GFX11-NEXT: s_waitcnt lgkmcnt(0)2585; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2586; GFX11-NEXT: s_waitcnt vmcnt(0)2587; GFX11-NEXT: v_med3_f32 v1, v1, 0, 1.02588; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2589; GFX11-NEXT: s_endpgm2590;2591; GFX12-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:2592; GFX12: ; %bb.0:2593; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242594; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02595; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2596; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02597; GFX12-NEXT: s_wait_kmcnt 0x02598; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2599; GFX12-NEXT: s_wait_loadcnt 0x02600; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp2601; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2602; GFX12-NEXT: s_endpgm2603 %tid = call i32 @llvm.amdgcn.workitem.id.x()2604 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2605 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2606 %a = load float, ptr addrspace(1) %gep02607 %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 0.0, float 1.0)2608 store float %med, ptr addrspace(1) %out.gep2609 ret void2610}2611 2612define amdgpu_kernel void @v_clamp_med3_yba_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {2613; GFX6-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:2614; GFX6: ; %bb.0:2615; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92616; GFX6-NEXT: s_mov_b32 s7, 0xf0002617; GFX6-NEXT: s_mov_b32 s6, 02618; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02619; GFX6-NEXT: v_mov_b32_e32 v1, 02620; GFX6-NEXT: s_waitcnt lgkmcnt(0)2621; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2622; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642623; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2624; GFX6-NEXT: s_waitcnt vmcnt(0)2625; GFX6-NEXT: v_med3_f32 v2, v2, 1.0, 02626; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642627; GFX6-NEXT: s_endpgm2628;2629; GFX8-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:2630; GFX8: ; %bb.0:2631; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242632; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02633; GFX8-NEXT: s_waitcnt lgkmcnt(0)2634; GFX8-NEXT: v_mov_b32_e32 v1, s32635; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22636; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2637; GFX8-NEXT: flat_load_dword v3, v[0:1]2638; GFX8-NEXT: v_mov_b32_e32 v1, s12639; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22640; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2641; GFX8-NEXT: s_waitcnt vmcnt(0)2642; GFX8-NEXT: v_med3_f32 v2, v3, 1.0, 02643; GFX8-NEXT: flat_store_dword v[0:1], v22644; GFX8-NEXT: s_endpgm2645;2646; GFX9-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:2647; GFX9: ; %bb.0:2648; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242649; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02650; GFX9-NEXT: s_waitcnt lgkmcnt(0)2651; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2652; GFX9-NEXT: s_waitcnt vmcnt(0)2653; GFX9-NEXT: v_med3_f32 v1, v1, 1.0, 02654; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2655; GFX9-NEXT: s_endpgm2656;2657; GFX11-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:2658; GFX11: ; %bb.0:2659; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242660; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02661; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2662; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02663; GFX11-NEXT: s_waitcnt lgkmcnt(0)2664; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2665; GFX11-NEXT: s_waitcnt vmcnt(0)2666; GFX11-NEXT: v_med3_f32 v1, v1, 1.0, 02667; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2668; GFX11-NEXT: s_endpgm2669;2670; GFX12-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:2671; GFX12: ; %bb.0:2672; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242673; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02674; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2675; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02676; GFX12-NEXT: s_wait_kmcnt 0x02677; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2678; GFX12-NEXT: s_wait_loadcnt 0x02679; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp2680; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2681; GFX12-NEXT: s_endpgm2682 %tid = call i32 @llvm.amdgcn.workitem.id.x()2683 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2684 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2685 %a = load float, ptr addrspace(1) %gep02686 %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 1.0, float 0.0)2687 store float %med, ptr addrspace(1) %out.gep2688 ret void2689}2690 2691define amdgpu_kernel void @v_clamp_med3_ayb_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {2692; GFX6-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:2693; GFX6: ; %bb.0:2694; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92695; GFX6-NEXT: s_mov_b32 s7, 0xf0002696; GFX6-NEXT: s_mov_b32 s6, 02697; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02698; GFX6-NEXT: v_mov_b32_e32 v1, 02699; GFX6-NEXT: s_waitcnt lgkmcnt(0)2700; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2701; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642702; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2703; GFX6-NEXT: s_waitcnt vmcnt(0)2704; GFX6-NEXT: v_med3_f32 v2, 0, v2, 1.02705; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642706; GFX6-NEXT: s_endpgm2707;2708; GFX8-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:2709; GFX8: ; %bb.0:2710; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242711; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02712; GFX8-NEXT: s_waitcnt lgkmcnt(0)2713; GFX8-NEXT: v_mov_b32_e32 v1, s32714; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22715; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2716; GFX8-NEXT: flat_load_dword v3, v[0:1]2717; GFX8-NEXT: v_mov_b32_e32 v1, s12718; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22719; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2720; GFX8-NEXT: s_waitcnt vmcnt(0)2721; GFX8-NEXT: v_med3_f32 v2, 0, v3, 1.02722; GFX8-NEXT: flat_store_dword v[0:1], v22723; GFX8-NEXT: s_endpgm2724;2725; GFX9-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:2726; GFX9: ; %bb.0:2727; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242728; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02729; GFX9-NEXT: s_waitcnt lgkmcnt(0)2730; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2731; GFX9-NEXT: s_waitcnt vmcnt(0)2732; GFX9-NEXT: v_med3_f32 v1, 0, v1, 1.02733; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2734; GFX9-NEXT: s_endpgm2735;2736; GFX11-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:2737; GFX11: ; %bb.0:2738; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242739; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02740; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2741; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02742; GFX11-NEXT: s_waitcnt lgkmcnt(0)2743; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2744; GFX11-NEXT: s_waitcnt vmcnt(0)2745; GFX11-NEXT: v_med3_f32 v1, 0, v1, 1.02746; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2747; GFX11-NEXT: s_endpgm2748;2749; GFX12-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:2750; GFX12: ; %bb.0:2751; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242752; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02753; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2754; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02755; GFX12-NEXT: s_wait_kmcnt 0x02756; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2757; GFX12-NEXT: s_wait_loadcnt 0x02758; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp2759; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2760; GFX12-NEXT: s_endpgm2761 %tid = call i32 @llvm.amdgcn.workitem.id.x()2762 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2763 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2764 %a = load float, ptr addrspace(1) %gep02765 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %a, float 1.0)2766 store float %med, ptr addrspace(1) %out.gep2767 ret void2768}2769 2770define amdgpu_kernel void @v_clamp_med3_bya_f32_no_dx10_clamp(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #2 {2771; GFX6-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:2772; GFX6: ; %bb.0:2773; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92774; GFX6-NEXT: s_mov_b32 s7, 0xf0002775; GFX6-NEXT: s_mov_b32 s6, 02776; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02777; GFX6-NEXT: v_mov_b32_e32 v1, 02778; GFX6-NEXT: s_waitcnt lgkmcnt(0)2779; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2780; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642781; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2782; GFX6-NEXT: s_waitcnt vmcnt(0)2783; GFX6-NEXT: v_med3_f32 v2, 1.0, v2, 02784; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642785; GFX6-NEXT: s_endpgm2786;2787; GFX8-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:2788; GFX8: ; %bb.0:2789; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242790; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02791; GFX8-NEXT: s_waitcnt lgkmcnt(0)2792; GFX8-NEXT: v_mov_b32_e32 v1, s32793; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22794; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2795; GFX8-NEXT: flat_load_dword v3, v[0:1]2796; GFX8-NEXT: v_mov_b32_e32 v1, s12797; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22798; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2799; GFX8-NEXT: s_waitcnt vmcnt(0)2800; GFX8-NEXT: v_med3_f32 v2, 1.0, v3, 02801; GFX8-NEXT: flat_store_dword v[0:1], v22802; GFX8-NEXT: s_endpgm2803;2804; GFX9-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:2805; GFX9: ; %bb.0:2806; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242807; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02808; GFX9-NEXT: s_waitcnt lgkmcnt(0)2809; GFX9-NEXT: global_load_dword v1, v0, s[2:3]2810; GFX9-NEXT: s_waitcnt vmcnt(0)2811; GFX9-NEXT: v_med3_f32 v1, 1.0, v1, 02812; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2813; GFX9-NEXT: s_endpgm2814;2815; GFX11-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:2816; GFX11: ; %bb.0:2817; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x242818; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02819; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2820; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02821; GFX11-NEXT: s_waitcnt lgkmcnt(0)2822; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]2823; GFX11-NEXT: s_waitcnt vmcnt(0)2824; GFX11-NEXT: v_med3_f32 v1, 1.0, v1, 02825; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2826; GFX11-NEXT: s_endpgm2827;2828; GFX12-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:2829; GFX12: ; %bb.0:2830; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x242831; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02832; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2833; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02834; GFX12-NEXT: s_wait_kmcnt 0x02835; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]2836; GFX12-NEXT: s_wait_loadcnt 0x02837; GFX12-NEXT: v_max_num_f32_e64 v1, v1, v1 clamp2838; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2839; GFX12-NEXT: s_endpgm2840 %tid = call i32 @llvm.amdgcn.workitem.id.x()2841 %gep0 = getelementptr float, ptr addrspace(1) %aptr, i32 %tid2842 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2843 %a = load float, ptr addrspace(1) %gep02844 %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %a, float 0.0)2845 store float %med, ptr addrspace(1) %out.gep2846 ret void2847}2848 2849define amdgpu_kernel void @v_clamp_constant_qnan_f32_no_dx10_clamp(ptr addrspace(1) %out) #2 {2850; GFX6-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:2851; GFX6: ; %bb.0:2852; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x92853; GFX6-NEXT: s_mov_b32 s3, 0xf0002854; GFX6-NEXT: s_mov_b32 s2, 02855; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02856; GFX6-NEXT: v_mov_b32_e32 v1, 02857; GFX6-NEXT: v_mov_b32_e32 v2, 0x7fc000002858; GFX6-NEXT: s_waitcnt lgkmcnt(0)2859; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642860; GFX6-NEXT: s_endpgm2861;2862; GFX8-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:2863; GFX8: ; %bb.0:2864; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x242865; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v02866; GFX8-NEXT: v_mov_b32_e32 v2, 0x7fc000002867; GFX8-NEXT: s_waitcnt lgkmcnt(0)2868; GFX8-NEXT: v_mov_b32_e32 v1, s12869; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v02870; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2871; GFX8-NEXT: flat_store_dword v[0:1], v22872; GFX8-NEXT: s_endpgm2873;2874; GFX9-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:2875; GFX9: ; %bb.0:2876; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x242877; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02878; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc000002879; GFX9-NEXT: s_waitcnt lgkmcnt(0)2880; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2881; GFX9-NEXT: s_endpgm2882;2883; GFX11-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:2884; GFX11: ; %bb.0:2885; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x242886; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02887; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2888; GFX11-NEXT: v_dual_mov_b32 v1, 0x7fc00000 :: v_dual_lshlrev_b32 v0, 2, v02889; GFX11-NEXT: s_waitcnt lgkmcnt(0)2890; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2891; GFX11-NEXT: s_endpgm2892;2893; GFX12-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:2894; GFX12: ; %bb.0:2895; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x242896; GFX12-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v02897; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2898; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02899; GFX12-NEXT: s_wait_kmcnt 0x02900; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2901; GFX12-NEXT: s_endpgm2902 %tid = call i32 @llvm.amdgcn.workitem.id.x()2903 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2904 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8000000000000)2905 store float %med, ptr addrspace(1) %out.gep2906 ret void2907}2908 2909define amdgpu_kernel void @v_clamp_constant_snan_f32_no_dx10_clamp(ptr addrspace(1) %out) #2 {2910; GFX6-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:2911; GFX6: ; %bb.0:2912; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x92913; GFX6-NEXT: s_mov_b32 s3, 0xf0002914; GFX6-NEXT: s_mov_b32 s2, 02915; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02916; GFX6-NEXT: v_mov_b32_e32 v1, 02917; GFX6-NEXT: v_mov_b32_e32 v2, 0x7f8000012918; GFX6-NEXT: s_waitcnt lgkmcnt(0)2919; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642920; GFX6-NEXT: s_endpgm2921;2922; GFX8-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:2923; GFX8: ; %bb.0:2924; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x242925; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v02926; GFX8-NEXT: v_mov_b32_e32 v2, 0x7f8000012927; GFX8-NEXT: s_waitcnt lgkmcnt(0)2928; GFX8-NEXT: v_mov_b32_e32 v1, s12929; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v02930; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2931; GFX8-NEXT: flat_store_dword v[0:1], v22932; GFX8-NEXT: s_endpgm2933;2934; GFX9-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:2935; GFX9: ; %bb.0:2936; GFX9-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x242937; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02938; GFX9-NEXT: v_mov_b32_e32 v1, 0x7f8000012939; GFX9-NEXT: s_waitcnt lgkmcnt(0)2940; GFX9-NEXT: global_store_dword v0, v1, s[0:1]2941; GFX9-NEXT: s_endpgm2942;2943; GFX11-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:2944; GFX11: ; %bb.0:2945; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x242946; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02947; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2948; GFX11-NEXT: v_dual_mov_b32 v1, 0x7f800001 :: v_dual_lshlrev_b32 v0, 2, v02949; GFX11-NEXT: s_waitcnt lgkmcnt(0)2950; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]2951; GFX11-NEXT: s_endpgm2952;2953; GFX12-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:2954; GFX12: ; %bb.0:2955; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x242956; GFX12-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v02957; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2958; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02959; GFX12-NEXT: s_wait_kmcnt 0x02960; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]2961; GFX12-NEXT: s_endpgm2962 %tid = call i32 @llvm.amdgcn.workitem.id.x()2963 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 %tid2964 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 2139095041 to float))2965 store float %med, ptr addrspace(1) %out.gep2966 ret void2967}2968 2969define amdgpu_kernel void @v_clamp_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {2970; GFX6-LABEL: v_clamp_v2f16:2971; GFX6: ; %bb.0:2972; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92973; GFX6-NEXT: s_mov_b32 s7, 0xf0002974; GFX6-NEXT: s_mov_b32 s6, 02975; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v02976; GFX6-NEXT: v_mov_b32_e32 v1, 02977; GFX6-NEXT: s_waitcnt lgkmcnt(0)2978; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]2979; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr642980; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]2981; GFX6-NEXT: s_waitcnt vmcnt(0)2982; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v22983; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp2984; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp2985; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v32986; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v22987; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v32988; GFX6-NEXT: v_or_b32_e32 v2, v2, v32989; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr642990; GFX6-NEXT: s_endpgm2991;2992; GFX8-LABEL: v_clamp_v2f16:2993; GFX8: ; %bb.0:2994; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x242995; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02996; GFX8-NEXT: s_waitcnt lgkmcnt(0)2997; GFX8-NEXT: v_mov_b32_e32 v1, s32998; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22999; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3000; GFX8-NEXT: flat_load_dword v3, v[0:1]3001; GFX8-NEXT: v_mov_b32_e32 v1, s13002; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23003; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3004; GFX8-NEXT: s_waitcnt vmcnt(0)3005; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13006; GFX8-NEXT: v_max_f16_e64 v3, v3, v3 clamp3007; GFX8-NEXT: v_or_b32_e32 v2, v3, v23008; GFX8-NEXT: flat_store_dword v[0:1], v23009; GFX8-NEXT: s_endpgm3010;3011; GFX9-LABEL: v_clamp_v2f16:3012; GFX9: ; %bb.0:3013; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243014; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03015; GFX9-NEXT: s_waitcnt lgkmcnt(0)3016; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3017; GFX9-NEXT: s_waitcnt vmcnt(0)3018; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp3019; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3020; GFX9-NEXT: s_endpgm3021;3022; GFX11-LABEL: v_clamp_v2f16:3023; GFX11: ; %bb.0:3024; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243025; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03026; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3027; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03028; GFX11-NEXT: s_waitcnt lgkmcnt(0)3029; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3030; GFX11-NEXT: s_waitcnt vmcnt(0)3031; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp3032; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3033; GFX11-NEXT: s_endpgm3034;3035; GFX12-LABEL: v_clamp_v2f16:3036; GFX12: ; %bb.0:3037; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243038; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03039; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3040; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03041; GFX12-NEXT: s_wait_kmcnt 0x03042; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3043; GFX12-NEXT: s_wait_loadcnt 0x03044; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 clamp3045; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3046; GFX12-NEXT: s_endpgm3047 %tid = call i32 @llvm.amdgcn.workitem.id.x()3048 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3049 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3050 %a = load <2 x half>, ptr addrspace(1) %gep03051 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> zeroinitializer)3052 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)3053 3054 store <2 x half> %med, ptr addrspace(1) %out.gep3055 ret void3056}3057 3058define amdgpu_kernel void @v_clamp_v2f16_undef_elt(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3059; GFX6-LABEL: v_clamp_v2f16_undef_elt:3060; GFX6: ; %bb.0:3061; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93062; GFX6-NEXT: s_mov_b32 s7, 0xf0003063; GFX6-NEXT: s_mov_b32 s6, 03064; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03065; GFX6-NEXT: v_mov_b32_e32 v1, 03066; GFX6-NEXT: s_waitcnt lgkmcnt(0)3067; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3068; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643069; GFX6-NEXT: v_mov_b32_e32 v4, 0x7fc000003070; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3071; GFX6-NEXT: s_waitcnt vmcnt(0)3072; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23073; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v23074; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v33075; GFX6-NEXT: v_max_f32_e32 v2, 0x7fc00000, v23076; GFX6-NEXT: v_med3_f32 v3, v3, 0, v43077; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33078; GFX6-NEXT: v_min_f32_e32 v2, 1.0, v23079; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23080; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33081; GFX6-NEXT: v_or_b32_e32 v2, v2, v33082; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643083; GFX6-NEXT: s_endpgm3084;3085; GFX8-LABEL: v_clamp_v2f16_undef_elt:3086; GFX8: ; %bb.0:3087; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243088; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03089; GFX8-NEXT: v_mov_b32_e32 v4, 0x7e003090; GFX8-NEXT: s_waitcnt lgkmcnt(0)3091; GFX8-NEXT: v_mov_b32_e32 v1, s33092; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23093; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3094; GFX8-NEXT: flat_load_dword v3, v[0:1]3095; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23096; GFX8-NEXT: v_mov_b32_e32 v1, s13097; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3098; GFX8-NEXT: s_waitcnt vmcnt(0)3099; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13100; GFX8-NEXT: v_max_f16_e32 v3, v3, v33101; GFX8-NEXT: v_max_f16_e32 v2, 0, v23102; GFX8-NEXT: v_max_f16_e32 v3, 0x7e00, v33103; GFX8-NEXT: v_min_f16_e32 v3, 1.0, v33104; GFX8-NEXT: v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD3105; GFX8-NEXT: v_or_b32_e32 v2, v3, v23106; GFX8-NEXT: flat_store_dword v[0:1], v23107; GFX8-NEXT: s_endpgm3108;3109; GFX9-LABEL: v_clamp_v2f16_undef_elt:3110; GFX9: ; %bb.0:3111; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243112; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03113; GFX9-NEXT: s_waitcnt lgkmcnt(0)3114; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3115; GFX9-NEXT: s_waitcnt vmcnt(0)3116; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp3117; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3118; GFX9-NEXT: s_endpgm3119;3120; GFX11-LABEL: v_clamp_v2f16_undef_elt:3121; GFX11: ; %bb.0:3122; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243123; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03124; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3125; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03126; GFX11-NEXT: s_waitcnt lgkmcnt(0)3127; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3128; GFX11-NEXT: s_waitcnt vmcnt(0)3129; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp3130; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3131; GFX11-NEXT: s_endpgm3132;3133; GFX12-LABEL: v_clamp_v2f16_undef_elt:3134; GFX12: ; %bb.0:3135; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243136; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03137; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3138; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03139; GFX12-NEXT: s_wait_kmcnt 0x03140; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3141; GFX12-NEXT: s_wait_loadcnt 0x03142; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 clamp3143; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3144; GFX12-NEXT: s_endpgm3145 %tid = call i32 @llvm.amdgcn.workitem.id.x()3146 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3147 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3148 %a = load <2 x half>, ptr addrspace(1) %gep03149 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half poison, half 0.0>)3150 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half poison>)3151 3152 store <2 x half> %med, ptr addrspace(1) %out.gep3153 ret void3154}3155 3156define amdgpu_kernel void @v_clamp_v2f16_not_zero(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3157; GFX6-LABEL: v_clamp_v2f16_not_zero:3158; GFX6: ; %bb.0:3159; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93160; GFX6-NEXT: s_mov_b32 s7, 0xf0003161; GFX6-NEXT: s_mov_b32 s6, 03162; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03163; GFX6-NEXT: v_mov_b32_e32 v1, 03164; GFX6-NEXT: s_waitcnt lgkmcnt(0)3165; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3166; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643167; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3168; GFX6-NEXT: s_waitcnt vmcnt(0)3169; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23170; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v23171; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp3172; GFX6-NEXT: v_max_f32_e32 v2, 2.0, v23173; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33174; GFX6-NEXT: v_min_f32_e32 v2, 1.0, v23175; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23176; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33177; GFX6-NEXT: v_or_b32_e32 v2, v2, v33178; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643179; GFX6-NEXT: s_endpgm3180;3181; GFX8-LABEL: v_clamp_v2f16_not_zero:3182; GFX8: ; %bb.0:3183; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243184; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03185; GFX8-NEXT: s_waitcnt lgkmcnt(0)3186; GFX8-NEXT: v_mov_b32_e32 v1, s33187; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23188; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3189; GFX8-NEXT: flat_load_dword v3, v[0:1]3190; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23191; GFX8-NEXT: v_mov_b32_e32 v1, s13192; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3193; GFX8-NEXT: s_waitcnt vmcnt(0)3194; GFX8-NEXT: v_max_f16_e32 v2, v3, v33195; GFX8-NEXT: v_max_f16_e32 v2, 2.0, v23196; GFX8-NEXT: v_max_f16_sdwa v3, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13197; GFX8-NEXT: v_min_f16_e32 v2, 1.0, v23198; GFX8-NEXT: v_or_b32_e32 v2, v2, v33199; GFX8-NEXT: flat_store_dword v[0:1], v23200; GFX8-NEXT: s_endpgm3201;3202; GFX9-LABEL: v_clamp_v2f16_not_zero:3203; GFX9: ; %bb.0:3204; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243205; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03206; GFX9-NEXT: s_waitcnt lgkmcnt(0)3207; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3208; GFX9-NEXT: s_waitcnt vmcnt(0)3209; GFX9-NEXT: v_pk_max_f16 v1, v1, v13210; GFX9-NEXT: v_pk_max_f16 v1, v1, 2.03211; GFX9-NEXT: v_pk_min_f16 v1, v1, 1.0 op_sel_hi:[1,0]3212; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3213; GFX9-NEXT: s_endpgm3214;3215; GFX11-LABEL: v_clamp_v2f16_not_zero:3216; GFX11: ; %bb.0:3217; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243218; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03219; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)3220; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03221; GFX11-NEXT: s_waitcnt lgkmcnt(0)3222; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3223; GFX11-NEXT: s_waitcnt vmcnt(0)3224; GFX11-NEXT: v_pk_max_f16 v1, v1, v13225; GFX11-NEXT: v_pk_max_f16 v1, v1, 2.03226; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3227; GFX11-NEXT: v_pk_min_f16 v1, v1, 1.0 op_sel_hi:[1,0]3228; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3229; GFX11-NEXT: s_endpgm3230;3231; GFX12-LABEL: v_clamp_v2f16_not_zero:3232; GFX12: ; %bb.0:3233; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243234; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03235; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)3236; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03237; GFX12-NEXT: s_wait_kmcnt 0x03238; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3239; GFX12-NEXT: s_wait_loadcnt 0x03240; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v13241; GFX12-NEXT: v_pk_max_num_f16 v1, v1, 2.03242; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3243; GFX12-NEXT: v_pk_min_num_f16 v1, v1, 1.0 op_sel_hi:[1,0]3244; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3245; GFX12-NEXT: s_endpgm3246 %tid = call i32 @llvm.amdgcn.workitem.id.x()3247 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3248 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3249 %a = load <2 x half>, ptr addrspace(1) %gep03250 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 2.0, half 0.0>)3251 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)3252 3253 store <2 x half> %med, ptr addrspace(1) %out.gep3254 ret void3255}3256 3257define amdgpu_kernel void @v_clamp_v2f16_not_one(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3258; GFX6-LABEL: v_clamp_v2f16_not_one:3259; GFX6: ; %bb.0:3260; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93261; GFX6-NEXT: s_mov_b32 s7, 0xf0003262; GFX6-NEXT: s_mov_b32 s6, 03263; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03264; GFX6-NEXT: v_mov_b32_e32 v1, 03265; GFX6-NEXT: s_waitcnt lgkmcnt(0)3266; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3267; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643268; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3269; GFX6-NEXT: s_waitcnt vmcnt(0)3270; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23271; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp3272; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v23273; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33274; GFX6-NEXT: v_med3_f32 v2, v2, 0, 03275; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23276; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33277; GFX6-NEXT: v_or_b32_e32 v2, v2, v33278; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643279; GFX6-NEXT: s_endpgm3280;3281; GFX8-LABEL: v_clamp_v2f16_not_one:3282; GFX8: ; %bb.0:3283; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243284; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03285; GFX8-NEXT: s_waitcnt lgkmcnt(0)3286; GFX8-NEXT: v_mov_b32_e32 v1, s33287; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23288; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3289; GFX8-NEXT: flat_load_dword v3, v[0:1]3290; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23291; GFX8-NEXT: v_mov_b32_e32 v1, s13292; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3293; GFX8-NEXT: s_waitcnt vmcnt(0)3294; GFX8-NEXT: v_max_f16_e32 v2, v3, v33295; GFX8-NEXT: v_max_f16_e32 v2, 0, v23296; GFX8-NEXT: v_max_f16_sdwa v3, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13297; GFX8-NEXT: v_min_f16_e32 v2, 0, v23298; GFX8-NEXT: v_or_b32_e32 v2, v2, v33299; GFX8-NEXT: flat_store_dword v[0:1], v23300; GFX8-NEXT: s_endpgm3301;3302; GFX9-LABEL: v_clamp_v2f16_not_one:3303; GFX9: ; %bb.0:3304; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243305; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03306; GFX9-NEXT: s_waitcnt lgkmcnt(0)3307; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3308; GFX9-NEXT: s_waitcnt vmcnt(0)3309; GFX9-NEXT: v_pk_max_f16 v1, v1, v13310; GFX9-NEXT: v_pk_max_f16 v1, v1, 03311; GFX9-NEXT: v_pk_min_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0]3312; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3313; GFX9-NEXT: s_endpgm3314;3315; GFX11-LABEL: v_clamp_v2f16_not_one:3316; GFX11: ; %bb.0:3317; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243318; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03319; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)3320; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03321; GFX11-NEXT: s_waitcnt lgkmcnt(0)3322; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3323; GFX11-NEXT: s_waitcnt vmcnt(0)3324; GFX11-NEXT: v_pk_max_f16 v1, v1, v13325; GFX11-NEXT: v_pk_max_f16 v1, v1, 03326; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3327; GFX11-NEXT: v_pk_min_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0]3328; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3329; GFX11-NEXT: s_endpgm3330;3331; GFX12-LABEL: v_clamp_v2f16_not_one:3332; GFX12: ; %bb.0:3333; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243334; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03335; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)3336; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03337; GFX12-NEXT: s_wait_kmcnt 0x03338; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3339; GFX12-NEXT: s_wait_loadcnt 0x03340; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v13341; GFX12-NEXT: v_pk_max_num_f16 v1, v1, 03342; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3343; GFX12-NEXT: v_pk_min_num_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0]3344; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3345; GFX12-NEXT: s_endpgm3346 %tid = call i32 @llvm.amdgcn.workitem.id.x()3347 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3348 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3349 %a = load <2 x half>, ptr addrspace(1) %gep03350 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 0.0, half 0.0>)3351 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 0.0, half 1.0>)3352 3353 store <2 x half> %med, ptr addrspace(1) %out.gep3354 ret void3355}3356 3357define amdgpu_kernel void @v_clamp_neg_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3358; GFX6-LABEL: v_clamp_neg_v2f16:3359; GFX6: ; %bb.0:3360; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93361; GFX6-NEXT: s_mov_b32 s7, 0xf0003362; GFX6-NEXT: s_mov_b32 s6, 03363; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03364; GFX6-NEXT: v_mov_b32_e32 v1, 03365; GFX6-NEXT: s_waitcnt lgkmcnt(0)3366; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3367; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643368; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3369; GFX6-NEXT: s_waitcnt vmcnt(0)3370; GFX6-NEXT: v_xor_b32_e32 v2, 0x80008000, v23371; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23372; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp3373; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp3374; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33375; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23376; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33377; GFX6-NEXT: v_or_b32_e32 v2, v2, v33378; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643379; GFX6-NEXT: s_endpgm3380;3381; GFX8-LABEL: v_clamp_neg_v2f16:3382; GFX8: ; %bb.0:3383; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243384; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03385; GFX8-NEXT: s_waitcnt lgkmcnt(0)3386; GFX8-NEXT: v_mov_b32_e32 v1, s33387; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23388; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3389; GFX8-NEXT: flat_load_dword v3, v[0:1]3390; GFX8-NEXT: v_mov_b32_e32 v1, s13391; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23392; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3393; GFX8-NEXT: s_waitcnt vmcnt(0)3394; GFX8-NEXT: v_max_f16_sdwa v2, -v3, -v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13395; GFX8-NEXT: v_max_f16_e64 v3, -v3, -v3 clamp3396; GFX8-NEXT: v_or_b32_e32 v2, v3, v23397; GFX8-NEXT: flat_store_dword v[0:1], v23398; GFX8-NEXT: s_endpgm3399;3400; GFX9-LABEL: v_clamp_neg_v2f16:3401; GFX9: ; %bb.0:3402; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243403; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03404; GFX9-NEXT: s_waitcnt lgkmcnt(0)3405; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3406; GFX9-NEXT: s_waitcnt vmcnt(0)3407; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp3408; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3409; GFX9-NEXT: s_endpgm3410;3411; GFX11-LABEL: v_clamp_neg_v2f16:3412; GFX11: ; %bb.0:3413; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243414; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03415; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3416; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03417; GFX11-NEXT: s_waitcnt lgkmcnt(0)3418; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3419; GFX11-NEXT: s_waitcnt vmcnt(0)3420; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp3421; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3422; GFX11-NEXT: s_endpgm3423;3424; GFX12-LABEL: v_clamp_neg_v2f16:3425; GFX12: ; %bb.0:3426; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243427; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03428; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3429; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03430; GFX12-NEXT: s_wait_kmcnt 0x03431; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3432; GFX12-NEXT: s_wait_loadcnt 0x03433; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp3434; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3435; GFX12-NEXT: s_endpgm3436 %tid = call i32 @llvm.amdgcn.workitem.id.x()3437 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3438 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3439 %a = load <2 x half>, ptr addrspace(1) %gep03440 %fneg.a = fneg <2 x half> %a3441 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %fneg.a, <2 x half> zeroinitializer)3442 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)3443 3444 store <2 x half> %med, ptr addrspace(1) %out.gep3445 ret void3446}3447 3448define amdgpu_kernel void @v_clamp_negabs_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3449; GFX6-LABEL: v_clamp_negabs_v2f16:3450; GFX6: ; %bb.0:3451; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93452; GFX6-NEXT: s_mov_b32 s7, 0xf0003453; GFX6-NEXT: s_mov_b32 s6, 03454; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03455; GFX6-NEXT: v_mov_b32_e32 v1, 03456; GFX6-NEXT: s_waitcnt lgkmcnt(0)3457; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3458; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643459; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3460; GFX6-NEXT: s_waitcnt vmcnt(0)3461; GFX6-NEXT: v_or_b32_e32 v2, 0x80008000, v23462; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23463; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp3464; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp3465; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33466; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23467; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33468; GFX6-NEXT: v_or_b32_e32 v2, v2, v33469; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643470; GFX6-NEXT: s_endpgm3471;3472; GFX8-LABEL: v_clamp_negabs_v2f16:3473; GFX8: ; %bb.0:3474; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243475; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03476; GFX8-NEXT: s_waitcnt lgkmcnt(0)3477; GFX8-NEXT: v_mov_b32_e32 v1, s33478; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23479; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3480; GFX8-NEXT: flat_load_dword v3, v[0:1]3481; GFX8-NEXT: v_mov_b32_e32 v1, s13482; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23483; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3484; GFX8-NEXT: s_waitcnt vmcnt(0)3485; GFX8-NEXT: v_max_f16_sdwa v2, -|v3|, -|v3| clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13486; GFX8-NEXT: v_max_f16_e64 v3, -|v3|, -|v3| clamp3487; GFX8-NEXT: v_or_b32_e32 v2, v3, v23488; GFX8-NEXT: flat_store_dword v[0:1], v23489; GFX8-NEXT: s_endpgm3490;3491; GFX9-LABEL: v_clamp_negabs_v2f16:3492; GFX9: ; %bb.0:3493; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243494; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03495; GFX9-NEXT: s_waitcnt lgkmcnt(0)3496; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3497; GFX9-NEXT: s_waitcnt vmcnt(0)3498; GFX9-NEXT: v_and_b32_e32 v1, 0x7fff7fff, v13499; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp3500; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3501; GFX9-NEXT: s_endpgm3502;3503; GFX11-LABEL: v_clamp_negabs_v2f16:3504; GFX11: ; %bb.0:3505; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243506; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03507; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)3508; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03509; GFX11-NEXT: s_waitcnt lgkmcnt(0)3510; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3511; GFX11-NEXT: s_waitcnt vmcnt(0)3512; GFX11-NEXT: v_and_b32_e32 v1, 0x7fff7fff, v13513; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp3514; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3515; GFX11-NEXT: s_endpgm3516;3517; GFX12-LABEL: v_clamp_negabs_v2f16:3518; GFX12: ; %bb.0:3519; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243520; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03521; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1)3522; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03523; GFX12-NEXT: s_wait_kmcnt 0x03524; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3525; GFX12-NEXT: s_wait_loadcnt 0x03526; GFX12-NEXT: v_and_b32_e32 v1, 0x7fff7fff, v13527; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp3528; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3529; GFX12-NEXT: s_endpgm3530 %tid = call i32 @llvm.amdgcn.workitem.id.x()3531 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3532 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3533 %a = load <2 x half>, ptr addrspace(1) %gep03534 %fabs.a = call <2 x half> @llvm.fabs.v2f16(<2 x half> %a)3535 %fneg.fabs.a = fneg <2 x half> %fabs.a3536 3537 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %fneg.fabs.a, <2 x half> zeroinitializer)3538 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)3539 3540 store <2 x half> %med, ptr addrspace(1) %out.gep3541 ret void3542}3543 3544define amdgpu_kernel void @v_clamp_neglo_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3545; GFX6-LABEL: v_clamp_neglo_v2f16:3546; GFX6: ; %bb.0:3547; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93548; GFX6-NEXT: s_mov_b32 s7, 0xf0003549; GFX6-NEXT: s_mov_b32 s6, 03550; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03551; GFX6-NEXT: v_mov_b32_e32 v1, 03552; GFX6-NEXT: s_waitcnt lgkmcnt(0)3553; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3554; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643555; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3556; GFX6-NEXT: s_waitcnt vmcnt(0)3557; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23558; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp3559; GFX6-NEXT: v_and_b32_e32 v2, 0xffff, v23560; GFX6-NEXT: v_cvt_f32_f16_e64 v2, -v2 clamp3561; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33562; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23563; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33564; GFX6-NEXT: v_or_b32_e32 v2, v2, v33565; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643566; GFX6-NEXT: s_endpgm3567;3568; GFX8-LABEL: v_clamp_neglo_v2f16:3569; GFX8: ; %bb.0:3570; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243571; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03572; GFX8-NEXT: s_waitcnt lgkmcnt(0)3573; GFX8-NEXT: v_mov_b32_e32 v1, s33574; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23575; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3576; GFX8-NEXT: flat_load_dword v3, v[0:1]3577; GFX8-NEXT: v_mov_b32_e32 v1, s13578; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23579; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3580; GFX8-NEXT: s_waitcnt vmcnt(0)3581; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13582; GFX8-NEXT: v_max_f16_e64 v3, -v3, -v3 clamp3583; GFX8-NEXT: v_or_b32_e32 v2, v3, v23584; GFX8-NEXT: flat_store_dword v[0:1], v23585; GFX8-NEXT: s_endpgm3586;3587; GFX9-LABEL: v_clamp_neglo_v2f16:3588; GFX9: ; %bb.0:3589; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243590; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03591; GFX9-NEXT: s_waitcnt lgkmcnt(0)3592; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3593; GFX9-NEXT: s_waitcnt vmcnt(0)3594; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp3595; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3596; GFX9-NEXT: s_endpgm3597;3598; GFX11-LABEL: v_clamp_neglo_v2f16:3599; GFX11: ; %bb.0:3600; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243601; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03602; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3603; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03604; GFX11-NEXT: s_waitcnt lgkmcnt(0)3605; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3606; GFX11-NEXT: s_waitcnt vmcnt(0)3607; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp3608; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3609; GFX11-NEXT: s_endpgm3610;3611; GFX12-LABEL: v_clamp_neglo_v2f16:3612; GFX12: ; %bb.0:3613; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243614; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03615; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3616; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03617; GFX12-NEXT: s_wait_kmcnt 0x03618; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3619; GFX12-NEXT: s_wait_loadcnt 0x03620; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 neg_lo:[1,1] clamp3621; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3622; GFX12-NEXT: s_endpgm3623 %tid = call i32 @llvm.amdgcn.workitem.id.x()3624 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3625 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3626 %a = load <2 x half>, ptr addrspace(1) %gep03627 %lo = extractelement <2 x half> %a, i32 03628 %neg.lo = fneg half %lo3629 %neg.lo.vec = insertelement <2 x half> %a, half %neg.lo, i32 03630 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.lo.vec, <2 x half> zeroinitializer)3631 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)3632 3633 store <2 x half> %med, ptr addrspace(1) %out.gep3634 ret void3635}3636 3637define amdgpu_kernel void @v_clamp_neghi_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3638; GFX6-LABEL: v_clamp_neghi_v2f16:3639; GFX6: ; %bb.0:3640; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93641; GFX6-NEXT: s_mov_b32 s7, 0xf0003642; GFX6-NEXT: s_mov_b32 s6, 03643; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03644; GFX6-NEXT: v_mov_b32_e32 v1, 03645; GFX6-NEXT: s_waitcnt lgkmcnt(0)3646; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3647; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643648; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3649; GFX6-NEXT: s_waitcnt vmcnt(0)3650; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23651; GFX6-NEXT: v_cvt_f32_f16_e64 v3, -v3 clamp3652; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp3653; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33654; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23655; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33656; GFX6-NEXT: v_or_b32_e32 v2, v2, v33657; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643658; GFX6-NEXT: s_endpgm3659;3660; GFX8-LABEL: v_clamp_neghi_v2f16:3661; GFX8: ; %bb.0:3662; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243663; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03664; GFX8-NEXT: s_waitcnt lgkmcnt(0)3665; GFX8-NEXT: v_mov_b32_e32 v1, s33666; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23667; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3668; GFX8-NEXT: flat_load_dword v3, v[0:1]3669; GFX8-NEXT: v_mov_b32_e32 v1, s13670; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23671; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3672; GFX8-NEXT: s_waitcnt vmcnt(0)3673; GFX8-NEXT: v_max_f16_sdwa v2, -v3, -v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13674; GFX8-NEXT: v_max_f16_e64 v3, v3, v3 clamp3675; GFX8-NEXT: v_or_b32_e32 v2, v3, v23676; GFX8-NEXT: flat_store_dword v[0:1], v23677; GFX8-NEXT: s_endpgm3678;3679; GFX9-LABEL: v_clamp_neghi_v2f16:3680; GFX9: ; %bb.0:3681; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243682; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03683; GFX9-NEXT: s_waitcnt lgkmcnt(0)3684; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3685; GFX9-NEXT: s_waitcnt vmcnt(0)3686; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp3687; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3688; GFX9-NEXT: s_endpgm3689;3690; GFX11-LABEL: v_clamp_neghi_v2f16:3691; GFX11: ; %bb.0:3692; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243693; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03694; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3695; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03696; GFX11-NEXT: s_waitcnt lgkmcnt(0)3697; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3698; GFX11-NEXT: s_waitcnt vmcnt(0)3699; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp3700; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3701; GFX11-NEXT: s_endpgm3702;3703; GFX12-LABEL: v_clamp_neghi_v2f16:3704; GFX12: ; %bb.0:3705; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243706; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03707; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3708; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03709; GFX12-NEXT: s_wait_kmcnt 0x03710; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3711; GFX12-NEXT: s_wait_loadcnt 0x03712; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 neg_hi:[1,1] clamp3713; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3714; GFX12-NEXT: s_endpgm3715 %tid = call i32 @llvm.amdgcn.workitem.id.x()3716 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3717 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3718 %a = load <2 x half>, ptr addrspace(1) %gep03719 %hi = extractelement <2 x half> %a, i32 13720 %neg.hi = fneg half %hi3721 %neg.hi.vec = insertelement <2 x half> %a, half %neg.hi, i32 13722 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.hi.vec, <2 x half> zeroinitializer)3723 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)3724 3725 store <2 x half> %med, ptr addrspace(1) %out.gep3726 ret void3727}3728 3729define amdgpu_kernel void @v_clamp_v2f16_shuffle(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3730; GFX6-LABEL: v_clamp_v2f16_shuffle:3731; GFX6: ; %bb.0:3732; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93733; GFX6-NEXT: s_mov_b32 s7, 0xf0003734; GFX6-NEXT: s_mov_b32 s6, 03735; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03736; GFX6-NEXT: v_mov_b32_e32 v1, 03737; GFX6-NEXT: s_waitcnt lgkmcnt(0)3738; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3739; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643740; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3741; GFX6-NEXT: s_waitcnt vmcnt(0)3742; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23743; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp3744; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp3745; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23746; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33747; GFX6-NEXT: v_lshlrev_b32_e32 v2, 16, v23748; GFX6-NEXT: v_or_b32_e32 v2, v3, v23749; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643750; GFX6-NEXT: s_endpgm3751;3752; GFX8-LABEL: v_clamp_v2f16_shuffle:3753; GFX8: ; %bb.0:3754; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243755; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03756; GFX8-NEXT: s_waitcnt lgkmcnt(0)3757; GFX8-NEXT: v_mov_b32_e32 v1, s33758; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23759; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3760; GFX8-NEXT: flat_load_dword v3, v[0:1]3761; GFX8-NEXT: v_mov_b32_e32 v1, s13762; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23763; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3764; GFX8-NEXT: s_waitcnt vmcnt(0)3765; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD3766; GFX8-NEXT: v_max_f16_sdwa v3, v3, v3 clamp dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13767; GFX8-NEXT: v_or_b32_e32 v2, v3, v23768; GFX8-NEXT: flat_store_dword v[0:1], v23769; GFX8-NEXT: s_endpgm3770;3771; GFX9-LABEL: v_clamp_v2f16_shuffle:3772; GFX9: ; %bb.0:3773; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243774; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03775; GFX9-NEXT: s_waitcnt lgkmcnt(0)3776; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3777; GFX9-NEXT: s_waitcnt vmcnt(0)3778; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp3779; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3780; GFX9-NEXT: s_endpgm3781;3782; GFX11-LABEL: v_clamp_v2f16_shuffle:3783; GFX11: ; %bb.0:3784; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243785; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03786; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3787; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03788; GFX11-NEXT: s_waitcnt lgkmcnt(0)3789; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3790; GFX11-NEXT: s_waitcnt vmcnt(0)3791; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp3792; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3793; GFX11-NEXT: s_endpgm3794;3795; GFX12-LABEL: v_clamp_v2f16_shuffle:3796; GFX12: ; %bb.0:3797; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243798; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03799; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3800; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03801; GFX12-NEXT: s_wait_kmcnt 0x03802; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3803; GFX12-NEXT: s_wait_loadcnt 0x03804; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp3805; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3806; GFX12-NEXT: s_endpgm3807 %tid = call i32 @llvm.amdgcn.workitem.id.x()3808 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3809 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3810 %a = load <2 x half>, ptr addrspace(1) %gep03811 %shuf = shufflevector <2 x half> %a, <2 x half> poison, <2 x i32> <i32 1, i32 0>3812 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %shuf, <2 x half> zeroinitializer)3813 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)3814 3815 store <2 x half> %med, ptr addrspace(1) %out.gep3816 ret void3817}3818 3819define amdgpu_kernel void @v_clamp_v2f16_undef_limit_elts0(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3820; GFX6-LABEL: v_clamp_v2f16_undef_limit_elts0:3821; GFX6: ; %bb.0:3822; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93823; GFX6-NEXT: s_mov_b32 s7, 0xf0003824; GFX6-NEXT: s_mov_b32 s6, 03825; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03826; GFX6-NEXT: v_mov_b32_e32 v1, 03827; GFX6-NEXT: s_waitcnt lgkmcnt(0)3828; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3829; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643830; GFX6-NEXT: v_mov_b32_e32 v4, 0x7fc000003831; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3832; GFX6-NEXT: s_waitcnt vmcnt(0)3833; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23834; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v33835; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v23836; GFX6-NEXT: v_max_f32_e32 v3, 0x7fc00000, v33837; GFX6-NEXT: v_min_f32_e32 v3, 1.0, v33838; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33839; GFX6-NEXT: v_med3_f32 v2, v2, 0, v43840; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23841; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33842; GFX6-NEXT: v_or_b32_e32 v2, v2, v33843; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643844; GFX6-NEXT: s_endpgm3845;3846; GFX8-LABEL: v_clamp_v2f16_undef_limit_elts0:3847; GFX8: ; %bb.0:3848; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243849; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03850; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c003851; GFX8-NEXT: s_waitcnt lgkmcnt(0)3852; GFX8-NEXT: v_mov_b32_e32 v1, s33853; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23854; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3855; GFX8-NEXT: flat_load_dword v3, v[0:1]3856; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23857; GFX8-NEXT: v_mov_b32_e32 v1, s13858; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3859; GFX8-NEXT: s_waitcnt vmcnt(0)3860; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13861; GFX8-NEXT: v_max_f16_e32 v3, v3, v33862; GFX8-NEXT: v_max_f16_e32 v2, 0x7e00, v23863; GFX8-NEXT: v_max_f16_e32 v3, 0, v33864; GFX8-NEXT: v_min_f16_e32 v3, 0x7e00, v33865; GFX8-NEXT: v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD3866; GFX8-NEXT: v_or_b32_e32 v2, v3, v23867; GFX8-NEXT: flat_store_dword v[0:1], v23868; GFX8-NEXT: s_endpgm3869;3870; GFX9-LABEL: v_clamp_v2f16_undef_limit_elts0:3871; GFX9: ; %bb.0:3872; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243873; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03874; GFX9-NEXT: s_waitcnt lgkmcnt(0)3875; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3876; GFX9-NEXT: s_waitcnt vmcnt(0)3877; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp3878; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3879; GFX9-NEXT: s_endpgm3880;3881; GFX11-LABEL: v_clamp_v2f16_undef_limit_elts0:3882; GFX11: ; %bb.0:3883; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243884; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03885; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3886; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03887; GFX11-NEXT: s_waitcnt lgkmcnt(0)3888; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3889; GFX11-NEXT: s_waitcnt vmcnt(0)3890; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp3891; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3892; GFX11-NEXT: s_endpgm3893;3894; GFX12-LABEL: v_clamp_v2f16_undef_limit_elts0:3895; GFX12: ; %bb.0:3896; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243897; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03898; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3899; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03900; GFX12-NEXT: s_wait_kmcnt 0x03901; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]3902; GFX12-NEXT: s_wait_loadcnt 0x03903; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 clamp3904; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]3905; GFX12-NEXT: s_endpgm3906 %tid = call i32 @llvm.amdgcn.workitem.id.x()3907 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid3908 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid3909 %a = load <2 x half>, ptr addrspace(1) %gep03910 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 0.0, half poison>)3911 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half poison, half 1.0>)3912 3913 store <2 x half> %med, ptr addrspace(1) %out.gep3914 ret void3915}3916 3917define amdgpu_kernel void @v_clamp_v2f16_undef_limit_elts1(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #0 {3918; GFX6-LABEL: v_clamp_v2f16_undef_limit_elts1:3919; GFX6: ; %bb.0:3920; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x93921; GFX6-NEXT: s_mov_b32 s7, 0xf0003922; GFX6-NEXT: s_mov_b32 s6, 03923; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v03924; GFX6-NEXT: v_mov_b32_e32 v1, 03925; GFX6-NEXT: s_waitcnt lgkmcnt(0)3926; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3]3927; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr643928; GFX6-NEXT: v_mov_b32_e32 v4, 0x7fc000003929; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7]3930; GFX6-NEXT: s_waitcnt vmcnt(0)3931; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v23932; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v23933; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v33934; GFX6-NEXT: v_max_f32_e32 v2, 0x7fc00000, v23935; GFX6-NEXT: v_med3_f32 v3, v3, 0, v43936; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v33937; GFX6-NEXT: v_min_f32_e32 v2, 1.0, v23938; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v23939; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v33940; GFX6-NEXT: v_or_b32_e32 v2, v2, v33941; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr643942; GFX6-NEXT: s_endpgm3943;3944; GFX8-LABEL: v_clamp_v2f16_undef_limit_elts1:3945; GFX8: ; %bb.0:3946; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243947; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v03948; GFX8-NEXT: v_mov_b32_e32 v4, 0x7e003949; GFX8-NEXT: s_waitcnt lgkmcnt(0)3950; GFX8-NEXT: v_mov_b32_e32 v1, s33951; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v23952; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3953; GFX8-NEXT: flat_load_dword v3, v[0:1]3954; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v23955; GFX8-NEXT: v_mov_b32_e32 v1, s13956; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc3957; GFX8-NEXT: s_waitcnt vmcnt(0)3958; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_13959; GFX8-NEXT: v_max_f16_e32 v3, v3, v33960; GFX8-NEXT: v_max_f16_e32 v2, 0, v23961; GFX8-NEXT: v_max_f16_e32 v3, 0x7e00, v33962; GFX8-NEXT: v_min_f16_e32 v3, 1.0, v33963; GFX8-NEXT: v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD3964; GFX8-NEXT: v_or_b32_e32 v2, v3, v23965; GFX8-NEXT: flat_store_dword v[0:1], v23966; GFX8-NEXT: s_endpgm3967;3968; GFX9-LABEL: v_clamp_v2f16_undef_limit_elts1:3969; GFX9: ; %bb.0:3970; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x243971; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v03972; GFX9-NEXT: s_waitcnt lgkmcnt(0)3973; GFX9-NEXT: global_load_dword v1, v0, s[2:3]3974; GFX9-NEXT: s_waitcnt vmcnt(0)3975; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp3976; GFX9-NEXT: global_store_dword v0, v1, s[0:1]3977; GFX9-NEXT: s_endpgm3978;3979; GFX11-LABEL: v_clamp_v2f16_undef_limit_elts1:3980; GFX11: ; %bb.0:3981; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x243982; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03983; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3984; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v03985; GFX11-NEXT: s_waitcnt lgkmcnt(0)3986; GFX11-NEXT: global_load_b32 v1, v0, s[2:3]3987; GFX11-NEXT: s_waitcnt vmcnt(0)3988; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp3989; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]3990; GFX11-NEXT: s_endpgm3991;3992; GFX12-LABEL: v_clamp_v2f16_undef_limit_elts1:3993; GFX12: ; %bb.0:3994; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x243995; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03996; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)3997; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v03998; GFX12-NEXT: s_wait_kmcnt 0x03999; GFX12-NEXT: global_load_b32 v1, v0, s[2:3]4000; GFX12-NEXT: s_wait_loadcnt 0x04001; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v1 clamp4002; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]4003; GFX12-NEXT: s_endpgm4004 %tid = call i32 @llvm.amdgcn.workitem.id.x()4005 %gep0 = getelementptr <2 x half>, ptr addrspace(1) %aptr, i32 %tid4006 %out.gep = getelementptr <2 x half>, ptr addrspace(1) %out, i32 %tid4007 %a = load <2 x half>, ptr addrspace(1) %gep04008 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half poison, half 0.0>)4009 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half poison>)4010 4011 store <2 x half> %med, ptr addrspace(1) %out.gep4012 ret void4013}4014 4015define amdgpu_kernel void @v_clamp_diff_source_f32(ptr addrspace(1) %out, ptr addrspace(1) %aptr) #04016; GFX6-LABEL: v_clamp_diff_source_f32:4017; GFX6: ; %bb.0:4018; GFX6-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x94019; GFX6-NEXT: s_waitcnt lgkmcnt(0)4020; GFX6-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x04021; GFX6-NEXT: s_load_dword s2, s[2:3], 0x24022; GFX6-NEXT: s_mov_b32 s3, 0xf0004023; GFX6-NEXT: s_waitcnt lgkmcnt(0)4024; GFX6-NEXT: v_mov_b32_e32 v0, s54025; GFX6-NEXT: v_mov_b32_e32 v1, s24026; GFX6-NEXT: v_add_f32_e32 v0, s4, v04027; GFX6-NEXT: v_add_f32_e32 v1, s4, v14028; GFX6-NEXT: v_max_f32_e64 v0, v0, v1 clamp4029; GFX6-NEXT: s_mov_b32 s2, -14030; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:124031; GFX6-NEXT: s_endpgm4032;4033; GFX8-LABEL: v_clamp_diff_source_f32:4034; GFX8: ; %bb.0:4035; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x244036; GFX8-NEXT: s_waitcnt lgkmcnt(0)4037; GFX8-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x04038; GFX8-NEXT: s_load_dword s2, s[2:3], 0x84039; GFX8-NEXT: s_add_u32 s0, s0, 124040; GFX8-NEXT: s_addc_u32 s1, s1, 04041; GFX8-NEXT: s_waitcnt lgkmcnt(0)4042; GFX8-NEXT: v_mov_b32_e32 v0, s54043; GFX8-NEXT: v_mov_b32_e32 v1, s24044; GFX8-NEXT: v_add_f32_e32 v0, s4, v04045; GFX8-NEXT: v_add_f32_e32 v1, s4, v14046; GFX8-NEXT: v_max_f32_e64 v2, v0, v1 clamp4047; GFX8-NEXT: v_mov_b32_e32 v0, s04048; GFX8-NEXT: v_mov_b32_e32 v1, s14049; GFX8-NEXT: flat_store_dword v[0:1], v24050; GFX8-NEXT: s_endpgm4051;4052; GFX9-LABEL: v_clamp_diff_source_f32:4053; GFX9: ; %bb.0:4054; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x244055; GFX9-NEXT: v_mov_b32_e32 v0, 04056; GFX9-NEXT: s_waitcnt lgkmcnt(0)4057; GFX9-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x04058; GFX9-NEXT: s_load_dword s6, s[2:3], 0x84059; GFX9-NEXT: s_waitcnt lgkmcnt(0)4060; GFX9-NEXT: v_mov_b32_e32 v1, s54061; GFX9-NEXT: v_mov_b32_e32 v2, s64062; GFX9-NEXT: v_add_f32_e32 v1, s4, v14063; GFX9-NEXT: v_add_f32_e32 v2, s4, v24064; GFX9-NEXT: v_max_f32_e64 v1, v1, v2 clamp4065; GFX9-NEXT: global_store_dword v0, v1, s[0:1] offset:124066; GFX9-NEXT: s_endpgm4067;4068; GFX11-LABEL: v_clamp_diff_source_f32:4069; GFX11: ; %bb.0:4070; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x244071; GFX11-NEXT: v_mov_b32_e32 v2, 04072; GFX11-NEXT: s_waitcnt lgkmcnt(0)4073; GFX11-NEXT: s_clause 0x14074; GFX11-NEXT: s_load_b64 s[4:5], s[2:3], 0x04075; GFX11-NEXT: s_load_b32 s2, s[2:3], 0x84076; GFX11-NEXT: s_waitcnt lgkmcnt(0)4077; GFX11-NEXT: v_add_f32_e64 v0, s4, s54078; GFX11-NEXT: v_add_f32_e64 v1, s4, s24079; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)4080; GFX11-NEXT: v_max_f32_e64 v0, v0, v1 clamp4081; GFX11-NEXT: global_store_b32 v2, v0, s[0:1] offset:124082; GFX11-NEXT: s_endpgm4083;4084; GFX12-LABEL: v_clamp_diff_source_f32:4085; GFX12: ; %bb.0:4086; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x244087; GFX12-NEXT: v_mov_b32_e32 v0, 04088; GFX12-NEXT: s_wait_kmcnt 0x04089; GFX12-NEXT: s_load_b96 s[4:6], s[2:3], 0x04090; GFX12-NEXT: s_wait_kmcnt 0x04091; GFX12-NEXT: s_add_f32 s2, s4, s54092; GFX12-NEXT: s_add_f32 s3, s4, s64093; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_3) | instskip(NEXT) | instid1(SALU_CYCLE_3)4094; GFX12-NEXT: s_max_num_f32 s2, s2, s34095; GFX12-NEXT: v_max_num_f32_e64 v1, s2, s2 clamp4096; GFX12-NEXT: global_store_b32 v0, v1, s[0:1] offset:124097; GFX12-NEXT: s_endpgm4098{4099 %gep1 = getelementptr float, ptr addrspace(1) %aptr, i32 14100 %gep2 = getelementptr float, ptr addrspace(1) %aptr, i32 24101 %l0 = load float, ptr addrspace(1) %aptr4102 %l1 = load float, ptr addrspace(1) %gep14103 %l2 = load float, ptr addrspace(1) %gep24104 %a = fadd nsz float %l0, %l14105 %b = fadd nsz float %l0, %l24106 %res = call nsz float @llvm.maxnum.f32(float %a, float %b)4107 %max = call nsz float @llvm.maxnum.f32(float %res, float 0.0)4108 %min = call nsz float @llvm.minnum.f32(float %max, float 1.0)4109 %out.gep = getelementptr float, ptr addrspace(1) %out, i32 34110 store float %min, ptr addrspace(1) %out.gep4111 ret void4112}4113 4114define float @v_clamp_f32_daz_minimumnum_maximumnum(float %a) #0 {4115; GFX6-LABEL: v_clamp_f32_daz_minimumnum_maximumnum:4116; GFX6: ; %bb.0:4117; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4118; GFX6-NEXT: v_max_f32_e64 v0, v0, v0 clamp4119; GFX6-NEXT: s_setpc_b64 s[30:31]4120;4121; GFX8-LABEL: v_clamp_f32_daz_minimumnum_maximumnum:4122; GFX8: ; %bb.0:4123; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4124; GFX8-NEXT: v_max_f32_e64 v0, v0, v0 clamp4125; GFX8-NEXT: s_setpc_b64 s[30:31]4126;4127; GFX9-LABEL: v_clamp_f32_daz_minimumnum_maximumnum:4128; GFX9: ; %bb.0:4129; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4130; GFX9-NEXT: v_max_f32_e64 v0, v0, v0 clamp4131; GFX9-NEXT: s_setpc_b64 s[30:31]4132;4133; GFX11-LABEL: v_clamp_f32_daz_minimumnum_maximumnum:4134; GFX11: ; %bb.0:4135; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4136; GFX11-NEXT: v_max_f32_e64 v0, v0, v0 clamp4137; GFX11-NEXT: s_setpc_b64 s[30:31]4138;4139; GFX12-LABEL: v_clamp_f32_daz_minimumnum_maximumnum:4140; GFX12: ; %bb.0:4141; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04142; GFX12-NEXT: s_wait_expcnt 0x04143; GFX12-NEXT: s_wait_samplecnt 0x04144; GFX12-NEXT: s_wait_bvhcnt 0x04145; GFX12-NEXT: s_wait_kmcnt 0x04146; GFX12-NEXT: v_max_num_f32_e64 v0, v0, v0 clamp4147; GFX12-NEXT: s_setpc_b64 s[30:31]4148 %max = call float @llvm.maximumnum.f32(float %a, float 0.0)4149 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4150 ret float %med4151}4152 4153define float @v_clamp_f32_minimumnum_maximumnum(float %a) #1 {4154; GFX6-LABEL: v_clamp_f32_minimumnum_maximumnum:4155; GFX6: ; %bb.0:4156; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4157; GFX6-NEXT: v_max_f32_e64 v0, v0, v0 clamp4158; GFX6-NEXT: s_setpc_b64 s[30:31]4159;4160; GFX8-LABEL: v_clamp_f32_minimumnum_maximumnum:4161; GFX8: ; %bb.0:4162; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4163; GFX8-NEXT: v_max_f32_e64 v0, v0, v0 clamp4164; GFX8-NEXT: s_setpc_b64 s[30:31]4165;4166; GFX9-LABEL: v_clamp_f32_minimumnum_maximumnum:4167; GFX9: ; %bb.0:4168; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4169; GFX9-NEXT: v_max_f32_e64 v0, v0, v0 clamp4170; GFX9-NEXT: s_setpc_b64 s[30:31]4171;4172; GFX11-LABEL: v_clamp_f32_minimumnum_maximumnum:4173; GFX11: ; %bb.0:4174; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4175; GFX11-NEXT: v_max_f32_e64 v0, v0, v0 clamp4176; GFX11-NEXT: s_setpc_b64 s[30:31]4177;4178; GFX12-LABEL: v_clamp_f32_minimumnum_maximumnum:4179; GFX12: ; %bb.0:4180; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04181; GFX12-NEXT: s_wait_expcnt 0x04182; GFX12-NEXT: s_wait_samplecnt 0x04183; GFX12-NEXT: s_wait_bvhcnt 0x04184; GFX12-NEXT: s_wait_kmcnt 0x04185; GFX12-NEXT: v_max_num_f32_e64 v0, v0, v0 clamp4186; GFX12-NEXT: s_setpc_b64 s[30:31]4187 %max = call float @llvm.maximumnum.f32(float %a, float 0.0)4188 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4189 ret float %med4190}4191 4192define float @v_clamp_f32_neg_minimumnum_maximumnum(float %a) #1 {4193; GFX6-LABEL: v_clamp_f32_neg_minimumnum_maximumnum:4194; GFX6: ; %bb.0:4195; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4196; GFX6-NEXT: v_max_f32_e64 v0, -v0, -v0 clamp4197; GFX6-NEXT: s_setpc_b64 s[30:31]4198;4199; GFX8-LABEL: v_clamp_f32_neg_minimumnum_maximumnum:4200; GFX8: ; %bb.0:4201; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4202; GFX8-NEXT: v_max_f32_e64 v0, -v0, -v0 clamp4203; GFX8-NEXT: s_setpc_b64 s[30:31]4204;4205; GFX9-LABEL: v_clamp_f32_neg_minimumnum_maximumnum:4206; GFX9: ; %bb.0:4207; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4208; GFX9-NEXT: v_max_f32_e64 v0, -v0, -v0 clamp4209; GFX9-NEXT: s_setpc_b64 s[30:31]4210;4211; GFX11-LABEL: v_clamp_f32_neg_minimumnum_maximumnum:4212; GFX11: ; %bb.0:4213; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4214; GFX11-NEXT: v_max_f32_e64 v0, -v0, -v0 clamp4215; GFX11-NEXT: s_setpc_b64 s[30:31]4216;4217; GFX12-LABEL: v_clamp_f32_neg_minimumnum_maximumnum:4218; GFX12: ; %bb.0:4219; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04220; GFX12-NEXT: s_wait_expcnt 0x04221; GFX12-NEXT: s_wait_samplecnt 0x04222; GFX12-NEXT: s_wait_bvhcnt 0x04223; GFX12-NEXT: s_wait_kmcnt 0x04224; GFX12-NEXT: v_max_num_f32_e64 v0, -v0, -v0 clamp4225; GFX12-NEXT: s_setpc_b64 s[30:31]4226 %neg.a = fneg float %a4227 %max = call float @llvm.maximumnum.f32(float %neg.a, float 0.0)4228 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4229 ret float %med4230}4231 4232define float @v_clamp_f32_minimumnum_maximumnum_no_ieee(float %a) #5 {4233; GFX6-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee:4234; GFX6: ; %bb.0:4235; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4236; GFX6-NEXT: v_max_f32_e64 v0, v0, v0 clamp4237; GFX6-NEXT: s_setpc_b64 s[30:31]4238;4239; GFX8-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee:4240; GFX8: ; %bb.0:4241; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4242; GFX8-NEXT: v_max_f32_e64 v0, v0, v0 clamp4243; GFX8-NEXT: s_setpc_b64 s[30:31]4244;4245; GFX9-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee:4246; GFX9: ; %bb.0:4247; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4248; GFX9-NEXT: v_max_f32_e64 v0, v0, v0 clamp4249; GFX9-NEXT: s_setpc_b64 s[30:31]4250;4251; GFX11-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee:4252; GFX11: ; %bb.0:4253; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4254; GFX11-NEXT: v_max_f32_e64 v0, v0, v0 clamp4255; GFX11-NEXT: s_setpc_b64 s[30:31]4256;4257; GFX12-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee:4258; GFX12: ; %bb.0:4259; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04260; GFX12-NEXT: s_wait_expcnt 0x04261; GFX12-NEXT: s_wait_samplecnt 0x04262; GFX12-NEXT: s_wait_bvhcnt 0x04263; GFX12-NEXT: s_wait_kmcnt 0x04264; GFX12-NEXT: v_max_num_f32_e64 v0, v0, v0 clamp4265; GFX12-NEXT: s_setpc_b64 s[30:31]4266 %max = call float @llvm.maximumnum.f32(float %a, float 0.0)4267 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4268 ret float %med4269}4270 4271define float @v_clamp_f32_minimumnum_maximumnum_foldable_source(float %a, float %b) #1 {4272; GFX6-LABEL: v_clamp_f32_minimumnum_maximumnum_foldable_source:4273; GFX6: ; %bb.0:4274; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4275; GFX6-NEXT: v_add_f32_e64 v0, v0, v1 clamp4276; GFX6-NEXT: s_setpc_b64 s[30:31]4277;4278; GFX8-LABEL: v_clamp_f32_minimumnum_maximumnum_foldable_source:4279; GFX8: ; %bb.0:4280; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4281; GFX8-NEXT: v_add_f32_e64 v0, v0, v1 clamp4282; GFX8-NEXT: s_setpc_b64 s[30:31]4283;4284; GFX9-LABEL: v_clamp_f32_minimumnum_maximumnum_foldable_source:4285; GFX9: ; %bb.0:4286; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4287; GFX9-NEXT: v_add_f32_e64 v0, v0, v1 clamp4288; GFX9-NEXT: s_setpc_b64 s[30:31]4289;4290; GFX11-LABEL: v_clamp_f32_minimumnum_maximumnum_foldable_source:4291; GFX11: ; %bb.0:4292; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4293; GFX11-NEXT: v_add_f32_e64 v0, v0, v1 clamp4294; GFX11-NEXT: s_setpc_b64 s[30:31]4295;4296; GFX12-LABEL: v_clamp_f32_minimumnum_maximumnum_foldable_source:4297; GFX12: ; %bb.0:4298; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04299; GFX12-NEXT: s_wait_expcnt 0x04300; GFX12-NEXT: s_wait_samplecnt 0x04301; GFX12-NEXT: s_wait_bvhcnt 0x04302; GFX12-NEXT: s_wait_kmcnt 0x04303; GFX12-NEXT: v_add_f32_e64 v0, v0, v1 clamp4304; GFX12-NEXT: s_setpc_b64 s[30:31]4305 %add = fadd float %a, %b4306 %max = call float @llvm.maximumnum.f32(float %add, float 0.0)4307 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4308 ret float %med4309}4310 4311define float @v_clamp_f32_minimumnum_maximumnum_no_ieee_foldable_source(float %a, float %b) #5 {4312; GFX6-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee_foldable_source:4313; GFX6: ; %bb.0:4314; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4315; GFX6-NEXT: v_add_f32_e64 v0, v0, v1 clamp4316; GFX6-NEXT: s_setpc_b64 s[30:31]4317;4318; GFX8-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee_foldable_source:4319; GFX8: ; %bb.0:4320; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4321; GFX8-NEXT: v_add_f32_e64 v0, v0, v1 clamp4322; GFX8-NEXT: s_setpc_b64 s[30:31]4323;4324; GFX9-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee_foldable_source:4325; GFX9: ; %bb.0:4326; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4327; GFX9-NEXT: v_add_f32_e64 v0, v0, v1 clamp4328; GFX9-NEXT: s_setpc_b64 s[30:31]4329;4330; GFX11-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee_foldable_source:4331; GFX11: ; %bb.0:4332; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4333; GFX11-NEXT: v_add_f32_e64 v0, v0, v1 clamp4334; GFX11-NEXT: s_setpc_b64 s[30:31]4335;4336; GFX12-LABEL: v_clamp_f32_minimumnum_maximumnum_no_ieee_foldable_source:4337; GFX12: ; %bb.0:4338; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04339; GFX12-NEXT: s_wait_expcnt 0x04340; GFX12-NEXT: s_wait_samplecnt 0x04341; GFX12-NEXT: s_wait_bvhcnt 0x04342; GFX12-NEXT: s_wait_kmcnt 0x04343; GFX12-NEXT: v_add_f32_e64 v0, v0, v1 clamp4344; GFX12-NEXT: s_setpc_b64 s[30:31]4345 %add = fadd float %a, %b4346 %max = call float @llvm.maximumnum.f32(float %add, float 0.0)4347 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4348 ret float %med4349}4350 4351define half @v_clamp_f16_minimumnum_maximumnum(half %a) #1 {4352; GFX6-LABEL: v_clamp_f16_minimumnum_maximumnum:4353; GFX6: ; %bb.0:4354; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4355; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v04356; GFX6-NEXT: v_cvt_f32_f16_e64 v0, v0 clamp4357; GFX6-NEXT: s_setpc_b64 s[30:31]4358;4359; GFX8-LABEL: v_clamp_f16_minimumnum_maximumnum:4360; GFX8: ; %bb.0:4361; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4362; GFX8-NEXT: v_max_f16_e64 v0, v0, v0 clamp4363; GFX8-NEXT: s_setpc_b64 s[30:31]4364;4365; GFX9-LABEL: v_clamp_f16_minimumnum_maximumnum:4366; GFX9: ; %bb.0:4367; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4368; GFX9-NEXT: v_max_f16_e64 v0, v0, v0 clamp4369; GFX9-NEXT: s_setpc_b64 s[30:31]4370;4371; GFX11-TRUE16-LABEL: v_clamp_f16_minimumnum_maximumnum:4372; GFX11-TRUE16: ; %bb.0:4373; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4374; GFX11-TRUE16-NEXT: v_max_f16_e64 v0.l, v0.l, v0.l clamp4375; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]4376;4377; GFX11-FAKE16-LABEL: v_clamp_f16_minimumnum_maximumnum:4378; GFX11-FAKE16: ; %bb.0:4379; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4380; GFX11-FAKE16-NEXT: v_max_f16_e64 v0, v0, v0 clamp4381; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]4382;4383; GFX12-TRUE16-LABEL: v_clamp_f16_minimumnum_maximumnum:4384; GFX12-TRUE16: ; %bb.0:4385; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x04386; GFX12-TRUE16-NEXT: s_wait_expcnt 0x04387; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x04388; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x04389; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x04390; GFX12-TRUE16-NEXT: v_max_num_f16_e64 v0.l, v0.l, v0.l clamp4391; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]4392;4393; GFX12-FAKE16-LABEL: v_clamp_f16_minimumnum_maximumnum:4394; GFX12-FAKE16: ; %bb.0:4395; GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x04396; GFX12-FAKE16-NEXT: s_wait_expcnt 0x04397; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x04398; GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x04399; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x04400; GFX12-FAKE16-NEXT: v_max_num_f16_e64 v0, v0, v0 clamp4401; GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]4402 %max = call half @llvm.maximumnum.f16(half %a, half 0.0)4403 %med = call half @llvm.minimumnum.f16(half %max, half 1.0)4404 ret half %med4405}4406 4407define half @v_clamp_f16_minimumnum_maximumnum_no_ieee(half %a) #5 {4408; GFX6-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee:4409; GFX6: ; %bb.0:4410; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4411; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v04412; GFX6-NEXT: v_cvt_f32_f16_e64 v0, v0 clamp4413; GFX6-NEXT: s_setpc_b64 s[30:31]4414;4415; GFX8-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee:4416; GFX8: ; %bb.0:4417; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4418; GFX8-NEXT: v_max_f16_e64 v0, v0, v0 clamp4419; GFX8-NEXT: s_setpc_b64 s[30:31]4420;4421; GFX9-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee:4422; GFX9: ; %bb.0:4423; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4424; GFX9-NEXT: v_max_f16_e64 v0, v0, v0 clamp4425; GFX9-NEXT: s_setpc_b64 s[30:31]4426;4427; GFX11-TRUE16-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee:4428; GFX11-TRUE16: ; %bb.0:4429; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4430; GFX11-TRUE16-NEXT: v_max_f16_e64 v0.l, v0.l, v0.l clamp4431; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]4432;4433; GFX11-FAKE16-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee:4434; GFX11-FAKE16: ; %bb.0:4435; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4436; GFX11-FAKE16-NEXT: v_max_f16_e64 v0, v0, v0 clamp4437; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]4438;4439; GFX12-TRUE16-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee:4440; GFX12-TRUE16: ; %bb.0:4441; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x04442; GFX12-TRUE16-NEXT: s_wait_expcnt 0x04443; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x04444; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x04445; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x04446; GFX12-TRUE16-NEXT: v_max_num_f16_e64 v0.l, v0.l, v0.l clamp4447; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]4448;4449; GFX12-FAKE16-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee:4450; GFX12-FAKE16: ; %bb.0:4451; GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x04452; GFX12-FAKE16-NEXT: s_wait_expcnt 0x04453; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x04454; GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x04455; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x04456; GFX12-FAKE16-NEXT: v_max_num_f16_e64 v0, v0, v0 clamp4457; GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]4458 %max = call half @llvm.maximumnum.f16(half %a, half 0.0)4459 %med = call half @llvm.minimumnum.f16(half %max, half 1.0)4460 ret half %med4461}4462 4463define half @v_clamp_f16_minimumnum_maximumnum_foldable_source(half %a, half %b) #1 {4464; GFX6-LABEL: v_clamp_f16_minimumnum_maximumnum_foldable_source:4465; GFX6: ; %bb.0:4466; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4467; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v14468; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v04469; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v14470; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v04471; GFX6-NEXT: v_add_f32_e64 v0, v0, v1 clamp4472; GFX6-NEXT: s_setpc_b64 s[30:31]4473;4474; GFX8-LABEL: v_clamp_f16_minimumnum_maximumnum_foldable_source:4475; GFX8: ; %bb.0:4476; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4477; GFX8-NEXT: v_add_f16_e64 v0, v0, v1 clamp4478; GFX8-NEXT: s_setpc_b64 s[30:31]4479;4480; GFX9-LABEL: v_clamp_f16_minimumnum_maximumnum_foldable_source:4481; GFX9: ; %bb.0:4482; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4483; GFX9-NEXT: v_add_f16_e64 v0, v0, v1 clamp4484; GFX9-NEXT: s_setpc_b64 s[30:31]4485;4486; GFX11-TRUE16-LABEL: v_clamp_f16_minimumnum_maximumnum_foldable_source:4487; GFX11-TRUE16: ; %bb.0:4488; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4489; GFX11-TRUE16-NEXT: v_add_f16_e64 v0.l, v0.l, v1.l clamp4490; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]4491;4492; GFX11-FAKE16-LABEL: v_clamp_f16_minimumnum_maximumnum_foldable_source:4493; GFX11-FAKE16: ; %bb.0:4494; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4495; GFX11-FAKE16-NEXT: v_add_f16_e64 v0, v0, v1 clamp4496; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]4497;4498; GFX12-TRUE16-LABEL: v_clamp_f16_minimumnum_maximumnum_foldable_source:4499; GFX12-TRUE16: ; %bb.0:4500; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x04501; GFX12-TRUE16-NEXT: s_wait_expcnt 0x04502; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x04503; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x04504; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x04505; GFX12-TRUE16-NEXT: v_add_f16_e64 v0.l, v0.l, v1.l clamp4506; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]4507;4508; GFX12-FAKE16-LABEL: v_clamp_f16_minimumnum_maximumnum_foldable_source:4509; GFX12-FAKE16: ; %bb.0:4510; GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x04511; GFX12-FAKE16-NEXT: s_wait_expcnt 0x04512; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x04513; GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x04514; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x04515; GFX12-FAKE16-NEXT: v_add_f16_e64 v0, v0, v1 clamp4516; GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]4517 %add = fadd half %a, %b4518 %max = call half @llvm.maximumnum.f16(half %add, half 0.0)4519 %med = call half @llvm.minimumnum.f16(half %max, half 1.0)4520 ret half %med4521}4522 4523define half @v_clamp_f16_minimumnum_maximumnum_no_ieee_foldable_source(half %a, half %b) #5 {4524; GFX6-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee_foldable_source:4525; GFX6: ; %bb.0:4526; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4527; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v14528; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v04529; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v14530; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v04531; GFX6-NEXT: v_add_f32_e64 v0, v0, v1 clamp4532; GFX6-NEXT: s_setpc_b64 s[30:31]4533;4534; GFX8-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee_foldable_source:4535; GFX8: ; %bb.0:4536; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4537; GFX8-NEXT: v_add_f16_e64 v0, v0, v1 clamp4538; GFX8-NEXT: s_setpc_b64 s[30:31]4539;4540; GFX9-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee_foldable_source:4541; GFX9: ; %bb.0:4542; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4543; GFX9-NEXT: v_add_f16_e64 v0, v0, v1 clamp4544; GFX9-NEXT: s_setpc_b64 s[30:31]4545;4546; GFX11-TRUE16-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee_foldable_source:4547; GFX11-TRUE16: ; %bb.0:4548; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4549; GFX11-TRUE16-NEXT: v_add_f16_e64 v0.l, v0.l, v1.l clamp4550; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]4551;4552; GFX11-FAKE16-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee_foldable_source:4553; GFX11-FAKE16: ; %bb.0:4554; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4555; GFX11-FAKE16-NEXT: v_add_f16_e64 v0, v0, v1 clamp4556; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]4557;4558; GFX12-TRUE16-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee_foldable_source:4559; GFX12-TRUE16: ; %bb.0:4560; GFX12-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x04561; GFX12-TRUE16-NEXT: s_wait_expcnt 0x04562; GFX12-TRUE16-NEXT: s_wait_samplecnt 0x04563; GFX12-TRUE16-NEXT: s_wait_bvhcnt 0x04564; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x04565; GFX12-TRUE16-NEXT: v_add_f16_e64 v0.l, v0.l, v1.l clamp4566; GFX12-TRUE16-NEXT: s_setpc_b64 s[30:31]4567;4568; GFX12-FAKE16-LABEL: v_clamp_f16_minimumnum_maximumnum_no_ieee_foldable_source:4569; GFX12-FAKE16: ; %bb.0:4570; GFX12-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x04571; GFX12-FAKE16-NEXT: s_wait_expcnt 0x04572; GFX12-FAKE16-NEXT: s_wait_samplecnt 0x04573; GFX12-FAKE16-NEXT: s_wait_bvhcnt 0x04574; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x04575; GFX12-FAKE16-NEXT: v_add_f16_e64 v0, v0, v1 clamp4576; GFX12-FAKE16-NEXT: s_setpc_b64 s[30:31]4577 %add = fadd half %a, %b4578 %max = call half @llvm.maximumnum.f16(half %add, half 0.0)4579 %med = call half @llvm.minimumnum.f16(half %max, half 1.0)4580 ret half %med4581}4582 4583define float @v_clamp_f32_minimumnum_maximumnum_no_dx10_clamp(float %a) #6 {4584; GFX6-LABEL: v_clamp_f32_minimumnum_maximumnum_no_dx10_clamp:4585; GFX6: ; %bb.0:4586; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4587; GFX6-NEXT: v_mul_f32_e32 v0, 1.0, v04588; GFX6-NEXT: v_med3_f32 v0, v0, 0, 1.04589; GFX6-NEXT: s_setpc_b64 s[30:31]4590;4591; GFX8-LABEL: v_clamp_f32_minimumnum_maximumnum_no_dx10_clamp:4592; GFX8: ; %bb.0:4593; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4594; GFX8-NEXT: v_mul_f32_e32 v0, 1.0, v04595; GFX8-NEXT: v_med3_f32 v0, v0, 0, 1.04596; GFX8-NEXT: s_setpc_b64 s[30:31]4597;4598; GFX9-LABEL: v_clamp_f32_minimumnum_maximumnum_no_dx10_clamp:4599; GFX9: ; %bb.0:4600; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4601; GFX9-NEXT: v_max_f32_e32 v0, v0, v04602; GFX9-NEXT: v_med3_f32 v0, v0, 0, 1.04603; GFX9-NEXT: s_setpc_b64 s[30:31]4604;4605; GFX11-LABEL: v_clamp_f32_minimumnum_maximumnum_no_dx10_clamp:4606; GFX11: ; %bb.0:4607; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4608; GFX11-NEXT: v_max_f32_e32 v0, v0, v04609; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)4610; GFX11-NEXT: v_med3_f32 v0, v0, 0, 1.04611; GFX11-NEXT: s_setpc_b64 s[30:31]4612;4613; GFX12-LABEL: v_clamp_f32_minimumnum_maximumnum_no_dx10_clamp:4614; GFX12: ; %bb.0:4615; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04616; GFX12-NEXT: s_wait_expcnt 0x04617; GFX12-NEXT: s_wait_samplecnt 0x04618; GFX12-NEXT: s_wait_bvhcnt 0x04619; GFX12-NEXT: s_wait_kmcnt 0x04620; GFX12-NEXT: v_max_num_f32_e64 v0, v0, v0 clamp4621; GFX12-NEXT: s_setpc_b64 s[30:31]4622 %max = call float @llvm.maximumnum.f32(float %a, float 0.0)4623 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4624 ret float %med4625}4626 4627define float @v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp(float %a) #4 {4628; GFX6-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp:4629; GFX6: ; %bb.0:4630; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4631; GFX6-NEXT: v_mul_f32_e32 v0, 1.0, v04632; GFX6-NEXT: v_med3_f32 v0, v0, 0, 1.04633; GFX6-NEXT: s_setpc_b64 s[30:31]4634;4635; GFX8-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp:4636; GFX8: ; %bb.0:4637; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4638; GFX8-NEXT: v_mul_f32_e32 v0, 1.0, v04639; GFX8-NEXT: v_med3_f32 v0, v0, 0, 1.04640; GFX8-NEXT: s_setpc_b64 s[30:31]4641;4642; GFX9-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp:4643; GFX9: ; %bb.0:4644; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4645; GFX9-NEXT: v_max_f32_e32 v0, v0, v04646; GFX9-NEXT: v_med3_f32 v0, v0, 0, 1.04647; GFX9-NEXT: s_setpc_b64 s[30:31]4648;4649; GFX11-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp:4650; GFX11: ; %bb.0:4651; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4652; GFX11-NEXT: v_max_f32_e32 v0, v0, v04653; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)4654; GFX11-NEXT: v_med3_f32 v0, v0, 0, 1.04655; GFX11-NEXT: s_setpc_b64 s[30:31]4656;4657; GFX12-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp:4658; GFX12: ; %bb.0:4659; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04660; GFX12-NEXT: s_wait_expcnt 0x04661; GFX12-NEXT: s_wait_samplecnt 0x04662; GFX12-NEXT: s_wait_bvhcnt 0x04663; GFX12-NEXT: s_wait_kmcnt 0x04664; GFX12-NEXT: v_max_num_f32_e64 v0, v0, v0 clamp4665; GFX12-NEXT: s_setpc_b64 s[30:31]4666 %max = call float @llvm.maximumnum.f32(float %a, float 0.0)4667 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4668 ret float %med4669}4670 4671define float @v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp_nnan_src(float %a) #4 {4672; GFX6-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp_nnan_src:4673; GFX6: ; %bb.0:4674; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4675; GFX6-NEXT: v_add_f32_e32 v0, v0, v04676; GFX6-NEXT: v_med3_f32 v0, v0, 0, 1.04677; GFX6-NEXT: s_setpc_b64 s[30:31]4678;4679; GFX8-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp_nnan_src:4680; GFX8: ; %bb.0:4681; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4682; GFX8-NEXT: v_add_f32_e32 v0, v0, v04683; GFX8-NEXT: v_med3_f32 v0, v0, 0, 1.04684; GFX8-NEXT: s_setpc_b64 s[30:31]4685;4686; GFX9-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp_nnan_src:4687; GFX9: ; %bb.0:4688; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4689; GFX9-NEXT: v_add_f32_e32 v0, v0, v04690; GFX9-NEXT: v_med3_f32 v0, v0, 0, 1.04691; GFX9-NEXT: s_setpc_b64 s[30:31]4692;4693; GFX11-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp_nnan_src:4694; GFX11: ; %bb.0:4695; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4696; GFX11-NEXT: v_add_f32_e32 v0, v0, v04697; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)4698; GFX11-NEXT: v_med3_f32 v0, v0, 0, 1.04699; GFX11-NEXT: s_setpc_b64 s[30:31]4700;4701; GFX12-LABEL: v_clamp_f32_daz_minimumnum_maximumnum_daz_no_dx10clamp_nnan_src:4702; GFX12: ; %bb.0:4703; GFX12-NEXT: s_wait_loadcnt_dscnt 0x04704; GFX12-NEXT: s_wait_expcnt 0x04705; GFX12-NEXT: s_wait_samplecnt 0x04706; GFX12-NEXT: s_wait_bvhcnt 0x04707; GFX12-NEXT: s_wait_kmcnt 0x04708; GFX12-NEXT: v_add_f32_e64 v0, v0, v0 clamp4709; GFX12-NEXT: s_setpc_b64 s[30:31]4710 %nnan.src = fadd nnan float %a, %a4711 %max = call float @llvm.maximumnum.f32(float %nnan.src, float 0.0)4712 %med = call float @llvm.minimumnum.f32(float %max, float 1.0)4713 ret float %med4714}4715 4716 4717declare i32 @llvm.amdgcn.workitem.id.x() #14718declare float @llvm.fabs.f32(float) #14719declare float @llvm.minnum.f32(float, float) #14720declare float @llvm.maxnum.f32(float, float) #14721declare float @llvm.amdgcn.fmed3.f32(float, float, float) #14722declare double @llvm.fabs.f64(double) #14723declare double @llvm.minnum.f64(double, double) #14724declare double @llvm.maxnum.f64(double, double) #14725declare half @llvm.fabs.f16(half) #14726declare half @llvm.minnum.f16(half, half) #14727declare half @llvm.maxnum.f16(half, half) #14728declare <2 x half> @llvm.fabs.v2f16(<2 x half>) #14729declare <2 x half> @llvm.minnum.v2f16(<2 x half>, <2 x half>) #14730declare <2 x half> @llvm.maxnum.v2f16(<2 x half>, <2 x half>) #14731 4732attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }4733attributes #1 = { nounwind readnone }4734attributes #2 = { nounwind "amdgpu-dx10-clamp"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }4735attributes #3 = { nounwind "amdgpu-dx10-clamp"="true" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }4736attributes #4 = { nounwind "amdgpu-dx10-clamp"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }4737attributes #5 = { nounwind readnone "amdgpu-ieee"="false" }4738attributes #6 = { nounwind "amdgpu-dx10-clamp"="false" }4739