1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX6 %s 3; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX8 %s 4; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9 %s 5; RUN: llc -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s 6 7define amdgpu_kernel void @v_clamp_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 8; GFX6-LABEL: v_clamp_f32: 9; GFX6: ; %bb.0: 10; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 11; GFX6-NEXT: s_mov_b32 s7, 0xf000 12; GFX6-NEXT: s_mov_b32 s6, 0 13; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 14; GFX6-NEXT: v_mov_b32_e32 v1, 0 15; GFX6-NEXT: s_waitcnt lgkmcnt(0) 16; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 17; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 18; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 19; GFX6-NEXT: s_waitcnt vmcnt(0) 20; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 21; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 22; GFX6-NEXT: s_endpgm 23; 24; GFX8-LABEL: v_clamp_f32: 25; GFX8: ; %bb.0: 26; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 27; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 28; GFX8-NEXT: s_waitcnt lgkmcnt(0) 29; GFX8-NEXT: v_mov_b32_e32 v1, s3 30; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 31; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 32; GFX8-NEXT: flat_load_dword v3, v[0:1] 33; GFX8-NEXT: v_mov_b32_e32 v1, s1 34; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 35; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 36; GFX8-NEXT: s_waitcnt vmcnt(0) 37; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 38; GFX8-NEXT: flat_store_dword v[0:1], v2 39; GFX8-NEXT: s_endpgm 40; 41; GFX9-LABEL: v_clamp_f32: 42; GFX9: ; %bb.0: 43; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 44; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 45; GFX9-NEXT: s_waitcnt lgkmcnt(0) 46; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 47; GFX9-NEXT: s_waitcnt vmcnt(0) 48; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 49; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 50; GFX9-NEXT: s_endpgm 51; 52; GFX11-LABEL: v_clamp_f32: 53; GFX11: ; %bb.0: 54; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 55; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 56; GFX11-NEXT: s_waitcnt lgkmcnt(0) 57; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 58; GFX11-NEXT: s_waitcnt vmcnt(0) 59; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 60; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 61; GFX11-NEXT: s_endpgm 62 %tid = call i32 @llvm.amdgcn.workitem.id.x() 63 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 64 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 65 %a = load float, float addrspace(1)* %gep0 66 %max = call float @llvm.maxnum.f32(float %a, float 0.0) 67 %med = call float @llvm.minnum.f32(float %max, float 1.0) 68 69 store float %med, float addrspace(1)* %out.gep 70 ret void 71} 72 73define amdgpu_kernel void @v_clamp_neg_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 74; GFX6-LABEL: v_clamp_neg_f32: 75; GFX6: ; %bb.0: 76; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 77; GFX6-NEXT: s_mov_b32 s7, 0xf000 78; GFX6-NEXT: s_mov_b32 s6, 0 79; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 80; GFX6-NEXT: v_mov_b32_e32 v1, 0 81; GFX6-NEXT: s_waitcnt lgkmcnt(0) 82; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 83; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 84; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 85; GFX6-NEXT: s_waitcnt vmcnt(0) 86; GFX6-NEXT: v_max_f32_e64 v2, -v2, -v2 clamp 87; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 88; GFX6-NEXT: s_endpgm 89; 90; GFX8-LABEL: v_clamp_neg_f32: 91; GFX8: ; %bb.0: 92; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 93; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 94; GFX8-NEXT: s_waitcnt lgkmcnt(0) 95; GFX8-NEXT: v_mov_b32_e32 v1, s3 96; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 97; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 98; GFX8-NEXT: flat_load_dword v3, v[0:1] 99; GFX8-NEXT: v_mov_b32_e32 v1, s1 100; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 101; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 102; GFX8-NEXT: s_waitcnt vmcnt(0) 103; GFX8-NEXT: v_max_f32_e64 v2, -v3, -v3 clamp 104; GFX8-NEXT: flat_store_dword v[0:1], v2 105; GFX8-NEXT: s_endpgm 106; 107; GFX9-LABEL: v_clamp_neg_f32: 108; GFX9: ; %bb.0: 109; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 110; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 111; GFX9-NEXT: s_waitcnt lgkmcnt(0) 112; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 113; GFX9-NEXT: s_waitcnt vmcnt(0) 114; GFX9-NEXT: v_max_f32_e64 v1, -v1, -v1 clamp 115; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 116; GFX9-NEXT: s_endpgm 117; 118; GFX11-LABEL: v_clamp_neg_f32: 119; GFX11: ; %bb.0: 120; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 121; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 122; GFX11-NEXT: s_waitcnt lgkmcnt(0) 123; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 124; GFX11-NEXT: s_waitcnt vmcnt(0) 125; GFX11-NEXT: v_max_f32_e64 v1, -v1, -v1 clamp 126; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 127; GFX11-NEXT: s_endpgm 128 %tid = call i32 @llvm.amdgcn.workitem.id.x() 129 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 130 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 131 %a = load float, float addrspace(1)* %gep0 132 %fneg.a = fneg float %a 133 %max = call float @llvm.maxnum.f32(float %fneg.a, float 0.0) 134 %med = call float @llvm.minnum.f32(float %max, float 1.0) 135 136 store float %med, float addrspace(1)* %out.gep 137 ret void 138} 139 140define amdgpu_kernel void @v_clamp_negabs_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 141; GFX6-LABEL: v_clamp_negabs_f32: 142; GFX6: ; %bb.0: 143; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 144; GFX6-NEXT: s_mov_b32 s7, 0xf000 145; GFX6-NEXT: s_mov_b32 s6, 0 146; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 147; GFX6-NEXT: v_mov_b32_e32 v1, 0 148; GFX6-NEXT: s_waitcnt lgkmcnt(0) 149; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 150; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 151; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 152; GFX6-NEXT: s_waitcnt vmcnt(0) 153; GFX6-NEXT: v_max_f32_e64 v2, -|v2|, -|v2| clamp 154; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 155; GFX6-NEXT: s_endpgm 156; 157; GFX8-LABEL: v_clamp_negabs_f32: 158; GFX8: ; %bb.0: 159; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 160; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 161; GFX8-NEXT: s_waitcnt lgkmcnt(0) 162; GFX8-NEXT: v_mov_b32_e32 v1, s3 163; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 164; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 165; GFX8-NEXT: flat_load_dword v3, v[0:1] 166; GFX8-NEXT: v_mov_b32_e32 v1, s1 167; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 168; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 169; GFX8-NEXT: s_waitcnt vmcnt(0) 170; GFX8-NEXT: v_max_f32_e64 v2, -|v3|, -|v3| clamp 171; GFX8-NEXT: flat_store_dword v[0:1], v2 172; GFX8-NEXT: s_endpgm 173; 174; GFX9-LABEL: v_clamp_negabs_f32: 175; GFX9: ; %bb.0: 176; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 177; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 178; GFX9-NEXT: s_waitcnt lgkmcnt(0) 179; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 180; GFX9-NEXT: s_waitcnt vmcnt(0) 181; GFX9-NEXT: v_max_f32_e64 v1, -|v1|, -|v1| clamp 182; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 183; GFX9-NEXT: s_endpgm 184; 185; GFX11-LABEL: v_clamp_negabs_f32: 186; GFX11: ; %bb.0: 187; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 188; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 189; GFX11-NEXT: s_waitcnt lgkmcnt(0) 190; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 191; GFX11-NEXT: s_waitcnt vmcnt(0) 192; GFX11-NEXT: v_max_f32_e64 v1, -|v1|, -|v1| clamp 193; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 194; GFX11-NEXT: s_endpgm 195 %tid = call i32 @llvm.amdgcn.workitem.id.x() 196 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 197 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 198 %a = load float, float addrspace(1)* %gep0 199 %fabs.a = call float @llvm.fabs.f32(float %a) 200 %fneg.fabs.a = fneg float %fabs.a 201 202 %max = call float @llvm.maxnum.f32(float %fneg.fabs.a, float 0.0) 203 %med = call float @llvm.minnum.f32(float %max, float 1.0) 204 205 store float %med, float addrspace(1)* %out.gep 206 ret void 207} 208 209define amdgpu_kernel void @v_clamp_negzero_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 210; GFX6-LABEL: v_clamp_negzero_f32: 211; GFX6: ; %bb.0: 212; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 213; GFX6-NEXT: s_mov_b32 s7, 0xf000 214; GFX6-NEXT: s_mov_b32 s6, 0 215; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 216; GFX6-NEXT: v_mov_b32_e32 v1, 0 217; GFX6-NEXT: s_waitcnt lgkmcnt(0) 218; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 219; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 220; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 221; GFX6-NEXT: s_waitcnt vmcnt(0) 222; GFX6-NEXT: v_add_f32_e32 v2, 0.5, v2 223; GFX6-NEXT: v_max_f32_e32 v2, 0x80000000, v2 224; GFX6-NEXT: v_min_f32_e32 v2, 1.0, v2 225; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 226; GFX6-NEXT: s_endpgm 227; 228; GFX8-LABEL: v_clamp_negzero_f32: 229; GFX8: ; %bb.0: 230; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 231; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 232; GFX8-NEXT: s_waitcnt lgkmcnt(0) 233; GFX8-NEXT: v_mov_b32_e32 v1, s3 234; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 235; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 236; GFX8-NEXT: flat_load_dword v3, v[0:1] 237; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 238; GFX8-NEXT: v_mov_b32_e32 v1, s1 239; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 240; GFX8-NEXT: s_waitcnt vmcnt(0) 241; GFX8-NEXT: v_add_f32_e32 v2, 0.5, v3 242; GFX8-NEXT: v_max_f32_e32 v2, 0x80000000, v2 243; GFX8-NEXT: v_min_f32_e32 v2, 1.0, v2 244; GFX8-NEXT: flat_store_dword v[0:1], v2 245; GFX8-NEXT: s_endpgm 246; 247; GFX9-LABEL: v_clamp_negzero_f32: 248; GFX9: ; %bb.0: 249; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 250; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 251; GFX9-NEXT: s_waitcnt lgkmcnt(0) 252; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 253; GFX9-NEXT: s_waitcnt vmcnt(0) 254; GFX9-NEXT: v_add_f32_e32 v1, 0.5, v1 255; GFX9-NEXT: v_max_f32_e32 v1, 0x80000000, v1 256; GFX9-NEXT: v_min_f32_e32 v1, 1.0, v1 257; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 258; GFX9-NEXT: s_endpgm 259; 260; GFX11-LABEL: v_clamp_negzero_f32: 261; GFX11: ; %bb.0: 262; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 263; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 264; GFX11-NEXT: s_waitcnt lgkmcnt(0) 265; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 266; GFX11-NEXT: s_waitcnt vmcnt(0) 267; GFX11-NEXT: v_add_f32_e32 v1, 0.5, v1 268; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 269; GFX11-NEXT: v_max_f32_e32 v1, 0x80000000, v1 270; GFX11-NEXT: v_min_f32_e32 v1, 1.0, v1 271; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 272; GFX11-NEXT: s_endpgm 273 %tid = call i32 @llvm.amdgcn.workitem.id.x() 274 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 275 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 276 %a = load float, float addrspace(1)* %gep0 277 %add = fadd nnan float %a, 0.5 278 %max = call float @llvm.maxnum.f32(float %add, float -0.0) 279 %med = call float @llvm.minnum.f32(float %max, float 1.0) 280 281 store float %med, float addrspace(1)* %out.gep 282 ret void 283} 284 285; FIXME: Weird inconsistency in how -0.0 is treated. Accepted if clamp 286; matched through med3, not if directly. Is this correct? 287define amdgpu_kernel void @v_clamp_negzero_maybe_snan_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 288; GFX6-LABEL: v_clamp_negzero_maybe_snan_f32: 289; GFX6: ; %bb.0: 290; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 291; GFX6-NEXT: s_mov_b32 s7, 0xf000 292; GFX6-NEXT: s_mov_b32 s6, 0 293; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 294; GFX6-NEXT: v_mov_b32_e32 v1, 0 295; GFX6-NEXT: s_waitcnt lgkmcnt(0) 296; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 297; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 298; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 299; GFX6-NEXT: s_waitcnt vmcnt(0) 300; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2 301; GFX6-NEXT: v_max_f32_e32 v2, 0x80000000, v2 302; GFX6-NEXT: v_min_f32_e32 v2, 1.0, v2 303; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 304; GFX6-NEXT: s_endpgm 305; 306; GFX8-LABEL: v_clamp_negzero_maybe_snan_f32: 307; GFX8: ; %bb.0: 308; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 309; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 310; GFX8-NEXT: s_waitcnt lgkmcnt(0) 311; GFX8-NEXT: v_mov_b32_e32 v1, s3 312; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 313; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 314; GFX8-NEXT: flat_load_dword v3, v[0:1] 315; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 316; GFX8-NEXT: v_mov_b32_e32 v1, s1 317; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 318; GFX8-NEXT: s_waitcnt vmcnt(0) 319; GFX8-NEXT: v_mul_f32_e32 v2, 1.0, v3 320; GFX8-NEXT: v_max_f32_e32 v2, 0x80000000, v2 321; GFX8-NEXT: v_min_f32_e32 v2, 1.0, v2 322; GFX8-NEXT: flat_store_dword v[0:1], v2 323; GFX8-NEXT: s_endpgm 324; 325; GFX9-LABEL: v_clamp_negzero_maybe_snan_f32: 326; GFX9: ; %bb.0: 327; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 328; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 329; GFX9-NEXT: s_waitcnt lgkmcnt(0) 330; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 331; GFX9-NEXT: s_waitcnt vmcnt(0) 332; GFX9-NEXT: v_max_f32_e32 v1, v1, v1 333; GFX9-NEXT: v_max_f32_e32 v1, 0x80000000, v1 334; GFX9-NEXT: v_min_f32_e32 v1, 1.0, v1 335; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 336; GFX9-NEXT: s_endpgm 337; 338; GFX11-LABEL: v_clamp_negzero_maybe_snan_f32: 339; GFX11: ; %bb.0: 340; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 341; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 342; GFX11-NEXT: s_waitcnt lgkmcnt(0) 343; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 344; GFX11-NEXT: s_waitcnt vmcnt(0) 345; GFX11-NEXT: v_max_f32_e32 v1, v1, v1 346; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 347; GFX11-NEXT: v_max_f32_e32 v1, 0x80000000, v1 348; GFX11-NEXT: v_min_f32_e32 v1, 1.0, v1 349; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 350; GFX11-NEXT: s_endpgm 351 %tid = call i32 @llvm.amdgcn.workitem.id.x() 352 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 353 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 354 %a = load float, float addrspace(1)* %gep0 355 %max = call float @llvm.maxnum.f32(float %a, float -0.0) 356 %med = call float @llvm.minnum.f32(float %max, float 1.0) 357 358 store float %med, float addrspace(1)* %out.gep 359 ret void 360} 361 362define amdgpu_kernel void @v_clamp_multi_use_max_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 363; GFX6-LABEL: v_clamp_multi_use_max_f32: 364; GFX6: ; %bb.0: 365; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 366; GFX6-NEXT: s_mov_b32 s6, 0 367; GFX6-NEXT: s_mov_b32 s7, 0xf000 368; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 369; GFX6-NEXT: v_mov_b32_e32 v1, 0 370; GFX6-NEXT: s_waitcnt lgkmcnt(0) 371; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 372; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 373; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 374; GFX6-NEXT: s_mov_b32 s6, -1 375; GFX6-NEXT: s_waitcnt vmcnt(0) 376; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2 377; GFX6-NEXT: v_max_f32_e32 v2, 0, v2 378; GFX6-NEXT: v_min_f32_e32 v3, 1.0, v2 379; GFX6-NEXT: buffer_store_dword v3, v[0:1], s[0:3], 0 addr64 380; GFX6-NEXT: buffer_store_dword v2, off, s[4:7], 0 381; GFX6-NEXT: s_waitcnt vmcnt(0) 382; GFX6-NEXT: s_endpgm 383; 384; GFX8-LABEL: v_clamp_multi_use_max_f32: 385; GFX8: ; %bb.0: 386; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 387; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 388; GFX8-NEXT: s_waitcnt lgkmcnt(0) 389; GFX8-NEXT: v_mov_b32_e32 v1, s3 390; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 391; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 392; GFX8-NEXT: flat_load_dword v3, v[0:1] 393; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 394; GFX8-NEXT: v_mov_b32_e32 v1, s1 395; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 396; GFX8-NEXT: s_waitcnt vmcnt(0) 397; GFX8-NEXT: v_mul_f32_e32 v2, 1.0, v3 398; GFX8-NEXT: v_max_f32_e32 v2, 0, v2 399; GFX8-NEXT: v_min_f32_e32 v3, 1.0, v2 400; GFX8-NEXT: flat_store_dword v[0:1], v3 401; GFX8-NEXT: flat_store_dword v[0:1], v2 402; GFX8-NEXT: s_waitcnt vmcnt(0) 403; GFX8-NEXT: s_endpgm 404; 405; GFX9-LABEL: v_clamp_multi_use_max_f32: 406; GFX9: ; %bb.0: 407; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 408; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 409; GFX9-NEXT: s_waitcnt lgkmcnt(0) 410; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 411; GFX9-NEXT: s_waitcnt vmcnt(0) 412; GFX9-NEXT: v_max_f32_e32 v1, v1, v1 413; GFX9-NEXT: v_max_f32_e32 v1, 0, v1 414; GFX9-NEXT: v_min_f32_e32 v2, 1.0, v1 415; GFX9-NEXT: global_store_dword v0, v2, s[0:1] 416; GFX9-NEXT: global_store_dword v[0:1], v1, off 417; GFX9-NEXT: s_waitcnt vmcnt(0) 418; GFX9-NEXT: s_endpgm 419; 420; GFX11-LABEL: v_clamp_multi_use_max_f32: 421; GFX11: ; %bb.0: 422; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 423; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 424; GFX11-NEXT: s_waitcnt lgkmcnt(0) 425; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 426; GFX11-NEXT: s_waitcnt vmcnt(0) 427; GFX11-NEXT: v_max_f32_e32 v1, v1, v1 428; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 429; GFX11-NEXT: v_max_f32_e32 v1, 0, v1 430; GFX11-NEXT: v_min_f32_e32 v2, 1.0, v1 431; GFX11-NEXT: global_store_b32 v0, v2, s[0:1] 432; GFX11-NEXT: global_store_b32 v[0:1], v1, off dlc 433; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 434; GFX11-NEXT: s_endpgm 435 %tid = call i32 @llvm.amdgcn.workitem.id.x() 436 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 437 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 438 %a = load float, float addrspace(1)* %gep0 439 %max = call float @llvm.maxnum.f32(float %a, float 0.0) 440 %med = call float @llvm.minnum.f32(float %max, float 1.0) 441 442 store float %med, float addrspace(1)* %out.gep 443 store volatile float %max, float addrspace(1)* undef 444 ret void 445} 446 447define amdgpu_kernel void @v_clamp_f16(half addrspace(1)* %out, half addrspace(1)* %aptr) #0 { 448; GFX6-LABEL: v_clamp_f16: 449; GFX6: ; %bb.0: 450; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 451; GFX6-NEXT: s_mov_b32 s7, 0xf000 452; GFX6-NEXT: s_mov_b32 s6, 0 453; GFX6-NEXT: v_lshlrev_b32_e32 v0, 1, v0 454; GFX6-NEXT: v_mov_b32_e32 v1, 0 455; GFX6-NEXT: s_waitcnt lgkmcnt(0) 456; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 457; GFX6-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64 458; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 459; GFX6-NEXT: s_waitcnt vmcnt(0) 460; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp 461; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 462; GFX6-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr64 463; GFX6-NEXT: s_endpgm 464; 465; GFX8-LABEL: v_clamp_f16: 466; GFX8: ; %bb.0: 467; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 468; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0 469; GFX8-NEXT: s_waitcnt lgkmcnt(0) 470; GFX8-NEXT: v_mov_b32_e32 v1, s3 471; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 472; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 473; GFX8-NEXT: flat_load_ushort v3, v[0:1] 474; GFX8-NEXT: v_mov_b32_e32 v1, s1 475; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 476; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 477; GFX8-NEXT: s_waitcnt vmcnt(0) 478; GFX8-NEXT: v_max_f16_e64 v2, v3, v3 clamp 479; GFX8-NEXT: flat_store_short v[0:1], v2 480; GFX8-NEXT: s_endpgm 481; 482; GFX9-LABEL: v_clamp_f16: 483; GFX9: ; %bb.0: 484; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 485; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0 486; GFX9-NEXT: s_waitcnt lgkmcnt(0) 487; GFX9-NEXT: global_load_ushort v1, v0, s[2:3] 488; GFX9-NEXT: s_waitcnt vmcnt(0) 489; GFX9-NEXT: v_max_f16_e64 v1, v1, v1 clamp 490; GFX9-NEXT: global_store_short v0, v1, s[0:1] 491; GFX9-NEXT: s_endpgm 492; 493; GFX11-LABEL: v_clamp_f16: 494; GFX11: ; %bb.0: 495; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 496; GFX11-NEXT: v_lshlrev_b32_e32 v0, 1, v0 497; GFX11-NEXT: s_waitcnt lgkmcnt(0) 498; GFX11-NEXT: global_load_u16 v1, v0, s[2:3] 499; GFX11-NEXT: s_waitcnt vmcnt(0) 500; GFX11-NEXT: v_max_f16_e64 v1, v1, v1 clamp 501; GFX11-NEXT: global_store_b16 v0, v1, s[0:1] 502; GFX11-NEXT: s_endpgm 503 %tid = call i32 @llvm.amdgcn.workitem.id.x() 504 %gep0 = getelementptr half, half addrspace(1)* %aptr, i32 %tid 505 %out.gep = getelementptr half, half addrspace(1)* %out, i32 %tid 506 %a = load half, half addrspace(1)* %gep0 507 %max = call half @llvm.maxnum.f16(half %a, half 0.0) 508 %med = call half @llvm.minnum.f16(half %max, half 1.0) 509 510 store half %med, half addrspace(1)* %out.gep 511 ret void 512} 513 514define amdgpu_kernel void @v_clamp_neg_f16(half addrspace(1)* %out, half addrspace(1)* %aptr) #0 { 515; GFX6-LABEL: v_clamp_neg_f16: 516; GFX6: ; %bb.0: 517; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 518; GFX6-NEXT: s_mov_b32 s7, 0xf000 519; GFX6-NEXT: s_mov_b32 s6, 0 520; GFX6-NEXT: v_lshlrev_b32_e32 v0, 1, v0 521; GFX6-NEXT: v_mov_b32_e32 v1, 0 522; GFX6-NEXT: s_waitcnt lgkmcnt(0) 523; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 524; GFX6-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64 525; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 526; GFX6-NEXT: s_waitcnt vmcnt(0) 527; GFX6-NEXT: v_cvt_f32_f16_e64 v2, -v2 clamp 528; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 529; GFX6-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr64 530; GFX6-NEXT: s_endpgm 531; 532; GFX8-LABEL: v_clamp_neg_f16: 533; GFX8: ; %bb.0: 534; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 535; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0 536; GFX8-NEXT: s_waitcnt lgkmcnt(0) 537; GFX8-NEXT: v_mov_b32_e32 v1, s3 538; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 539; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 540; GFX8-NEXT: flat_load_ushort v3, v[0:1] 541; GFX8-NEXT: v_mov_b32_e32 v1, s1 542; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 543; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 544; GFX8-NEXT: s_waitcnt vmcnt(0) 545; GFX8-NEXT: v_max_f16_e64 v2, -v3, -v3 clamp 546; GFX8-NEXT: flat_store_short v[0:1], v2 547; GFX8-NEXT: s_endpgm 548; 549; GFX9-LABEL: v_clamp_neg_f16: 550; GFX9: ; %bb.0: 551; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 552; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0 553; GFX9-NEXT: s_waitcnt lgkmcnt(0) 554; GFX9-NEXT: global_load_ushort v1, v0, s[2:3] 555; GFX9-NEXT: s_waitcnt vmcnt(0) 556; GFX9-NEXT: v_max_f16_e64 v1, -v1, -v1 clamp 557; GFX9-NEXT: global_store_short v0, v1, s[0:1] 558; GFX9-NEXT: s_endpgm 559; 560; GFX11-LABEL: v_clamp_neg_f16: 561; GFX11: ; %bb.0: 562; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 563; GFX11-NEXT: v_lshlrev_b32_e32 v0, 1, v0 564; GFX11-NEXT: s_waitcnt lgkmcnt(0) 565; GFX11-NEXT: global_load_u16 v1, v0, s[2:3] 566; GFX11-NEXT: s_waitcnt vmcnt(0) 567; GFX11-NEXT: v_max_f16_e64 v1, -v1, -v1 clamp 568; GFX11-NEXT: global_store_b16 v0, v1, s[0:1] 569; GFX11-NEXT: s_endpgm 570 %tid = call i32 @llvm.amdgcn.workitem.id.x() 571 %gep0 = getelementptr half, half addrspace(1)* %aptr, i32 %tid 572 %out.gep = getelementptr half, half addrspace(1)* %out, i32 %tid 573 %a = load half, half addrspace(1)* %gep0 574 %fneg.a = fsub half -0.0, %a 575 %max = call half @llvm.maxnum.f16(half %fneg.a, half 0.0) 576 %med = call half @llvm.minnum.f16(half %max, half 1.0) 577 578 store half %med, half addrspace(1)* %out.gep 579 ret void 580} 581 582define amdgpu_kernel void @v_clamp_negabs_f16(half addrspace(1)* %out, half addrspace(1)* %aptr) #0 { 583; GFX6-LABEL: v_clamp_negabs_f16: 584; GFX6: ; %bb.0: 585; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 586; GFX6-NEXT: s_mov_b32 s7, 0xf000 587; GFX6-NEXT: s_mov_b32 s6, 0 588; GFX6-NEXT: v_lshlrev_b32_e32 v0, 1, v0 589; GFX6-NEXT: v_mov_b32_e32 v1, 0 590; GFX6-NEXT: s_waitcnt lgkmcnt(0) 591; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 592; GFX6-NEXT: buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64 593; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 594; GFX6-NEXT: s_waitcnt vmcnt(0) 595; GFX6-NEXT: v_cvt_f32_f16_e64 v2, -|v2| clamp 596; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 597; GFX6-NEXT: buffer_store_short v2, v[0:1], s[0:3], 0 addr64 598; GFX6-NEXT: s_endpgm 599; 600; GFX8-LABEL: v_clamp_negabs_f16: 601; GFX8: ; %bb.0: 602; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 603; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v0 604; GFX8-NEXT: s_waitcnt lgkmcnt(0) 605; GFX8-NEXT: v_mov_b32_e32 v1, s3 606; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 607; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 608; GFX8-NEXT: flat_load_ushort v3, v[0:1] 609; GFX8-NEXT: v_mov_b32_e32 v1, s1 610; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 611; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 612; GFX8-NEXT: s_waitcnt vmcnt(0) 613; GFX8-NEXT: v_max_f16_e64 v2, -|v3|, -|v3| clamp 614; GFX8-NEXT: flat_store_short v[0:1], v2 615; GFX8-NEXT: s_endpgm 616; 617; GFX9-LABEL: v_clamp_negabs_f16: 618; GFX9: ; %bb.0: 619; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 620; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v0 621; GFX9-NEXT: s_waitcnt lgkmcnt(0) 622; GFX9-NEXT: global_load_ushort v1, v0, s[2:3] 623; GFX9-NEXT: s_waitcnt vmcnt(0) 624; GFX9-NEXT: v_max_f16_e64 v1, -|v1|, -|v1| clamp 625; GFX9-NEXT: global_store_short v0, v1, s[0:1] 626; GFX9-NEXT: s_endpgm 627; 628; GFX11-LABEL: v_clamp_negabs_f16: 629; GFX11: ; %bb.0: 630; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 631; GFX11-NEXT: v_lshlrev_b32_e32 v0, 1, v0 632; GFX11-NEXT: s_waitcnt lgkmcnt(0) 633; GFX11-NEXT: global_load_u16 v1, v0, s[2:3] 634; GFX11-NEXT: s_waitcnt vmcnt(0) 635; GFX11-NEXT: v_max_f16_e64 v1, -|v1|, -|v1| clamp 636; GFX11-NEXT: global_store_b16 v0, v1, s[0:1] 637; GFX11-NEXT: s_endpgm 638 %tid = call i32 @llvm.amdgcn.workitem.id.x() 639 %gep0 = getelementptr half, half addrspace(1)* %aptr, i32 %tid 640 %out.gep = getelementptr half, half addrspace(1)* %out, i32 %tid 641 %a = load half, half addrspace(1)* %gep0 642 %fabs.a = call half @llvm.fabs.f16(half %a) 643 %fneg.fabs.a = fsub half -0.0, %fabs.a 644 645 %max = call half @llvm.maxnum.f16(half %fneg.fabs.a, half 0.0) 646 %med = call half @llvm.minnum.f16(half %max, half 1.0) 647 648 store half %med, half addrspace(1)* %out.gep 649 ret void 650} 651 652define amdgpu_kernel void @v_clamp_f64(double addrspace(1)* %out, double addrspace(1)* %aptr) #0 { 653; GFX6-LABEL: v_clamp_f64: 654; GFX6: ; %bb.0: 655; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 656; GFX6-NEXT: s_mov_b32 s7, 0xf000 657; GFX6-NEXT: s_mov_b32 s6, 0 658; GFX6-NEXT: v_lshlrev_b32_e32 v0, 3, v0 659; GFX6-NEXT: v_mov_b32_e32 v1, 0 660; GFX6-NEXT: s_waitcnt lgkmcnt(0) 661; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 662; GFX6-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 663; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 664; GFX6-NEXT: s_waitcnt vmcnt(0) 665; GFX6-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3] clamp 666; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 667; GFX6-NEXT: s_endpgm 668; 669; GFX8-LABEL: v_clamp_f64: 670; GFX8: ; %bb.0: 671; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 672; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0 673; GFX8-NEXT: s_waitcnt lgkmcnt(0) 674; GFX8-NEXT: v_mov_b32_e32 v1, s3 675; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 676; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 677; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 678; GFX8-NEXT: v_mov_b32_e32 v3, s1 679; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v2 680; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc 681; GFX8-NEXT: s_waitcnt vmcnt(0) 682; GFX8-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1] clamp 683; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1] 684; GFX8-NEXT: s_endpgm 685; 686; GFX9-LABEL: v_clamp_f64: 687; GFX9: ; %bb.0: 688; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 689; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0 690; GFX9-NEXT: s_waitcnt lgkmcnt(0) 691; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3] 692; GFX9-NEXT: s_waitcnt vmcnt(0) 693; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1] clamp 694; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1] 695; GFX9-NEXT: s_endpgm 696; 697; GFX11-LABEL: v_clamp_f64: 698; GFX11: ; %bb.0: 699; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 700; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0 701; GFX11-NEXT: s_waitcnt lgkmcnt(0) 702; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3] 703; GFX11-NEXT: s_waitcnt vmcnt(0) 704; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1] clamp 705; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1] 706; GFX11-NEXT: s_endpgm 707 %tid = call i32 @llvm.amdgcn.workitem.id.x() 708 %gep0 = getelementptr double, double addrspace(1)* %aptr, i32 %tid 709 %out.gep = getelementptr double, double addrspace(1)* %out, i32 %tid 710 %a = load double, double addrspace(1)* %gep0 711 %max = call double @llvm.maxnum.f64(double %a, double 0.0) 712 %med = call double @llvm.minnum.f64(double %max, double 1.0) 713 714 store double %med, double addrspace(1)* %out.gep 715 ret void 716} 717 718define amdgpu_kernel void @v_clamp_neg_f64(double addrspace(1)* %out, double addrspace(1)* %aptr) #0 { 719; GFX6-LABEL: v_clamp_neg_f64: 720; GFX6: ; %bb.0: 721; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 722; GFX6-NEXT: s_mov_b32 s7, 0xf000 723; GFX6-NEXT: s_mov_b32 s6, 0 724; GFX6-NEXT: v_lshlrev_b32_e32 v0, 3, v0 725; GFX6-NEXT: v_mov_b32_e32 v1, 0 726; GFX6-NEXT: s_waitcnt lgkmcnt(0) 727; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 728; GFX6-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 729; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 730; GFX6-NEXT: s_waitcnt vmcnt(0) 731; GFX6-NEXT: v_max_f64 v[2:3], -v[2:3], -v[2:3] clamp 732; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 733; GFX6-NEXT: s_endpgm 734; 735; GFX8-LABEL: v_clamp_neg_f64: 736; GFX8: ; %bb.0: 737; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 738; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0 739; GFX8-NEXT: s_waitcnt lgkmcnt(0) 740; GFX8-NEXT: v_mov_b32_e32 v1, s3 741; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 742; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 743; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 744; GFX8-NEXT: v_mov_b32_e32 v3, s1 745; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v2 746; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc 747; GFX8-NEXT: s_waitcnt vmcnt(0) 748; GFX8-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp 749; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1] 750; GFX8-NEXT: s_endpgm 751; 752; GFX9-LABEL: v_clamp_neg_f64: 753; GFX9: ; %bb.0: 754; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 755; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0 756; GFX9-NEXT: s_waitcnt lgkmcnt(0) 757; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3] 758; GFX9-NEXT: s_waitcnt vmcnt(0) 759; GFX9-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp 760; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1] 761; GFX9-NEXT: s_endpgm 762; 763; GFX11-LABEL: v_clamp_neg_f64: 764; GFX11: ; %bb.0: 765; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 766; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0 767; GFX11-NEXT: s_waitcnt lgkmcnt(0) 768; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3] 769; GFX11-NEXT: s_waitcnt vmcnt(0) 770; GFX11-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp 771; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1] 772; GFX11-NEXT: s_endpgm 773 %tid = call i32 @llvm.amdgcn.workitem.id.x() 774 %gep0 = getelementptr double, double addrspace(1)* %aptr, i32 %tid 775 %out.gep = getelementptr double, double addrspace(1)* %out, i32 %tid 776 %a = load double, double addrspace(1)* %gep0 777 %fneg.a = fsub double -0.0, %a 778 %max = call double @llvm.maxnum.f64(double %fneg.a, double 0.0) 779 %med = call double @llvm.minnum.f64(double %max, double 1.0) 780 781 store double %med, double addrspace(1)* %out.gep 782 ret void 783} 784 785define amdgpu_kernel void @v_clamp_negabs_f64(double addrspace(1)* %out, double addrspace(1)* %aptr) #0 { 786; GFX6-LABEL: v_clamp_negabs_f64: 787; GFX6: ; %bb.0: 788; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 789; GFX6-NEXT: s_mov_b32 s7, 0xf000 790; GFX6-NEXT: s_mov_b32 s6, 0 791; GFX6-NEXT: v_lshlrev_b32_e32 v0, 3, v0 792; GFX6-NEXT: v_mov_b32_e32 v1, 0 793; GFX6-NEXT: s_waitcnt lgkmcnt(0) 794; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 795; GFX6-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 796; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 797; GFX6-NEXT: s_waitcnt vmcnt(0) 798; GFX6-NEXT: v_max_f64 v[2:3], -|v[2:3]|, -|v[2:3]| clamp 799; GFX6-NEXT: buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 800; GFX6-NEXT: s_endpgm 801; 802; GFX8-LABEL: v_clamp_negabs_f64: 803; GFX8: ; %bb.0: 804; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 805; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0 806; GFX8-NEXT: s_waitcnt lgkmcnt(0) 807; GFX8-NEXT: v_mov_b32_e32 v1, s3 808; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 809; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 810; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] 811; GFX8-NEXT: v_mov_b32_e32 v3, s1 812; GFX8-NEXT: v_add_u32_e32 v2, vcc, s0, v2 813; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc 814; GFX8-NEXT: s_waitcnt vmcnt(0) 815; GFX8-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp 816; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1] 817; GFX8-NEXT: s_endpgm 818; 819; GFX9-LABEL: v_clamp_negabs_f64: 820; GFX9: ; %bb.0: 821; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 822; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v0 823; GFX9-NEXT: s_waitcnt lgkmcnt(0) 824; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[2:3] 825; GFX9-NEXT: s_waitcnt vmcnt(0) 826; GFX9-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp 827; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1] 828; GFX9-NEXT: s_endpgm 829; 830; GFX11-LABEL: v_clamp_negabs_f64: 831; GFX11: ; %bb.0: 832; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 833; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0 834; GFX11-NEXT: s_waitcnt lgkmcnt(0) 835; GFX11-NEXT: global_load_b64 v[0:1], v2, s[2:3] 836; GFX11-NEXT: s_waitcnt vmcnt(0) 837; GFX11-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp 838; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1] 839; GFX11-NEXT: s_endpgm 840 %tid = call i32 @llvm.amdgcn.workitem.id.x() 841 %gep0 = getelementptr double, double addrspace(1)* %aptr, i32 %tid 842 %out.gep = getelementptr double, double addrspace(1)* %out, i32 %tid 843 %a = load double, double addrspace(1)* %gep0 844 %fabs.a = call double @llvm.fabs.f64(double %a) 845 %fneg.fabs.a = fsub double -0.0, %fabs.a 846 847 %max = call double @llvm.maxnum.f64(double %fneg.fabs.a, double 0.0) 848 %med = call double @llvm.minnum.f64(double %max, double 1.0) 849 850 store double %med, double addrspace(1)* %out.gep 851 ret void 852} 853 854define amdgpu_kernel void @v_clamp_med3_aby_negzero_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 855; GFX6-LABEL: v_clamp_med3_aby_negzero_f32: 856; GFX6: ; %bb.0: 857; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 858; GFX6-NEXT: s_mov_b32 s7, 0xf000 859; GFX6-NEXT: s_mov_b32 s6, 0 860; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 861; GFX6-NEXT: v_mov_b32_e32 v1, 0 862; GFX6-NEXT: s_waitcnt lgkmcnt(0) 863; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 864; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 865; GFX6-NEXT: s_brev_b32 s4, 1 866; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 867; GFX6-NEXT: s_waitcnt vmcnt(0) 868; GFX6-NEXT: v_med3_f32 v2, s4, 1.0, v2 869; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 870; GFX6-NEXT: s_endpgm 871; 872; GFX8-LABEL: v_clamp_med3_aby_negzero_f32: 873; GFX8: ; %bb.0: 874; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 875; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 876; GFX8-NEXT: s_waitcnt lgkmcnt(0) 877; GFX8-NEXT: v_mov_b32_e32 v1, s3 878; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 879; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 880; GFX8-NEXT: flat_load_dword v3, v[0:1] 881; GFX8-NEXT: v_mov_b32_e32 v1, s1 882; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 883; GFX8-NEXT: s_brev_b32 s0, 1 884; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 885; GFX8-NEXT: s_waitcnt vmcnt(0) 886; GFX8-NEXT: v_med3_f32 v2, s0, 1.0, v3 887; GFX8-NEXT: flat_store_dword v[0:1], v2 888; GFX8-NEXT: s_endpgm 889; 890; GFX9-LABEL: v_clamp_med3_aby_negzero_f32: 891; GFX9: ; %bb.0: 892; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 893; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 894; GFX9-NEXT: s_waitcnt lgkmcnt(0) 895; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 896; GFX9-NEXT: s_brev_b32 s2, 1 897; GFX9-NEXT: s_waitcnt vmcnt(0) 898; GFX9-NEXT: v_med3_f32 v1, s2, 1.0, v1 899; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 900; GFX9-NEXT: s_endpgm 901; 902; GFX11-LABEL: v_clamp_med3_aby_negzero_f32: 903; GFX11: ; %bb.0: 904; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 905; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 906; GFX11-NEXT: s_waitcnt lgkmcnt(0) 907; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 908; GFX11-NEXT: s_waitcnt vmcnt(0) 909; GFX11-NEXT: v_med3_f32 v1, 0x80000000, 1.0, v1 910; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 911; GFX11-NEXT: s_endpgm 912 %tid = call i32 @llvm.amdgcn.workitem.id.x() 913 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 914 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 915 %a = load float, float addrspace(1)* %gep0 916 %med = call float @llvm.amdgcn.fmed3.f32(float -0.0, float 1.0, float %a) 917 store float %med, float addrspace(1)* %out.gep 918 ret void 919} 920 921define amdgpu_kernel void @v_clamp_med3_aby_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 922; GFX6-LABEL: v_clamp_med3_aby_f32: 923; GFX6: ; %bb.0: 924; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 925; GFX6-NEXT: s_mov_b32 s7, 0xf000 926; GFX6-NEXT: s_mov_b32 s6, 0 927; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 928; GFX6-NEXT: v_mov_b32_e32 v1, 0 929; GFX6-NEXT: s_waitcnt lgkmcnt(0) 930; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 931; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 932; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 933; GFX6-NEXT: s_waitcnt vmcnt(0) 934; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 935; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 936; GFX6-NEXT: s_endpgm 937; 938; GFX8-LABEL: v_clamp_med3_aby_f32: 939; GFX8: ; %bb.0: 940; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 941; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 942; GFX8-NEXT: s_waitcnt lgkmcnt(0) 943; GFX8-NEXT: v_mov_b32_e32 v1, s3 944; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 945; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 946; GFX8-NEXT: flat_load_dword v3, v[0:1] 947; GFX8-NEXT: v_mov_b32_e32 v1, s1 948; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 949; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 950; GFX8-NEXT: s_waitcnt vmcnt(0) 951; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 952; GFX8-NEXT: flat_store_dword v[0:1], v2 953; GFX8-NEXT: s_endpgm 954; 955; GFX9-LABEL: v_clamp_med3_aby_f32: 956; GFX9: ; %bb.0: 957; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 958; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 959; GFX9-NEXT: s_waitcnt lgkmcnt(0) 960; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 961; GFX9-NEXT: s_waitcnt vmcnt(0) 962; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 963; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 964; GFX9-NEXT: s_endpgm 965; 966; GFX11-LABEL: v_clamp_med3_aby_f32: 967; GFX11: ; %bb.0: 968; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 969; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 970; GFX11-NEXT: s_waitcnt lgkmcnt(0) 971; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 972; GFX11-NEXT: s_waitcnt vmcnt(0) 973; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 974; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 975; GFX11-NEXT: s_endpgm 976 %tid = call i32 @llvm.amdgcn.workitem.id.x() 977 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 978 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 979 %a = load float, float addrspace(1)* %gep0 980 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %a) 981 store float %med, float addrspace(1)* %out.gep 982 ret void 983} 984 985define amdgpu_kernel void @v_clamp_med3_bay_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 986; GFX6-LABEL: v_clamp_med3_bay_f32: 987; GFX6: ; %bb.0: 988; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 989; GFX6-NEXT: s_mov_b32 s7, 0xf000 990; GFX6-NEXT: s_mov_b32 s6, 0 991; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 992; GFX6-NEXT: v_mov_b32_e32 v1, 0 993; GFX6-NEXT: s_waitcnt lgkmcnt(0) 994; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 995; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 996; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 997; GFX6-NEXT: s_waitcnt vmcnt(0) 998; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 999; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1000; GFX6-NEXT: s_endpgm 1001; 1002; GFX8-LABEL: v_clamp_med3_bay_f32: 1003; GFX8: ; %bb.0: 1004; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1005; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1006; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1007; GFX8-NEXT: v_mov_b32_e32 v1, s3 1008; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1009; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1010; GFX8-NEXT: flat_load_dword v3, v[0:1] 1011; GFX8-NEXT: v_mov_b32_e32 v1, s1 1012; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1013; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1014; GFX8-NEXT: s_waitcnt vmcnt(0) 1015; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 1016; GFX8-NEXT: flat_store_dword v[0:1], v2 1017; GFX8-NEXT: s_endpgm 1018; 1019; GFX9-LABEL: v_clamp_med3_bay_f32: 1020; GFX9: ; %bb.0: 1021; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1022; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1023; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1024; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1025; GFX9-NEXT: s_waitcnt vmcnt(0) 1026; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1027; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1028; GFX9-NEXT: s_endpgm 1029; 1030; GFX11-LABEL: v_clamp_med3_bay_f32: 1031; GFX11: ; %bb.0: 1032; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1033; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1034; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1035; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1036; GFX11-NEXT: s_waitcnt vmcnt(0) 1037; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1038; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1039; GFX11-NEXT: s_endpgm 1040 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1041 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1042 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1043 %a = load float, float addrspace(1)* %gep0 1044 %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float 0.0, float %a) 1045 store float %med, float addrspace(1)* %out.gep 1046 ret void 1047} 1048 1049define amdgpu_kernel void @v_clamp_med3_yab_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 1050; GFX6-LABEL: v_clamp_med3_yab_f32: 1051; GFX6: ; %bb.0: 1052; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1053; GFX6-NEXT: s_mov_b32 s7, 0xf000 1054; GFX6-NEXT: s_mov_b32 s6, 0 1055; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1056; GFX6-NEXT: v_mov_b32_e32 v1, 0 1057; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1058; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1059; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1060; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1061; GFX6-NEXT: s_waitcnt vmcnt(0) 1062; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 1063; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1064; GFX6-NEXT: s_endpgm 1065; 1066; GFX8-LABEL: v_clamp_med3_yab_f32: 1067; GFX8: ; %bb.0: 1068; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1069; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1070; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1071; GFX8-NEXT: v_mov_b32_e32 v1, s3 1072; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1073; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1074; GFX8-NEXT: flat_load_dword v3, v[0:1] 1075; GFX8-NEXT: v_mov_b32_e32 v1, s1 1076; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1077; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1078; GFX8-NEXT: s_waitcnt vmcnt(0) 1079; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 1080; GFX8-NEXT: flat_store_dword v[0:1], v2 1081; GFX8-NEXT: s_endpgm 1082; 1083; GFX9-LABEL: v_clamp_med3_yab_f32: 1084; GFX9: ; %bb.0: 1085; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1086; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1087; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1088; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1089; GFX9-NEXT: s_waitcnt vmcnt(0) 1090; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1091; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1092; GFX9-NEXT: s_endpgm 1093; 1094; GFX11-LABEL: v_clamp_med3_yab_f32: 1095; GFX11: ; %bb.0: 1096; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1097; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1098; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1099; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1100; GFX11-NEXT: s_waitcnt vmcnt(0) 1101; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1102; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1103; GFX11-NEXT: s_endpgm 1104 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1105 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1106 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1107 %a = load float, float addrspace(1)* %gep0 1108 %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 0.0, float 1.0) 1109 store float %med, float addrspace(1)* %out.gep 1110 ret void 1111} 1112 1113define amdgpu_kernel void @v_clamp_med3_yba_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 1114; GFX6-LABEL: v_clamp_med3_yba_f32: 1115; GFX6: ; %bb.0: 1116; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1117; GFX6-NEXT: s_mov_b32 s7, 0xf000 1118; GFX6-NEXT: s_mov_b32 s6, 0 1119; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1120; GFX6-NEXT: v_mov_b32_e32 v1, 0 1121; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1122; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1123; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1124; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1125; GFX6-NEXT: s_waitcnt vmcnt(0) 1126; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 1127; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1128; GFX6-NEXT: s_endpgm 1129; 1130; GFX8-LABEL: v_clamp_med3_yba_f32: 1131; GFX8: ; %bb.0: 1132; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1133; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1134; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1135; GFX8-NEXT: v_mov_b32_e32 v1, s3 1136; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1137; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1138; GFX8-NEXT: flat_load_dword v3, v[0:1] 1139; GFX8-NEXT: v_mov_b32_e32 v1, s1 1140; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1141; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1142; GFX8-NEXT: s_waitcnt vmcnt(0) 1143; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 1144; GFX8-NEXT: flat_store_dword v[0:1], v2 1145; GFX8-NEXT: s_endpgm 1146; 1147; GFX9-LABEL: v_clamp_med3_yba_f32: 1148; GFX9: ; %bb.0: 1149; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1150; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1151; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1152; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1153; GFX9-NEXT: s_waitcnt vmcnt(0) 1154; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1155; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1156; GFX9-NEXT: s_endpgm 1157; 1158; GFX11-LABEL: v_clamp_med3_yba_f32: 1159; GFX11: ; %bb.0: 1160; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1161; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1162; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1163; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1164; GFX11-NEXT: s_waitcnt vmcnt(0) 1165; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1166; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1167; GFX11-NEXT: s_endpgm 1168 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1169 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1170 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1171 %a = load float, float addrspace(1)* %gep0 1172 %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 1.0, float 0.0) 1173 store float %med, float addrspace(1)* %out.gep 1174 ret void 1175} 1176 1177define amdgpu_kernel void @v_clamp_med3_ayb_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 1178; GFX6-LABEL: v_clamp_med3_ayb_f32: 1179; GFX6: ; %bb.0: 1180; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1181; GFX6-NEXT: s_mov_b32 s7, 0xf000 1182; GFX6-NEXT: s_mov_b32 s6, 0 1183; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1184; GFX6-NEXT: v_mov_b32_e32 v1, 0 1185; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1186; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1187; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1188; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1189; GFX6-NEXT: s_waitcnt vmcnt(0) 1190; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 1191; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1192; GFX6-NEXT: s_endpgm 1193; 1194; GFX8-LABEL: v_clamp_med3_ayb_f32: 1195; GFX8: ; %bb.0: 1196; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1197; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1198; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1199; GFX8-NEXT: v_mov_b32_e32 v1, s3 1200; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1201; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1202; GFX8-NEXT: flat_load_dword v3, v[0:1] 1203; GFX8-NEXT: v_mov_b32_e32 v1, s1 1204; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1205; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1206; GFX8-NEXT: s_waitcnt vmcnt(0) 1207; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 1208; GFX8-NEXT: flat_store_dword v[0:1], v2 1209; GFX8-NEXT: s_endpgm 1210; 1211; GFX9-LABEL: v_clamp_med3_ayb_f32: 1212; GFX9: ; %bb.0: 1213; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1214; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1215; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1216; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1217; GFX9-NEXT: s_waitcnt vmcnt(0) 1218; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1219; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1220; GFX9-NEXT: s_endpgm 1221; 1222; GFX11-LABEL: v_clamp_med3_ayb_f32: 1223; GFX11: ; %bb.0: 1224; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1225; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1226; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1227; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1228; GFX11-NEXT: s_waitcnt vmcnt(0) 1229; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1230; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1231; GFX11-NEXT: s_endpgm 1232 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1233 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1234 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1235 %a = load float, float addrspace(1)* %gep0 1236 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %a, float 1.0) 1237 store float %med, float addrspace(1)* %out.gep 1238 ret void 1239} 1240 1241define amdgpu_kernel void @v_clamp_med3_bya_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 { 1242; GFX6-LABEL: v_clamp_med3_bya_f32: 1243; GFX6: ; %bb.0: 1244; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1245; GFX6-NEXT: s_mov_b32 s7, 0xf000 1246; GFX6-NEXT: s_mov_b32 s6, 0 1247; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1248; GFX6-NEXT: v_mov_b32_e32 v1, 0 1249; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1250; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1251; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1252; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1253; GFX6-NEXT: s_waitcnt vmcnt(0) 1254; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 1255; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1256; GFX6-NEXT: s_endpgm 1257; 1258; GFX8-LABEL: v_clamp_med3_bya_f32: 1259; GFX8: ; %bb.0: 1260; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1261; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1262; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1263; GFX8-NEXT: v_mov_b32_e32 v1, s3 1264; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1265; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1266; GFX8-NEXT: flat_load_dword v3, v[0:1] 1267; GFX8-NEXT: v_mov_b32_e32 v1, s1 1268; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1269; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1270; GFX8-NEXT: s_waitcnt vmcnt(0) 1271; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 1272; GFX8-NEXT: flat_store_dword v[0:1], v2 1273; GFX8-NEXT: s_endpgm 1274; 1275; GFX9-LABEL: v_clamp_med3_bya_f32: 1276; GFX9: ; %bb.0: 1277; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1278; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1279; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1280; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1281; GFX9-NEXT: s_waitcnt vmcnt(0) 1282; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1283; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1284; GFX9-NEXT: s_endpgm 1285; 1286; GFX11-LABEL: v_clamp_med3_bya_f32: 1287; GFX11: ; %bb.0: 1288; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1289; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1290; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1291; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1292; GFX11-NEXT: s_waitcnt vmcnt(0) 1293; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1294; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1295; GFX11-NEXT: s_endpgm 1296 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1297 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1298 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1299 %a = load float, float addrspace(1)* %gep0 1300 %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %a, float 0.0) 1301 store float %med, float addrspace(1)* %out.gep 1302 ret void 1303} 1304 1305define amdgpu_kernel void @v_clamp_constants_to_one_f32(float addrspace(1)* %out) #0 { 1306; GFX6-LABEL: v_clamp_constants_to_one_f32: 1307; GFX6: ; %bb.0: 1308; GFX6-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1309; GFX6-NEXT: s_mov_b32 s3, 0xf000 1310; GFX6-NEXT: s_mov_b32 s2, 0 1311; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1312; GFX6-NEXT: v_mov_b32_e32 v1, 0 1313; GFX6-NEXT: v_mov_b32_e32 v2, 1.0 1314; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1315; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1316; GFX6-NEXT: s_endpgm 1317; 1318; GFX8-LABEL: v_clamp_constants_to_one_f32: 1319; GFX8: ; %bb.0: 1320; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1321; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1322; GFX8-NEXT: v_mov_b32_e32 v2, 1.0 1323; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1324; GFX8-NEXT: v_mov_b32_e32 v1, s1 1325; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0 1326; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1327; GFX8-NEXT: flat_store_dword v[0:1], v2 1328; GFX8-NEXT: s_endpgm 1329; 1330; GFX9-LABEL: v_clamp_constants_to_one_f32: 1331; GFX9: ; %bb.0: 1332; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1333; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1334; GFX9-NEXT: v_mov_b32_e32 v1, 1.0 1335; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1336; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1337; GFX9-NEXT: s_endpgm 1338; 1339; GFX11-LABEL: v_clamp_constants_to_one_f32: 1340; GFX11: ; %bb.0: 1341; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 1342; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1343; GFX11-NEXT: v_mov_b32_e32 v1, 1.0 1344; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1345; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1346; GFX11-NEXT: s_endpgm 1347 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1348 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1349 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 4.0) 1350 store float %med, float addrspace(1)* %out.gep 1351 ret void 1352} 1353 1354define amdgpu_kernel void @v_clamp_constants_to_zero_f32(float addrspace(1)* %out) #0 { 1355; GFX6-LABEL: v_clamp_constants_to_zero_f32: 1356; GFX6: ; %bb.0: 1357; GFX6-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1358; GFX6-NEXT: s_mov_b32 s3, 0xf000 1359; GFX6-NEXT: s_mov_b32 s2, 0 1360; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1361; GFX6-NEXT: v_mov_b32_e32 v1, 0 1362; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1363; GFX6-NEXT: buffer_store_dword v1, v[0:1], s[0:3], 0 addr64 1364; GFX6-NEXT: s_endpgm 1365; 1366; GFX8-LABEL: v_clamp_constants_to_zero_f32: 1367; GFX8: ; %bb.0: 1368; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1369; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1370; GFX8-NEXT: v_mov_b32_e32 v2, 0 1371; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1372; GFX8-NEXT: v_mov_b32_e32 v1, s1 1373; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0 1374; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1375; GFX8-NEXT: flat_store_dword v[0:1], v2 1376; GFX8-NEXT: s_endpgm 1377; 1378; GFX9-LABEL: v_clamp_constants_to_zero_f32: 1379; GFX9: ; %bb.0: 1380; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1381; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1382; GFX9-NEXT: v_mov_b32_e32 v1, 0 1383; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1384; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1385; GFX9-NEXT: s_endpgm 1386; 1387; GFX11-LABEL: v_clamp_constants_to_zero_f32: 1388; GFX11: ; %bb.0: 1389; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 1390; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1391; GFX11-NEXT: v_mov_b32_e32 v1, 0 1392; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1393; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1394; GFX11-NEXT: s_endpgm 1395 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1396 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1397 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float -4.0) 1398 store float %med, float addrspace(1)* %out.gep 1399 ret void 1400} 1401 1402define amdgpu_kernel void @v_clamp_constant_preserve_f32(float addrspace(1)* %out) #0 { 1403; GFX6-LABEL: v_clamp_constant_preserve_f32: 1404; GFX6: ; %bb.0: 1405; GFX6-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1406; GFX6-NEXT: s_mov_b32 s3, 0xf000 1407; GFX6-NEXT: s_mov_b32 s2, 0 1408; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1409; GFX6-NEXT: v_mov_b32_e32 v1, 0 1410; GFX6-NEXT: v_mov_b32_e32 v2, 0.5 1411; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1412; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1413; GFX6-NEXT: s_endpgm 1414; 1415; GFX8-LABEL: v_clamp_constant_preserve_f32: 1416; GFX8: ; %bb.0: 1417; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1418; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1419; GFX8-NEXT: v_mov_b32_e32 v2, 0.5 1420; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1421; GFX8-NEXT: v_mov_b32_e32 v1, s1 1422; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0 1423; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1424; GFX8-NEXT: flat_store_dword v[0:1], v2 1425; GFX8-NEXT: s_endpgm 1426; 1427; GFX9-LABEL: v_clamp_constant_preserve_f32: 1428; GFX9: ; %bb.0: 1429; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1430; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1431; GFX9-NEXT: v_mov_b32_e32 v1, 0.5 1432; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1433; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1434; GFX9-NEXT: s_endpgm 1435; 1436; GFX11-LABEL: v_clamp_constant_preserve_f32: 1437; GFX11: ; %bb.0: 1438; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 1439; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1440; GFX11-NEXT: v_mov_b32_e32 v1, 0.5 1441; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1442; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1443; GFX11-NEXT: s_endpgm 1444 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1445 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1446 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0.5) 1447 store float %med, float addrspace(1)* %out.gep 1448 ret void 1449} 1450 1451define amdgpu_kernel void @v_clamp_constant_preserve_denorm_f32(float addrspace(1)* %out) #0 { 1452; GFX6-LABEL: v_clamp_constant_preserve_denorm_f32: 1453; GFX6: ; %bb.0: 1454; GFX6-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1455; GFX6-NEXT: s_mov_b32 s3, 0xf000 1456; GFX6-NEXT: s_mov_b32 s2, 0 1457; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1458; GFX6-NEXT: v_mov_b32_e32 v1, 0 1459; GFX6-NEXT: v_mov_b32_e32 v2, 0x7fffff 1460; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1461; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1462; GFX6-NEXT: s_endpgm 1463; 1464; GFX8-LABEL: v_clamp_constant_preserve_denorm_f32: 1465; GFX8: ; %bb.0: 1466; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1467; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1468; GFX8-NEXT: v_mov_b32_e32 v2, 0x7fffff 1469; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1470; GFX8-NEXT: v_mov_b32_e32 v1, s1 1471; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0 1472; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1473; GFX8-NEXT: flat_store_dword v[0:1], v2 1474; GFX8-NEXT: s_endpgm 1475; 1476; GFX9-LABEL: v_clamp_constant_preserve_denorm_f32: 1477; GFX9: ; %bb.0: 1478; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1479; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1480; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fffff 1481; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1482; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1483; GFX9-NEXT: s_endpgm 1484; 1485; GFX11-LABEL: v_clamp_constant_preserve_denorm_f32: 1486; GFX11: ; %bb.0: 1487; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 1488; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1489; GFX11-NEXT: v_mov_b32_e32 v1, 0x7fffff 1490; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1491; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1492; GFX11-NEXT: s_endpgm 1493 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1494 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1495 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 8388607 to float)) 1496 store float %med, float addrspace(1)* %out.gep 1497 ret void 1498} 1499 1500define amdgpu_kernel void @v_clamp_constant_qnan_f32(float addrspace(1)* %out) #0 { 1501; GFX6-LABEL: v_clamp_constant_qnan_f32: 1502; GFX6: ; %bb.0: 1503; GFX6-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1504; GFX6-NEXT: s_mov_b32 s3, 0xf000 1505; GFX6-NEXT: s_mov_b32 s2, 0 1506; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1507; GFX6-NEXT: v_mov_b32_e32 v1, 0 1508; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1509; GFX6-NEXT: buffer_store_dword v1, v[0:1], s[0:3], 0 addr64 1510; GFX6-NEXT: s_endpgm 1511; 1512; GFX8-LABEL: v_clamp_constant_qnan_f32: 1513; GFX8: ; %bb.0: 1514; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1515; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1516; GFX8-NEXT: v_mov_b32_e32 v2, 0 1517; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1518; GFX8-NEXT: v_mov_b32_e32 v1, s1 1519; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0 1520; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1521; GFX8-NEXT: flat_store_dword v[0:1], v2 1522; GFX8-NEXT: s_endpgm 1523; 1524; GFX9-LABEL: v_clamp_constant_qnan_f32: 1525; GFX9: ; %bb.0: 1526; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1527; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1528; GFX9-NEXT: v_mov_b32_e32 v1, 0 1529; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1530; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1531; GFX9-NEXT: s_endpgm 1532; 1533; GFX11-LABEL: v_clamp_constant_qnan_f32: 1534; GFX11: ; %bb.0: 1535; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 1536; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1537; GFX11-NEXT: v_mov_b32_e32 v1, 0 1538; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1539; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1540; GFX11-NEXT: s_endpgm 1541 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1542 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1543 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8000000000000) 1544 store float %med, float addrspace(1)* %out.gep 1545 ret void 1546} 1547 1548define amdgpu_kernel void @v_clamp_constant_snan_f32(float addrspace(1)* %out) #0 { 1549; GFX6-LABEL: v_clamp_constant_snan_f32: 1550; GFX6: ; %bb.0: 1551; GFX6-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 1552; GFX6-NEXT: s_mov_b32 s3, 0xf000 1553; GFX6-NEXT: s_mov_b32 s2, 0 1554; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1555; GFX6-NEXT: v_mov_b32_e32 v1, 0 1556; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1557; GFX6-NEXT: buffer_store_dword v1, v[0:1], s[0:3], 0 addr64 1558; GFX6-NEXT: s_endpgm 1559; 1560; GFX8-LABEL: v_clamp_constant_snan_f32: 1561; GFX8: ; %bb.0: 1562; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1563; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1564; GFX8-NEXT: v_mov_b32_e32 v2, 0 1565; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1566; GFX8-NEXT: v_mov_b32_e32 v1, s1 1567; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0 1568; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1569; GFX8-NEXT: flat_store_dword v[0:1], v2 1570; GFX8-NEXT: s_endpgm 1571; 1572; GFX9-LABEL: v_clamp_constant_snan_f32: 1573; GFX9: ; %bb.0: 1574; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 1575; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1576; GFX9-NEXT: v_mov_b32_e32 v1, 0 1577; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1578; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1579; GFX9-NEXT: s_endpgm 1580; 1581; GFX11-LABEL: v_clamp_constant_snan_f32: 1582; GFX11: ; %bb.0: 1583; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 1584; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1585; GFX11-NEXT: v_mov_b32_e32 v1, 0 1586; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1587; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1588; GFX11-NEXT: s_endpgm 1589 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1590 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1591 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 2139095041 to float)) 1592 store float %med, float addrspace(1)* %out.gep 1593 ret void 1594} 1595 1596; --------------------------------------------------------------------- 1597; Test non-default behaviors enabling snans and disabling dx10_clamp 1598; --------------------------------------------------------------------- 1599 1600define amdgpu_kernel void @v_clamp_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 { 1601; GFX6-LABEL: v_clamp_f32_no_dx10_clamp: 1602; GFX6: ; %bb.0: 1603; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1604; GFX6-NEXT: s_mov_b32 s7, 0xf000 1605; GFX6-NEXT: s_mov_b32 s6, 0 1606; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1607; GFX6-NEXT: v_mov_b32_e32 v1, 0 1608; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1609; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1610; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1611; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1612; GFX6-NEXT: s_waitcnt vmcnt(0) 1613; GFX6-NEXT: v_add_f32_e32 v2, 0.5, v2 1614; GFX6-NEXT: v_med3_f32 v2, v2, 0, 1.0 1615; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1616; GFX6-NEXT: s_endpgm 1617; 1618; GFX8-LABEL: v_clamp_f32_no_dx10_clamp: 1619; GFX8: ; %bb.0: 1620; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1621; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1622; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1623; GFX8-NEXT: v_mov_b32_e32 v1, s3 1624; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1625; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1626; GFX8-NEXT: flat_load_dword v3, v[0:1] 1627; GFX8-NEXT: v_mov_b32_e32 v1, s1 1628; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1629; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1630; GFX8-NEXT: s_waitcnt vmcnt(0) 1631; GFX8-NEXT: v_add_f32_e32 v2, 0.5, v3 1632; GFX8-NEXT: v_med3_f32 v2, v2, 0, 1.0 1633; GFX8-NEXT: flat_store_dword v[0:1], v2 1634; GFX8-NEXT: s_endpgm 1635; 1636; GFX9-LABEL: v_clamp_f32_no_dx10_clamp: 1637; GFX9: ; %bb.0: 1638; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1639; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1640; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1641; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1642; GFX9-NEXT: s_waitcnt vmcnt(0) 1643; GFX9-NEXT: v_add_f32_e32 v1, 0.5, v1 1644; GFX9-NEXT: v_med3_f32 v1, v1, 0, 1.0 1645; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1646; GFX9-NEXT: s_endpgm 1647; 1648; GFX11-LABEL: v_clamp_f32_no_dx10_clamp: 1649; GFX11: ; %bb.0: 1650; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1651; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1652; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1653; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1654; GFX11-NEXT: s_waitcnt vmcnt(0) 1655; GFX11-NEXT: v_add_f32_e32 v1, 0.5, v1 1656; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) 1657; GFX11-NEXT: v_med3_f32 v1, v1, 0, 1.0 1658; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1659; GFX11-NEXT: s_endpgm 1660 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1661 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1662 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1663 %a = load float, float addrspace(1)* %gep0 1664 %a.nnan = fadd nnan float %a, 0.5 1665 %max = call float @llvm.maxnum.f32(float %a.nnan, float 0.0) 1666 %med = call float @llvm.minnum.f32(float %max, float 1.0) 1667 1668 store float %med, float addrspace(1)* %out.gep 1669 ret void 1670} 1671 1672define amdgpu_kernel void @v_clamp_f32_snan_dx10clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #3 { 1673; GFX6-LABEL: v_clamp_f32_snan_dx10clamp: 1674; GFX6: ; %bb.0: 1675; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1676; GFX6-NEXT: s_mov_b32 s7, 0xf000 1677; GFX6-NEXT: s_mov_b32 s6, 0 1678; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1679; GFX6-NEXT: v_mov_b32_e32 v1, 0 1680; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1681; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1682; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1683; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1684; GFX6-NEXT: s_waitcnt vmcnt(0) 1685; GFX6-NEXT: v_add_f32_e64 v2, v2, 0.5 clamp 1686; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1687; GFX6-NEXT: s_endpgm 1688; 1689; GFX8-LABEL: v_clamp_f32_snan_dx10clamp: 1690; GFX8: ; %bb.0: 1691; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1692; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1693; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1694; GFX8-NEXT: v_mov_b32_e32 v1, s3 1695; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1696; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1697; GFX8-NEXT: flat_load_dword v3, v[0:1] 1698; GFX8-NEXT: v_mov_b32_e32 v1, s1 1699; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1700; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1701; GFX8-NEXT: s_waitcnt vmcnt(0) 1702; GFX8-NEXT: v_add_f32_e64 v2, v3, 0.5 clamp 1703; GFX8-NEXT: flat_store_dword v[0:1], v2 1704; GFX8-NEXT: s_endpgm 1705; 1706; GFX9-LABEL: v_clamp_f32_snan_dx10clamp: 1707; GFX9: ; %bb.0: 1708; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1709; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1710; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1711; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1712; GFX9-NEXT: s_waitcnt vmcnt(0) 1713; GFX9-NEXT: v_add_f32_e64 v1, v1, 0.5 clamp 1714; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1715; GFX9-NEXT: s_endpgm 1716; 1717; GFX11-LABEL: v_clamp_f32_snan_dx10clamp: 1718; GFX11: ; %bb.0: 1719; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1720; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1721; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1722; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1723; GFX11-NEXT: s_waitcnt vmcnt(0) 1724; GFX11-NEXT: v_add_f32_e64 v1, v1, 0.5 clamp 1725; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1726; GFX11-NEXT: s_endpgm 1727 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1728 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1729 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1730 %a = load float, float addrspace(1)* %gep0 1731 %add = fadd float %a, 0.5 1732 %max = call float @llvm.maxnum.f32(float %add, float 0.0) 1733 %med = call float @llvm.minnum.f32(float %max, float 1.0) 1734 1735 store float %med, float addrspace(1)* %out.gep 1736 ret void 1737} 1738 1739define amdgpu_kernel void @v_clamp_f32_snan_no_dx10clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #4 { 1740; GFX6-LABEL: v_clamp_f32_snan_no_dx10clamp: 1741; GFX6: ; %bb.0: 1742; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1743; GFX6-NEXT: s_mov_b32 s7, 0xf000 1744; GFX6-NEXT: s_mov_b32 s6, 0 1745; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1746; GFX6-NEXT: v_mov_b32_e32 v1, 0 1747; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1748; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1749; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1750; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1751; GFX6-NEXT: s_waitcnt vmcnt(0) 1752; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2 1753; GFX6-NEXT: v_med3_f32 v2, v2, 0, 1.0 1754; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1755; GFX6-NEXT: s_endpgm 1756; 1757; GFX8-LABEL: v_clamp_f32_snan_no_dx10clamp: 1758; GFX8: ; %bb.0: 1759; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1760; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1761; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1762; GFX8-NEXT: v_mov_b32_e32 v1, s3 1763; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1764; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1765; GFX8-NEXT: flat_load_dword v3, v[0:1] 1766; GFX8-NEXT: v_mov_b32_e32 v1, s1 1767; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1768; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1769; GFX8-NEXT: s_waitcnt vmcnt(0) 1770; GFX8-NEXT: v_mul_f32_e32 v2, 1.0, v3 1771; GFX8-NEXT: v_med3_f32 v2, v2, 0, 1.0 1772; GFX8-NEXT: flat_store_dword v[0:1], v2 1773; GFX8-NEXT: s_endpgm 1774; 1775; GFX9-LABEL: v_clamp_f32_snan_no_dx10clamp: 1776; GFX9: ; %bb.0: 1777; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1778; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1779; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1780; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1781; GFX9-NEXT: s_waitcnt vmcnt(0) 1782; GFX9-NEXT: v_max_f32_e32 v1, v1, v1 1783; GFX9-NEXT: v_med3_f32 v1, v1, 0, 1.0 1784; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1785; GFX9-NEXT: s_endpgm 1786; 1787; GFX11-LABEL: v_clamp_f32_snan_no_dx10clamp: 1788; GFX11: ; %bb.0: 1789; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1790; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1791; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1792; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1793; GFX11-NEXT: s_waitcnt vmcnt(0) 1794; GFX11-NEXT: v_max_f32_e32 v1, v1, v1 1795; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) 1796; GFX11-NEXT: v_med3_f32 v1, v1, 0, 1.0 1797; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1798; GFX11-NEXT: s_endpgm 1799 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1800 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1801 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1802 %a = load float, float addrspace(1)* %gep0 1803 %max = call float @llvm.maxnum.f32(float %a, float 0.0) 1804 %med = call float @llvm.minnum.f32(float %max, float 1.0) 1805 1806 store float %med, float addrspace(1)* %out.gep 1807 ret void 1808} 1809 1810define amdgpu_kernel void @v_clamp_f32_snan_no_dx10clamp_nnan_src(float addrspace(1)* %out, float addrspace(1)* %aptr) #4 { 1811; GFX6-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src: 1812; GFX6: ; %bb.0: 1813; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1814; GFX6-NEXT: s_mov_b32 s7, 0xf000 1815; GFX6-NEXT: s_mov_b32 s6, 0 1816; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1817; GFX6-NEXT: v_mov_b32_e32 v1, 0 1818; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1819; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1820; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1821; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1822; GFX6-NEXT: s_waitcnt vmcnt(0) 1823; GFX6-NEXT: v_add_f32_e32 v2, 1.0, v2 1824; GFX6-NEXT: v_med3_f32 v2, v2, 0, 1.0 1825; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1826; GFX6-NEXT: s_endpgm 1827; 1828; GFX8-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src: 1829; GFX8: ; %bb.0: 1830; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1831; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1832; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1833; GFX8-NEXT: v_mov_b32_e32 v1, s3 1834; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1835; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1836; GFX8-NEXT: flat_load_dword v3, v[0:1] 1837; GFX8-NEXT: v_mov_b32_e32 v1, s1 1838; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1839; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1840; GFX8-NEXT: s_waitcnt vmcnt(0) 1841; GFX8-NEXT: v_add_f32_e32 v2, 1.0, v3 1842; GFX8-NEXT: v_med3_f32 v2, v2, 0, 1.0 1843; GFX8-NEXT: flat_store_dword v[0:1], v2 1844; GFX8-NEXT: s_endpgm 1845; 1846; GFX9-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src: 1847; GFX9: ; %bb.0: 1848; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1849; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1850; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1851; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1852; GFX9-NEXT: s_waitcnt vmcnt(0) 1853; GFX9-NEXT: v_add_f32_e32 v1, 1.0, v1 1854; GFX9-NEXT: v_med3_f32 v1, v1, 0, 1.0 1855; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1856; GFX9-NEXT: s_endpgm 1857; 1858; GFX11-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src: 1859; GFX11: ; %bb.0: 1860; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1861; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1862; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1863; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1864; GFX11-NEXT: s_waitcnt vmcnt(0) 1865; GFX11-NEXT: v_add_f32_e32 v1, 1.0, v1 1866; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) 1867; GFX11-NEXT: v_med3_f32 v1, v1, 0, 1.0 1868; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1869; GFX11-NEXT: s_endpgm 1870 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1871 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1872 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1873 %a = load float, float addrspace(1)* %gep0 1874 %add = fadd nnan float %a, 1.0 1875 %max = call float @llvm.maxnum.f32(float %add, float 0.0) 1876 %med = call float @llvm.minnum.f32(float %max, float 1.0) 1877 1878 store float %med, float addrspace(1)* %out.gep 1879 ret void 1880} 1881 1882define amdgpu_kernel void @v_clamp_med3_aby_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 { 1883; GFX6-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp: 1884; GFX6: ; %bb.0: 1885; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1886; GFX6-NEXT: s_mov_b32 s7, 0xf000 1887; GFX6-NEXT: s_mov_b32 s6, 0 1888; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1889; GFX6-NEXT: v_mov_b32_e32 v1, 0 1890; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1891; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1892; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1893; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1894; GFX6-NEXT: s_waitcnt vmcnt(0) 1895; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 1896; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1897; GFX6-NEXT: s_endpgm 1898; 1899; GFX8-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp: 1900; GFX8: ; %bb.0: 1901; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1902; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1903; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1904; GFX8-NEXT: v_mov_b32_e32 v1, s3 1905; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1906; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1907; GFX8-NEXT: flat_load_dword v3, v[0:1] 1908; GFX8-NEXT: v_mov_b32_e32 v1, s1 1909; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1910; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1911; GFX8-NEXT: s_waitcnt vmcnt(0) 1912; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 1913; GFX8-NEXT: flat_store_dword v[0:1], v2 1914; GFX8-NEXT: s_endpgm 1915; 1916; GFX9-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp: 1917; GFX9: ; %bb.0: 1918; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1919; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1920; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1921; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1922; GFX9-NEXT: s_waitcnt vmcnt(0) 1923; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1924; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1925; GFX9-NEXT: s_endpgm 1926; 1927; GFX11-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp: 1928; GFX11: ; %bb.0: 1929; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1930; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1931; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1932; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1933; GFX11-NEXT: s_waitcnt vmcnt(0) 1934; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1935; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 1936; GFX11-NEXT: s_endpgm 1937 %tid = call i32 @llvm.amdgcn.workitem.id.x() 1938 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 1939 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 1940 %a = load float, float addrspace(1)* %gep0 1941 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %a) 1942 store float %med, float addrspace(1)* %out.gep 1943 ret void 1944} 1945 1946define amdgpu_kernel void @v_clamp_med3_bay_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 { 1947; GFX6-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp: 1948; GFX6: ; %bb.0: 1949; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 1950; GFX6-NEXT: s_mov_b32 s7, 0xf000 1951; GFX6-NEXT: s_mov_b32 s6, 0 1952; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1953; GFX6-NEXT: v_mov_b32_e32 v1, 0 1954; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1955; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 1956; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 1957; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 1958; GFX6-NEXT: s_waitcnt vmcnt(0) 1959; GFX6-NEXT: v_max_f32_e64 v2, v2, v2 clamp 1960; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 1961; GFX6-NEXT: s_endpgm 1962; 1963; GFX8-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp: 1964; GFX8: ; %bb.0: 1965; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1966; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 1967; GFX8-NEXT: s_waitcnt lgkmcnt(0) 1968; GFX8-NEXT: v_mov_b32_e32 v1, s3 1969; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 1970; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1971; GFX8-NEXT: flat_load_dword v3, v[0:1] 1972; GFX8-NEXT: v_mov_b32_e32 v1, s1 1973; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 1974; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 1975; GFX8-NEXT: s_waitcnt vmcnt(0) 1976; GFX8-NEXT: v_max_f32_e64 v2, v3, v3 clamp 1977; GFX8-NEXT: flat_store_dword v[0:1], v2 1978; GFX8-NEXT: s_endpgm 1979; 1980; GFX9-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp: 1981; GFX9: ; %bb.0: 1982; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 1983; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1984; GFX9-NEXT: s_waitcnt lgkmcnt(0) 1985; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 1986; GFX9-NEXT: s_waitcnt vmcnt(0) 1987; GFX9-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1988; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 1989; GFX9-NEXT: s_endpgm 1990; 1991; GFX11-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp: 1992; GFX11: ; %bb.0: 1993; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 1994; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 1995; GFX11-NEXT: s_waitcnt lgkmcnt(0) 1996; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 1997; GFX11-NEXT: s_waitcnt vmcnt(0) 1998; GFX11-NEXT: v_max_f32_e64 v1, v1, v1 clamp 1999; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2000; GFX11-NEXT: s_endpgm 2001 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2002 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 2003 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 2004 %a = load float, float addrspace(1)* %gep0 2005 %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float 0.0, float %a) 2006 store float %med, float addrspace(1)* %out.gep 2007 ret void 2008} 2009 2010define amdgpu_kernel void @v_clamp_med3_yab_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 { 2011; GFX6-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp: 2012; GFX6: ; %bb.0: 2013; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2014; GFX6-NEXT: s_mov_b32 s7, 0xf000 2015; GFX6-NEXT: s_mov_b32 s6, 0 2016; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2017; GFX6-NEXT: v_mov_b32_e32 v1, 0 2018; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2019; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2020; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2021; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2022; GFX6-NEXT: s_waitcnt vmcnt(0) 2023; GFX6-NEXT: v_med3_f32 v2, v2, 0, 1.0 2024; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2025; GFX6-NEXT: s_endpgm 2026; 2027; GFX8-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp: 2028; GFX8: ; %bb.0: 2029; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2030; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2031; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2032; GFX8-NEXT: v_mov_b32_e32 v1, s3 2033; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2034; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2035; GFX8-NEXT: flat_load_dword v3, v[0:1] 2036; GFX8-NEXT: v_mov_b32_e32 v1, s1 2037; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2038; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2039; GFX8-NEXT: s_waitcnt vmcnt(0) 2040; GFX8-NEXT: v_med3_f32 v2, v3, 0, 1.0 2041; GFX8-NEXT: flat_store_dword v[0:1], v2 2042; GFX8-NEXT: s_endpgm 2043; 2044; GFX9-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp: 2045; GFX9: ; %bb.0: 2046; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2047; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2048; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2049; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2050; GFX9-NEXT: s_waitcnt vmcnt(0) 2051; GFX9-NEXT: v_med3_f32 v1, v1, 0, 1.0 2052; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2053; GFX9-NEXT: s_endpgm 2054; 2055; GFX11-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp: 2056; GFX11: ; %bb.0: 2057; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2058; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2059; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2060; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2061; GFX11-NEXT: s_waitcnt vmcnt(0) 2062; GFX11-NEXT: v_med3_f32 v1, v1, 0, 1.0 2063; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2064; GFX11-NEXT: s_endpgm 2065 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2066 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 2067 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 2068 %a = load float, float addrspace(1)* %gep0 2069 %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 0.0, float 1.0) 2070 store float %med, float addrspace(1)* %out.gep 2071 ret void 2072} 2073 2074define amdgpu_kernel void @v_clamp_med3_yba_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 { 2075; GFX6-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp: 2076; GFX6: ; %bb.0: 2077; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2078; GFX6-NEXT: s_mov_b32 s7, 0xf000 2079; GFX6-NEXT: s_mov_b32 s6, 0 2080; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2081; GFX6-NEXT: v_mov_b32_e32 v1, 0 2082; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2083; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2084; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2085; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2086; GFX6-NEXT: s_waitcnt vmcnt(0) 2087; GFX6-NEXT: v_med3_f32 v2, v2, 1.0, 0 2088; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2089; GFX6-NEXT: s_endpgm 2090; 2091; GFX8-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp: 2092; GFX8: ; %bb.0: 2093; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2094; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2095; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2096; GFX8-NEXT: v_mov_b32_e32 v1, s3 2097; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2098; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2099; GFX8-NEXT: flat_load_dword v3, v[0:1] 2100; GFX8-NEXT: v_mov_b32_e32 v1, s1 2101; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2102; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2103; GFX8-NEXT: s_waitcnt vmcnt(0) 2104; GFX8-NEXT: v_med3_f32 v2, v3, 1.0, 0 2105; GFX8-NEXT: flat_store_dword v[0:1], v2 2106; GFX8-NEXT: s_endpgm 2107; 2108; GFX9-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp: 2109; GFX9: ; %bb.0: 2110; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2111; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2112; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2113; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2114; GFX9-NEXT: s_waitcnt vmcnt(0) 2115; GFX9-NEXT: v_med3_f32 v1, v1, 1.0, 0 2116; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2117; GFX9-NEXT: s_endpgm 2118; 2119; GFX11-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp: 2120; GFX11: ; %bb.0: 2121; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2122; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2123; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2124; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2125; GFX11-NEXT: s_waitcnt vmcnt(0) 2126; GFX11-NEXT: v_med3_f32 v1, v1, 1.0, 0 2127; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2128; GFX11-NEXT: s_endpgm 2129 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2130 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 2131 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 2132 %a = load float, float addrspace(1)* %gep0 2133 %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 1.0, float 0.0) 2134 store float %med, float addrspace(1)* %out.gep 2135 ret void 2136} 2137 2138define amdgpu_kernel void @v_clamp_med3_ayb_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 { 2139; GFX6-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp: 2140; GFX6: ; %bb.0: 2141; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2142; GFX6-NEXT: s_mov_b32 s7, 0xf000 2143; GFX6-NEXT: s_mov_b32 s6, 0 2144; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2145; GFX6-NEXT: v_mov_b32_e32 v1, 0 2146; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2147; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2148; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2149; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2150; GFX6-NEXT: s_waitcnt vmcnt(0) 2151; GFX6-NEXT: v_med3_f32 v2, 0, v2, 1.0 2152; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2153; GFX6-NEXT: s_endpgm 2154; 2155; GFX8-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp: 2156; GFX8: ; %bb.0: 2157; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2158; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2159; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2160; GFX8-NEXT: v_mov_b32_e32 v1, s3 2161; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2162; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2163; GFX8-NEXT: flat_load_dword v3, v[0:1] 2164; GFX8-NEXT: v_mov_b32_e32 v1, s1 2165; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2166; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2167; GFX8-NEXT: s_waitcnt vmcnt(0) 2168; GFX8-NEXT: v_med3_f32 v2, 0, v3, 1.0 2169; GFX8-NEXT: flat_store_dword v[0:1], v2 2170; GFX8-NEXT: s_endpgm 2171; 2172; GFX9-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp: 2173; GFX9: ; %bb.0: 2174; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2175; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2176; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2177; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2178; GFX9-NEXT: s_waitcnt vmcnt(0) 2179; GFX9-NEXT: v_med3_f32 v1, 0, v1, 1.0 2180; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2181; GFX9-NEXT: s_endpgm 2182; 2183; GFX11-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp: 2184; GFX11: ; %bb.0: 2185; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2186; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2187; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2188; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2189; GFX11-NEXT: s_waitcnt vmcnt(0) 2190; GFX11-NEXT: v_med3_f32 v1, 0, v1, 1.0 2191; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2192; GFX11-NEXT: s_endpgm 2193 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2194 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 2195 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 2196 %a = load float, float addrspace(1)* %gep0 2197 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %a, float 1.0) 2198 store float %med, float addrspace(1)* %out.gep 2199 ret void 2200} 2201 2202define amdgpu_kernel void @v_clamp_med3_bya_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 { 2203; GFX6-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp: 2204; GFX6: ; %bb.0: 2205; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2206; GFX6-NEXT: s_mov_b32 s7, 0xf000 2207; GFX6-NEXT: s_mov_b32 s6, 0 2208; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2209; GFX6-NEXT: v_mov_b32_e32 v1, 0 2210; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2211; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2212; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2213; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2214; GFX6-NEXT: s_waitcnt vmcnt(0) 2215; GFX6-NEXT: v_med3_f32 v2, 1.0, v2, 0 2216; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2217; GFX6-NEXT: s_endpgm 2218; 2219; GFX8-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp: 2220; GFX8: ; %bb.0: 2221; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2222; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2223; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2224; GFX8-NEXT: v_mov_b32_e32 v1, s3 2225; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2226; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2227; GFX8-NEXT: flat_load_dword v3, v[0:1] 2228; GFX8-NEXT: v_mov_b32_e32 v1, s1 2229; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2230; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2231; GFX8-NEXT: s_waitcnt vmcnt(0) 2232; GFX8-NEXT: v_med3_f32 v2, 1.0, v3, 0 2233; GFX8-NEXT: flat_store_dword v[0:1], v2 2234; GFX8-NEXT: s_endpgm 2235; 2236; GFX9-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp: 2237; GFX9: ; %bb.0: 2238; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2239; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2240; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2241; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2242; GFX9-NEXT: s_waitcnt vmcnt(0) 2243; GFX9-NEXT: v_med3_f32 v1, 1.0, v1, 0 2244; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2245; GFX9-NEXT: s_endpgm 2246; 2247; GFX11-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp: 2248; GFX11: ; %bb.0: 2249; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2250; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2251; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2252; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2253; GFX11-NEXT: s_waitcnt vmcnt(0) 2254; GFX11-NEXT: v_med3_f32 v1, 1.0, v1, 0 2255; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2256; GFX11-NEXT: s_endpgm 2257 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2258 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid 2259 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 2260 %a = load float, float addrspace(1)* %gep0 2261 %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %a, float 0.0) 2262 store float %med, float addrspace(1)* %out.gep 2263 ret void 2264} 2265 2266define amdgpu_kernel void @v_clamp_constant_qnan_f32_no_dx10_clamp(float addrspace(1)* %out) #2 { 2267; GFX6-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp: 2268; GFX6: ; %bb.0: 2269; GFX6-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 2270; GFX6-NEXT: s_mov_b32 s3, 0xf000 2271; GFX6-NEXT: s_mov_b32 s2, 0 2272; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2273; GFX6-NEXT: v_mov_b32_e32 v1, 0 2274; GFX6-NEXT: v_mov_b32_e32 v2, 0x7fc00000 2275; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2276; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2277; GFX6-NEXT: s_endpgm 2278; 2279; GFX8-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp: 2280; GFX8: ; %bb.0: 2281; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 2282; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2283; GFX8-NEXT: v_mov_b32_e32 v2, 0x7fc00000 2284; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2285; GFX8-NEXT: v_mov_b32_e32 v1, s1 2286; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0 2287; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2288; GFX8-NEXT: flat_store_dword v[0:1], v2 2289; GFX8-NEXT: s_endpgm 2290; 2291; GFX9-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp: 2292; GFX9: ; %bb.0: 2293; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 2294; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2295; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000 2296; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2297; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2298; GFX9-NEXT: s_endpgm 2299; 2300; GFX11-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp: 2301; GFX11: ; %bb.0: 2302; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 2303; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2304; GFX11-NEXT: v_mov_b32_e32 v1, 0x7fc00000 2305; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2306; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2307; GFX11-NEXT: s_endpgm 2308 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2309 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 2310 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8000000000000) 2311 store float %med, float addrspace(1)* %out.gep 2312 ret void 2313} 2314 2315define amdgpu_kernel void @v_clamp_constant_snan_f32_no_dx10_clamp(float addrspace(1)* %out) #2 { 2316; GFX6-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp: 2317; GFX6: ; %bb.0: 2318; GFX6-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x9 2319; GFX6-NEXT: s_mov_b32 s3, 0xf000 2320; GFX6-NEXT: s_mov_b32 s2, 0 2321; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2322; GFX6-NEXT: v_mov_b32_e32 v1, 0 2323; GFX6-NEXT: v_mov_b32_e32 v2, 0x7f800001 2324; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2325; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2326; GFX6-NEXT: s_endpgm 2327; 2328; GFX8-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp: 2329; GFX8: ; %bb.0: 2330; GFX8-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 2331; GFX8-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2332; GFX8-NEXT: v_mov_b32_e32 v2, 0x7f800001 2333; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2334; GFX8-NEXT: v_mov_b32_e32 v1, s1 2335; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v0 2336; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2337; GFX8-NEXT: flat_store_dword v[0:1], v2 2338; GFX8-NEXT: s_endpgm 2339; 2340; GFX9-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp: 2341; GFX9: ; %bb.0: 2342; GFX9-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 2343; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2344; GFX9-NEXT: v_mov_b32_e32 v1, 0x7f800001 2345; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2346; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2347; GFX9-NEXT: s_endpgm 2348; 2349; GFX11-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp: 2350; GFX11: ; %bb.0: 2351; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 2352; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2353; GFX11-NEXT: v_mov_b32_e32 v1, 0x7f800001 2354; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2355; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2356; GFX11-NEXT: s_endpgm 2357 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2358 %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 2359 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 2139095041 to float)) 2360 store float %med, float addrspace(1)* %out.gep 2361 ret void 2362} 2363 2364define amdgpu_kernel void @v_clamp_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 2365; GFX6-LABEL: v_clamp_v2f16: 2366; GFX6: ; %bb.0: 2367; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2368; GFX6-NEXT: s_mov_b32 s7, 0xf000 2369; GFX6-NEXT: s_mov_b32 s6, 0 2370; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2371; GFX6-NEXT: v_mov_b32_e32 v1, 0 2372; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2373; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2374; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2375; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2376; GFX6-NEXT: s_waitcnt vmcnt(0) 2377; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v2 2378; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp 2379; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp 2380; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 2381; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 2382; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v3 2383; GFX6-NEXT: v_or_b32_e32 v2, v2, v3 2384; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2385; GFX6-NEXT: s_endpgm 2386; 2387; GFX8-LABEL: v_clamp_v2f16: 2388; GFX8: ; %bb.0: 2389; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2390; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2391; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2392; GFX8-NEXT: v_mov_b32_e32 v1, s3 2393; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2394; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2395; GFX8-NEXT: flat_load_dword v3, v[0:1] 2396; GFX8-NEXT: v_mov_b32_e32 v1, s1 2397; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2398; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2399; GFX8-NEXT: s_waitcnt vmcnt(0) 2400; 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_1 2401; GFX8-NEXT: v_max_f16_e64 v3, v3, v3 clamp 2402; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 2403; GFX8-NEXT: flat_store_dword v[0:1], v2 2404; GFX8-NEXT: s_endpgm 2405; 2406; GFX9-LABEL: v_clamp_v2f16: 2407; GFX9: ; %bb.0: 2408; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2409; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2410; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2411; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2412; GFX9-NEXT: s_waitcnt vmcnt(0) 2413; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp 2414; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2415; GFX9-NEXT: s_endpgm 2416; 2417; GFX11-LABEL: v_clamp_v2f16: 2418; GFX11: ; %bb.0: 2419; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2420; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2421; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2422; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2423; GFX11-NEXT: s_waitcnt vmcnt(0) 2424; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp 2425; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2426; GFX11-NEXT: s_endpgm 2427 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2428 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 2429 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 2430 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 2431 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> zeroinitializer) 2432 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>) 2433 2434 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 2435 ret void 2436} 2437 2438define amdgpu_kernel void @v_clamp_v2f16_undef_elt(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 2439; GFX6-LABEL: v_clamp_v2f16_undef_elt: 2440; GFX6: ; %bb.0: 2441; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2442; GFX6-NEXT: s_mov_b32 s7, 0xf000 2443; GFX6-NEXT: s_mov_b32 s6, 0 2444; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2445; GFX6-NEXT: v_mov_b32_e32 v1, 0 2446; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2447; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2448; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2449; GFX6-NEXT: s_mov_b32 s2, 0x7fc00000 2450; GFX6-NEXT: s_waitcnt vmcnt(0) 2451; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v2 2452; GFX6-NEXT: v_lshrrev_b32_e32 v2, 16, v2 2453; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 2454; GFX6-NEXT: v_mul_f32_e32 v3, 1.0, v3 2455; GFX6-NEXT: v_max_f32_e32 v3, 0x7fc00000, v3 2456; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2 2457; GFX6-NEXT: v_med3_f32 v2, v2, 0, s2 2458; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 2459; GFX6-NEXT: v_min_f32_e32 v3, 1.0, v3 2460; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 2461; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2462; GFX6-NEXT: v_lshlrev_b32_e32 v2, 16, v2 2463; GFX6-NEXT: v_or_b32_e32 v2, v3, v2 2464; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2465; GFX6-NEXT: s_endpgm 2466; 2467; GFX8-LABEL: v_clamp_v2f16_undef_elt: 2468; GFX8: ; %bb.0: 2469; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2470; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2471; GFX8-NEXT: v_mov_b32_e32 v4, 0x7e00 2472; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2473; GFX8-NEXT: v_mov_b32_e32 v1, s3 2474; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2475; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2476; GFX8-NEXT: flat_load_dword v3, v[0:1] 2477; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2478; GFX8-NEXT: v_mov_b32_e32 v1, s1 2479; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2480; GFX8-NEXT: s_waitcnt vmcnt(0) 2481; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 2482; GFX8-NEXT: v_max_f16_e32 v3, v3, v3 2483; GFX8-NEXT: v_max_f16_e32 v2, 0, v2 2484; GFX8-NEXT: v_max_f16_e32 v3, 0x7e00, v3 2485; GFX8-NEXT: v_min_f16_e32 v3, 1.0, v3 2486; GFX8-NEXT: v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 2487; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 2488; GFX8-NEXT: flat_store_dword v[0:1], v2 2489; GFX8-NEXT: s_endpgm 2490; 2491; GFX9-LABEL: v_clamp_v2f16_undef_elt: 2492; GFX9: ; %bb.0: 2493; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2494; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2495; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2496; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2497; GFX9-NEXT: s_waitcnt vmcnt(0) 2498; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp 2499; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2500; GFX9-NEXT: s_endpgm 2501; 2502; GFX11-LABEL: v_clamp_v2f16_undef_elt: 2503; GFX11: ; %bb.0: 2504; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2505; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2506; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2507; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2508; GFX11-NEXT: s_waitcnt vmcnt(0) 2509; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp 2510; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2511; GFX11-NEXT: s_endpgm 2512 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2513 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 2514 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 2515 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 2516 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half undef, half 0.0>) 2517 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half undef>) 2518 2519 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 2520 ret void 2521} 2522 2523define amdgpu_kernel void @v_clamp_v2f16_not_zero(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 2524; GFX6-LABEL: v_clamp_v2f16_not_zero: 2525; GFX6: ; %bb.0: 2526; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2527; GFX6-NEXT: s_mov_b32 s7, 0xf000 2528; GFX6-NEXT: s_mov_b32 s6, 0 2529; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2530; GFX6-NEXT: v_mov_b32_e32 v1, 0 2531; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2532; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2533; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2534; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2535; GFX6-NEXT: s_waitcnt vmcnt(0) 2536; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v2 2537; GFX6-NEXT: v_lshrrev_b32_e32 v2, 16, v2 2538; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp 2539; GFX6-NEXT: v_mul_f32_e32 v3, 1.0, v3 2540; GFX6-NEXT: v_max_f32_e32 v3, 2.0, v3 2541; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 2542; GFX6-NEXT: v_min_f32_e32 v3, 1.0, v3 2543; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 2544; GFX6-NEXT: v_lshlrev_b32_e32 v2, 16, v2 2545; GFX6-NEXT: v_or_b32_e32 v2, v3, v2 2546; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2547; GFX6-NEXT: s_endpgm 2548; 2549; GFX8-LABEL: v_clamp_v2f16_not_zero: 2550; GFX8: ; %bb.0: 2551; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2552; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2553; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2554; GFX8-NEXT: v_mov_b32_e32 v1, s3 2555; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2556; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2557; GFX8-NEXT: flat_load_dword v3, v[0:1] 2558; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2559; GFX8-NEXT: v_mov_b32_e32 v1, s1 2560; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2561; GFX8-NEXT: s_waitcnt vmcnt(0) 2562; GFX8-NEXT: v_max_f16_e32 v2, v3, v3 2563; GFX8-NEXT: v_max_f16_e32 v2, 2.0, v2 2564; 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_1 2565; GFX8-NEXT: v_min_f16_e32 v2, 1.0, v2 2566; GFX8-NEXT: v_or_b32_e32 v2, v2, v3 2567; GFX8-NEXT: flat_store_dword v[0:1], v2 2568; GFX8-NEXT: s_endpgm 2569; 2570; GFX9-LABEL: v_clamp_v2f16_not_zero: 2571; GFX9: ; %bb.0: 2572; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2573; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2574; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2575; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2576; GFX9-NEXT: s_waitcnt vmcnt(0) 2577; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 2578; GFX9-NEXT: v_pk_max_f16 v1, v1, 2.0 2579; GFX9-NEXT: v_pk_min_f16 v1, v1, 1.0 op_sel_hi:[1,0] 2580; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2581; GFX9-NEXT: s_endpgm 2582; 2583; GFX11-LABEL: v_clamp_v2f16_not_zero: 2584; GFX11: ; %bb.0: 2585; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2586; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2587; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2588; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2589; GFX11-NEXT: s_waitcnt vmcnt(0) 2590; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 2591; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 2592; GFX11-NEXT: v_pk_max_f16 v1, v1, 2.0 2593; GFX11-NEXT: v_pk_min_f16 v1, v1, 1.0 op_sel_hi:[1,0] 2594; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2595; GFX11-NEXT: s_endpgm 2596 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2597 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 2598 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 2599 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 2600 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 2.0, half 0.0>) 2601 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>) 2602 2603 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 2604 ret void 2605} 2606 2607define amdgpu_kernel void @v_clamp_v2f16_not_one(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 2608; GFX6-LABEL: v_clamp_v2f16_not_one: 2609; GFX6: ; %bb.0: 2610; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2611; GFX6-NEXT: s_mov_b32 s7, 0xf000 2612; GFX6-NEXT: s_mov_b32 s6, 0 2613; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2614; GFX6-NEXT: v_mov_b32_e32 v1, 0 2615; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2616; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2617; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2618; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2619; GFX6-NEXT: s_waitcnt vmcnt(0) 2620; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v2 2621; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 2622; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp 2623; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2 2624; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 2625; GFX6-NEXT: v_med3_f32 v2, v2, 0, 0 2626; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 2627; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v3 2628; GFX6-NEXT: v_or_b32_e32 v2, v2, v3 2629; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2630; GFX6-NEXT: s_endpgm 2631; 2632; GFX8-LABEL: v_clamp_v2f16_not_one: 2633; GFX8: ; %bb.0: 2634; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2635; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2636; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2637; GFX8-NEXT: v_mov_b32_e32 v1, s3 2638; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2639; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2640; GFX8-NEXT: flat_load_dword v3, v[0:1] 2641; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2642; GFX8-NEXT: v_mov_b32_e32 v1, s1 2643; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2644; GFX8-NEXT: s_waitcnt vmcnt(0) 2645; GFX8-NEXT: v_max_f16_e32 v2, v3, v3 2646; GFX8-NEXT: v_max_f16_e32 v2, 0, v2 2647; 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_1 2648; GFX8-NEXT: v_min_f16_e32 v2, 0, v2 2649; GFX8-NEXT: v_or_b32_e32 v2, v2, v3 2650; GFX8-NEXT: flat_store_dword v[0:1], v2 2651; GFX8-NEXT: s_endpgm 2652; 2653; GFX9-LABEL: v_clamp_v2f16_not_one: 2654; GFX9: ; %bb.0: 2655; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2656; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2657; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2658; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2659; GFX9-NEXT: s_waitcnt vmcnt(0) 2660; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 2661; GFX9-NEXT: v_pk_max_f16 v1, v1, 0 2662; GFX9-NEXT: v_pk_min_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0] 2663; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2664; GFX9-NEXT: s_endpgm 2665; 2666; GFX11-LABEL: v_clamp_v2f16_not_one: 2667; GFX11: ; %bb.0: 2668; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2669; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2670; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2671; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2672; GFX11-NEXT: s_waitcnt vmcnt(0) 2673; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 2674; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 2675; GFX11-NEXT: v_pk_max_f16 v1, v1, 0 2676; GFX11-NEXT: v_pk_min_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0] 2677; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2678; GFX11-NEXT: s_endpgm 2679 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2680 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 2681 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 2682 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 2683 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 0.0, half 0.0>) 2684 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 0.0, half 1.0>) 2685 2686 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 2687 ret void 2688} 2689 2690define amdgpu_kernel void @v_clamp_neg_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 2691; GFX6-LABEL: v_clamp_neg_v2f16: 2692; GFX6: ; %bb.0: 2693; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2694; GFX6-NEXT: s_mov_b32 s7, 0xf000 2695; GFX6-NEXT: s_mov_b32 s6, 0 2696; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2697; GFX6-NEXT: v_mov_b32_e32 v1, 0 2698; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2699; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2700; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2701; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2702; GFX6-NEXT: s_waitcnt vmcnt(0) 2703; GFX6-NEXT: v_xor_b32_e32 v2, 0x80008000, v2 2704; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v2 2705; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp 2706; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp 2707; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 2708; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 2709; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v3 2710; GFX6-NEXT: v_or_b32_e32 v2, v2, v3 2711; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2712; GFX6-NEXT: s_endpgm 2713; 2714; GFX8-LABEL: v_clamp_neg_v2f16: 2715; GFX8: ; %bb.0: 2716; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2717; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2718; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2719; GFX8-NEXT: v_mov_b32_e32 v1, s3 2720; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2721; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2722; GFX8-NEXT: flat_load_dword v3, v[0:1] 2723; GFX8-NEXT: v_mov_b32_e32 v1, s1 2724; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2725; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2726; GFX8-NEXT: s_waitcnt vmcnt(0) 2727; 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_1 2728; GFX8-NEXT: v_max_f16_e64 v3, -v3, -v3 clamp 2729; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 2730; GFX8-NEXT: flat_store_dword v[0:1], v2 2731; GFX8-NEXT: s_endpgm 2732; 2733; GFX9-LABEL: v_clamp_neg_v2f16: 2734; GFX9: ; %bb.0: 2735; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2736; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2737; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2738; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2739; GFX9-NEXT: s_waitcnt vmcnt(0) 2740; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp 2741; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2742; GFX9-NEXT: s_endpgm 2743; 2744; GFX11-LABEL: v_clamp_neg_v2f16: 2745; GFX11: ; %bb.0: 2746; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2747; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2748; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2749; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2750; GFX11-NEXT: s_waitcnt vmcnt(0) 2751; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp 2752; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2753; GFX11-NEXT: s_endpgm 2754 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2755 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 2756 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 2757 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 2758 %fneg.a = fsub <2 x half> <half -0.0, half -0.0>, %a 2759 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %fneg.a, <2 x half> zeroinitializer) 2760 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>) 2761 2762 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 2763 ret void 2764} 2765 2766define amdgpu_kernel void @v_clamp_negabs_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 2767; GFX6-LABEL: v_clamp_negabs_v2f16: 2768; GFX6: ; %bb.0: 2769; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2770; GFX6-NEXT: s_mov_b32 s7, 0xf000 2771; GFX6-NEXT: s_mov_b32 s6, 0 2772; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2773; GFX6-NEXT: v_mov_b32_e32 v1, 0 2774; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2775; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2776; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2777; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2778; GFX6-NEXT: s_waitcnt vmcnt(0) 2779; GFX6-NEXT: v_or_b32_e32 v2, 0x80008000, v2 2780; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v2 2781; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp 2782; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp 2783; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 2784; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 2785; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v3 2786; GFX6-NEXT: v_or_b32_e32 v2, v2, v3 2787; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2788; GFX6-NEXT: s_endpgm 2789; 2790; GFX8-LABEL: v_clamp_negabs_v2f16: 2791; GFX8: ; %bb.0: 2792; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2793; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2794; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2795; GFX8-NEXT: v_mov_b32_e32 v1, s3 2796; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2797; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2798; GFX8-NEXT: flat_load_dword v3, v[0:1] 2799; GFX8-NEXT: v_mov_b32_e32 v1, s1 2800; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2801; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2802; GFX8-NEXT: s_waitcnt vmcnt(0) 2803; 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_1 2804; GFX8-NEXT: v_max_f16_e64 v3, -|v3|, -|v3| clamp 2805; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 2806; GFX8-NEXT: flat_store_dword v[0:1], v2 2807; GFX8-NEXT: s_endpgm 2808; 2809; GFX9-LABEL: v_clamp_negabs_v2f16: 2810; GFX9: ; %bb.0: 2811; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2812; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2813; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2814; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2815; GFX9-NEXT: s_waitcnt vmcnt(0) 2816; GFX9-NEXT: v_and_b32_e32 v1, 0x7fff7fff, v1 2817; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp 2818; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2819; GFX9-NEXT: s_endpgm 2820; 2821; GFX11-LABEL: v_clamp_negabs_v2f16: 2822; GFX11: ; %bb.0: 2823; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2824; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2825; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2826; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2827; GFX11-NEXT: s_waitcnt vmcnt(0) 2828; GFX11-NEXT: v_and_b32_e32 v1, 0x7fff7fff, v1 2829; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) 2830; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp 2831; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2832; GFX11-NEXT: s_endpgm 2833 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2834 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 2835 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 2836 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 2837 %fabs.a = call <2 x half> @llvm.fabs.v2f16(<2 x half> %a) 2838 %fneg.fabs.a = fsub <2 x half> <half -0.0, half -0.0>, %fabs.a 2839 2840 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %fneg.fabs.a, <2 x half> zeroinitializer) 2841 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>) 2842 2843 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 2844 ret void 2845} 2846 2847define amdgpu_kernel void @v_clamp_neglo_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 2848; GFX6-LABEL: v_clamp_neglo_v2f16: 2849; GFX6: ; %bb.0: 2850; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2851; GFX6-NEXT: s_mov_b32 s7, 0xf000 2852; GFX6-NEXT: s_mov_b32 s6, 0 2853; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2854; GFX6-NEXT: v_mov_b32_e32 v1, 0 2855; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2856; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2857; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2858; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2859; GFX6-NEXT: s_waitcnt vmcnt(0) 2860; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v2 2861; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp 2862; GFX6-NEXT: v_and_b32_e32 v2, 0xffff, v2 2863; GFX6-NEXT: v_cvt_f32_f16_e64 v2, -v2 clamp 2864; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 2865; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 2866; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v3 2867; GFX6-NEXT: v_or_b32_e32 v2, v2, v3 2868; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2869; GFX6-NEXT: s_endpgm 2870; 2871; GFX8-LABEL: v_clamp_neglo_v2f16: 2872; GFX8: ; %bb.0: 2873; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2874; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2875; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2876; GFX8-NEXT: v_mov_b32_e32 v1, s3 2877; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2878; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2879; GFX8-NEXT: flat_load_dword v3, v[0:1] 2880; GFX8-NEXT: v_mov_b32_e32 v1, s1 2881; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2882; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2883; GFX8-NEXT: s_waitcnt vmcnt(0) 2884; 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_1 2885; GFX8-NEXT: v_max_f16_e64 v3, -v3, -v3 clamp 2886; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 2887; GFX8-NEXT: flat_store_dword v[0:1], v2 2888; GFX8-NEXT: s_endpgm 2889; 2890; GFX9-LABEL: v_clamp_neglo_v2f16: 2891; GFX9: ; %bb.0: 2892; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2893; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2894; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2895; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2896; GFX9-NEXT: s_waitcnt vmcnt(0) 2897; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp 2898; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2899; GFX9-NEXT: s_endpgm 2900; 2901; GFX11-LABEL: v_clamp_neglo_v2f16: 2902; GFX11: ; %bb.0: 2903; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2904; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2905; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2906; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2907; GFX11-NEXT: s_waitcnt vmcnt(0) 2908; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp 2909; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2910; GFX11-NEXT: s_endpgm 2911 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2912 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 2913 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 2914 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 2915 %lo = extractelement <2 x half> %a, i32 0 2916 %neg.lo = fsub half -0.0, %lo 2917 %neg.lo.vec = insertelement <2 x half> %a, half %neg.lo, i32 0 2918 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.lo.vec, <2 x half> zeroinitializer) 2919 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>) 2920 2921 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 2922 ret void 2923} 2924 2925define amdgpu_kernel void @v_clamp_neghi_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 2926; GFX6-LABEL: v_clamp_neghi_v2f16: 2927; GFX6: ; %bb.0: 2928; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 2929; GFX6-NEXT: s_mov_b32 s7, 0xf000 2930; GFX6-NEXT: s_mov_b32 s6, 0 2931; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2932; GFX6-NEXT: v_mov_b32_e32 v1, 0 2933; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2934; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 2935; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 2936; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 2937; GFX6-NEXT: s_waitcnt vmcnt(0) 2938; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v2 2939; GFX6-NEXT: v_cvt_f32_f16_e64 v3, -v3 clamp 2940; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp 2941; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 2942; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 2943; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v3 2944; GFX6-NEXT: v_or_b32_e32 v2, v2, v3 2945; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 2946; GFX6-NEXT: s_endpgm 2947; 2948; GFX8-LABEL: v_clamp_neghi_v2f16: 2949; GFX8: ; %bb.0: 2950; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2951; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 2952; GFX8-NEXT: s_waitcnt lgkmcnt(0) 2953; GFX8-NEXT: v_mov_b32_e32 v1, s3 2954; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 2955; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2956; GFX8-NEXT: flat_load_dword v3, v[0:1] 2957; GFX8-NEXT: v_mov_b32_e32 v1, s1 2958; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 2959; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 2960; GFX8-NEXT: s_waitcnt vmcnt(0) 2961; 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_1 2962; GFX8-NEXT: v_max_f16_e64 v3, v3, v3 clamp 2963; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 2964; GFX8-NEXT: flat_store_dword v[0:1], v2 2965; GFX8-NEXT: s_endpgm 2966; 2967; GFX9-LABEL: v_clamp_neghi_v2f16: 2968; GFX9: ; %bb.0: 2969; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 2970; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2971; GFX9-NEXT: s_waitcnt lgkmcnt(0) 2972; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 2973; GFX9-NEXT: s_waitcnt vmcnt(0) 2974; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp 2975; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 2976; GFX9-NEXT: s_endpgm 2977; 2978; GFX11-LABEL: v_clamp_neghi_v2f16: 2979; GFX11: ; %bb.0: 2980; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 2981; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 2982; GFX11-NEXT: s_waitcnt lgkmcnt(0) 2983; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 2984; GFX11-NEXT: s_waitcnt vmcnt(0) 2985; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp 2986; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 2987; GFX11-NEXT: s_endpgm 2988 %tid = call i32 @llvm.amdgcn.workitem.id.x() 2989 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 2990 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 2991 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 2992 %hi = extractelement <2 x half> %a, i32 1 2993 %neg.hi = fsub half -0.0, %hi 2994 %neg.hi.vec = insertelement <2 x half> %a, half %neg.hi, i32 1 2995 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.hi.vec, <2 x half> zeroinitializer) 2996 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>) 2997 2998 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 2999 ret void 3000} 3001 3002define amdgpu_kernel void @v_clamp_v2f16_shuffle(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 3003; GFX6-LABEL: v_clamp_v2f16_shuffle: 3004; GFX6: ; %bb.0: 3005; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 3006; GFX6-NEXT: s_mov_b32 s7, 0xf000 3007; GFX6-NEXT: s_mov_b32 s6, 0 3008; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3009; GFX6-NEXT: v_mov_b32_e32 v1, 0 3010; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3011; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 3012; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 3013; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 3014; GFX6-NEXT: s_waitcnt vmcnt(0) 3015; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v2 3016; GFX6-NEXT: v_cvt_f32_f16_e64 v2, v2 clamp 3017; GFX6-NEXT: v_cvt_f32_f16_e64 v3, v3 clamp 3018; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 3019; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 3020; GFX6-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3021; GFX6-NEXT: v_or_b32_e32 v2, v3, v2 3022; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 3023; GFX6-NEXT: s_endpgm 3024; 3025; GFX8-LABEL: v_clamp_v2f16_shuffle: 3026; GFX8: ; %bb.0: 3027; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 3028; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 3029; GFX8-NEXT: s_waitcnt lgkmcnt(0) 3030; GFX8-NEXT: v_mov_b32_e32 v1, s3 3031; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 3032; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 3033; GFX8-NEXT: flat_load_dword v3, v[0:1] 3034; GFX8-NEXT: v_mov_b32_e32 v1, s1 3035; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 3036; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 3037; GFX8-NEXT: s_waitcnt vmcnt(0) 3038; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 3039; GFX8-NEXT: v_max_f16_sdwa v3, v3, v3 clamp dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 3040; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 3041; GFX8-NEXT: flat_store_dword v[0:1], v2 3042; GFX8-NEXT: s_endpgm 3043; 3044; GFX9-LABEL: v_clamp_v2f16_shuffle: 3045; GFX9: ; %bb.0: 3046; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 3047; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3048; GFX9-NEXT: s_waitcnt lgkmcnt(0) 3049; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 3050; GFX9-NEXT: s_waitcnt vmcnt(0) 3051; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp 3052; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 3053; GFX9-NEXT: s_endpgm 3054; 3055; GFX11-LABEL: v_clamp_v2f16_shuffle: 3056; GFX11: ; %bb.0: 3057; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 3058; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3059; GFX11-NEXT: s_waitcnt lgkmcnt(0) 3060; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 3061; GFX11-NEXT: s_waitcnt vmcnt(0) 3062; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp 3063; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 3064; GFX11-NEXT: s_endpgm 3065 %tid = call i32 @llvm.amdgcn.workitem.id.x() 3066 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 3067 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 3068 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 3069 %shuf = shufflevector <2 x half> %a, <2 x half> undef, <2 x i32> <i32 1, i32 0> 3070 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %shuf, <2 x half> zeroinitializer) 3071 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>) 3072 3073 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 3074 ret void 3075} 3076 3077define amdgpu_kernel void @v_clamp_v2f16_undef_limit_elts0(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 3078; GFX6-LABEL: v_clamp_v2f16_undef_limit_elts0: 3079; GFX6: ; %bb.0: 3080; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 3081; GFX6-NEXT: s_mov_b32 s7, 0xf000 3082; GFX6-NEXT: s_mov_b32 s6, 0 3083; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3084; GFX6-NEXT: v_mov_b32_e32 v1, 0 3085; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3086; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 3087; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 3088; GFX6-NEXT: s_mov_b32 s2, 0x7fc00000 3089; GFX6-NEXT: s_waitcnt vmcnt(0) 3090; GFX6-NEXT: v_lshrrev_b32_e32 v3, 16, v2 3091; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v3 3092; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 3093; GFX6-NEXT: v_mul_f32_e32 v3, 1.0, v3 3094; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2 3095; GFX6-NEXT: v_med3_f32 v3, v3, s2, 1.0 3096; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 3097; GFX6-NEXT: v_med3_f32 v2, v2, 0, s2 3098; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 3099; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 3100; GFX6-NEXT: v_lshlrev_b32_e32 v3, 16, v3 3101; GFX6-NEXT: v_or_b32_e32 v2, v2, v3 3102; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 3103; GFX6-NEXT: s_endpgm 3104; 3105; GFX8-LABEL: v_clamp_v2f16_undef_limit_elts0: 3106; GFX8: ; %bb.0: 3107; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 3108; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 3109; GFX8-NEXT: v_mov_b32_e32 v4, 0x3c00 3110; GFX8-NEXT: s_waitcnt lgkmcnt(0) 3111; GFX8-NEXT: v_mov_b32_e32 v1, s3 3112; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 3113; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 3114; GFX8-NEXT: flat_load_dword v3, v[0:1] 3115; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 3116; GFX8-NEXT: v_mov_b32_e32 v1, s1 3117; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 3118; GFX8-NEXT: s_waitcnt vmcnt(0) 3119; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 3120; GFX8-NEXT: v_max_f16_e32 v3, v3, v3 3121; GFX8-NEXT: v_max_f16_e32 v2, 0x7e00, v2 3122; GFX8-NEXT: v_max_f16_e32 v3, 0, v3 3123; GFX8-NEXT: v_min_f16_e32 v3, 0x7e00, v3 3124; GFX8-NEXT: v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 3125; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 3126; GFX8-NEXT: flat_store_dword v[0:1], v2 3127; GFX8-NEXT: s_endpgm 3128; 3129; GFX9-LABEL: v_clamp_v2f16_undef_limit_elts0: 3130; GFX9: ; %bb.0: 3131; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 3132; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3133; GFX9-NEXT: s_waitcnt lgkmcnt(0) 3134; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 3135; GFX9-NEXT: s_waitcnt vmcnt(0) 3136; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp 3137; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 3138; GFX9-NEXT: s_endpgm 3139; 3140; GFX11-LABEL: v_clamp_v2f16_undef_limit_elts0: 3141; GFX11: ; %bb.0: 3142; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 3143; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3144; GFX11-NEXT: s_waitcnt lgkmcnt(0) 3145; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 3146; GFX11-NEXT: s_waitcnt vmcnt(0) 3147; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp 3148; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 3149; GFX11-NEXT: s_endpgm 3150 %tid = call i32 @llvm.amdgcn.workitem.id.x() 3151 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 3152 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 3153 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 3154 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 0.0, half undef>) 3155 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half undef, half 1.0>) 3156 3157 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 3158 ret void 3159} 3160 3161define amdgpu_kernel void @v_clamp_v2f16_undef_limit_elts1(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 { 3162; GFX6-LABEL: v_clamp_v2f16_undef_limit_elts1: 3163; GFX6: ; %bb.0: 3164; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 3165; GFX6-NEXT: s_mov_b32 s7, 0xf000 3166; GFX6-NEXT: s_mov_b32 s6, 0 3167; GFX6-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3168; GFX6-NEXT: v_mov_b32_e32 v1, 0 3169; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3170; GFX6-NEXT: s_mov_b64 s[4:5], s[2:3] 3171; GFX6-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 3172; GFX6-NEXT: s_mov_b32 s2, 0x7fc00000 3173; GFX6-NEXT: s_waitcnt vmcnt(0) 3174; GFX6-NEXT: v_cvt_f32_f16_e32 v3, v2 3175; GFX6-NEXT: v_lshrrev_b32_e32 v2, 16, v2 3176; GFX6-NEXT: v_cvt_f32_f16_e32 v2, v2 3177; GFX6-NEXT: v_mul_f32_e32 v3, 1.0, v3 3178; GFX6-NEXT: v_max_f32_e32 v3, 0x7fc00000, v3 3179; GFX6-NEXT: v_mul_f32_e32 v2, 1.0, v2 3180; GFX6-NEXT: v_med3_f32 v2, v2, 0, s2 3181; GFX6-NEXT: v_cvt_f16_f32_e32 v2, v2 3182; GFX6-NEXT: v_min_f32_e32 v3, 1.0, v3 3183; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v3 3184; GFX6-NEXT: s_mov_b64 s[2:3], s[6:7] 3185; GFX6-NEXT: v_lshlrev_b32_e32 v2, 16, v2 3186; GFX6-NEXT: v_or_b32_e32 v2, v3, v2 3187; GFX6-NEXT: buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 3188; GFX6-NEXT: s_endpgm 3189; 3190; GFX8-LABEL: v_clamp_v2f16_undef_limit_elts1: 3191; GFX8: ; %bb.0: 3192; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 3193; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0 3194; GFX8-NEXT: v_mov_b32_e32 v4, 0x7e00 3195; GFX8-NEXT: s_waitcnt lgkmcnt(0) 3196; GFX8-NEXT: v_mov_b32_e32 v1, s3 3197; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v2 3198; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 3199; GFX8-NEXT: flat_load_dword v3, v[0:1] 3200; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v2 3201; GFX8-NEXT: v_mov_b32_e32 v1, s1 3202; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc 3203; GFX8-NEXT: s_waitcnt vmcnt(0) 3204; GFX8-NEXT: v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 3205; GFX8-NEXT: v_max_f16_e32 v3, v3, v3 3206; GFX8-NEXT: v_max_f16_e32 v2, 0, v2 3207; GFX8-NEXT: v_max_f16_e32 v3, 0x7e00, v3 3208; GFX8-NEXT: v_min_f16_e32 v3, 1.0, v3 3209; GFX8-NEXT: v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 3210; GFX8-NEXT: v_or_b32_e32 v2, v3, v2 3211; GFX8-NEXT: flat_store_dword v[0:1], v2 3212; GFX8-NEXT: s_endpgm 3213; 3214; GFX9-LABEL: v_clamp_v2f16_undef_limit_elts1: 3215; GFX9: ; %bb.0: 3216; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 3217; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3218; GFX9-NEXT: s_waitcnt lgkmcnt(0) 3219; GFX9-NEXT: global_load_dword v1, v0, s[2:3] 3220; GFX9-NEXT: s_waitcnt vmcnt(0) 3221; GFX9-NEXT: v_pk_max_f16 v1, v1, v1 clamp 3222; GFX9-NEXT: global_store_dword v0, v1, s[0:1] 3223; GFX9-NEXT: s_endpgm 3224; 3225; GFX11-LABEL: v_clamp_v2f16_undef_limit_elts1: 3226; GFX11: ; %bb.0: 3227; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 3228; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0 3229; GFX11-NEXT: s_waitcnt lgkmcnt(0) 3230; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] 3231; GFX11-NEXT: s_waitcnt vmcnt(0) 3232; GFX11-NEXT: v_pk_max_f16 v1, v1, v1 clamp 3233; GFX11-NEXT: global_store_b32 v0, v1, s[0:1] 3234; GFX11-NEXT: s_endpgm 3235 %tid = call i32 @llvm.amdgcn.workitem.id.x() 3236 %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid 3237 %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid 3238 %a = load <2 x half>, <2 x half> addrspace(1)* %gep0 3239 %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half undef, half 0.0>) 3240 %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half undef>) 3241 3242 store <2 x half> %med, <2 x half> addrspace(1)* %out.gep 3243 ret void 3244} 3245 3246define amdgpu_kernel void @v_clamp_diff_source_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 3247; GFX6-LABEL: v_clamp_diff_source_f32: 3248; GFX6: ; %bb.0: 3249; GFX6-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 3250; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3251; GFX6-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x0 3252; GFX6-NEXT: s_load_dword s2, s[2:3], 0x2 3253; GFX6-NEXT: s_mov_b32 s3, 0xf000 3254; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3255; GFX6-NEXT: v_mov_b32_e32 v0, s5 3256; GFX6-NEXT: v_mov_b32_e32 v1, s2 3257; GFX6-NEXT: v_add_f32_e32 v0, s4, v0 3258; GFX6-NEXT: v_add_f32_e32 v1, s4, v1 3259; GFX6-NEXT: v_max_f32_e64 v0, v0, v1 clamp 3260; GFX6-NEXT: s_mov_b32 s2, -1 3261; GFX6-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:12 3262; GFX6-NEXT: s_endpgm 3263; 3264; GFX8-LABEL: v_clamp_diff_source_f32: 3265; GFX8: ; %bb.0: 3266; GFX8-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 3267; GFX8-NEXT: s_waitcnt lgkmcnt(0) 3268; GFX8-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x0 3269; GFX8-NEXT: s_load_dword s2, s[2:3], 0x8 3270; GFX8-NEXT: s_add_u32 s0, s0, 12 3271; GFX8-NEXT: s_addc_u32 s1, s1, 0 3272; GFX8-NEXT: s_waitcnt lgkmcnt(0) 3273; GFX8-NEXT: v_mov_b32_e32 v0, s5 3274; GFX8-NEXT: v_mov_b32_e32 v1, s2 3275; GFX8-NEXT: v_add_f32_e32 v0, s4, v0 3276; GFX8-NEXT: v_add_f32_e32 v1, s4, v1 3277; GFX8-NEXT: v_max_f32_e64 v2, v0, v1 clamp 3278; GFX8-NEXT: v_mov_b32_e32 v0, s0 3279; GFX8-NEXT: v_mov_b32_e32 v1, s1 3280; GFX8-NEXT: flat_store_dword v[0:1], v2 3281; GFX8-NEXT: s_endpgm 3282; 3283; GFX9-LABEL: v_clamp_diff_source_f32: 3284; GFX9: ; %bb.0: 3285; GFX9-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 3286; GFX9-NEXT: v_mov_b32_e32 v0, 0 3287; GFX9-NEXT: s_waitcnt lgkmcnt(0) 3288; GFX9-NEXT: s_load_dwordx2 s[4:5], s[2:3], 0x0 3289; GFX9-NEXT: s_load_dword s6, s[2:3], 0x8 3290; GFX9-NEXT: s_waitcnt lgkmcnt(0) 3291; GFX9-NEXT: v_mov_b32_e32 v1, s5 3292; GFX9-NEXT: v_mov_b32_e32 v2, s6 3293; GFX9-NEXT: v_add_f32_e32 v1, s4, v1 3294; GFX9-NEXT: v_add_f32_e32 v2, s4, v2 3295; GFX9-NEXT: v_max_f32_e64 v1, v1, v2 clamp 3296; GFX9-NEXT: global_store_dword v0, v1, s[0:1] offset:12 3297; GFX9-NEXT: s_endpgm 3298; 3299; GFX11-LABEL: v_clamp_diff_source_f32: 3300; GFX11: ; %bb.0: 3301; GFX11-NEXT: s_load_b128 s[0:3], s[0:1], 0x24 3302; GFX11-NEXT: v_mov_b32_e32 v2, 0 3303; GFX11-NEXT: s_waitcnt lgkmcnt(0) 3304; GFX11-NEXT: s_clause 0x1 3305; GFX11-NEXT: s_load_b64 s[4:5], s[2:3], 0x0 3306; GFX11-NEXT: s_load_b32 s2, s[2:3], 0x8 3307; GFX11-NEXT: s_waitcnt lgkmcnt(0) 3308; GFX11-NEXT: v_add_f32_e64 v0, s4, s5 3309; GFX11-NEXT: v_add_f32_e64 v1, s4, s2 3310; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) 3311; GFX11-NEXT: v_max_f32_e64 v0, v0, v1 clamp 3312; GFX11-NEXT: global_store_b32 v2, v0, s[0:1] offset:12 3313; GFX11-NEXT: s_endpgm 3314{ 3315 %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 0 3316 %gep1 = getelementptr float, float addrspace(1)* %aptr, i32 1 3317 %gep2 = getelementptr float, float addrspace(1)* %aptr, i32 2 3318 %l0 = load float, float addrspace(1)* %gep0 3319 %l1 = load float, float addrspace(1)* %gep1 3320 %l2 = load float, float addrspace(1)* %gep2 3321 %a = fadd nsz float %l0, %l1 3322 %b = fadd nsz float %l0, %l2 3323 %res = call nsz float @llvm.maxnum.f32(float %a, float %b) 3324 %max = call nsz float @llvm.maxnum.f32(float %res, float 0.0) 3325 %min = call nsz float @llvm.minnum.f32(float %max, float 1.0) 3326 %out.gep = getelementptr float, float addrspace(1)* %out, i32 3 3327 store float %min, float addrspace(1)* %out.gep 3328 ret void 3329} 3330 3331declare i32 @llvm.amdgcn.workitem.id.x() #1 3332declare float @llvm.fabs.f32(float) #1 3333declare float @llvm.minnum.f32(float, float) #1 3334declare float @llvm.maxnum.f32(float, float) #1 3335declare float @llvm.amdgcn.fmed3.f32(float, float, float) #1 3336declare double @llvm.fabs.f64(double) #1 3337declare double @llvm.minnum.f64(double, double) #1 3338declare double @llvm.maxnum.f64(double, double) #1 3339declare half @llvm.fabs.f16(half) #1 3340declare half @llvm.minnum.f16(half, half) #1 3341declare half @llvm.maxnum.f16(half, half) #1 3342declare <2 x half> @llvm.fabs.v2f16(<2 x half>) #1 3343declare <2 x half> @llvm.minnum.v2f16(<2 x half>, <2 x half>) #1 3344declare <2 x half> @llvm.maxnum.v2f16(<2 x half>, <2 x half>) #1 3345 3346attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" } 3347attributes #1 = { nounwind readnone } 3348attributes #2 = { nounwind "amdgpu-dx10-clamp"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" } 3349attributes #3 = { nounwind "amdgpu-dx10-clamp"="true" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" } 3350attributes #4 = { nounwind "amdgpu-dx10-clamp"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" } 3351