1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -march=amdgcn -mcpu=verde -verify-machineinstrs | FileCheck %s -check-prefix=SI 3; RUN: llc < %s -march=amdgcn -mcpu=hawaii -verify-machineinstrs | FileCheck %s -check-prefix=GFX7 4; RUN: llc < %s -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs | FileCheck %s -check-prefix=GFX10 5; RUN: llc < %s -march=amdgcn -mcpu=gfx1030 -verify-machineinstrs | FileCheck %s -check-prefix=GFX1030 6 7; RUN: llc < %s -global-isel -march=amdgcn -mcpu=verde -verify-machineinstrs | FileCheck %s -check-prefix=G_SI 8; RUN: llc < %s -global-isel -march=amdgcn -mcpu=hawaii -verify-machineinstrs | FileCheck %s -check-prefix=G_GFX7 9; RUN: llc < %s -global-isel -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs | FileCheck %s -check-prefix=G_GFX10 10; RUN: llc < %s -global-isel -march=amdgcn -mcpu=gfx1030 -verify-machineinstrs | FileCheck %s -check-prefix=G_GFX1030 11 12declare float @llvm.amdgcn.raw.buffer.atomic.fmin.f32(float, <4 x i32>, i32, i32, i32 immarg) 13declare float @llvm.amdgcn.raw.buffer.atomic.fmax.f32(float, <4 x i32>, i32, i32, i32 immarg) 14 15 16define amdgpu_kernel void @raw_buffer_atomic_min_noret_f32(<4 x i32> inreg %rsrc, float %data, i32 %vindex) { 17; SI-LABEL: raw_buffer_atomic_min_noret_f32: 18; SI: ; %bb.0: ; %main_body 19; SI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0xd 20; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 21; SI-NEXT: s_waitcnt lgkmcnt(0) 22; SI-NEXT: v_mov_b32_e32 v0, s4 23; SI-NEXT: v_mov_b32_e32 v1, s5 24; SI-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen 25; SI-NEXT: s_endpgm 26; 27; GFX7-LABEL: raw_buffer_atomic_min_noret_f32: 28; GFX7: ; %bb.0: ; %main_body 29; GFX7-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0xd 30; GFX7-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 31; GFX7-NEXT: s_waitcnt lgkmcnt(0) 32; GFX7-NEXT: v_mov_b32_e32 v0, s4 33; GFX7-NEXT: v_mov_b32_e32 v1, s5 34; GFX7-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen 35; GFX7-NEXT: s_endpgm 36; 37; GFX10-LABEL: raw_buffer_atomic_min_noret_f32: 38; GFX10: ; %bb.0: ; %main_body 39; GFX10-NEXT: s_clause 0x1 40; GFX10-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 41; GFX10-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 42; GFX10-NEXT: s_waitcnt lgkmcnt(0) 43; GFX10-NEXT: v_mov_b32_e32 v0, s2 44; GFX10-NEXT: v_mov_b32_e32 v1, s3 45; GFX10-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 0 offen 46; GFX10-NEXT: s_endpgm 47; 48; GFX1030-LABEL: raw_buffer_atomic_min_noret_f32: 49; GFX1030: ; %bb.0: ; %main_body 50; GFX1030-NEXT: s_clause 0x1 51; GFX1030-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 52; GFX1030-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 53; GFX1030-NEXT: s_waitcnt lgkmcnt(0) 54; GFX1030-NEXT: v_mov_b32_e32 v0, s4 55; GFX1030-NEXT: v_mov_b32_e32 v1, s5 56; GFX1030-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen 57; GFX1030-NEXT: s_endpgm 58; 59; G_SI-LABEL: raw_buffer_atomic_min_noret_f32: 60; G_SI: ; %bb.0: ; %main_body 61; G_SI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0xd 62; G_SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 63; G_SI-NEXT: s_waitcnt lgkmcnt(0) 64; G_SI-NEXT: v_mov_b32_e32 v0, s4 65; G_SI-NEXT: v_mov_b32_e32 v1, s5 66; G_SI-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 67; G_SI-NEXT: s_endpgm 68; 69; G_GFX7-LABEL: raw_buffer_atomic_min_noret_f32: 70; G_GFX7: ; %bb.0: ; %main_body 71; G_GFX7-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0xd 72; G_GFX7-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 73; G_GFX7-NEXT: s_waitcnt lgkmcnt(0) 74; G_GFX7-NEXT: v_mov_b32_e32 v0, s4 75; G_GFX7-NEXT: v_mov_b32_e32 v1, s5 76; G_GFX7-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 77; G_GFX7-NEXT: s_endpgm 78; 79; G_GFX10-LABEL: raw_buffer_atomic_min_noret_f32: 80; G_GFX10: ; %bb.0: ; %main_body 81; G_GFX10-NEXT: s_clause 0x1 82; G_GFX10-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 83; G_GFX10-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 84; G_GFX10-NEXT: s_waitcnt lgkmcnt(0) 85; G_GFX10-NEXT: v_mov_b32_e32 v0, s2 86; G_GFX10-NEXT: v_mov_b32_e32 v1, s3 87; G_GFX10-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 0 offen glc 88; G_GFX10-NEXT: s_endpgm 89; 90; G_GFX1030-LABEL: raw_buffer_atomic_min_noret_f32: 91; G_GFX1030: ; %bb.0: ; %main_body 92; G_GFX1030-NEXT: s_clause 0x1 93; G_GFX1030-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 94; G_GFX1030-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 95; G_GFX1030-NEXT: s_waitcnt lgkmcnt(0) 96; G_GFX1030-NEXT: v_mov_b32_e32 v0, s4 97; G_GFX1030-NEXT: v_mov_b32_e32 v1, s5 98; G_GFX1030-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 99; G_GFX1030-NEXT: s_endpgm 100main_body: 101 %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmin.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0) 102 ret void 103} 104 105define amdgpu_ps void @raw_buffer_atomic_min_rtn_f32(<4 x i32> inreg %rsrc, float %data, i32 %vindex) { 106; SI-LABEL: raw_buffer_atomic_min_rtn_f32: 107; SI: ; %bb.0: ; %main_body 108; SI-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 109; SI-NEXT: s_mov_b32 s3, 0xf000 110; SI-NEXT: s_mov_b32 s2, -1 111; SI-NEXT: s_waitcnt vmcnt(0) 112; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 113; SI-NEXT: s_endpgm 114; 115; GFX7-LABEL: raw_buffer_atomic_min_rtn_f32: 116; GFX7: ; %bb.0: ; %main_body 117; GFX7-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 118; GFX7-NEXT: s_mov_b32 s3, 0xf000 119; GFX7-NEXT: s_mov_b32 s2, -1 120; GFX7-NEXT: s_waitcnt vmcnt(0) 121; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 122; GFX7-NEXT: s_endpgm 123; 124; GFX10-LABEL: raw_buffer_atomic_min_rtn_f32: 125; GFX10: ; %bb.0: ; %main_body 126; GFX10-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 127; GFX10-NEXT: s_waitcnt vmcnt(0) 128; GFX10-NEXT: global_store_dword v[0:1], v0, off 129; GFX10-NEXT: s_endpgm 130; 131; GFX1030-LABEL: raw_buffer_atomic_min_rtn_f32: 132; GFX1030: ; %bb.0: ; %main_body 133; GFX1030-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 134; GFX1030-NEXT: s_waitcnt vmcnt(0) 135; GFX1030-NEXT: global_store_dword v[0:1], v0, off 136; GFX1030-NEXT: s_endpgm 137; 138; G_SI-LABEL: raw_buffer_atomic_min_rtn_f32: 139; G_SI: ; %bb.0: ; %main_body 140; G_SI-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 141; G_SI-NEXT: s_mov_b32 s2, -1 142; G_SI-NEXT: s_mov_b32 s3, 0xf000 143; G_SI-NEXT: s_waitcnt vmcnt(0) 144; G_SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 145; G_SI-NEXT: s_endpgm 146; 147; G_GFX7-LABEL: raw_buffer_atomic_min_rtn_f32: 148; G_GFX7: ; %bb.0: ; %main_body 149; G_GFX7-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 150; G_GFX7-NEXT: s_mov_b32 s2, -1 151; G_GFX7-NEXT: s_mov_b32 s3, 0xf000 152; G_GFX7-NEXT: s_waitcnt vmcnt(0) 153; G_GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 154; G_GFX7-NEXT: s_endpgm 155; 156; G_GFX10-LABEL: raw_buffer_atomic_min_rtn_f32: 157; G_GFX10: ; %bb.0: ; %main_body 158; G_GFX10-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 159; G_GFX10-NEXT: s_waitcnt vmcnt(0) 160; G_GFX10-NEXT: global_store_dword v[0:1], v0, off 161; G_GFX10-NEXT: s_endpgm 162; 163; G_GFX1030-LABEL: raw_buffer_atomic_min_rtn_f32: 164; G_GFX1030: ; %bb.0: ; %main_body 165; G_GFX1030-NEXT: buffer_atomic_fmin v0, v1, s[0:3], 0 offen glc 166; G_GFX1030-NEXT: s_waitcnt vmcnt(0) 167; G_GFX1030-NEXT: global_store_dword v[0:1], v0, off 168; G_GFX1030-NEXT: s_endpgm 169main_body: 170 %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmin.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0) 171 store float %ret, float addrspace(1)* undef 172 ret void 173} 174 175define amdgpu_kernel void @raw_buffer_atomic_min_rtn_f32_off4_slc(<4 x i32> inreg %rsrc, float %data, i32 %vindex, float addrspace(3)* %out) { 176; SI-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 177; SI: ; %bb.0: ; %main_body 178; SI-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0xd 179; SI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 180; SI-NEXT: s_load_dword s0, s[0:1], 0xf 181; SI-NEXT: s_mov_b32 m0, -1 182; SI-NEXT: s_waitcnt lgkmcnt(0) 183; SI-NEXT: v_mov_b32_e32 v0, s2 184; SI-NEXT: v_mov_b32_e32 v1, s3 185; SI-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc 186; SI-NEXT: v_mov_b32_e32 v1, s0 187; SI-NEXT: s_waitcnt vmcnt(0) 188; SI-NEXT: ds_write_b32 v1, v0 189; SI-NEXT: s_endpgm 190; 191; GFX7-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 192; GFX7: ; %bb.0: ; %main_body 193; GFX7-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0xd 194; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 195; GFX7-NEXT: s_load_dword s0, s[0:1], 0xf 196; GFX7-NEXT: s_mov_b32 m0, -1 197; GFX7-NEXT: s_waitcnt lgkmcnt(0) 198; GFX7-NEXT: v_mov_b32_e32 v0, s2 199; GFX7-NEXT: v_mov_b32_e32 v1, s3 200; GFX7-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc 201; GFX7-NEXT: v_mov_b32_e32 v1, s0 202; GFX7-NEXT: s_waitcnt vmcnt(0) 203; GFX7-NEXT: ds_write_b32 v1, v0 204; GFX7-NEXT: s_endpgm 205; 206; GFX10-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 207; GFX10: ; %bb.0: ; %main_body 208; GFX10-NEXT: s_clause 0x1 209; GFX10-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 210; GFX10-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 211; GFX10-NEXT: s_waitcnt lgkmcnt(0) 212; GFX10-NEXT: v_mov_b32_e32 v0, s2 213; GFX10-NEXT: v_mov_b32_e32 v1, s3 214; GFX10-NEXT: s_load_dword s0, s[0:1], 0x3c 215; GFX10-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc 216; GFX10-NEXT: s_waitcnt lgkmcnt(0) 217; GFX10-NEXT: v_mov_b32_e32 v1, s0 218; GFX10-NEXT: s_waitcnt vmcnt(0) 219; GFX10-NEXT: ds_write_b32 v1, v0 220; GFX10-NEXT: s_endpgm 221; 222; GFX1030-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 223; GFX1030: ; %bb.0: ; %main_body 224; GFX1030-NEXT: s_clause 0x2 225; GFX1030-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 226; GFX1030-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 227; GFX1030-NEXT: s_load_dword s0, s[0:1], 0x3c 228; GFX1030-NEXT: s_waitcnt lgkmcnt(0) 229; GFX1030-NEXT: v_mov_b32_e32 v0, s2 230; GFX1030-NEXT: v_mov_b32_e32 v1, s3 231; GFX1030-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc 232; GFX1030-NEXT: v_mov_b32_e32 v1, s0 233; GFX1030-NEXT: s_waitcnt vmcnt(0) 234; GFX1030-NEXT: ds_write_b32 v1, v0 235; GFX1030-NEXT: s_endpgm 236; 237; G_SI-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 238; G_SI: ; %bb.0: ; %main_body 239; G_SI-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0xd 240; G_SI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 241; G_SI-NEXT: s_load_dword s0, s[0:1], 0xf 242; G_SI-NEXT: s_mov_b32 m0, -1 243; G_SI-NEXT: s_waitcnt lgkmcnt(0) 244; G_SI-NEXT: v_mov_b32_e32 v0, s2 245; G_SI-NEXT: v_mov_b32_e32 v1, s3 246; G_SI-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc 247; G_SI-NEXT: v_mov_b32_e32 v1, s0 248; G_SI-NEXT: s_waitcnt vmcnt(0) 249; G_SI-NEXT: ds_write_b32 v1, v0 250; G_SI-NEXT: s_endpgm 251; 252; G_GFX7-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 253; G_GFX7: ; %bb.0: ; %main_body 254; G_GFX7-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0xd 255; G_GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 256; G_GFX7-NEXT: s_load_dword s0, s[0:1], 0xf 257; G_GFX7-NEXT: s_mov_b32 m0, -1 258; G_GFX7-NEXT: s_waitcnt lgkmcnt(0) 259; G_GFX7-NEXT: v_mov_b32_e32 v0, s2 260; G_GFX7-NEXT: v_mov_b32_e32 v1, s3 261; G_GFX7-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc 262; G_GFX7-NEXT: v_mov_b32_e32 v1, s0 263; G_GFX7-NEXT: s_waitcnt vmcnt(0) 264; G_GFX7-NEXT: ds_write_b32 v1, v0 265; G_GFX7-NEXT: s_endpgm 266; 267; G_GFX10-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 268; G_GFX10: ; %bb.0: ; %main_body 269; G_GFX10-NEXT: s_clause 0x1 270; G_GFX10-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 271; G_GFX10-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 272; G_GFX10-NEXT: s_waitcnt lgkmcnt(0) 273; G_GFX10-NEXT: v_mov_b32_e32 v0, s2 274; G_GFX10-NEXT: v_mov_b32_e32 v1, s3 275; G_GFX10-NEXT: s_load_dword s0, s[0:1], 0x3c 276; G_GFX10-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc 277; G_GFX10-NEXT: s_waitcnt lgkmcnt(0) 278; G_GFX10-NEXT: v_mov_b32_e32 v1, s0 279; G_GFX10-NEXT: s_waitcnt vmcnt(0) 280; G_GFX10-NEXT: ds_write_b32 v1, v0 281; G_GFX10-NEXT: s_endpgm 282; 283; G_GFX1030-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 284; G_GFX1030: ; %bb.0: ; %main_body 285; G_GFX1030-NEXT: s_clause 0x2 286; G_GFX1030-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 287; G_GFX1030-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 288; G_GFX1030-NEXT: s_load_dword s0, s[0:1], 0x3c 289; G_GFX1030-NEXT: s_waitcnt lgkmcnt(0) 290; G_GFX1030-NEXT: v_mov_b32_e32 v0, s2 291; G_GFX1030-NEXT: v_mov_b32_e32 v1, s3 292; G_GFX1030-NEXT: buffer_atomic_fmin v0, v1, s[4:7], 4 offen glc slc 293; G_GFX1030-NEXT: v_mov_b32_e32 v1, s0 294; G_GFX1030-NEXT: s_waitcnt vmcnt(0) 295; G_GFX1030-NEXT: ds_write_b32 v1, v0 296; G_GFX1030-NEXT: s_endpgm 297; GFX1010-LABEL: raw_buffer_atomic_min_rtn_f32_off4_slc: 298main_body: 299 %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmin.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2) 300 store float %ret, float addrspace(3)* %out, align 8 301 ret void 302} 303 304define amdgpu_kernel void @raw_buffer_atomic_max_noret_f32(<4 x i32> inreg %rsrc, float %data, i32 %vindex) { 305; SI-LABEL: raw_buffer_atomic_max_noret_f32: 306; SI: ; %bb.0: ; %main_body 307; SI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0xd 308; SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 309; SI-NEXT: s_waitcnt lgkmcnt(0) 310; SI-NEXT: v_mov_b32_e32 v0, s4 311; SI-NEXT: v_mov_b32_e32 v1, s5 312; SI-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen 313; SI-NEXT: s_endpgm 314; 315; GFX7-LABEL: raw_buffer_atomic_max_noret_f32: 316; GFX7: ; %bb.0: ; %main_body 317; GFX7-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0xd 318; GFX7-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 319; GFX7-NEXT: s_waitcnt lgkmcnt(0) 320; GFX7-NEXT: v_mov_b32_e32 v0, s4 321; GFX7-NEXT: v_mov_b32_e32 v1, s5 322; GFX7-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen 323; GFX7-NEXT: s_endpgm 324; 325; GFX10-LABEL: raw_buffer_atomic_max_noret_f32: 326; GFX10: ; %bb.0: ; %main_body 327; GFX10-NEXT: s_clause 0x1 328; GFX10-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 329; GFX10-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 330; GFX10-NEXT: s_waitcnt lgkmcnt(0) 331; GFX10-NEXT: v_mov_b32_e32 v0, s2 332; GFX10-NEXT: v_mov_b32_e32 v1, s3 333; GFX10-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 0 offen 334; GFX10-NEXT: s_endpgm 335; 336; GFX1030-LABEL: raw_buffer_atomic_max_noret_f32: 337; GFX1030: ; %bb.0: ; %main_body 338; GFX1030-NEXT: s_clause 0x1 339; GFX1030-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 340; GFX1030-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 341; GFX1030-NEXT: s_waitcnt lgkmcnt(0) 342; GFX1030-NEXT: v_mov_b32_e32 v0, s4 343; GFX1030-NEXT: v_mov_b32_e32 v1, s5 344; GFX1030-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen 345; GFX1030-NEXT: s_endpgm 346; 347; G_SI-LABEL: raw_buffer_atomic_max_noret_f32: 348; G_SI: ; %bb.0: ; %main_body 349; G_SI-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0xd 350; G_SI-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 351; G_SI-NEXT: s_waitcnt lgkmcnt(0) 352; G_SI-NEXT: v_mov_b32_e32 v0, s4 353; G_SI-NEXT: v_mov_b32_e32 v1, s5 354; G_SI-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 355; G_SI-NEXT: s_endpgm 356; 357; G_GFX7-LABEL: raw_buffer_atomic_max_noret_f32: 358; G_GFX7: ; %bb.0: ; %main_body 359; G_GFX7-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0xd 360; G_GFX7-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x9 361; G_GFX7-NEXT: s_waitcnt lgkmcnt(0) 362; G_GFX7-NEXT: v_mov_b32_e32 v0, s4 363; G_GFX7-NEXT: v_mov_b32_e32 v1, s5 364; G_GFX7-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 365; G_GFX7-NEXT: s_endpgm 366; 367; G_GFX10-LABEL: raw_buffer_atomic_max_noret_f32: 368; G_GFX10: ; %bb.0: ; %main_body 369; G_GFX10-NEXT: s_clause 0x1 370; G_GFX10-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 371; G_GFX10-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 372; G_GFX10-NEXT: s_waitcnt lgkmcnt(0) 373; G_GFX10-NEXT: v_mov_b32_e32 v0, s2 374; G_GFX10-NEXT: v_mov_b32_e32 v1, s3 375; G_GFX10-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 0 offen glc 376; G_GFX10-NEXT: s_endpgm 377; 378; G_GFX1030-LABEL: raw_buffer_atomic_max_noret_f32: 379; G_GFX1030: ; %bb.0: ; %main_body 380; G_GFX1030-NEXT: s_clause 0x1 381; G_GFX1030-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x34 382; G_GFX1030-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x24 383; G_GFX1030-NEXT: s_waitcnt lgkmcnt(0) 384; G_GFX1030-NEXT: v_mov_b32_e32 v0, s4 385; G_GFX1030-NEXT: v_mov_b32_e32 v1, s5 386; G_GFX1030-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 387; G_GFX1030-NEXT: s_endpgm 388main_body: 389 %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmax.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0) 390 ret void 391} 392 393define amdgpu_ps void @raw_buffer_atomic_max_rtn_f32(<4 x i32> inreg %rsrc, float %data, i32 %vindex) { 394; SI-LABEL: raw_buffer_atomic_max_rtn_f32: 395; SI: ; %bb.0: ; %main_body 396; SI-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 397; SI-NEXT: s_mov_b32 s3, 0xf000 398; SI-NEXT: s_mov_b32 s2, -1 399; SI-NEXT: s_waitcnt vmcnt(0) 400; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 401; SI-NEXT: s_endpgm 402; 403; GFX7-LABEL: raw_buffer_atomic_max_rtn_f32: 404; GFX7: ; %bb.0: ; %main_body 405; GFX7-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 406; GFX7-NEXT: s_mov_b32 s3, 0xf000 407; GFX7-NEXT: s_mov_b32 s2, -1 408; GFX7-NEXT: s_waitcnt vmcnt(0) 409; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 410; GFX7-NEXT: s_endpgm 411; 412; GFX10-LABEL: raw_buffer_atomic_max_rtn_f32: 413; GFX10: ; %bb.0: ; %main_body 414; GFX10-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 415; GFX10-NEXT: s_waitcnt vmcnt(0) 416; GFX10-NEXT: global_store_dword v[0:1], v0, off 417; GFX10-NEXT: s_endpgm 418; 419; GFX1030-LABEL: raw_buffer_atomic_max_rtn_f32: 420; GFX1030: ; %bb.0: ; %main_body 421; GFX1030-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 422; GFX1030-NEXT: s_waitcnt vmcnt(0) 423; GFX1030-NEXT: global_store_dword v[0:1], v0, off 424; GFX1030-NEXT: s_endpgm 425; 426; G_SI-LABEL: raw_buffer_atomic_max_rtn_f32: 427; G_SI: ; %bb.0: ; %main_body 428; G_SI-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 429; G_SI-NEXT: s_mov_b32 s2, -1 430; G_SI-NEXT: s_mov_b32 s3, 0xf000 431; G_SI-NEXT: s_waitcnt vmcnt(0) 432; G_SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 433; G_SI-NEXT: s_endpgm 434; 435; G_GFX7-LABEL: raw_buffer_atomic_max_rtn_f32: 436; G_GFX7: ; %bb.0: ; %main_body 437; G_GFX7-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 438; G_GFX7-NEXT: s_mov_b32 s2, -1 439; G_GFX7-NEXT: s_mov_b32 s3, 0xf000 440; G_GFX7-NEXT: s_waitcnt vmcnt(0) 441; G_GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 442; G_GFX7-NEXT: s_endpgm 443; 444; G_GFX10-LABEL: raw_buffer_atomic_max_rtn_f32: 445; G_GFX10: ; %bb.0: ; %main_body 446; G_GFX10-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 447; G_GFX10-NEXT: s_waitcnt vmcnt(0) 448; G_GFX10-NEXT: global_store_dword v[0:1], v0, off 449; G_GFX10-NEXT: s_endpgm 450; 451; G_GFX1030-LABEL: raw_buffer_atomic_max_rtn_f32: 452; G_GFX1030: ; %bb.0: ; %main_body 453; G_GFX1030-NEXT: buffer_atomic_fmax v0, v1, s[0:3], 0 offen glc 454; G_GFX1030-NEXT: s_waitcnt vmcnt(0) 455; G_GFX1030-NEXT: global_store_dword v[0:1], v0, off 456; G_GFX1030-NEXT: s_endpgm 457main_body: 458 %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmax.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 0, i32 0) 459 store float %ret, float addrspace(1)* undef 460 ret void 461} 462 463define amdgpu_kernel void @raw_buffer_atomic_max_rtn_f32_off4_slc(<4 x i32> inreg %rsrc, float %data, i32 %vindex, float addrspace(1)* %out) { 464; SI-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc: 465; SI: ; %bb.0: ; %main_body 466; SI-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0xd 467; SI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 468; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xf 469; SI-NEXT: s_waitcnt lgkmcnt(0) 470; SI-NEXT: v_mov_b32_e32 v0, s2 471; SI-NEXT: v_mov_b32_e32 v1, s3 472; SI-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc 473; SI-NEXT: s_mov_b32 s3, 0xf000 474; SI-NEXT: s_mov_b32 s2, -1 475; SI-NEXT: s_waitcnt vmcnt(0) 476; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 477; SI-NEXT: s_endpgm 478; 479; GFX7-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc: 480; GFX7: ; %bb.0: ; %main_body 481; GFX7-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0xd 482; GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 483; GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xf 484; GFX7-NEXT: s_waitcnt lgkmcnt(0) 485; GFX7-NEXT: v_mov_b32_e32 v0, s2 486; GFX7-NEXT: v_mov_b32_e32 v1, s3 487; GFX7-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc 488; GFX7-NEXT: s_mov_b32 s3, 0xf000 489; GFX7-NEXT: s_mov_b32 s2, -1 490; GFX7-NEXT: s_waitcnt vmcnt(0) 491; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 492; GFX7-NEXT: s_endpgm 493; 494; GFX10-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc: 495; GFX10: ; %bb.0: ; %main_body 496; GFX10-NEXT: s_clause 0x1 497; GFX10-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 498; GFX10-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 499; GFX10-NEXT: s_waitcnt lgkmcnt(0) 500; GFX10-NEXT: v_mov_b32_e32 v0, s2 501; GFX10-NEXT: v_mov_b32_e32 v1, s3 502; GFX10-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x3c 503; GFX10-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc 504; GFX10-NEXT: v_mov_b32_e32 v1, 0 505; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 506; GFX10-NEXT: global_store_dword v1, v0, s[0:1] 507; GFX10-NEXT: s_endpgm 508; 509; GFX1030-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc: 510; GFX1030: ; %bb.0: ; %main_body 511; GFX1030-NEXT: s_clause 0x2 512; GFX1030-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 513; GFX1030-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 514; GFX1030-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x3c 515; GFX1030-NEXT: s_waitcnt lgkmcnt(0) 516; GFX1030-NEXT: v_mov_b32_e32 v0, s2 517; GFX1030-NEXT: v_mov_b32_e32 v1, s3 518; GFX1030-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc 519; GFX1030-NEXT: v_mov_b32_e32 v1, 0 520; GFX1030-NEXT: s_waitcnt vmcnt(0) 521; GFX1030-NEXT: global_store_dword v1, v0, s[0:1] 522; GFX1030-NEXT: s_endpgm 523; 524; G_SI-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc: 525; G_SI: ; %bb.0: ; %main_body 526; G_SI-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0xd 527; G_SI-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 528; G_SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xf 529; G_SI-NEXT: s_waitcnt lgkmcnt(0) 530; G_SI-NEXT: v_mov_b32_e32 v0, s2 531; G_SI-NEXT: v_mov_b32_e32 v1, s3 532; G_SI-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc 533; G_SI-NEXT: s_mov_b32 s2, -1 534; G_SI-NEXT: s_mov_b32 s3, 0xf000 535; G_SI-NEXT: s_waitcnt vmcnt(0) 536; G_SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 537; G_SI-NEXT: s_endpgm 538; 539; G_GFX7-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc: 540; G_GFX7: ; %bb.0: ; %main_body 541; G_GFX7-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0xd 542; G_GFX7-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x9 543; G_GFX7-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0xf 544; G_GFX7-NEXT: s_waitcnt lgkmcnt(0) 545; G_GFX7-NEXT: v_mov_b32_e32 v0, s2 546; G_GFX7-NEXT: v_mov_b32_e32 v1, s3 547; G_GFX7-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc 548; G_GFX7-NEXT: s_mov_b32 s2, -1 549; G_GFX7-NEXT: s_mov_b32 s3, 0xf000 550; G_GFX7-NEXT: s_waitcnt vmcnt(0) 551; G_GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0 552; G_GFX7-NEXT: s_endpgm 553; 554; G_GFX10-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc: 555; G_GFX10: ; %bb.0: ; %main_body 556; G_GFX10-NEXT: s_clause 0x1 557; G_GFX10-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 558; G_GFX10-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 559; G_GFX10-NEXT: s_waitcnt lgkmcnt(0) 560; G_GFX10-NEXT: v_mov_b32_e32 v0, s2 561; G_GFX10-NEXT: v_mov_b32_e32 v1, s3 562; G_GFX10-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x3c 563; G_GFX10-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc 564; G_GFX10-NEXT: v_mov_b32_e32 v1, 0 565; G_GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 566; G_GFX10-NEXT: global_store_dword v1, v0, s[0:1] 567; G_GFX10-NEXT: s_endpgm 568; 569; G_GFX1030-LABEL: raw_buffer_atomic_max_rtn_f32_off4_slc: 570; G_GFX1030: ; %bb.0: ; %main_body 571; G_GFX1030-NEXT: s_clause 0x2 572; G_GFX1030-NEXT: s_load_dwordx2 s[2:3], s[0:1], 0x34 573; G_GFX1030-NEXT: s_load_dwordx4 s[4:7], s[0:1], 0x24 574; G_GFX1030-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x3c 575; G_GFX1030-NEXT: s_waitcnt lgkmcnt(0) 576; G_GFX1030-NEXT: v_mov_b32_e32 v0, s2 577; G_GFX1030-NEXT: v_mov_b32_e32 v1, s3 578; G_GFX1030-NEXT: buffer_atomic_fmax v0, v1, s[4:7], 4 offen glc slc 579; G_GFX1030-NEXT: v_mov_b32_e32 v1, 0 580; G_GFX1030-NEXT: s_waitcnt vmcnt(0) 581; G_GFX1030-NEXT: global_store_dword v1, v0, s[0:1] 582; G_GFX1030-NEXT: s_endpgm 583main_body: 584 %ret = call float @llvm.amdgcn.raw.buffer.atomic.fmax.f32(float %data, <4 x i32> %rsrc, i32 %vindex, i32 4, i32 2) 585 store float %ret, float addrspace(1)* %out, align 8 586 ret void 587} 588