1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx600 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX6 %s 3; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx700 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX7 %s 4; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-WGP %s 5; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-CU %s 6; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx700 -amdgcn-skip-cache-invalidations -verify-machineinstrs < %s | FileCheck --check-prefixes=SKIP-CACHE-INV %s 7; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX90A-NOTTGSPLIT %s 8; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -mattr=+tgsplit -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX90A-TGSPLIT %s 9; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx940 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX940-NOTTGSPLIT %s 10; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx940 -mattr=+tgsplit -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX940-TGSPLIT %s 11 12define amdgpu_kernel void @local_singlethread_unordered_load( 13; GFX6-LABEL: local_singlethread_unordered_load: 14; GFX6: ; %bb.0: ; %entry 15; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 16; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 17; GFX6-NEXT: s_mov_b32 m0, -1 18; GFX6-NEXT: s_waitcnt lgkmcnt(0) 19; GFX6-NEXT: v_mov_b32_e32 v0, s0 20; GFX6-NEXT: ds_read_b32 v0, v0 21; GFX6-NEXT: v_mov_b32_e32 v1, s1 22; GFX6-NEXT: s_waitcnt lgkmcnt(0) 23; GFX6-NEXT: ds_write_b32 v1, v0 24; GFX6-NEXT: s_endpgm 25; 26; GFX7-LABEL: local_singlethread_unordered_load: 27; GFX7: ; %bb.0: ; %entry 28; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 29; GFX7-NEXT: s_mov_b32 m0, -1 30; GFX7-NEXT: s_waitcnt lgkmcnt(0) 31; GFX7-NEXT: v_mov_b32_e32 v0, s0 32; GFX7-NEXT: ds_read_b32 v0, v0 33; GFX7-NEXT: v_mov_b32_e32 v1, s1 34; GFX7-NEXT: s_waitcnt lgkmcnt(0) 35; GFX7-NEXT: ds_write_b32 v1, v0 36; GFX7-NEXT: s_endpgm 37; 38; GFX10-WGP-LABEL: local_singlethread_unordered_load: 39; GFX10-WGP: ; %bb.0: ; %entry 40; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 41; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 42; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 43; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 44; GFX10-WGP-NEXT: ds_read_b32 v0, v0 45; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 46; GFX10-WGP-NEXT: ds_write_b32 v1, v0 47; GFX10-WGP-NEXT: s_endpgm 48; 49; GFX10-CU-LABEL: local_singlethread_unordered_load: 50; GFX10-CU: ; %bb.0: ; %entry 51; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 52; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 53; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 54; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 55; GFX10-CU-NEXT: ds_read_b32 v0, v0 56; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 57; GFX10-CU-NEXT: ds_write_b32 v1, v0 58; GFX10-CU-NEXT: s_endpgm 59; 60; SKIP-CACHE-INV-LABEL: local_singlethread_unordered_load: 61; SKIP-CACHE-INV: ; %bb.0: ; %entry 62; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 63; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 64; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 65; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 66; SKIP-CACHE-INV-NEXT: ds_read_b32 v0, v0 67; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 68; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 69; SKIP-CACHE-INV-NEXT: ds_write_b32 v1, v0 70; SKIP-CACHE-INV-NEXT: s_endpgm 71; 72; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_unordered_load: 73; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 74; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 75; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 76; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 77; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 78; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 79; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 80; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 81; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 82; 83; GFX90A-TGSPLIT-LABEL: local_singlethread_unordered_load: 84; GFX90A-TGSPLIT: ; %bb.0: ; %entry 85; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 86; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 87; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 88; GFX90A-TGSPLIT-NEXT: ds_read_b32 v0, v0 89; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 90; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 91; GFX90A-TGSPLIT-NEXT: ds_write_b32 v1, v0 92; GFX90A-TGSPLIT-NEXT: s_endpgm 93; 94; GFX940-NOTTGSPLIT-LABEL: local_singlethread_unordered_load: 95; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 96; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 97; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 98; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 99; GFX940-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 100; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 101; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 102; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 103; GFX940-NOTTGSPLIT-NEXT: s_endpgm 104; 105; GFX940-TGSPLIT-LABEL: local_singlethread_unordered_load: 106; GFX940-TGSPLIT: ; %bb.0: ; %entry 107; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 108; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 109; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 110; GFX940-TGSPLIT-NEXT: ds_read_b32 v0, v0 111; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 112; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 113; GFX940-TGSPLIT-NEXT: ds_write_b32 v1, v0 114; GFX940-TGSPLIT-NEXT: s_endpgm 115 i32 addrspace(3)* %in, i32 addrspace(3)* %out) { 116entry: 117 %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread") unordered, align 4 118 store i32 %val, i32 addrspace(3)* %out 119 ret void 120} 121 122define amdgpu_kernel void @local_singlethread_monotonic_load( 123; GFX6-LABEL: local_singlethread_monotonic_load: 124; GFX6: ; %bb.0: ; %entry 125; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 126; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 127; GFX6-NEXT: s_mov_b32 m0, -1 128; GFX6-NEXT: s_waitcnt lgkmcnt(0) 129; GFX6-NEXT: v_mov_b32_e32 v0, s0 130; GFX6-NEXT: ds_read_b32 v0, v0 131; GFX6-NEXT: v_mov_b32_e32 v1, s1 132; GFX6-NEXT: s_waitcnt lgkmcnt(0) 133; GFX6-NEXT: ds_write_b32 v1, v0 134; GFX6-NEXT: s_endpgm 135; 136; GFX7-LABEL: local_singlethread_monotonic_load: 137; GFX7: ; %bb.0: ; %entry 138; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 139; GFX7-NEXT: s_mov_b32 m0, -1 140; GFX7-NEXT: s_waitcnt lgkmcnt(0) 141; GFX7-NEXT: v_mov_b32_e32 v0, s0 142; GFX7-NEXT: ds_read_b32 v0, v0 143; GFX7-NEXT: v_mov_b32_e32 v1, s1 144; GFX7-NEXT: s_waitcnt lgkmcnt(0) 145; GFX7-NEXT: ds_write_b32 v1, v0 146; GFX7-NEXT: s_endpgm 147; 148; GFX10-WGP-LABEL: local_singlethread_monotonic_load: 149; GFX10-WGP: ; %bb.0: ; %entry 150; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 151; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 152; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 153; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 154; GFX10-WGP-NEXT: ds_read_b32 v0, v0 155; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 156; GFX10-WGP-NEXT: ds_write_b32 v1, v0 157; GFX10-WGP-NEXT: s_endpgm 158; 159; GFX10-CU-LABEL: local_singlethread_monotonic_load: 160; GFX10-CU: ; %bb.0: ; %entry 161; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 162; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 163; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 164; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 165; GFX10-CU-NEXT: ds_read_b32 v0, v0 166; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 167; GFX10-CU-NEXT: ds_write_b32 v1, v0 168; GFX10-CU-NEXT: s_endpgm 169; 170; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_load: 171; SKIP-CACHE-INV: ; %bb.0: ; %entry 172; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 173; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 174; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 175; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 176; SKIP-CACHE-INV-NEXT: ds_read_b32 v0, v0 177; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 178; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 179; SKIP-CACHE-INV-NEXT: ds_write_b32 v1, v0 180; SKIP-CACHE-INV-NEXT: s_endpgm 181; 182; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_load: 183; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 184; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 185; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 186; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 187; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 188; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 189; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 190; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 191; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 192; 193; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_load: 194; GFX90A-TGSPLIT: ; %bb.0: ; %entry 195; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 196; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 197; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 198; GFX90A-TGSPLIT-NEXT: ds_read_b32 v0, v0 199; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 200; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 201; GFX90A-TGSPLIT-NEXT: ds_write_b32 v1, v0 202; GFX90A-TGSPLIT-NEXT: s_endpgm 203; 204; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_load: 205; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 206; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 207; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 208; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 209; GFX940-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 210; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 211; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 212; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 213; GFX940-NOTTGSPLIT-NEXT: s_endpgm 214; 215; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_load: 216; GFX940-TGSPLIT: ; %bb.0: ; %entry 217; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 218; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 219; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 220; GFX940-TGSPLIT-NEXT: ds_read_b32 v0, v0 221; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 222; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 223; GFX940-TGSPLIT-NEXT: ds_write_b32 v1, v0 224; GFX940-TGSPLIT-NEXT: s_endpgm 225 i32 addrspace(3)* %in, i32 addrspace(3)* %out) { 226entry: 227 %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread") monotonic, align 4 228 store i32 %val, i32 addrspace(3)* %out 229 ret void 230} 231 232define amdgpu_kernel void @local_singlethread_acquire_load( 233; GFX6-LABEL: local_singlethread_acquire_load: 234; GFX6: ; %bb.0: ; %entry 235; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 236; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 237; GFX6-NEXT: s_mov_b32 m0, -1 238; GFX6-NEXT: s_waitcnt lgkmcnt(0) 239; GFX6-NEXT: v_mov_b32_e32 v0, s0 240; GFX6-NEXT: ds_read_b32 v0, v0 241; GFX6-NEXT: v_mov_b32_e32 v1, s1 242; GFX6-NEXT: s_waitcnt lgkmcnt(0) 243; GFX6-NEXT: ds_write_b32 v1, v0 244; GFX6-NEXT: s_endpgm 245; 246; GFX7-LABEL: local_singlethread_acquire_load: 247; GFX7: ; %bb.0: ; %entry 248; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 249; GFX7-NEXT: s_mov_b32 m0, -1 250; GFX7-NEXT: s_waitcnt lgkmcnt(0) 251; GFX7-NEXT: v_mov_b32_e32 v0, s0 252; GFX7-NEXT: ds_read_b32 v0, v0 253; GFX7-NEXT: v_mov_b32_e32 v1, s1 254; GFX7-NEXT: s_waitcnt lgkmcnt(0) 255; GFX7-NEXT: ds_write_b32 v1, v0 256; GFX7-NEXT: s_endpgm 257; 258; GFX10-WGP-LABEL: local_singlethread_acquire_load: 259; GFX10-WGP: ; %bb.0: ; %entry 260; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 261; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 262; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 263; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 264; GFX10-WGP-NEXT: ds_read_b32 v0, v0 265; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 266; GFX10-WGP-NEXT: ds_write_b32 v1, v0 267; GFX10-WGP-NEXT: s_endpgm 268; 269; GFX10-CU-LABEL: local_singlethread_acquire_load: 270; GFX10-CU: ; %bb.0: ; %entry 271; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 272; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 273; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 274; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 275; GFX10-CU-NEXT: ds_read_b32 v0, v0 276; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 277; GFX10-CU-NEXT: ds_write_b32 v1, v0 278; GFX10-CU-NEXT: s_endpgm 279; 280; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_load: 281; SKIP-CACHE-INV: ; %bb.0: ; %entry 282; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 283; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 284; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 285; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 286; SKIP-CACHE-INV-NEXT: ds_read_b32 v0, v0 287; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 288; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 289; SKIP-CACHE-INV-NEXT: ds_write_b32 v1, v0 290; SKIP-CACHE-INV-NEXT: s_endpgm 291; 292; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_load: 293; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 294; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 295; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 296; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 297; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 298; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 299; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 300; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 301; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 302; 303; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_load: 304; GFX90A-TGSPLIT: ; %bb.0: ; %entry 305; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 306; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 307; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 308; GFX90A-TGSPLIT-NEXT: ds_read_b32 v0, v0 309; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 310; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 311; GFX90A-TGSPLIT-NEXT: ds_write_b32 v1, v0 312; GFX90A-TGSPLIT-NEXT: s_endpgm 313; 314; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_load: 315; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 316; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 317; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 318; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 319; GFX940-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 320; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 321; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 322; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 323; GFX940-NOTTGSPLIT-NEXT: s_endpgm 324; 325; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_load: 326; GFX940-TGSPLIT: ; %bb.0: ; %entry 327; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 328; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 329; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 330; GFX940-TGSPLIT-NEXT: ds_read_b32 v0, v0 331; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 332; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 333; GFX940-TGSPLIT-NEXT: ds_write_b32 v1, v0 334; GFX940-TGSPLIT-NEXT: s_endpgm 335 i32 addrspace(3)* %in, i32 addrspace(3)* %out) { 336entry: 337 %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread") acquire, align 4 338 store i32 %val, i32 addrspace(3)* %out 339 ret void 340} 341 342define amdgpu_kernel void @local_singlethread_seq_cst_load( 343; GFX6-LABEL: local_singlethread_seq_cst_load: 344; GFX6: ; %bb.0: ; %entry 345; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 346; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 347; GFX6-NEXT: s_mov_b32 m0, -1 348; GFX6-NEXT: s_waitcnt lgkmcnt(0) 349; GFX6-NEXT: v_mov_b32_e32 v0, s0 350; GFX6-NEXT: ds_read_b32 v0, v0 351; GFX6-NEXT: v_mov_b32_e32 v1, s1 352; GFX6-NEXT: s_waitcnt lgkmcnt(0) 353; GFX6-NEXT: ds_write_b32 v1, v0 354; GFX6-NEXT: s_endpgm 355; 356; GFX7-LABEL: local_singlethread_seq_cst_load: 357; GFX7: ; %bb.0: ; %entry 358; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 359; GFX7-NEXT: s_mov_b32 m0, -1 360; GFX7-NEXT: s_waitcnt lgkmcnt(0) 361; GFX7-NEXT: v_mov_b32_e32 v0, s0 362; GFX7-NEXT: ds_read_b32 v0, v0 363; GFX7-NEXT: v_mov_b32_e32 v1, s1 364; GFX7-NEXT: s_waitcnt lgkmcnt(0) 365; GFX7-NEXT: ds_write_b32 v1, v0 366; GFX7-NEXT: s_endpgm 367; 368; GFX10-WGP-LABEL: local_singlethread_seq_cst_load: 369; GFX10-WGP: ; %bb.0: ; %entry 370; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 371; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 372; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 373; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 374; GFX10-WGP-NEXT: ds_read_b32 v0, v0 375; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 376; GFX10-WGP-NEXT: ds_write_b32 v1, v0 377; GFX10-WGP-NEXT: s_endpgm 378; 379; GFX10-CU-LABEL: local_singlethread_seq_cst_load: 380; GFX10-CU: ; %bb.0: ; %entry 381; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 382; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 383; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 384; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 385; GFX10-CU-NEXT: ds_read_b32 v0, v0 386; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 387; GFX10-CU-NEXT: ds_write_b32 v1, v0 388; GFX10-CU-NEXT: s_endpgm 389; 390; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_load: 391; SKIP-CACHE-INV: ; %bb.0: ; %entry 392; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 393; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 394; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 395; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 396; SKIP-CACHE-INV-NEXT: ds_read_b32 v0, v0 397; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 398; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 399; SKIP-CACHE-INV-NEXT: ds_write_b32 v1, v0 400; SKIP-CACHE-INV-NEXT: s_endpgm 401; 402; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_load: 403; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 404; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 405; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 406; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 407; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 408; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 409; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 410; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 411; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 412; 413; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_load: 414; GFX90A-TGSPLIT: ; %bb.0: ; %entry 415; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 416; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 417; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 418; GFX90A-TGSPLIT-NEXT: ds_read_b32 v0, v0 419; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 420; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 421; GFX90A-TGSPLIT-NEXT: ds_write_b32 v1, v0 422; GFX90A-TGSPLIT-NEXT: s_endpgm 423; 424; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_load: 425; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 426; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 427; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 428; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 429; GFX940-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 430; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 431; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 432; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 433; GFX940-NOTTGSPLIT-NEXT: s_endpgm 434; 435; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_load: 436; GFX940-TGSPLIT: ; %bb.0: ; %entry 437; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 438; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 439; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 440; GFX940-TGSPLIT-NEXT: ds_read_b32 v0, v0 441; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 442; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 443; GFX940-TGSPLIT-NEXT: ds_write_b32 v1, v0 444; GFX940-TGSPLIT-NEXT: s_endpgm 445 i32 addrspace(3)* %in, i32 addrspace(3)* %out) { 446entry: 447 %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread") seq_cst, align 4 448 store i32 %val, i32 addrspace(3)* %out 449 ret void 450} 451 452define amdgpu_kernel void @local_singlethread_unordered_store( 453; GFX6-LABEL: local_singlethread_unordered_store: 454; GFX6: ; %bb.0: ; %entry 455; GFX6-NEXT: s_load_dword s0, s[4:5], 0x1 456; GFX6-NEXT: s_load_dword s1, s[4:5], 0x0 457; GFX6-NEXT: s_mov_b32 m0, -1 458; GFX6-NEXT: s_waitcnt lgkmcnt(0) 459; GFX6-NEXT: v_mov_b32_e32 v0, s0 460; GFX6-NEXT: v_mov_b32_e32 v1, s1 461; GFX6-NEXT: ds_write_b32 v0, v1 462; GFX6-NEXT: s_endpgm 463; 464; GFX7-LABEL: local_singlethread_unordered_store: 465; GFX7: ; %bb.0: ; %entry 466; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 467; GFX7-NEXT: s_mov_b32 m0, -1 468; GFX7-NEXT: s_waitcnt lgkmcnt(0) 469; GFX7-NEXT: v_mov_b32_e32 v0, s1 470; GFX7-NEXT: v_mov_b32_e32 v1, s0 471; GFX7-NEXT: ds_write_b32 v0, v1 472; GFX7-NEXT: s_endpgm 473; 474; GFX10-WGP-LABEL: local_singlethread_unordered_store: 475; GFX10-WGP: ; %bb.0: ; %entry 476; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 477; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 478; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s1 479; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s0 480; GFX10-WGP-NEXT: ds_write_b32 v0, v1 481; GFX10-WGP-NEXT: s_endpgm 482; 483; GFX10-CU-LABEL: local_singlethread_unordered_store: 484; GFX10-CU: ; %bb.0: ; %entry 485; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 486; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 487; GFX10-CU-NEXT: v_mov_b32_e32 v0, s1 488; GFX10-CU-NEXT: v_mov_b32_e32 v1, s0 489; GFX10-CU-NEXT: ds_write_b32 v0, v1 490; GFX10-CU-NEXT: s_endpgm 491; 492; SKIP-CACHE-INV-LABEL: local_singlethread_unordered_store: 493; SKIP-CACHE-INV: ; %bb.0: ; %entry 494; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 495; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 496; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 497; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1 498; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0 499; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 500; SKIP-CACHE-INV-NEXT: s_endpgm 501; 502; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_unordered_store: 503; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 504; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 505; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 506; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 507; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 508; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 509; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 510; 511; GFX90A-TGSPLIT-LABEL: local_singlethread_unordered_store: 512; GFX90A-TGSPLIT: ; %bb.0: ; %entry 513; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 514; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 515; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 516; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 517; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 518; GFX90A-TGSPLIT-NEXT: s_endpgm 519; 520; GFX940-NOTTGSPLIT-LABEL: local_singlethread_unordered_store: 521; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 522; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 523; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 524; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 525; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 526; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 527; GFX940-NOTTGSPLIT-NEXT: s_endpgm 528; 529; GFX940-TGSPLIT-LABEL: local_singlethread_unordered_store: 530; GFX940-TGSPLIT: ; %bb.0: ; %entry 531; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 532; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 533; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 534; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 535; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 536; GFX940-TGSPLIT-NEXT: s_endpgm 537 i32 %in, i32 addrspace(3)* %out) { 538entry: 539 store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread") unordered, align 4 540 ret void 541} 542 543define amdgpu_kernel void @local_singlethread_monotonic_store( 544; GFX6-LABEL: local_singlethread_monotonic_store: 545; GFX6: ; %bb.0: ; %entry 546; GFX6-NEXT: s_load_dword s0, s[4:5], 0x1 547; GFX6-NEXT: s_load_dword s1, s[4:5], 0x0 548; GFX6-NEXT: s_mov_b32 m0, -1 549; GFX6-NEXT: s_waitcnt lgkmcnt(0) 550; GFX6-NEXT: v_mov_b32_e32 v0, s0 551; GFX6-NEXT: v_mov_b32_e32 v1, s1 552; GFX6-NEXT: ds_write_b32 v0, v1 553; GFX6-NEXT: s_endpgm 554; 555; GFX7-LABEL: local_singlethread_monotonic_store: 556; GFX7: ; %bb.0: ; %entry 557; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 558; GFX7-NEXT: s_mov_b32 m0, -1 559; GFX7-NEXT: s_waitcnt lgkmcnt(0) 560; GFX7-NEXT: v_mov_b32_e32 v0, s1 561; GFX7-NEXT: v_mov_b32_e32 v1, s0 562; GFX7-NEXT: ds_write_b32 v0, v1 563; GFX7-NEXT: s_endpgm 564; 565; GFX10-WGP-LABEL: local_singlethread_monotonic_store: 566; GFX10-WGP: ; %bb.0: ; %entry 567; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 568; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 569; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s1 570; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s0 571; GFX10-WGP-NEXT: ds_write_b32 v0, v1 572; GFX10-WGP-NEXT: s_endpgm 573; 574; GFX10-CU-LABEL: local_singlethread_monotonic_store: 575; GFX10-CU: ; %bb.0: ; %entry 576; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 577; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 578; GFX10-CU-NEXT: v_mov_b32_e32 v0, s1 579; GFX10-CU-NEXT: v_mov_b32_e32 v1, s0 580; GFX10-CU-NEXT: ds_write_b32 v0, v1 581; GFX10-CU-NEXT: s_endpgm 582; 583; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_store: 584; SKIP-CACHE-INV: ; %bb.0: ; %entry 585; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 586; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 587; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 588; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1 589; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0 590; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 591; SKIP-CACHE-INV-NEXT: s_endpgm 592; 593; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_store: 594; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 595; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 596; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 597; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 598; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 599; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 600; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 601; 602; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_store: 603; GFX90A-TGSPLIT: ; %bb.0: ; %entry 604; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 605; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 606; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 607; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 608; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 609; GFX90A-TGSPLIT-NEXT: s_endpgm 610; 611; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_store: 612; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 613; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 614; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 615; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 616; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 617; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 618; GFX940-NOTTGSPLIT-NEXT: s_endpgm 619; 620; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_store: 621; GFX940-TGSPLIT: ; %bb.0: ; %entry 622; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 623; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 624; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 625; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 626; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 627; GFX940-TGSPLIT-NEXT: s_endpgm 628 i32 %in, i32 addrspace(3)* %out) { 629entry: 630 store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread") monotonic, align 4 631 ret void 632} 633 634define amdgpu_kernel void @local_singlethread_release_store( 635; GFX6-LABEL: local_singlethread_release_store: 636; GFX6: ; %bb.0: ; %entry 637; GFX6-NEXT: s_load_dword s0, s[4:5], 0x1 638; GFX6-NEXT: s_load_dword s1, s[4:5], 0x0 639; GFX6-NEXT: s_mov_b32 m0, -1 640; GFX6-NEXT: s_waitcnt lgkmcnt(0) 641; GFX6-NEXT: v_mov_b32_e32 v0, s0 642; GFX6-NEXT: v_mov_b32_e32 v1, s1 643; GFX6-NEXT: ds_write_b32 v0, v1 644; GFX6-NEXT: s_endpgm 645; 646; GFX7-LABEL: local_singlethread_release_store: 647; GFX7: ; %bb.0: ; %entry 648; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 649; GFX7-NEXT: s_mov_b32 m0, -1 650; GFX7-NEXT: s_waitcnt lgkmcnt(0) 651; GFX7-NEXT: v_mov_b32_e32 v0, s1 652; GFX7-NEXT: v_mov_b32_e32 v1, s0 653; GFX7-NEXT: ds_write_b32 v0, v1 654; GFX7-NEXT: s_endpgm 655; 656; GFX10-WGP-LABEL: local_singlethread_release_store: 657; GFX10-WGP: ; %bb.0: ; %entry 658; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 659; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 660; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s1 661; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s0 662; GFX10-WGP-NEXT: ds_write_b32 v0, v1 663; GFX10-WGP-NEXT: s_endpgm 664; 665; GFX10-CU-LABEL: local_singlethread_release_store: 666; GFX10-CU: ; %bb.0: ; %entry 667; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 668; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 669; GFX10-CU-NEXT: v_mov_b32_e32 v0, s1 670; GFX10-CU-NEXT: v_mov_b32_e32 v1, s0 671; GFX10-CU-NEXT: ds_write_b32 v0, v1 672; GFX10-CU-NEXT: s_endpgm 673; 674; SKIP-CACHE-INV-LABEL: local_singlethread_release_store: 675; SKIP-CACHE-INV: ; %bb.0: ; %entry 676; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 677; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 678; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 679; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1 680; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0 681; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 682; SKIP-CACHE-INV-NEXT: s_endpgm 683; 684; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_store: 685; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 686; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 687; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 688; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 689; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 690; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 691; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 692; 693; GFX90A-TGSPLIT-LABEL: local_singlethread_release_store: 694; GFX90A-TGSPLIT: ; %bb.0: ; %entry 695; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 696; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 697; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 698; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 699; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 700; GFX90A-TGSPLIT-NEXT: s_endpgm 701; 702; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_store: 703; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 704; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 705; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 706; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 707; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 708; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 709; GFX940-NOTTGSPLIT-NEXT: s_endpgm 710; 711; GFX940-TGSPLIT-LABEL: local_singlethread_release_store: 712; GFX940-TGSPLIT: ; %bb.0: ; %entry 713; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 714; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 715; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 716; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 717; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 718; GFX940-TGSPLIT-NEXT: s_endpgm 719 i32 %in, i32 addrspace(3)* %out) { 720entry: 721 store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread") release, align 4 722 ret void 723} 724 725define amdgpu_kernel void @local_singlethread_seq_cst_store( 726; GFX6-LABEL: local_singlethread_seq_cst_store: 727; GFX6: ; %bb.0: ; %entry 728; GFX6-NEXT: s_load_dword s0, s[4:5], 0x1 729; GFX6-NEXT: s_load_dword s1, s[4:5], 0x0 730; GFX6-NEXT: s_mov_b32 m0, -1 731; GFX6-NEXT: s_waitcnt lgkmcnt(0) 732; GFX6-NEXT: v_mov_b32_e32 v0, s0 733; GFX6-NEXT: v_mov_b32_e32 v1, s1 734; GFX6-NEXT: ds_write_b32 v0, v1 735; GFX6-NEXT: s_endpgm 736; 737; GFX7-LABEL: local_singlethread_seq_cst_store: 738; GFX7: ; %bb.0: ; %entry 739; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 740; GFX7-NEXT: s_mov_b32 m0, -1 741; GFX7-NEXT: s_waitcnt lgkmcnt(0) 742; GFX7-NEXT: v_mov_b32_e32 v0, s1 743; GFX7-NEXT: v_mov_b32_e32 v1, s0 744; GFX7-NEXT: ds_write_b32 v0, v1 745; GFX7-NEXT: s_endpgm 746; 747; GFX10-WGP-LABEL: local_singlethread_seq_cst_store: 748; GFX10-WGP: ; %bb.0: ; %entry 749; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 750; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 751; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s1 752; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s0 753; GFX10-WGP-NEXT: ds_write_b32 v0, v1 754; GFX10-WGP-NEXT: s_endpgm 755; 756; GFX10-CU-LABEL: local_singlethread_seq_cst_store: 757; GFX10-CU: ; %bb.0: ; %entry 758; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 759; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 760; GFX10-CU-NEXT: v_mov_b32_e32 v0, s1 761; GFX10-CU-NEXT: v_mov_b32_e32 v1, s0 762; GFX10-CU-NEXT: ds_write_b32 v0, v1 763; GFX10-CU-NEXT: s_endpgm 764; 765; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_store: 766; SKIP-CACHE-INV: ; %bb.0: ; %entry 767; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 768; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 769; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 770; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1 771; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0 772; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 773; SKIP-CACHE-INV-NEXT: s_endpgm 774; 775; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_store: 776; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 777; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 778; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 779; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 780; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 781; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 782; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 783; 784; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_store: 785; GFX90A-TGSPLIT: ; %bb.0: ; %entry 786; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 787; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 788; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 789; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 790; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 791; GFX90A-TGSPLIT-NEXT: s_endpgm 792; 793; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_store: 794; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 795; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 796; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 797; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 798; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 799; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 800; GFX940-NOTTGSPLIT-NEXT: s_endpgm 801; 802; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_store: 803; GFX940-TGSPLIT: ; %bb.0: ; %entry 804; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 805; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 806; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 807; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 808; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 809; GFX940-TGSPLIT-NEXT: s_endpgm 810 i32 %in, i32 addrspace(3)* %out) { 811entry: 812 store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread") seq_cst, align 4 813 ret void 814} 815 816define amdgpu_kernel void @local_singlethread_monotonic_atomicrmw( 817; GFX6-LABEL: local_singlethread_monotonic_atomicrmw: 818; GFX6: ; %bb.0: ; %entry 819; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 820; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 821; GFX6-NEXT: s_mov_b32 m0, -1 822; GFX6-NEXT: s_waitcnt lgkmcnt(0) 823; GFX6-NEXT: v_mov_b32_e32 v0, s0 824; GFX6-NEXT: v_mov_b32_e32 v1, s1 825; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 826; GFX6-NEXT: s_endpgm 827; 828; GFX7-LABEL: local_singlethread_monotonic_atomicrmw: 829; GFX7: ; %bb.0: ; %entry 830; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 831; GFX7-NEXT: s_mov_b32 m0, -1 832; GFX7-NEXT: s_waitcnt lgkmcnt(0) 833; GFX7-NEXT: v_mov_b32_e32 v0, s0 834; GFX7-NEXT: v_mov_b32_e32 v1, s1 835; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 836; GFX7-NEXT: s_endpgm 837; 838; GFX10-WGP-LABEL: local_singlethread_monotonic_atomicrmw: 839; GFX10-WGP: ; %bb.0: ; %entry 840; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 841; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 842; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 843; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 844; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 845; GFX10-WGP-NEXT: s_endpgm 846; 847; GFX10-CU-LABEL: local_singlethread_monotonic_atomicrmw: 848; GFX10-CU: ; %bb.0: ; %entry 849; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 850; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 851; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 852; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 853; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 854; GFX10-CU-NEXT: s_endpgm 855; 856; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_atomicrmw: 857; SKIP-CACHE-INV: ; %bb.0: ; %entry 858; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 859; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 860; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 861; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 862; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 863; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 864; SKIP-CACHE-INV-NEXT: s_endpgm 865; 866; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw: 867; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 868; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 869; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 870; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 871; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 872; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 873; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 874; 875; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw: 876; GFX90A-TGSPLIT: ; %bb.0: ; %entry 877; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 878; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 879; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 880; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 881; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 882; GFX90A-TGSPLIT-NEXT: s_endpgm 883; 884; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw: 885; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 886; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 887; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 888; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 889; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 890; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 891; GFX940-NOTTGSPLIT-NEXT: s_endpgm 892; 893; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw: 894; GFX940-TGSPLIT: ; %bb.0: ; %entry 895; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 896; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 897; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 898; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 899; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 900; GFX940-TGSPLIT-NEXT: s_endpgm 901 i32 addrspace(3)* %out, i32 %in) { 902entry: 903 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") monotonic 904 ret void 905} 906 907define amdgpu_kernel void @local_singlethread_acquire_atomicrmw( 908; GFX6-LABEL: local_singlethread_acquire_atomicrmw: 909; GFX6: ; %bb.0: ; %entry 910; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 911; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 912; GFX6-NEXT: s_mov_b32 m0, -1 913; GFX6-NEXT: s_waitcnt lgkmcnt(0) 914; GFX6-NEXT: v_mov_b32_e32 v0, s0 915; GFX6-NEXT: v_mov_b32_e32 v1, s1 916; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 917; GFX6-NEXT: s_endpgm 918; 919; GFX7-LABEL: local_singlethread_acquire_atomicrmw: 920; GFX7: ; %bb.0: ; %entry 921; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 922; GFX7-NEXT: s_mov_b32 m0, -1 923; GFX7-NEXT: s_waitcnt lgkmcnt(0) 924; GFX7-NEXT: v_mov_b32_e32 v0, s0 925; GFX7-NEXT: v_mov_b32_e32 v1, s1 926; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 927; GFX7-NEXT: s_endpgm 928; 929; GFX10-WGP-LABEL: local_singlethread_acquire_atomicrmw: 930; GFX10-WGP: ; %bb.0: ; %entry 931; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 932; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 933; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 934; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 935; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 936; GFX10-WGP-NEXT: s_endpgm 937; 938; GFX10-CU-LABEL: local_singlethread_acquire_atomicrmw: 939; GFX10-CU: ; %bb.0: ; %entry 940; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 941; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 942; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 943; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 944; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 945; GFX10-CU-NEXT: s_endpgm 946; 947; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_atomicrmw: 948; SKIP-CACHE-INV: ; %bb.0: ; %entry 949; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 950; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 951; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 952; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 953; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 954; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 955; SKIP-CACHE-INV-NEXT: s_endpgm 956; 957; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_atomicrmw: 958; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 959; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 960; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 961; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 962; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 963; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 964; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 965; 966; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_atomicrmw: 967; GFX90A-TGSPLIT: ; %bb.0: ; %entry 968; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 969; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 970; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 971; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 972; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 973; GFX90A-TGSPLIT-NEXT: s_endpgm 974; 975; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_atomicrmw: 976; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 977; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 978; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 979; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 980; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 981; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 982; GFX940-NOTTGSPLIT-NEXT: s_endpgm 983; 984; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_atomicrmw: 985; GFX940-TGSPLIT: ; %bb.0: ; %entry 986; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 987; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 988; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 989; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 990; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 991; GFX940-TGSPLIT-NEXT: s_endpgm 992 i32 addrspace(3)* %out, i32 %in) { 993entry: 994 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") acquire 995 ret void 996} 997 998define amdgpu_kernel void @local_singlethread_release_atomicrmw( 999; GFX6-LABEL: local_singlethread_release_atomicrmw: 1000; GFX6: ; %bb.0: ; %entry 1001; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 1002; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 1003; GFX6-NEXT: s_mov_b32 m0, -1 1004; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1005; GFX6-NEXT: v_mov_b32_e32 v0, s0 1006; GFX6-NEXT: v_mov_b32_e32 v1, s1 1007; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1008; GFX6-NEXT: s_endpgm 1009; 1010; GFX7-LABEL: local_singlethread_release_atomicrmw: 1011; GFX7: ; %bb.0: ; %entry 1012; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1013; GFX7-NEXT: s_mov_b32 m0, -1 1014; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1015; GFX7-NEXT: v_mov_b32_e32 v0, s0 1016; GFX7-NEXT: v_mov_b32_e32 v1, s1 1017; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1018; GFX7-NEXT: s_endpgm 1019; 1020; GFX10-WGP-LABEL: local_singlethread_release_atomicrmw: 1021; GFX10-WGP: ; %bb.0: ; %entry 1022; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1023; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1024; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1025; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 1026; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1027; GFX10-WGP-NEXT: s_endpgm 1028; 1029; GFX10-CU-LABEL: local_singlethread_release_atomicrmw: 1030; GFX10-CU: ; %bb.0: ; %entry 1031; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1032; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1033; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1034; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 1035; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1036; GFX10-CU-NEXT: s_endpgm 1037; 1038; SKIP-CACHE-INV-LABEL: local_singlethread_release_atomicrmw: 1039; SKIP-CACHE-INV: ; %bb.0: ; %entry 1040; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1041; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1042; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1043; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1044; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 1045; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1046; SKIP-CACHE-INV-NEXT: s_endpgm 1047; 1048; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_atomicrmw: 1049; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1050; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1051; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1052; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1053; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1054; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1055; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1056; 1057; GFX90A-TGSPLIT-LABEL: local_singlethread_release_atomicrmw: 1058; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1059; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1060; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1061; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1062; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1063; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1064; GFX90A-TGSPLIT-NEXT: s_endpgm 1065; 1066; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_atomicrmw: 1067; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1068; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1069; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1070; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1071; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1072; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1073; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1074; 1075; GFX940-TGSPLIT-LABEL: local_singlethread_release_atomicrmw: 1076; GFX940-TGSPLIT: ; %bb.0: ; %entry 1077; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1078; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1079; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1080; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1081; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1082; GFX940-TGSPLIT-NEXT: s_endpgm 1083 i32 addrspace(3)* %out, i32 %in) { 1084entry: 1085 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") release 1086 ret void 1087} 1088 1089define amdgpu_kernel void @local_singlethread_acq_rel_atomicrmw( 1090; GFX6-LABEL: local_singlethread_acq_rel_atomicrmw: 1091; GFX6: ; %bb.0: ; %entry 1092; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 1093; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 1094; GFX6-NEXT: s_mov_b32 m0, -1 1095; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1096; GFX6-NEXT: v_mov_b32_e32 v0, s0 1097; GFX6-NEXT: v_mov_b32_e32 v1, s1 1098; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1099; GFX6-NEXT: s_endpgm 1100; 1101; GFX7-LABEL: local_singlethread_acq_rel_atomicrmw: 1102; GFX7: ; %bb.0: ; %entry 1103; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1104; GFX7-NEXT: s_mov_b32 m0, -1 1105; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1106; GFX7-NEXT: v_mov_b32_e32 v0, s0 1107; GFX7-NEXT: v_mov_b32_e32 v1, s1 1108; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1109; GFX7-NEXT: s_endpgm 1110; 1111; GFX10-WGP-LABEL: local_singlethread_acq_rel_atomicrmw: 1112; GFX10-WGP: ; %bb.0: ; %entry 1113; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1114; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1115; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1116; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 1117; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1118; GFX10-WGP-NEXT: s_endpgm 1119; 1120; GFX10-CU-LABEL: local_singlethread_acq_rel_atomicrmw: 1121; GFX10-CU: ; %bb.0: ; %entry 1122; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1123; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1124; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1125; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 1126; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1127; GFX10-CU-NEXT: s_endpgm 1128; 1129; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_atomicrmw: 1130; SKIP-CACHE-INV: ; %bb.0: ; %entry 1131; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1132; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1133; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1134; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1135; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 1136; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1137; SKIP-CACHE-INV-NEXT: s_endpgm 1138; 1139; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw: 1140; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1141; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1142; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1143; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1144; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1145; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1146; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1147; 1148; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw: 1149; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1150; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1151; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1152; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1153; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1154; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1155; GFX90A-TGSPLIT-NEXT: s_endpgm 1156; 1157; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw: 1158; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1159; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1160; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1161; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1162; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1163; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1164; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1165; 1166; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw: 1167; GFX940-TGSPLIT: ; %bb.0: ; %entry 1168; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1169; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1170; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1171; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1172; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1173; GFX940-TGSPLIT-NEXT: s_endpgm 1174 i32 addrspace(3)* %out, i32 %in) { 1175entry: 1176 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") acq_rel 1177 ret void 1178} 1179 1180define amdgpu_kernel void @local_singlethread_seq_cst_atomicrmw( 1181; GFX6-LABEL: local_singlethread_seq_cst_atomicrmw: 1182; GFX6: ; %bb.0: ; %entry 1183; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 1184; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 1185; GFX6-NEXT: s_mov_b32 m0, -1 1186; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1187; GFX6-NEXT: v_mov_b32_e32 v0, s0 1188; GFX6-NEXT: v_mov_b32_e32 v1, s1 1189; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1190; GFX6-NEXT: s_endpgm 1191; 1192; GFX7-LABEL: local_singlethread_seq_cst_atomicrmw: 1193; GFX7: ; %bb.0: ; %entry 1194; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1195; GFX7-NEXT: s_mov_b32 m0, -1 1196; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1197; GFX7-NEXT: v_mov_b32_e32 v0, s0 1198; GFX7-NEXT: v_mov_b32_e32 v1, s1 1199; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1200; GFX7-NEXT: s_endpgm 1201; 1202; GFX10-WGP-LABEL: local_singlethread_seq_cst_atomicrmw: 1203; GFX10-WGP: ; %bb.0: ; %entry 1204; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1205; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1206; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1207; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 1208; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1209; GFX10-WGP-NEXT: s_endpgm 1210; 1211; GFX10-CU-LABEL: local_singlethread_seq_cst_atomicrmw: 1212; GFX10-CU: ; %bb.0: ; %entry 1213; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1214; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1215; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1216; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 1217; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1218; GFX10-CU-NEXT: s_endpgm 1219; 1220; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_atomicrmw: 1221; SKIP-CACHE-INV: ; %bb.0: ; %entry 1222; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1223; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1224; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1225; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1226; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 1227; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1228; SKIP-CACHE-INV-NEXT: s_endpgm 1229; 1230; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw: 1231; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1232; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1233; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1234; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1235; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1236; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1237; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1238; 1239; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw: 1240; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1241; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1242; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1243; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1244; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1245; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1246; GFX90A-TGSPLIT-NEXT: s_endpgm 1247; 1248; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw: 1249; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1250; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1251; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1252; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1253; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1254; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1255; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1256; 1257; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw: 1258; GFX940-TGSPLIT: ; %bb.0: ; %entry 1259; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1260; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1261; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1262; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1263; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 1264; GFX940-TGSPLIT-NEXT: s_endpgm 1265 i32 addrspace(3)* %out, i32 %in) { 1266entry: 1267 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") seq_cst 1268 ret void 1269} 1270 1271define amdgpu_kernel void @local_singlethread_acquire_ret_atomicrmw( 1272; GFX6-LABEL: local_singlethread_acquire_ret_atomicrmw: 1273; GFX6: ; %bb.0: ; %entry 1274; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 1275; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 1276; GFX6-NEXT: s_mov_b32 m0, -1 1277; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1278; GFX6-NEXT: v_mov_b32_e32 v0, s0 1279; GFX6-NEXT: v_mov_b32_e32 v1, s1 1280; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1281; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1282; GFX6-NEXT: ds_write_b32 v0, v1 1283; GFX6-NEXT: s_endpgm 1284; 1285; GFX7-LABEL: local_singlethread_acquire_ret_atomicrmw: 1286; GFX7: ; %bb.0: ; %entry 1287; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1288; GFX7-NEXT: s_mov_b32 m0, -1 1289; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1290; GFX7-NEXT: v_mov_b32_e32 v0, s0 1291; GFX7-NEXT: v_mov_b32_e32 v1, s1 1292; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1293; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1294; GFX7-NEXT: ds_write_b32 v0, v1 1295; GFX7-NEXT: s_endpgm 1296; 1297; GFX10-WGP-LABEL: local_singlethread_acquire_ret_atomicrmw: 1298; GFX10-WGP: ; %bb.0: ; %entry 1299; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1300; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1301; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1302; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 1303; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1304; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1305; GFX10-WGP-NEXT: ds_write_b32 v0, v1 1306; GFX10-WGP-NEXT: s_endpgm 1307; 1308; GFX10-CU-LABEL: local_singlethread_acquire_ret_atomicrmw: 1309; GFX10-CU: ; %bb.0: ; %entry 1310; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1311; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1312; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1313; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 1314; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1315; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1316; GFX10-CU-NEXT: ds_write_b32 v0, v1 1317; GFX10-CU-NEXT: s_endpgm 1318; 1319; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_ret_atomicrmw: 1320; SKIP-CACHE-INV: ; %bb.0: ; %entry 1321; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1322; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1323; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1324; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1325; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 1326; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1327; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1328; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 1329; SKIP-CACHE-INV-NEXT: s_endpgm 1330; 1331; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw: 1332; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1333; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1334; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1335; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1336; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1337; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1338; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1339; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 1340; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1341; 1342; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw: 1343; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1344; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1345; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1346; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1347; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1348; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1349; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1350; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 1351; GFX90A-TGSPLIT-NEXT: s_endpgm 1352; 1353; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw: 1354; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1355; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1356; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1357; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1358; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1359; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1360; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1361; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 1362; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1363; 1364; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw: 1365; GFX940-TGSPLIT: ; %bb.0: ; %entry 1366; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1367; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1368; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1369; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1370; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1371; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1372; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 1373; GFX940-TGSPLIT-NEXT: s_endpgm 1374 i32 addrspace(3)* %out, i32 %in) { 1375entry: 1376 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") acquire 1377 store i32 %val, i32 addrspace(3)* %out, align 4 1378 ret void 1379} 1380 1381define amdgpu_kernel void @local_singlethread_acq_rel_ret_atomicrmw( 1382; GFX6-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1383; GFX6: ; %bb.0: ; %entry 1384; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 1385; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 1386; GFX6-NEXT: s_mov_b32 m0, -1 1387; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1388; GFX6-NEXT: v_mov_b32_e32 v0, s0 1389; GFX6-NEXT: v_mov_b32_e32 v1, s1 1390; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1391; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1392; GFX6-NEXT: ds_write_b32 v0, v1 1393; GFX6-NEXT: s_endpgm 1394; 1395; GFX7-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1396; GFX7: ; %bb.0: ; %entry 1397; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1398; GFX7-NEXT: s_mov_b32 m0, -1 1399; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1400; GFX7-NEXT: v_mov_b32_e32 v0, s0 1401; GFX7-NEXT: v_mov_b32_e32 v1, s1 1402; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1403; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1404; GFX7-NEXT: ds_write_b32 v0, v1 1405; GFX7-NEXT: s_endpgm 1406; 1407; GFX10-WGP-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1408; GFX10-WGP: ; %bb.0: ; %entry 1409; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1410; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1411; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1412; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 1413; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1414; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1415; GFX10-WGP-NEXT: ds_write_b32 v0, v1 1416; GFX10-WGP-NEXT: s_endpgm 1417; 1418; GFX10-CU-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1419; GFX10-CU: ; %bb.0: ; %entry 1420; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1421; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1422; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1423; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 1424; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1425; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1426; GFX10-CU-NEXT: ds_write_b32 v0, v1 1427; GFX10-CU-NEXT: s_endpgm 1428; 1429; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1430; SKIP-CACHE-INV: ; %bb.0: ; %entry 1431; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1432; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1433; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1434; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1435; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 1436; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1437; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1438; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 1439; SKIP-CACHE-INV-NEXT: s_endpgm 1440; 1441; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1442; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1443; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1444; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1445; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1446; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1447; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1448; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1449; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 1450; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1451; 1452; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1453; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1454; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1455; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1456; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1457; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1458; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1459; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1460; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 1461; GFX90A-TGSPLIT-NEXT: s_endpgm 1462; 1463; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1464; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1465; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1466; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1467; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1468; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1469; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1470; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1471; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 1472; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1473; 1474; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw: 1475; GFX940-TGSPLIT: ; %bb.0: ; %entry 1476; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1477; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1478; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1479; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1480; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1481; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1482; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 1483; GFX940-TGSPLIT-NEXT: s_endpgm 1484 i32 addrspace(3)* %out, i32 %in) { 1485entry: 1486 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") acq_rel 1487 store i32 %val, i32 addrspace(3)* %out, align 4 1488 ret void 1489} 1490 1491define amdgpu_kernel void @local_singlethread_seq_cst_ret_atomicrmw( 1492; GFX6-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1493; GFX6: ; %bb.0: ; %entry 1494; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 1495; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 1496; GFX6-NEXT: s_mov_b32 m0, -1 1497; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1498; GFX6-NEXT: v_mov_b32_e32 v0, s0 1499; GFX6-NEXT: v_mov_b32_e32 v1, s1 1500; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1501; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1502; GFX6-NEXT: ds_write_b32 v0, v1 1503; GFX6-NEXT: s_endpgm 1504; 1505; GFX7-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1506; GFX7: ; %bb.0: ; %entry 1507; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1508; GFX7-NEXT: s_mov_b32 m0, -1 1509; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1510; GFX7-NEXT: v_mov_b32_e32 v0, s0 1511; GFX7-NEXT: v_mov_b32_e32 v1, s1 1512; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1513; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1514; GFX7-NEXT: ds_write_b32 v0, v1 1515; GFX7-NEXT: s_endpgm 1516; 1517; GFX10-WGP-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1518; GFX10-WGP: ; %bb.0: ; %entry 1519; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1520; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1521; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1522; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 1523; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1524; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1525; GFX10-WGP-NEXT: ds_write_b32 v0, v1 1526; GFX10-WGP-NEXT: s_endpgm 1527; 1528; GFX10-CU-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1529; GFX10-CU: ; %bb.0: ; %entry 1530; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1531; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1532; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1533; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 1534; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1535; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1536; GFX10-CU-NEXT: ds_write_b32 v0, v1 1537; GFX10-CU-NEXT: s_endpgm 1538; 1539; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1540; SKIP-CACHE-INV: ; %bb.0: ; %entry 1541; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1542; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1543; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1544; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1545; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 1546; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1547; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1548; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 1549; SKIP-CACHE-INV-NEXT: s_endpgm 1550; 1551; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1552; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1553; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1554; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1555; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1556; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1557; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1558; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1559; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 1560; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1561; 1562; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1563; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1564; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 1565; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1566; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1567; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1568; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1569; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1570; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 1571; GFX90A-TGSPLIT-NEXT: s_endpgm 1572; 1573; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1574; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1575; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1576; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1577; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1578; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1579; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1580; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1581; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 1582; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1583; 1584; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw: 1585; GFX940-TGSPLIT: ; %bb.0: ; %entry 1586; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 1587; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1588; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1589; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 1590; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 1591; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1592; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 1593; GFX940-TGSPLIT-NEXT: s_endpgm 1594 i32 addrspace(3)* %out, i32 %in) { 1595entry: 1596 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") seq_cst 1597 store i32 %val, i32 addrspace(3)* %out, align 4 1598 ret void 1599} 1600 1601define amdgpu_kernel void @local_singlethread_monotonic_monotonic_cmpxchg( 1602; GFX6-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1603; GFX6: ; %bb.0: ; %entry 1604; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 1605; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 1606; GFX6-NEXT: s_mov_b32 m0, -1 1607; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1608; GFX6-NEXT: v_mov_b32_e32 v0, s2 1609; GFX6-NEXT: v_mov_b32_e32 v1, s1 1610; GFX6-NEXT: v_mov_b32_e32 v2, s0 1611; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1612; GFX6-NEXT: s_endpgm 1613; 1614; GFX7-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1615; GFX7: ; %bb.0: ; %entry 1616; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1617; GFX7-NEXT: s_mov_b32 m0, -1 1618; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1619; GFX7-NEXT: v_mov_b32_e32 v0, s0 1620; GFX7-NEXT: v_mov_b32_e32 v1, s2 1621; GFX7-NEXT: v_mov_b32_e32 v2, s1 1622; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1623; GFX7-NEXT: s_endpgm 1624; 1625; GFX10-WGP-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1626; GFX10-WGP: ; %bb.0: ; %entry 1627; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1628; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1629; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1630; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 1631; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 1632; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1633; GFX10-WGP-NEXT: s_endpgm 1634; 1635; GFX10-CU-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1636; GFX10-CU: ; %bb.0: ; %entry 1637; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1638; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1639; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1640; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 1641; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 1642; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1643; GFX10-CU-NEXT: s_endpgm 1644; 1645; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1646; SKIP-CACHE-INV: ; %bb.0: ; %entry 1647; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1648; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1649; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1650; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1651; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 1652; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 1653; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1654; SKIP-CACHE-INV-NEXT: s_endpgm 1655; 1656; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1657; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1658; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1659; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1660; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1661; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1662; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1663; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1664; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1665; 1666; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1667; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1668; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1669; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1670; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1671; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1672; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1673; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1674; GFX90A-TGSPLIT-NEXT: s_endpgm 1675; 1676; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1677; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1678; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1679; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1680; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1681; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1682; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1683; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1684; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1685; 1686; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg: 1687; GFX940-TGSPLIT: ; %bb.0: ; %entry 1688; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1689; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1690; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1691; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1692; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1693; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1694; GFX940-TGSPLIT-NEXT: s_endpgm 1695 i32 addrspace(3)* %out, i32 %in, i32 %old) { 1696entry: 1697 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 1698 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic monotonic 1699 ret void 1700} 1701 1702define amdgpu_kernel void @local_singlethread_acquire_monotonic_cmpxchg( 1703; GFX6-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1704; GFX6: ; %bb.0: ; %entry 1705; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 1706; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 1707; GFX6-NEXT: s_mov_b32 m0, -1 1708; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1709; GFX6-NEXT: v_mov_b32_e32 v0, s2 1710; GFX6-NEXT: v_mov_b32_e32 v1, s1 1711; GFX6-NEXT: v_mov_b32_e32 v2, s0 1712; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1713; GFX6-NEXT: s_endpgm 1714; 1715; GFX7-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1716; GFX7: ; %bb.0: ; %entry 1717; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1718; GFX7-NEXT: s_mov_b32 m0, -1 1719; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1720; GFX7-NEXT: v_mov_b32_e32 v0, s0 1721; GFX7-NEXT: v_mov_b32_e32 v1, s2 1722; GFX7-NEXT: v_mov_b32_e32 v2, s1 1723; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1724; GFX7-NEXT: s_endpgm 1725; 1726; GFX10-WGP-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1727; GFX10-WGP: ; %bb.0: ; %entry 1728; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1729; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1730; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1731; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 1732; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 1733; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1734; GFX10-WGP-NEXT: s_endpgm 1735; 1736; GFX10-CU-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1737; GFX10-CU: ; %bb.0: ; %entry 1738; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1739; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1740; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1741; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 1742; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 1743; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1744; GFX10-CU-NEXT: s_endpgm 1745; 1746; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1747; SKIP-CACHE-INV: ; %bb.0: ; %entry 1748; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1749; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1750; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1751; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1752; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 1753; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 1754; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1755; SKIP-CACHE-INV-NEXT: s_endpgm 1756; 1757; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1758; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1759; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1760; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1761; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1762; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1763; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1764; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1765; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1766; 1767; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1768; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1769; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1770; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1771; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1772; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1773; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1774; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1775; GFX90A-TGSPLIT-NEXT: s_endpgm 1776; 1777; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1778; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1779; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1780; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1781; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1782; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1783; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1784; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1785; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1786; 1787; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg: 1788; GFX940-TGSPLIT: ; %bb.0: ; %entry 1789; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1790; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1791; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1792; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1793; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1794; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1795; GFX940-TGSPLIT-NEXT: s_endpgm 1796 i32 addrspace(3)* %out, i32 %in, i32 %old) { 1797entry: 1798 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 1799 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire monotonic 1800 ret void 1801} 1802 1803define amdgpu_kernel void @local_singlethread_release_monotonic_cmpxchg( 1804; GFX6-LABEL: local_singlethread_release_monotonic_cmpxchg: 1805; GFX6: ; %bb.0: ; %entry 1806; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 1807; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 1808; GFX6-NEXT: s_mov_b32 m0, -1 1809; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1810; GFX6-NEXT: v_mov_b32_e32 v0, s2 1811; GFX6-NEXT: v_mov_b32_e32 v1, s1 1812; GFX6-NEXT: v_mov_b32_e32 v2, s0 1813; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1814; GFX6-NEXT: s_endpgm 1815; 1816; GFX7-LABEL: local_singlethread_release_monotonic_cmpxchg: 1817; GFX7: ; %bb.0: ; %entry 1818; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1819; GFX7-NEXT: s_mov_b32 m0, -1 1820; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1821; GFX7-NEXT: v_mov_b32_e32 v0, s0 1822; GFX7-NEXT: v_mov_b32_e32 v1, s2 1823; GFX7-NEXT: v_mov_b32_e32 v2, s1 1824; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1825; GFX7-NEXT: s_endpgm 1826; 1827; GFX10-WGP-LABEL: local_singlethread_release_monotonic_cmpxchg: 1828; GFX10-WGP: ; %bb.0: ; %entry 1829; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1830; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1831; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1832; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 1833; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 1834; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1835; GFX10-WGP-NEXT: s_endpgm 1836; 1837; GFX10-CU-LABEL: local_singlethread_release_monotonic_cmpxchg: 1838; GFX10-CU: ; %bb.0: ; %entry 1839; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1840; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1841; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1842; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 1843; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 1844; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1845; GFX10-CU-NEXT: s_endpgm 1846; 1847; SKIP-CACHE-INV-LABEL: local_singlethread_release_monotonic_cmpxchg: 1848; SKIP-CACHE-INV: ; %bb.0: ; %entry 1849; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1850; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1851; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1852; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1853; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 1854; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 1855; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1856; SKIP-CACHE-INV-NEXT: s_endpgm 1857; 1858; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg: 1859; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1860; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1861; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1862; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1863; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1864; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1865; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1866; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1867; 1868; GFX90A-TGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg: 1869; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1870; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1871; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1872; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1873; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1874; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1875; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1876; GFX90A-TGSPLIT-NEXT: s_endpgm 1877; 1878; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg: 1879; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1880; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1881; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1882; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1883; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1884; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1885; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1886; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1887; 1888; GFX940-TGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg: 1889; GFX940-TGSPLIT: ; %bb.0: ; %entry 1890; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1891; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1892; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1893; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1894; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1895; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1896; GFX940-TGSPLIT-NEXT: s_endpgm 1897 i32 addrspace(3)* %out, i32 %in, i32 %old) { 1898entry: 1899 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 1900 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release monotonic 1901 ret void 1902} 1903 1904define amdgpu_kernel void @local_singlethread_acq_rel_monotonic_cmpxchg( 1905; GFX6-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1906; GFX6: ; %bb.0: ; %entry 1907; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 1908; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 1909; GFX6-NEXT: s_mov_b32 m0, -1 1910; GFX6-NEXT: s_waitcnt lgkmcnt(0) 1911; GFX6-NEXT: v_mov_b32_e32 v0, s2 1912; GFX6-NEXT: v_mov_b32_e32 v1, s1 1913; GFX6-NEXT: v_mov_b32_e32 v2, s0 1914; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1915; GFX6-NEXT: s_endpgm 1916; 1917; GFX7-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1918; GFX7: ; %bb.0: ; %entry 1919; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1920; GFX7-NEXT: s_mov_b32 m0, -1 1921; GFX7-NEXT: s_waitcnt lgkmcnt(0) 1922; GFX7-NEXT: v_mov_b32_e32 v0, s0 1923; GFX7-NEXT: v_mov_b32_e32 v1, s2 1924; GFX7-NEXT: v_mov_b32_e32 v2, s1 1925; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1926; GFX7-NEXT: s_endpgm 1927; 1928; GFX10-WGP-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1929; GFX10-WGP: ; %bb.0: ; %entry 1930; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1931; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 1932; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 1933; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 1934; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 1935; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1936; GFX10-WGP-NEXT: s_endpgm 1937; 1938; GFX10-CU-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1939; GFX10-CU: ; %bb.0: ; %entry 1940; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1941; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 1942; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 1943; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 1944; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 1945; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1946; GFX10-CU-NEXT: s_endpgm 1947; 1948; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1949; SKIP-CACHE-INV: ; %bb.0: ; %entry 1950; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1951; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 1952; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 1953; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 1954; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 1955; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 1956; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1957; SKIP-CACHE-INV-NEXT: s_endpgm 1958; 1959; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1960; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 1961; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1962; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1963; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1964; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1965; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1966; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1967; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 1968; 1969; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1970; GFX90A-TGSPLIT: ; %bb.0: ; %entry 1971; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 1972; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1973; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1974; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1975; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1976; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1977; GFX90A-TGSPLIT-NEXT: s_endpgm 1978; 1979; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1980; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 1981; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1982; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1983; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1984; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1985; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1986; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1987; GFX940-NOTTGSPLIT-NEXT: s_endpgm 1988; 1989; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg: 1990; GFX940-TGSPLIT: ; %bb.0: ; %entry 1991; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 1992; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 1993; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 1994; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 1995; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 1996; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 1997; GFX940-TGSPLIT-NEXT: s_endpgm 1998 i32 addrspace(3)* %out, i32 %in, i32 %old) { 1999entry: 2000 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2001 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel monotonic 2002 ret void 2003} 2004 2005define amdgpu_kernel void @local_singlethread_seq_cst_monotonic_cmpxchg( 2006; GFX6-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2007; GFX6: ; %bb.0: ; %entry 2008; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2009; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2010; GFX6-NEXT: s_mov_b32 m0, -1 2011; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2012; GFX6-NEXT: v_mov_b32_e32 v0, s2 2013; GFX6-NEXT: v_mov_b32_e32 v1, s1 2014; GFX6-NEXT: v_mov_b32_e32 v2, s0 2015; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2016; GFX6-NEXT: s_endpgm 2017; 2018; GFX7-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2019; GFX7: ; %bb.0: ; %entry 2020; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2021; GFX7-NEXT: s_mov_b32 m0, -1 2022; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2023; GFX7-NEXT: v_mov_b32_e32 v0, s0 2024; GFX7-NEXT: v_mov_b32_e32 v1, s2 2025; GFX7-NEXT: v_mov_b32_e32 v2, s1 2026; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2027; GFX7-NEXT: s_endpgm 2028; 2029; GFX10-WGP-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2030; GFX10-WGP: ; %bb.0: ; %entry 2031; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2032; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2033; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2034; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2035; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2036; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2037; GFX10-WGP-NEXT: s_endpgm 2038; 2039; GFX10-CU-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2040; GFX10-CU: ; %bb.0: ; %entry 2041; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2042; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2043; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2044; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2045; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2046; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2047; GFX10-CU-NEXT: s_endpgm 2048; 2049; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2050; SKIP-CACHE-INV: ; %bb.0: ; %entry 2051; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2052; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2053; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2054; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2055; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2056; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2057; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2058; SKIP-CACHE-INV-NEXT: s_endpgm 2059; 2060; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2061; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2062; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2063; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2064; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2065; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2066; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2067; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2068; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2069; 2070; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2071; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2072; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2073; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2074; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2075; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2076; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2077; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2078; GFX90A-TGSPLIT-NEXT: s_endpgm 2079; 2080; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2081; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2082; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2083; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2084; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2085; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2086; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2087; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2088; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2089; 2090; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg: 2091; GFX940-TGSPLIT: ; %bb.0: ; %entry 2092; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2093; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2094; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2095; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2096; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2097; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2098; GFX940-TGSPLIT-NEXT: s_endpgm 2099 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2100entry: 2101 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2102 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst monotonic 2103 ret void 2104} 2105 2106define amdgpu_kernel void @local_singlethread_monotonic_acquire_cmpxchg( 2107; GFX6-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2108; GFX6: ; %bb.0: ; %entry 2109; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2110; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2111; GFX6-NEXT: s_mov_b32 m0, -1 2112; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2113; GFX6-NEXT: v_mov_b32_e32 v0, s2 2114; GFX6-NEXT: v_mov_b32_e32 v1, s1 2115; GFX6-NEXT: v_mov_b32_e32 v2, s0 2116; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2117; GFX6-NEXT: s_endpgm 2118; 2119; GFX7-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2120; GFX7: ; %bb.0: ; %entry 2121; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2122; GFX7-NEXT: s_mov_b32 m0, -1 2123; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2124; GFX7-NEXT: v_mov_b32_e32 v0, s0 2125; GFX7-NEXT: v_mov_b32_e32 v1, s2 2126; GFX7-NEXT: v_mov_b32_e32 v2, s1 2127; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2128; GFX7-NEXT: s_endpgm 2129; 2130; GFX10-WGP-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2131; GFX10-WGP: ; %bb.0: ; %entry 2132; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2133; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2134; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2135; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2136; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2137; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2138; GFX10-WGP-NEXT: s_endpgm 2139; 2140; GFX10-CU-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2141; GFX10-CU: ; %bb.0: ; %entry 2142; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2143; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2144; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2145; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2146; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2147; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2148; GFX10-CU-NEXT: s_endpgm 2149; 2150; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2151; SKIP-CACHE-INV: ; %bb.0: ; %entry 2152; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2153; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2154; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2155; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2156; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2157; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2158; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2159; SKIP-CACHE-INV-NEXT: s_endpgm 2160; 2161; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2162; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2163; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2164; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2165; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2166; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2167; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2168; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2169; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2170; 2171; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2172; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2173; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2174; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2175; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2176; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2177; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2178; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2179; GFX90A-TGSPLIT-NEXT: s_endpgm 2180; 2181; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2182; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2183; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2184; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2185; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2186; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2187; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2188; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2189; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2190; 2191; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg: 2192; GFX940-TGSPLIT: ; %bb.0: ; %entry 2193; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2194; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2195; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2196; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2197; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2198; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2199; GFX940-TGSPLIT-NEXT: s_endpgm 2200 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2201entry: 2202 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2203 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic acquire 2204 ret void 2205} 2206 2207define amdgpu_kernel void @local_singlethread_acquire_acquire_cmpxchg( 2208; GFX6-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2209; GFX6: ; %bb.0: ; %entry 2210; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2211; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2212; GFX6-NEXT: s_mov_b32 m0, -1 2213; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2214; GFX6-NEXT: v_mov_b32_e32 v0, s2 2215; GFX6-NEXT: v_mov_b32_e32 v1, s1 2216; GFX6-NEXT: v_mov_b32_e32 v2, s0 2217; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2218; GFX6-NEXT: s_endpgm 2219; 2220; GFX7-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2221; GFX7: ; %bb.0: ; %entry 2222; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2223; GFX7-NEXT: s_mov_b32 m0, -1 2224; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2225; GFX7-NEXT: v_mov_b32_e32 v0, s0 2226; GFX7-NEXT: v_mov_b32_e32 v1, s2 2227; GFX7-NEXT: v_mov_b32_e32 v2, s1 2228; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2229; GFX7-NEXT: s_endpgm 2230; 2231; GFX10-WGP-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2232; GFX10-WGP: ; %bb.0: ; %entry 2233; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2234; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2235; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2236; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2237; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2238; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2239; GFX10-WGP-NEXT: s_endpgm 2240; 2241; GFX10-CU-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2242; GFX10-CU: ; %bb.0: ; %entry 2243; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2244; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2245; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2246; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2247; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2248; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2249; GFX10-CU-NEXT: s_endpgm 2250; 2251; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2252; SKIP-CACHE-INV: ; %bb.0: ; %entry 2253; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2254; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2255; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2256; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2257; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2258; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2259; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2260; SKIP-CACHE-INV-NEXT: s_endpgm 2261; 2262; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2263; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2264; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2265; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2266; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2267; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2268; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2269; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2270; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2271; 2272; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2273; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2274; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2275; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2276; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2277; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2278; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2279; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2280; GFX90A-TGSPLIT-NEXT: s_endpgm 2281; 2282; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2283; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2284; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2285; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2286; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2287; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2288; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2289; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2290; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2291; 2292; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg: 2293; GFX940-TGSPLIT: ; %bb.0: ; %entry 2294; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2295; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2296; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2297; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2298; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2299; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2300; GFX940-TGSPLIT-NEXT: s_endpgm 2301 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2302entry: 2303 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2304 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire acquire 2305 ret void 2306} 2307 2308define amdgpu_kernel void @local_singlethread_release_acquire_cmpxchg( 2309; GFX6-LABEL: local_singlethread_release_acquire_cmpxchg: 2310; GFX6: ; %bb.0: ; %entry 2311; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2312; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2313; GFX6-NEXT: s_mov_b32 m0, -1 2314; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2315; GFX6-NEXT: v_mov_b32_e32 v0, s2 2316; GFX6-NEXT: v_mov_b32_e32 v1, s1 2317; GFX6-NEXT: v_mov_b32_e32 v2, s0 2318; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2319; GFX6-NEXT: s_endpgm 2320; 2321; GFX7-LABEL: local_singlethread_release_acquire_cmpxchg: 2322; GFX7: ; %bb.0: ; %entry 2323; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2324; GFX7-NEXT: s_mov_b32 m0, -1 2325; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2326; GFX7-NEXT: v_mov_b32_e32 v0, s0 2327; GFX7-NEXT: v_mov_b32_e32 v1, s2 2328; GFX7-NEXT: v_mov_b32_e32 v2, s1 2329; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2330; GFX7-NEXT: s_endpgm 2331; 2332; GFX10-WGP-LABEL: local_singlethread_release_acquire_cmpxchg: 2333; GFX10-WGP: ; %bb.0: ; %entry 2334; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2335; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2336; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2337; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2338; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2339; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2340; GFX10-WGP-NEXT: s_endpgm 2341; 2342; GFX10-CU-LABEL: local_singlethread_release_acquire_cmpxchg: 2343; GFX10-CU: ; %bb.0: ; %entry 2344; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2345; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2346; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2347; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2348; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2349; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2350; GFX10-CU-NEXT: s_endpgm 2351; 2352; SKIP-CACHE-INV-LABEL: local_singlethread_release_acquire_cmpxchg: 2353; SKIP-CACHE-INV: ; %bb.0: ; %entry 2354; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2355; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2356; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2357; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2358; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2359; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2360; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2361; SKIP-CACHE-INV-NEXT: s_endpgm 2362; 2363; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg: 2364; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2365; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2366; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2367; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2368; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2369; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2370; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2371; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2372; 2373; GFX90A-TGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg: 2374; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2375; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2376; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2377; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2378; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2379; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2380; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2381; GFX90A-TGSPLIT-NEXT: s_endpgm 2382; 2383; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg: 2384; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2385; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2386; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2387; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2388; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2389; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2390; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2391; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2392; 2393; GFX940-TGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg: 2394; GFX940-TGSPLIT: ; %bb.0: ; %entry 2395; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2396; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2397; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2398; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2399; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2400; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2401; GFX940-TGSPLIT-NEXT: s_endpgm 2402 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2403entry: 2404 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2405 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release acquire 2406 ret void 2407} 2408 2409define amdgpu_kernel void @local_singlethread_acq_rel_acquire_cmpxchg( 2410; GFX6-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2411; GFX6: ; %bb.0: ; %entry 2412; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2413; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2414; GFX6-NEXT: s_mov_b32 m0, -1 2415; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2416; GFX6-NEXT: v_mov_b32_e32 v0, s2 2417; GFX6-NEXT: v_mov_b32_e32 v1, s1 2418; GFX6-NEXT: v_mov_b32_e32 v2, s0 2419; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2420; GFX6-NEXT: s_endpgm 2421; 2422; GFX7-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2423; GFX7: ; %bb.0: ; %entry 2424; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2425; GFX7-NEXT: s_mov_b32 m0, -1 2426; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2427; GFX7-NEXT: v_mov_b32_e32 v0, s0 2428; GFX7-NEXT: v_mov_b32_e32 v1, s2 2429; GFX7-NEXT: v_mov_b32_e32 v2, s1 2430; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2431; GFX7-NEXT: s_endpgm 2432; 2433; GFX10-WGP-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2434; GFX10-WGP: ; %bb.0: ; %entry 2435; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2436; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2437; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2438; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2439; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2440; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2441; GFX10-WGP-NEXT: s_endpgm 2442; 2443; GFX10-CU-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2444; GFX10-CU: ; %bb.0: ; %entry 2445; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2446; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2447; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2448; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2449; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2450; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2451; GFX10-CU-NEXT: s_endpgm 2452; 2453; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2454; SKIP-CACHE-INV: ; %bb.0: ; %entry 2455; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2456; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2457; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2458; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2459; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2460; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2461; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2462; SKIP-CACHE-INV-NEXT: s_endpgm 2463; 2464; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2465; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2466; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2467; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2468; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2469; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2470; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2471; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2472; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2473; 2474; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2475; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2476; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2477; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2478; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2479; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2480; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2481; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2482; GFX90A-TGSPLIT-NEXT: s_endpgm 2483; 2484; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2485; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2486; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2487; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2488; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2489; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2490; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2491; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2492; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2493; 2494; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg: 2495; GFX940-TGSPLIT: ; %bb.0: ; %entry 2496; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2497; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2498; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2499; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2500; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2501; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2502; GFX940-TGSPLIT-NEXT: s_endpgm 2503 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2504entry: 2505 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2506 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel acquire 2507 ret void 2508} 2509 2510define amdgpu_kernel void @local_singlethread_seq_cst_acquire_cmpxchg( 2511; GFX6-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2512; GFX6: ; %bb.0: ; %entry 2513; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2514; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2515; GFX6-NEXT: s_mov_b32 m0, -1 2516; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2517; GFX6-NEXT: v_mov_b32_e32 v0, s2 2518; GFX6-NEXT: v_mov_b32_e32 v1, s1 2519; GFX6-NEXT: v_mov_b32_e32 v2, s0 2520; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2521; GFX6-NEXT: s_endpgm 2522; 2523; GFX7-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2524; GFX7: ; %bb.0: ; %entry 2525; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2526; GFX7-NEXT: s_mov_b32 m0, -1 2527; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2528; GFX7-NEXT: v_mov_b32_e32 v0, s0 2529; GFX7-NEXT: v_mov_b32_e32 v1, s2 2530; GFX7-NEXT: v_mov_b32_e32 v2, s1 2531; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2532; GFX7-NEXT: s_endpgm 2533; 2534; GFX10-WGP-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2535; GFX10-WGP: ; %bb.0: ; %entry 2536; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2537; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2538; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2539; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2540; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2541; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2542; GFX10-WGP-NEXT: s_endpgm 2543; 2544; GFX10-CU-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2545; GFX10-CU: ; %bb.0: ; %entry 2546; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2547; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2548; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2549; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2550; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2551; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2552; GFX10-CU-NEXT: s_endpgm 2553; 2554; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2555; SKIP-CACHE-INV: ; %bb.0: ; %entry 2556; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2557; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2558; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2559; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2560; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2561; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2562; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2563; SKIP-CACHE-INV-NEXT: s_endpgm 2564; 2565; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2566; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2567; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2568; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2569; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2570; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2571; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2572; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2573; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2574; 2575; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2576; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2577; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2578; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2579; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2580; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2581; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2582; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2583; GFX90A-TGSPLIT-NEXT: s_endpgm 2584; 2585; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2586; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2587; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2588; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2589; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2590; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2591; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2592; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2593; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2594; 2595; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg: 2596; GFX940-TGSPLIT: ; %bb.0: ; %entry 2597; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2598; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2599; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2600; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2601; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2602; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2603; GFX940-TGSPLIT-NEXT: s_endpgm 2604 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2605entry: 2606 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2607 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst acquire 2608 ret void 2609} 2610 2611define amdgpu_kernel void @local_singlethread_monotonic_seq_cst_cmpxchg( 2612; GFX6-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2613; GFX6: ; %bb.0: ; %entry 2614; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2615; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2616; GFX6-NEXT: s_mov_b32 m0, -1 2617; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2618; GFX6-NEXT: v_mov_b32_e32 v0, s2 2619; GFX6-NEXT: v_mov_b32_e32 v1, s1 2620; GFX6-NEXT: v_mov_b32_e32 v2, s0 2621; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2622; GFX6-NEXT: s_endpgm 2623; 2624; GFX7-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2625; GFX7: ; %bb.0: ; %entry 2626; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2627; GFX7-NEXT: s_mov_b32 m0, -1 2628; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2629; GFX7-NEXT: v_mov_b32_e32 v0, s0 2630; GFX7-NEXT: v_mov_b32_e32 v1, s2 2631; GFX7-NEXT: v_mov_b32_e32 v2, s1 2632; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2633; GFX7-NEXT: s_endpgm 2634; 2635; GFX10-WGP-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2636; GFX10-WGP: ; %bb.0: ; %entry 2637; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2638; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2639; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2640; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2641; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2642; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2643; GFX10-WGP-NEXT: s_endpgm 2644; 2645; GFX10-CU-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2646; GFX10-CU: ; %bb.0: ; %entry 2647; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2648; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2649; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2650; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2651; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2652; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2653; GFX10-CU-NEXT: s_endpgm 2654; 2655; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2656; SKIP-CACHE-INV: ; %bb.0: ; %entry 2657; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2658; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2659; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2660; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2661; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2662; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2663; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2664; SKIP-CACHE-INV-NEXT: s_endpgm 2665; 2666; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2667; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2668; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2669; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2670; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2671; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2672; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2673; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2674; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2675; 2676; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2677; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2678; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2679; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2680; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2681; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2682; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2683; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2684; GFX90A-TGSPLIT-NEXT: s_endpgm 2685; 2686; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2687; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2688; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2689; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2690; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2691; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2692; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2693; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2694; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2695; 2696; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg: 2697; GFX940-TGSPLIT: ; %bb.0: ; %entry 2698; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2699; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2700; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2701; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2702; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2703; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2704; GFX940-TGSPLIT-NEXT: s_endpgm 2705 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2706entry: 2707 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2708 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic seq_cst 2709 ret void 2710} 2711 2712define amdgpu_kernel void @local_singlethread_acquire_seq_cst_cmpxchg( 2713; GFX6-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2714; GFX6: ; %bb.0: ; %entry 2715; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2716; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2717; GFX6-NEXT: s_mov_b32 m0, -1 2718; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2719; GFX6-NEXT: v_mov_b32_e32 v0, s2 2720; GFX6-NEXT: v_mov_b32_e32 v1, s1 2721; GFX6-NEXT: v_mov_b32_e32 v2, s0 2722; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2723; GFX6-NEXT: s_endpgm 2724; 2725; GFX7-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2726; GFX7: ; %bb.0: ; %entry 2727; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2728; GFX7-NEXT: s_mov_b32 m0, -1 2729; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2730; GFX7-NEXT: v_mov_b32_e32 v0, s0 2731; GFX7-NEXT: v_mov_b32_e32 v1, s2 2732; GFX7-NEXT: v_mov_b32_e32 v2, s1 2733; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2734; GFX7-NEXT: s_endpgm 2735; 2736; GFX10-WGP-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2737; GFX10-WGP: ; %bb.0: ; %entry 2738; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2739; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2740; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2741; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2742; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2743; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2744; GFX10-WGP-NEXT: s_endpgm 2745; 2746; GFX10-CU-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2747; GFX10-CU: ; %bb.0: ; %entry 2748; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2749; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2750; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2751; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2752; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2753; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2754; GFX10-CU-NEXT: s_endpgm 2755; 2756; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2757; SKIP-CACHE-INV: ; %bb.0: ; %entry 2758; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2759; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2760; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2761; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2762; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2763; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2764; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2765; SKIP-CACHE-INV-NEXT: s_endpgm 2766; 2767; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2768; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2769; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2770; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2771; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2772; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2773; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2774; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2775; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2776; 2777; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2778; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2779; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2780; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2781; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2782; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2783; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2784; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2785; GFX90A-TGSPLIT-NEXT: s_endpgm 2786; 2787; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2788; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2789; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2790; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2791; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2792; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2793; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2794; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2795; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2796; 2797; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg: 2798; GFX940-TGSPLIT: ; %bb.0: ; %entry 2799; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2800; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2801; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2802; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2803; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2804; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2805; GFX940-TGSPLIT-NEXT: s_endpgm 2806 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2807entry: 2808 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2809 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire seq_cst 2810 ret void 2811} 2812 2813define amdgpu_kernel void @local_singlethread_release_seq_cst_cmpxchg( 2814; GFX6-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2815; GFX6: ; %bb.0: ; %entry 2816; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2817; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2818; GFX6-NEXT: s_mov_b32 m0, -1 2819; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2820; GFX6-NEXT: v_mov_b32_e32 v0, s2 2821; GFX6-NEXT: v_mov_b32_e32 v1, s1 2822; GFX6-NEXT: v_mov_b32_e32 v2, s0 2823; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2824; GFX6-NEXT: s_endpgm 2825; 2826; GFX7-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2827; GFX7: ; %bb.0: ; %entry 2828; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2829; GFX7-NEXT: s_mov_b32 m0, -1 2830; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2831; GFX7-NEXT: v_mov_b32_e32 v0, s0 2832; GFX7-NEXT: v_mov_b32_e32 v1, s2 2833; GFX7-NEXT: v_mov_b32_e32 v2, s1 2834; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2835; GFX7-NEXT: s_endpgm 2836; 2837; GFX10-WGP-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2838; GFX10-WGP: ; %bb.0: ; %entry 2839; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2840; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2841; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2842; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2843; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2844; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2845; GFX10-WGP-NEXT: s_endpgm 2846; 2847; GFX10-CU-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2848; GFX10-CU: ; %bb.0: ; %entry 2849; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2850; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2851; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2852; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2853; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2854; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2855; GFX10-CU-NEXT: s_endpgm 2856; 2857; SKIP-CACHE-INV-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2858; SKIP-CACHE-INV: ; %bb.0: ; %entry 2859; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2860; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2861; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2862; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2863; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2864; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2865; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2866; SKIP-CACHE-INV-NEXT: s_endpgm 2867; 2868; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2869; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2870; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2871; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2872; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2873; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2874; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2875; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2876; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2877; 2878; GFX90A-TGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2879; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2880; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2881; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2882; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2883; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2884; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2885; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2886; GFX90A-TGSPLIT-NEXT: s_endpgm 2887; 2888; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2889; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2890; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2891; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2892; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2893; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2894; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2895; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2896; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2897; 2898; GFX940-TGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg: 2899; GFX940-TGSPLIT: ; %bb.0: ; %entry 2900; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2901; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2902; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2903; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2904; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2905; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2906; GFX940-TGSPLIT-NEXT: s_endpgm 2907 i32 addrspace(3)* %out, i32 %in, i32 %old) { 2908entry: 2909 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 2910 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release seq_cst 2911 ret void 2912} 2913 2914define amdgpu_kernel void @local_singlethread_acq_rel_seq_cst_cmpxchg( 2915; GFX6-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 2916; GFX6: ; %bb.0: ; %entry 2917; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 2918; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 2919; GFX6-NEXT: s_mov_b32 m0, -1 2920; GFX6-NEXT: s_waitcnt lgkmcnt(0) 2921; GFX6-NEXT: v_mov_b32_e32 v0, s2 2922; GFX6-NEXT: v_mov_b32_e32 v1, s1 2923; GFX6-NEXT: v_mov_b32_e32 v2, s0 2924; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2925; GFX6-NEXT: s_endpgm 2926; 2927; GFX7-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 2928; GFX7: ; %bb.0: ; %entry 2929; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2930; GFX7-NEXT: s_mov_b32 m0, -1 2931; GFX7-NEXT: s_waitcnt lgkmcnt(0) 2932; GFX7-NEXT: v_mov_b32_e32 v0, s0 2933; GFX7-NEXT: v_mov_b32_e32 v1, s2 2934; GFX7-NEXT: v_mov_b32_e32 v2, s1 2935; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2936; GFX7-NEXT: s_endpgm 2937; 2938; GFX10-WGP-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 2939; GFX10-WGP: ; %bb.0: ; %entry 2940; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2941; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 2942; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 2943; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 2944; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 2945; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2946; GFX10-WGP-NEXT: s_endpgm 2947; 2948; GFX10-CU-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 2949; GFX10-CU: ; %bb.0: ; %entry 2950; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2951; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 2952; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 2953; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 2954; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 2955; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2956; GFX10-CU-NEXT: s_endpgm 2957; 2958; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 2959; SKIP-CACHE-INV: ; %bb.0: ; %entry 2960; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2961; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 2962; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 2963; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 2964; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 2965; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 2966; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2967; SKIP-CACHE-INV-NEXT: s_endpgm 2968; 2969; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 2970; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 2971; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2972; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2973; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2974; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2975; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2976; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2977; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 2978; 2979; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 2980; GFX90A-TGSPLIT: ; %bb.0: ; %entry 2981; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 2982; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2983; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2984; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2985; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2986; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2987; GFX90A-TGSPLIT-NEXT: s_endpgm 2988; 2989; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 2990; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 2991; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 2992; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 2993; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 2994; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 2995; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 2996; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 2997; GFX940-NOTTGSPLIT-NEXT: s_endpgm 2998; 2999; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg: 3000; GFX940-TGSPLIT: ; %bb.0: ; %entry 3001; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3002; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3003; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3004; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3005; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3006; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3007; GFX940-TGSPLIT-NEXT: s_endpgm 3008 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3009entry: 3010 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3011 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel seq_cst 3012 ret void 3013} 3014 3015define amdgpu_kernel void @local_singlethread_seq_cst_seq_cst_cmpxchg( 3016; GFX6-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3017; GFX6: ; %bb.0: ; %entry 3018; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3019; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3020; GFX6-NEXT: s_mov_b32 m0, -1 3021; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3022; GFX6-NEXT: v_mov_b32_e32 v0, s2 3023; GFX6-NEXT: v_mov_b32_e32 v1, s1 3024; GFX6-NEXT: v_mov_b32_e32 v2, s0 3025; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3026; GFX6-NEXT: s_endpgm 3027; 3028; GFX7-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3029; GFX7: ; %bb.0: ; %entry 3030; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3031; GFX7-NEXT: s_mov_b32 m0, -1 3032; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3033; GFX7-NEXT: v_mov_b32_e32 v0, s0 3034; GFX7-NEXT: v_mov_b32_e32 v1, s2 3035; GFX7-NEXT: v_mov_b32_e32 v2, s1 3036; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3037; GFX7-NEXT: s_endpgm 3038; 3039; GFX10-WGP-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3040; GFX10-WGP: ; %bb.0: ; %entry 3041; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3042; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3043; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3044; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3045; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3046; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3047; GFX10-WGP-NEXT: s_endpgm 3048; 3049; GFX10-CU-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3050; GFX10-CU: ; %bb.0: ; %entry 3051; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3052; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3053; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 3054; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 3055; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 3056; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3057; GFX10-CU-NEXT: s_endpgm 3058; 3059; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3060; SKIP-CACHE-INV: ; %bb.0: ; %entry 3061; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3062; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 3063; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3064; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 3065; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 3066; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 3067; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3068; SKIP-CACHE-INV-NEXT: s_endpgm 3069; 3070; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3071; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 3072; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3073; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3074; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3075; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3076; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3077; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3078; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 3079; 3080; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3081; GFX90A-TGSPLIT: ; %bb.0: ; %entry 3082; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3083; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3084; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3085; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3086; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3087; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3088; GFX90A-TGSPLIT-NEXT: s_endpgm 3089; 3090; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3091; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 3092; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3093; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3094; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3095; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3096; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3097; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3098; GFX940-NOTTGSPLIT-NEXT: s_endpgm 3099; 3100; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg: 3101; GFX940-TGSPLIT: ; %bb.0: ; %entry 3102; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3103; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3104; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3105; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3106; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3107; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 3108; GFX940-TGSPLIT-NEXT: s_endpgm 3109 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3110entry: 3111 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3112 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst seq_cst 3113 ret void 3114} 3115 3116define amdgpu_kernel void @local_singlethread_monotonic_monotonic_ret_cmpxchg( 3117; GFX6-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3118; GFX6: ; %bb.0: ; %entry 3119; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3120; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3121; GFX6-NEXT: s_mov_b32 m0, -1 3122; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3123; GFX6-NEXT: v_mov_b32_e32 v0, s2 3124; GFX6-NEXT: v_mov_b32_e32 v1, s1 3125; GFX6-NEXT: v_mov_b32_e32 v2, s0 3126; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3127; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3128; GFX6-NEXT: ds_write_b32 v0, v1 3129; GFX6-NEXT: s_endpgm 3130; 3131; GFX7-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3132; GFX7: ; %bb.0: ; %entry 3133; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3134; GFX7-NEXT: s_mov_b32 m0, -1 3135; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3136; GFX7-NEXT: v_mov_b32_e32 v0, s0 3137; GFX7-NEXT: v_mov_b32_e32 v1, s2 3138; GFX7-NEXT: v_mov_b32_e32 v2, s1 3139; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3140; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3141; GFX7-NEXT: ds_write_b32 v0, v1 3142; GFX7-NEXT: s_endpgm 3143; 3144; GFX10-WGP-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3145; GFX10-WGP: ; %bb.0: ; %entry 3146; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3147; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3148; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3149; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3150; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3151; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3152; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3153; GFX10-WGP-NEXT: ds_write_b32 v0, v1 3154; GFX10-WGP-NEXT: s_endpgm 3155; 3156; GFX10-CU-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3157; GFX10-CU: ; %bb.0: ; %entry 3158; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3159; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3160; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 3161; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 3162; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 3163; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3164; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3165; GFX10-CU-NEXT: ds_write_b32 v0, v1 3166; GFX10-CU-NEXT: s_endpgm 3167; 3168; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3169; SKIP-CACHE-INV: ; %bb.0: ; %entry 3170; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3171; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 3172; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3173; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 3174; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 3175; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 3176; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3177; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3178; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 3179; SKIP-CACHE-INV-NEXT: s_endpgm 3180; 3181; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3182; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 3183; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3184; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3185; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3186; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3187; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3188; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3189; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3190; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3191; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 3192; 3193; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3194; GFX90A-TGSPLIT: ; %bb.0: ; %entry 3195; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3196; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3197; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3198; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3199; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3200; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3201; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3202; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 3203; GFX90A-TGSPLIT-NEXT: s_endpgm 3204; 3205; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3206; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 3207; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3208; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3209; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3210; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3211; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3212; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3213; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3214; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3215; GFX940-NOTTGSPLIT-NEXT: s_endpgm 3216; 3217; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg: 3218; GFX940-TGSPLIT: ; %bb.0: ; %entry 3219; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3220; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3221; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3222; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3223; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3224; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3225; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3226; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 3227; GFX940-TGSPLIT-NEXT: s_endpgm 3228 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3229entry: 3230 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3231 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic monotonic 3232 %val0 = extractvalue { i32, i1 } %val, 0 3233 store i32 %val0, i32 addrspace(3)* %out, align 4 3234 ret void 3235} 3236 3237define amdgpu_kernel void @local_singlethread_acquire_monotonic_ret_cmpxchg( 3238; GFX6-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3239; GFX6: ; %bb.0: ; %entry 3240; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3241; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3242; GFX6-NEXT: s_mov_b32 m0, -1 3243; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3244; GFX6-NEXT: v_mov_b32_e32 v0, s2 3245; GFX6-NEXT: v_mov_b32_e32 v1, s1 3246; GFX6-NEXT: v_mov_b32_e32 v2, s0 3247; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3248; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3249; GFX6-NEXT: ds_write_b32 v0, v1 3250; GFX6-NEXT: s_endpgm 3251; 3252; GFX7-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3253; GFX7: ; %bb.0: ; %entry 3254; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3255; GFX7-NEXT: s_mov_b32 m0, -1 3256; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3257; GFX7-NEXT: v_mov_b32_e32 v0, s0 3258; GFX7-NEXT: v_mov_b32_e32 v1, s2 3259; GFX7-NEXT: v_mov_b32_e32 v2, s1 3260; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3261; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3262; GFX7-NEXT: ds_write_b32 v0, v1 3263; GFX7-NEXT: s_endpgm 3264; 3265; GFX10-WGP-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3266; GFX10-WGP: ; %bb.0: ; %entry 3267; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3268; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3269; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3270; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3271; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3272; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3273; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3274; GFX10-WGP-NEXT: ds_write_b32 v0, v1 3275; GFX10-WGP-NEXT: s_endpgm 3276; 3277; GFX10-CU-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3278; GFX10-CU: ; %bb.0: ; %entry 3279; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3280; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3281; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 3282; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 3283; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 3284; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3285; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3286; GFX10-CU-NEXT: ds_write_b32 v0, v1 3287; GFX10-CU-NEXT: s_endpgm 3288; 3289; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3290; SKIP-CACHE-INV: ; %bb.0: ; %entry 3291; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3292; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 3293; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3294; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 3295; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 3296; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 3297; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3298; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3299; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 3300; SKIP-CACHE-INV-NEXT: s_endpgm 3301; 3302; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3303; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 3304; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3305; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3306; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3307; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3308; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3309; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3310; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3311; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3312; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 3313; 3314; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3315; GFX90A-TGSPLIT: ; %bb.0: ; %entry 3316; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3317; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3318; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3319; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3320; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3321; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3322; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3323; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 3324; GFX90A-TGSPLIT-NEXT: s_endpgm 3325; 3326; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3327; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 3328; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3329; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3330; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3331; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3332; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3333; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3334; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3335; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3336; GFX940-NOTTGSPLIT-NEXT: s_endpgm 3337; 3338; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg: 3339; GFX940-TGSPLIT: ; %bb.0: ; %entry 3340; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3341; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3342; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3343; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3344; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3345; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3346; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3347; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 3348; GFX940-TGSPLIT-NEXT: s_endpgm 3349 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3350entry: 3351 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3352 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire monotonic 3353 %val0 = extractvalue { i32, i1 } %val, 0 3354 store i32 %val0, i32 addrspace(3)* %out, align 4 3355 ret void 3356} 3357 3358define amdgpu_kernel void @local_singlethread_release_monotonic_ret_cmpxchg( 3359; GFX6-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3360; GFX6: ; %bb.0: ; %entry 3361; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3362; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3363; GFX6-NEXT: s_mov_b32 m0, -1 3364; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3365; GFX6-NEXT: v_mov_b32_e32 v0, s2 3366; GFX6-NEXT: v_mov_b32_e32 v1, s1 3367; GFX6-NEXT: v_mov_b32_e32 v2, s0 3368; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3369; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3370; GFX6-NEXT: ds_write_b32 v0, v1 3371; GFX6-NEXT: s_endpgm 3372; 3373; GFX7-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3374; GFX7: ; %bb.0: ; %entry 3375; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3376; GFX7-NEXT: s_mov_b32 m0, -1 3377; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3378; GFX7-NEXT: v_mov_b32_e32 v0, s0 3379; GFX7-NEXT: v_mov_b32_e32 v1, s2 3380; GFX7-NEXT: v_mov_b32_e32 v2, s1 3381; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3382; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3383; GFX7-NEXT: ds_write_b32 v0, v1 3384; GFX7-NEXT: s_endpgm 3385; 3386; GFX10-WGP-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3387; GFX10-WGP: ; %bb.0: ; %entry 3388; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3389; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3390; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3391; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3392; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3393; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3394; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3395; GFX10-WGP-NEXT: ds_write_b32 v0, v1 3396; GFX10-WGP-NEXT: s_endpgm 3397; 3398; GFX10-CU-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3399; GFX10-CU: ; %bb.0: ; %entry 3400; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3401; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3402; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 3403; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 3404; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 3405; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3406; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3407; GFX10-CU-NEXT: ds_write_b32 v0, v1 3408; GFX10-CU-NEXT: s_endpgm 3409; 3410; SKIP-CACHE-INV-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3411; SKIP-CACHE-INV: ; %bb.0: ; %entry 3412; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3413; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 3414; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3415; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 3416; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 3417; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 3418; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3419; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3420; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 3421; SKIP-CACHE-INV-NEXT: s_endpgm 3422; 3423; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3424; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 3425; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3426; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3427; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3428; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3429; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3430; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3431; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3432; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3433; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 3434; 3435; GFX90A-TGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3436; GFX90A-TGSPLIT: ; %bb.0: ; %entry 3437; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3438; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3439; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3440; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3441; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3442; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3443; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3444; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 3445; GFX90A-TGSPLIT-NEXT: s_endpgm 3446; 3447; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3448; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 3449; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3450; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3451; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3452; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3453; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3454; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3455; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3456; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3457; GFX940-NOTTGSPLIT-NEXT: s_endpgm 3458; 3459; GFX940-TGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg: 3460; GFX940-TGSPLIT: ; %bb.0: ; %entry 3461; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3462; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3463; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3464; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3465; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3466; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3467; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3468; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 3469; GFX940-TGSPLIT-NEXT: s_endpgm 3470 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3471entry: 3472 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3473 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release monotonic 3474 %val0 = extractvalue { i32, i1 } %val, 0 3475 store i32 %val0, i32 addrspace(3)* %out, align 4 3476 ret void 3477} 3478 3479define amdgpu_kernel void @local_singlethread_acq_rel_monotonic_ret_cmpxchg( 3480; GFX6-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3481; GFX6: ; %bb.0: ; %entry 3482; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3483; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3484; GFX6-NEXT: s_mov_b32 m0, -1 3485; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3486; GFX6-NEXT: v_mov_b32_e32 v0, s2 3487; GFX6-NEXT: v_mov_b32_e32 v1, s1 3488; GFX6-NEXT: v_mov_b32_e32 v2, s0 3489; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3490; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3491; GFX6-NEXT: ds_write_b32 v0, v1 3492; GFX6-NEXT: s_endpgm 3493; 3494; GFX7-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3495; GFX7: ; %bb.0: ; %entry 3496; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3497; GFX7-NEXT: s_mov_b32 m0, -1 3498; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3499; GFX7-NEXT: v_mov_b32_e32 v0, s0 3500; GFX7-NEXT: v_mov_b32_e32 v1, s2 3501; GFX7-NEXT: v_mov_b32_e32 v2, s1 3502; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3503; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3504; GFX7-NEXT: ds_write_b32 v0, v1 3505; GFX7-NEXT: s_endpgm 3506; 3507; GFX10-WGP-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3508; GFX10-WGP: ; %bb.0: ; %entry 3509; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3510; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3511; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3512; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3513; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3514; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3515; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3516; GFX10-WGP-NEXT: ds_write_b32 v0, v1 3517; GFX10-WGP-NEXT: s_endpgm 3518; 3519; GFX10-CU-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3520; GFX10-CU: ; %bb.0: ; %entry 3521; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3522; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3523; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 3524; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 3525; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 3526; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3527; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3528; GFX10-CU-NEXT: ds_write_b32 v0, v1 3529; GFX10-CU-NEXT: s_endpgm 3530; 3531; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3532; SKIP-CACHE-INV: ; %bb.0: ; %entry 3533; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3534; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 3535; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3536; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 3537; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 3538; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 3539; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3540; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3541; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 3542; SKIP-CACHE-INV-NEXT: s_endpgm 3543; 3544; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3545; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 3546; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3547; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3548; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3549; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3550; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3551; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3552; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3553; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3554; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 3555; 3556; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3557; GFX90A-TGSPLIT: ; %bb.0: ; %entry 3558; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3559; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3560; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3561; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3562; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3563; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3564; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3565; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 3566; GFX90A-TGSPLIT-NEXT: s_endpgm 3567; 3568; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3569; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 3570; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3571; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3572; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3573; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3574; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3575; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3576; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3577; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3578; GFX940-NOTTGSPLIT-NEXT: s_endpgm 3579; 3580; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg: 3581; GFX940-TGSPLIT: ; %bb.0: ; %entry 3582; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3583; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3584; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3585; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3586; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3587; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3588; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3589; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 3590; GFX940-TGSPLIT-NEXT: s_endpgm 3591 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3592entry: 3593 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3594 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel monotonic 3595 %val0 = extractvalue { i32, i1 } %val, 0 3596 store i32 %val0, i32 addrspace(3)* %out, align 4 3597 ret void 3598} 3599 3600define amdgpu_kernel void @local_singlethread_seq_cst_monotonic_ret_cmpxchg( 3601; GFX6-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3602; GFX6: ; %bb.0: ; %entry 3603; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3604; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3605; GFX6-NEXT: s_mov_b32 m0, -1 3606; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3607; GFX6-NEXT: v_mov_b32_e32 v0, s2 3608; GFX6-NEXT: v_mov_b32_e32 v1, s1 3609; GFX6-NEXT: v_mov_b32_e32 v2, s0 3610; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3611; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3612; GFX6-NEXT: ds_write_b32 v0, v1 3613; GFX6-NEXT: s_endpgm 3614; 3615; GFX7-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3616; GFX7: ; %bb.0: ; %entry 3617; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3618; GFX7-NEXT: s_mov_b32 m0, -1 3619; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3620; GFX7-NEXT: v_mov_b32_e32 v0, s0 3621; GFX7-NEXT: v_mov_b32_e32 v1, s2 3622; GFX7-NEXT: v_mov_b32_e32 v2, s1 3623; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3624; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3625; GFX7-NEXT: ds_write_b32 v0, v1 3626; GFX7-NEXT: s_endpgm 3627; 3628; GFX10-WGP-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3629; GFX10-WGP: ; %bb.0: ; %entry 3630; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3631; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3632; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3633; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3634; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3635; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3636; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3637; GFX10-WGP-NEXT: ds_write_b32 v0, v1 3638; GFX10-WGP-NEXT: s_endpgm 3639; 3640; GFX10-CU-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3641; GFX10-CU: ; %bb.0: ; %entry 3642; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3643; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3644; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 3645; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 3646; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 3647; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3648; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3649; GFX10-CU-NEXT: ds_write_b32 v0, v1 3650; GFX10-CU-NEXT: s_endpgm 3651; 3652; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3653; SKIP-CACHE-INV: ; %bb.0: ; %entry 3654; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3655; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 3656; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3657; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 3658; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 3659; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 3660; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3661; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3662; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 3663; SKIP-CACHE-INV-NEXT: s_endpgm 3664; 3665; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3666; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 3667; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3668; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3669; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3670; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3671; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3672; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3673; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3674; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3675; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 3676; 3677; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3678; GFX90A-TGSPLIT: ; %bb.0: ; %entry 3679; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3680; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3681; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3682; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3683; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3684; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3685; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3686; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 3687; GFX90A-TGSPLIT-NEXT: s_endpgm 3688; 3689; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3690; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 3691; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3692; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3693; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3694; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3695; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3696; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3697; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3698; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3699; GFX940-NOTTGSPLIT-NEXT: s_endpgm 3700; 3701; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg: 3702; GFX940-TGSPLIT: ; %bb.0: ; %entry 3703; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3704; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3705; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3706; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3707; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3708; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3709; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3710; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 3711; GFX940-TGSPLIT-NEXT: s_endpgm 3712 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3713entry: 3714 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3715 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst monotonic 3716 %val0 = extractvalue { i32, i1 } %val, 0 3717 store i32 %val0, i32 addrspace(3)* %out, align 4 3718 ret void 3719} 3720 3721define amdgpu_kernel void @local_singlethread_monotonic_acquire_ret_cmpxchg( 3722; GFX6-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3723; GFX6: ; %bb.0: ; %entry 3724; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3725; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3726; GFX6-NEXT: s_mov_b32 m0, -1 3727; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3728; GFX6-NEXT: v_mov_b32_e32 v0, s2 3729; GFX6-NEXT: v_mov_b32_e32 v1, s1 3730; GFX6-NEXT: v_mov_b32_e32 v2, s0 3731; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3732; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3733; GFX6-NEXT: ds_write_b32 v0, v1 3734; GFX6-NEXT: s_endpgm 3735; 3736; GFX7-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3737; GFX7: ; %bb.0: ; %entry 3738; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3739; GFX7-NEXT: s_mov_b32 m0, -1 3740; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3741; GFX7-NEXT: v_mov_b32_e32 v0, s0 3742; GFX7-NEXT: v_mov_b32_e32 v1, s2 3743; GFX7-NEXT: v_mov_b32_e32 v2, s1 3744; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3745; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3746; GFX7-NEXT: ds_write_b32 v0, v1 3747; GFX7-NEXT: s_endpgm 3748; 3749; GFX10-WGP-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3750; GFX10-WGP: ; %bb.0: ; %entry 3751; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3752; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3753; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3754; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3755; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3756; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3757; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3758; GFX10-WGP-NEXT: ds_write_b32 v0, v1 3759; GFX10-WGP-NEXT: s_endpgm 3760; 3761; GFX10-CU-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3762; GFX10-CU: ; %bb.0: ; %entry 3763; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3764; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3765; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 3766; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 3767; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 3768; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3769; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3770; GFX10-CU-NEXT: ds_write_b32 v0, v1 3771; GFX10-CU-NEXT: s_endpgm 3772; 3773; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3774; SKIP-CACHE-INV: ; %bb.0: ; %entry 3775; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3776; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 3777; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3778; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 3779; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 3780; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 3781; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3782; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3783; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 3784; SKIP-CACHE-INV-NEXT: s_endpgm 3785; 3786; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3787; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 3788; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3789; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3790; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3791; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3792; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3793; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3794; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3795; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3796; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 3797; 3798; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3799; GFX90A-TGSPLIT: ; %bb.0: ; %entry 3800; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3801; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3802; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3803; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3804; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3805; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3806; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3807; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 3808; GFX90A-TGSPLIT-NEXT: s_endpgm 3809; 3810; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3811; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 3812; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3813; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3814; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3815; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3816; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3817; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3818; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3819; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3820; GFX940-NOTTGSPLIT-NEXT: s_endpgm 3821; 3822; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg: 3823; GFX940-TGSPLIT: ; %bb.0: ; %entry 3824; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3825; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3826; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3827; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3828; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3829; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3830; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3831; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 3832; GFX940-TGSPLIT-NEXT: s_endpgm 3833 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3834entry: 3835 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3836 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic acquire 3837 %val0 = extractvalue { i32, i1 } %val, 0 3838 store i32 %val0, i32 addrspace(3)* %out, align 4 3839 ret void 3840} 3841 3842define amdgpu_kernel void @local_singlethread_acquire_acquire_ret_cmpxchg( 3843; GFX6-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3844; GFX6: ; %bb.0: ; %entry 3845; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3846; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3847; GFX6-NEXT: s_mov_b32 m0, -1 3848; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3849; GFX6-NEXT: v_mov_b32_e32 v0, s2 3850; GFX6-NEXT: v_mov_b32_e32 v1, s1 3851; GFX6-NEXT: v_mov_b32_e32 v2, s0 3852; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3853; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3854; GFX6-NEXT: ds_write_b32 v0, v1 3855; GFX6-NEXT: s_endpgm 3856; 3857; GFX7-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3858; GFX7: ; %bb.0: ; %entry 3859; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3860; GFX7-NEXT: s_mov_b32 m0, -1 3861; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3862; GFX7-NEXT: v_mov_b32_e32 v0, s0 3863; GFX7-NEXT: v_mov_b32_e32 v1, s2 3864; GFX7-NEXT: v_mov_b32_e32 v2, s1 3865; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3866; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3867; GFX7-NEXT: ds_write_b32 v0, v1 3868; GFX7-NEXT: s_endpgm 3869; 3870; GFX10-WGP-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3871; GFX10-WGP: ; %bb.0: ; %entry 3872; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3873; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3874; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3875; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3876; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3877; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3878; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3879; GFX10-WGP-NEXT: ds_write_b32 v0, v1 3880; GFX10-WGP-NEXT: s_endpgm 3881; 3882; GFX10-CU-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3883; GFX10-CU: ; %bb.0: ; %entry 3884; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3885; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3886; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 3887; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 3888; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 3889; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3890; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 3891; GFX10-CU-NEXT: ds_write_b32 v0, v1 3892; GFX10-CU-NEXT: s_endpgm 3893; 3894; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3895; SKIP-CACHE-INV: ; %bb.0: ; %entry 3896; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3897; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 3898; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3899; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 3900; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 3901; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 3902; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3903; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 3904; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 3905; SKIP-CACHE-INV-NEXT: s_endpgm 3906; 3907; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3908; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 3909; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3910; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3911; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3912; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3913; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3914; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3915; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3916; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3917; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 3918; 3919; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3920; GFX90A-TGSPLIT: ; %bb.0: ; %entry 3921; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3922; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3923; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3924; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3925; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3926; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3927; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3928; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 3929; GFX90A-TGSPLIT-NEXT: s_endpgm 3930; 3931; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3932; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 3933; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3934; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3935; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3936; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3937; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3938; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3939; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3940; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 3941; GFX940-NOTTGSPLIT-NEXT: s_endpgm 3942; 3943; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg: 3944; GFX940-TGSPLIT: ; %bb.0: ; %entry 3945; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 3946; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3947; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 3948; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 3949; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 3950; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3951; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 3952; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 3953; GFX940-TGSPLIT-NEXT: s_endpgm 3954 i32 addrspace(3)* %out, i32 %in, i32 %old) { 3955entry: 3956 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 3957 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire acquire 3958 %val0 = extractvalue { i32, i1 } %val, 0 3959 store i32 %val0, i32 addrspace(3)* %out, align 4 3960 ret void 3961} 3962 3963define amdgpu_kernel void @local_singlethread_release_acquire_ret_cmpxchg( 3964; GFX6-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 3965; GFX6: ; %bb.0: ; %entry 3966; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 3967; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 3968; GFX6-NEXT: s_mov_b32 m0, -1 3969; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3970; GFX6-NEXT: v_mov_b32_e32 v0, s2 3971; GFX6-NEXT: v_mov_b32_e32 v1, s1 3972; GFX6-NEXT: v_mov_b32_e32 v2, s0 3973; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3974; GFX6-NEXT: s_waitcnt lgkmcnt(0) 3975; GFX6-NEXT: ds_write_b32 v0, v1 3976; GFX6-NEXT: s_endpgm 3977; 3978; GFX7-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 3979; GFX7: ; %bb.0: ; %entry 3980; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3981; GFX7-NEXT: s_mov_b32 m0, -1 3982; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3983; GFX7-NEXT: v_mov_b32_e32 v0, s0 3984; GFX7-NEXT: v_mov_b32_e32 v1, s2 3985; GFX7-NEXT: v_mov_b32_e32 v2, s1 3986; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3987; GFX7-NEXT: s_waitcnt lgkmcnt(0) 3988; GFX7-NEXT: ds_write_b32 v0, v1 3989; GFX7-NEXT: s_endpgm 3990; 3991; GFX10-WGP-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 3992; GFX10-WGP: ; %bb.0: ; %entry 3993; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 3994; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 3995; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 3996; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 3997; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 3998; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 3999; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4000; GFX10-WGP-NEXT: ds_write_b32 v0, v1 4001; GFX10-WGP-NEXT: s_endpgm 4002; 4003; GFX10-CU-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 4004; GFX10-CU: ; %bb.0: ; %entry 4005; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4006; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4007; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4008; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 4009; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 4010; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4011; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4012; GFX10-CU-NEXT: ds_write_b32 v0, v1 4013; GFX10-CU-NEXT: s_endpgm 4014; 4015; SKIP-CACHE-INV-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 4016; SKIP-CACHE-INV: ; %bb.0: ; %entry 4017; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4018; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4019; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4020; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4021; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 4022; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 4023; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4024; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4025; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 4026; SKIP-CACHE-INV-NEXT: s_endpgm 4027; 4028; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 4029; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4030; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4031; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4032; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4033; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4034; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4035; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4036; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4037; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4038; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 4039; 4040; GFX90A-TGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 4041; GFX90A-TGSPLIT: ; %bb.0: ; %entry 4042; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4043; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4044; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4045; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4046; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4047; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4048; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4049; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 4050; GFX90A-TGSPLIT-NEXT: s_endpgm 4051; 4052; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 4053; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 4054; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4055; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4056; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4057; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4058; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4059; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4060; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4061; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4062; GFX940-NOTTGSPLIT-NEXT: s_endpgm 4063; 4064; GFX940-TGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg: 4065; GFX940-TGSPLIT: ; %bb.0: ; %entry 4066; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4067; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4068; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4069; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4070; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4071; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4072; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4073; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 4074; GFX940-TGSPLIT-NEXT: s_endpgm 4075 i32 addrspace(3)* %out, i32 %in, i32 %old) { 4076entry: 4077 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 4078 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release acquire 4079 %val0 = extractvalue { i32, i1 } %val, 0 4080 store i32 %val0, i32 addrspace(3)* %out, align 4 4081 ret void 4082} 4083 4084define amdgpu_kernel void @local_singlethread_acq_rel_acquire_ret_cmpxchg( 4085; GFX6-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4086; GFX6: ; %bb.0: ; %entry 4087; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 4088; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 4089; GFX6-NEXT: s_mov_b32 m0, -1 4090; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4091; GFX6-NEXT: v_mov_b32_e32 v0, s2 4092; GFX6-NEXT: v_mov_b32_e32 v1, s1 4093; GFX6-NEXT: v_mov_b32_e32 v2, s0 4094; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4095; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4096; GFX6-NEXT: ds_write_b32 v0, v1 4097; GFX6-NEXT: s_endpgm 4098; 4099; GFX7-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4100; GFX7: ; %bb.0: ; %entry 4101; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4102; GFX7-NEXT: s_mov_b32 m0, -1 4103; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4104; GFX7-NEXT: v_mov_b32_e32 v0, s0 4105; GFX7-NEXT: v_mov_b32_e32 v1, s2 4106; GFX7-NEXT: v_mov_b32_e32 v2, s1 4107; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4108; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4109; GFX7-NEXT: ds_write_b32 v0, v1 4110; GFX7-NEXT: s_endpgm 4111; 4112; GFX10-WGP-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4113; GFX10-WGP: ; %bb.0: ; %entry 4114; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4115; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4116; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 4117; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 4118; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 4119; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4120; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4121; GFX10-WGP-NEXT: ds_write_b32 v0, v1 4122; GFX10-WGP-NEXT: s_endpgm 4123; 4124; GFX10-CU-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4125; GFX10-CU: ; %bb.0: ; %entry 4126; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4127; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4128; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4129; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 4130; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 4131; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4132; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4133; GFX10-CU-NEXT: ds_write_b32 v0, v1 4134; GFX10-CU-NEXT: s_endpgm 4135; 4136; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4137; SKIP-CACHE-INV: ; %bb.0: ; %entry 4138; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4139; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4140; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4141; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4142; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 4143; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 4144; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4145; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4146; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 4147; SKIP-CACHE-INV-NEXT: s_endpgm 4148; 4149; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4150; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4151; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4152; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4153; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4154; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4155; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4156; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4157; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4158; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4159; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 4160; 4161; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4162; GFX90A-TGSPLIT: ; %bb.0: ; %entry 4163; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4164; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4165; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4166; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4167; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4168; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4169; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4170; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 4171; GFX90A-TGSPLIT-NEXT: s_endpgm 4172; 4173; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4174; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 4175; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4176; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4177; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4178; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4179; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4180; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4181; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4182; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4183; GFX940-NOTTGSPLIT-NEXT: s_endpgm 4184; 4185; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg: 4186; GFX940-TGSPLIT: ; %bb.0: ; %entry 4187; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4188; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4189; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4190; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4191; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4192; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4193; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4194; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 4195; GFX940-TGSPLIT-NEXT: s_endpgm 4196 i32 addrspace(3)* %out, i32 %in, i32 %old) { 4197entry: 4198 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 4199 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel acquire 4200 %val0 = extractvalue { i32, i1 } %val, 0 4201 store i32 %val0, i32 addrspace(3)* %out, align 4 4202 ret void 4203} 4204 4205define amdgpu_kernel void @local_singlethread_seq_cst_acquire_ret_cmpxchg( 4206; GFX6-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4207; GFX6: ; %bb.0: ; %entry 4208; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 4209; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 4210; GFX6-NEXT: s_mov_b32 m0, -1 4211; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4212; GFX6-NEXT: v_mov_b32_e32 v0, s2 4213; GFX6-NEXT: v_mov_b32_e32 v1, s1 4214; GFX6-NEXT: v_mov_b32_e32 v2, s0 4215; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4216; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4217; GFX6-NEXT: ds_write_b32 v0, v1 4218; GFX6-NEXT: s_endpgm 4219; 4220; GFX7-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4221; GFX7: ; %bb.0: ; %entry 4222; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4223; GFX7-NEXT: s_mov_b32 m0, -1 4224; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4225; GFX7-NEXT: v_mov_b32_e32 v0, s0 4226; GFX7-NEXT: v_mov_b32_e32 v1, s2 4227; GFX7-NEXT: v_mov_b32_e32 v2, s1 4228; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4229; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4230; GFX7-NEXT: ds_write_b32 v0, v1 4231; GFX7-NEXT: s_endpgm 4232; 4233; GFX10-WGP-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4234; GFX10-WGP: ; %bb.0: ; %entry 4235; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4236; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4237; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 4238; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 4239; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 4240; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4241; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4242; GFX10-WGP-NEXT: ds_write_b32 v0, v1 4243; GFX10-WGP-NEXT: s_endpgm 4244; 4245; GFX10-CU-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4246; GFX10-CU: ; %bb.0: ; %entry 4247; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4248; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4249; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4250; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 4251; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 4252; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4253; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4254; GFX10-CU-NEXT: ds_write_b32 v0, v1 4255; GFX10-CU-NEXT: s_endpgm 4256; 4257; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4258; SKIP-CACHE-INV: ; %bb.0: ; %entry 4259; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4260; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4261; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4262; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4263; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 4264; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 4265; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4266; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4267; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 4268; SKIP-CACHE-INV-NEXT: s_endpgm 4269; 4270; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4271; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4272; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4273; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4274; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4275; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4276; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4277; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4278; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4279; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4280; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 4281; 4282; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4283; GFX90A-TGSPLIT: ; %bb.0: ; %entry 4284; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4285; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4286; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4287; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4288; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4289; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4290; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4291; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 4292; GFX90A-TGSPLIT-NEXT: s_endpgm 4293; 4294; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4295; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 4296; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4297; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4298; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4299; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4300; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4301; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4302; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4303; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4304; GFX940-NOTTGSPLIT-NEXT: s_endpgm 4305; 4306; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg: 4307; GFX940-TGSPLIT: ; %bb.0: ; %entry 4308; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4309; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4310; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4311; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4312; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4313; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4314; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4315; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 4316; GFX940-TGSPLIT-NEXT: s_endpgm 4317 i32 addrspace(3)* %out, i32 %in, i32 %old) { 4318entry: 4319 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 4320 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst acquire 4321 %val0 = extractvalue { i32, i1 } %val, 0 4322 store i32 %val0, i32 addrspace(3)* %out, align 4 4323 ret void 4324} 4325 4326define amdgpu_kernel void @local_singlethread_monotonic_seq_cst_ret_cmpxchg( 4327; GFX6-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4328; GFX6: ; %bb.0: ; %entry 4329; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 4330; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 4331; GFX6-NEXT: s_mov_b32 m0, -1 4332; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4333; GFX6-NEXT: v_mov_b32_e32 v0, s2 4334; GFX6-NEXT: v_mov_b32_e32 v1, s1 4335; GFX6-NEXT: v_mov_b32_e32 v2, s0 4336; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4337; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4338; GFX6-NEXT: ds_write_b32 v0, v1 4339; GFX6-NEXT: s_endpgm 4340; 4341; GFX7-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4342; GFX7: ; %bb.0: ; %entry 4343; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4344; GFX7-NEXT: s_mov_b32 m0, -1 4345; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4346; GFX7-NEXT: v_mov_b32_e32 v0, s0 4347; GFX7-NEXT: v_mov_b32_e32 v1, s2 4348; GFX7-NEXT: v_mov_b32_e32 v2, s1 4349; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4350; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4351; GFX7-NEXT: ds_write_b32 v0, v1 4352; GFX7-NEXT: s_endpgm 4353; 4354; GFX10-WGP-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4355; GFX10-WGP: ; %bb.0: ; %entry 4356; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4357; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4358; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 4359; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 4360; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 4361; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4362; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4363; GFX10-WGP-NEXT: ds_write_b32 v0, v1 4364; GFX10-WGP-NEXT: s_endpgm 4365; 4366; GFX10-CU-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4367; GFX10-CU: ; %bb.0: ; %entry 4368; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4369; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4370; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4371; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 4372; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 4373; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4374; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4375; GFX10-CU-NEXT: ds_write_b32 v0, v1 4376; GFX10-CU-NEXT: s_endpgm 4377; 4378; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4379; SKIP-CACHE-INV: ; %bb.0: ; %entry 4380; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4381; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4382; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4383; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4384; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 4385; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 4386; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4387; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4388; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 4389; SKIP-CACHE-INV-NEXT: s_endpgm 4390; 4391; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4392; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4393; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4394; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4395; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4396; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4397; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4398; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4399; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4400; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4401; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 4402; 4403; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4404; GFX90A-TGSPLIT: ; %bb.0: ; %entry 4405; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4406; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4407; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4408; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4409; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4410; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4411; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4412; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 4413; GFX90A-TGSPLIT-NEXT: s_endpgm 4414; 4415; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4416; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 4417; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4418; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4419; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4420; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4421; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4422; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4423; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4424; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4425; GFX940-NOTTGSPLIT-NEXT: s_endpgm 4426; 4427; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg: 4428; GFX940-TGSPLIT: ; %bb.0: ; %entry 4429; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4430; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4431; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4432; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4433; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4434; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4435; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4436; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 4437; GFX940-TGSPLIT-NEXT: s_endpgm 4438 i32 addrspace(3)* %out, i32 %in, i32 %old) { 4439entry: 4440 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 4441 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic seq_cst 4442 %val0 = extractvalue { i32, i1 } %val, 0 4443 store i32 %val0, i32 addrspace(3)* %out, align 4 4444 ret void 4445} 4446 4447define amdgpu_kernel void @local_singlethread_acquire_seq_cst_ret_cmpxchg( 4448; GFX6-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4449; GFX6: ; %bb.0: ; %entry 4450; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 4451; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 4452; GFX6-NEXT: s_mov_b32 m0, -1 4453; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4454; GFX6-NEXT: v_mov_b32_e32 v0, s2 4455; GFX6-NEXT: v_mov_b32_e32 v1, s1 4456; GFX6-NEXT: v_mov_b32_e32 v2, s0 4457; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4458; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4459; GFX6-NEXT: ds_write_b32 v0, v1 4460; GFX6-NEXT: s_endpgm 4461; 4462; GFX7-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4463; GFX7: ; %bb.0: ; %entry 4464; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4465; GFX7-NEXT: s_mov_b32 m0, -1 4466; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4467; GFX7-NEXT: v_mov_b32_e32 v0, s0 4468; GFX7-NEXT: v_mov_b32_e32 v1, s2 4469; GFX7-NEXT: v_mov_b32_e32 v2, s1 4470; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4471; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4472; GFX7-NEXT: ds_write_b32 v0, v1 4473; GFX7-NEXT: s_endpgm 4474; 4475; GFX10-WGP-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4476; GFX10-WGP: ; %bb.0: ; %entry 4477; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4478; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4479; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 4480; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 4481; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 4482; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4483; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4484; GFX10-WGP-NEXT: ds_write_b32 v0, v1 4485; GFX10-WGP-NEXT: s_endpgm 4486; 4487; GFX10-CU-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4488; GFX10-CU: ; %bb.0: ; %entry 4489; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4490; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4491; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4492; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 4493; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 4494; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4495; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4496; GFX10-CU-NEXT: ds_write_b32 v0, v1 4497; GFX10-CU-NEXT: s_endpgm 4498; 4499; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4500; SKIP-CACHE-INV: ; %bb.0: ; %entry 4501; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4502; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4503; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4504; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4505; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 4506; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 4507; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4508; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4509; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 4510; SKIP-CACHE-INV-NEXT: s_endpgm 4511; 4512; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4513; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4514; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4515; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4516; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4517; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4518; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4519; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4520; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4521; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4522; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 4523; 4524; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4525; GFX90A-TGSPLIT: ; %bb.0: ; %entry 4526; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4527; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4528; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4529; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4530; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4531; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4532; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4533; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 4534; GFX90A-TGSPLIT-NEXT: s_endpgm 4535; 4536; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4537; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 4538; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4539; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4540; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4541; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4542; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4543; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4544; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4545; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4546; GFX940-NOTTGSPLIT-NEXT: s_endpgm 4547; 4548; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg: 4549; GFX940-TGSPLIT: ; %bb.0: ; %entry 4550; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4551; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4552; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4553; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4554; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4555; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4556; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4557; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 4558; GFX940-TGSPLIT-NEXT: s_endpgm 4559 i32 addrspace(3)* %out, i32 %in, i32 %old) { 4560entry: 4561 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 4562 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire seq_cst 4563 %val0 = extractvalue { i32, i1 } %val, 0 4564 store i32 %val0, i32 addrspace(3)* %out, align 4 4565 ret void 4566} 4567 4568define amdgpu_kernel void @local_singlethread_release_seq_cst_ret_cmpxchg( 4569; GFX6-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4570; GFX6: ; %bb.0: ; %entry 4571; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 4572; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 4573; GFX6-NEXT: s_mov_b32 m0, -1 4574; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4575; GFX6-NEXT: v_mov_b32_e32 v0, s2 4576; GFX6-NEXT: v_mov_b32_e32 v1, s1 4577; GFX6-NEXT: v_mov_b32_e32 v2, s0 4578; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4579; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4580; GFX6-NEXT: ds_write_b32 v0, v1 4581; GFX6-NEXT: s_endpgm 4582; 4583; GFX7-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4584; GFX7: ; %bb.0: ; %entry 4585; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4586; GFX7-NEXT: s_mov_b32 m0, -1 4587; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4588; GFX7-NEXT: v_mov_b32_e32 v0, s0 4589; GFX7-NEXT: v_mov_b32_e32 v1, s2 4590; GFX7-NEXT: v_mov_b32_e32 v2, s1 4591; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4592; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4593; GFX7-NEXT: ds_write_b32 v0, v1 4594; GFX7-NEXT: s_endpgm 4595; 4596; GFX10-WGP-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4597; GFX10-WGP: ; %bb.0: ; %entry 4598; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4599; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4600; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 4601; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 4602; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 4603; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4604; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4605; GFX10-WGP-NEXT: ds_write_b32 v0, v1 4606; GFX10-WGP-NEXT: s_endpgm 4607; 4608; GFX10-CU-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4609; GFX10-CU: ; %bb.0: ; %entry 4610; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4611; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4612; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4613; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 4614; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 4615; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4616; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4617; GFX10-CU-NEXT: ds_write_b32 v0, v1 4618; GFX10-CU-NEXT: s_endpgm 4619; 4620; SKIP-CACHE-INV-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4621; SKIP-CACHE-INV: ; %bb.0: ; %entry 4622; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4623; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4624; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4625; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4626; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 4627; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 4628; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4629; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4630; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 4631; SKIP-CACHE-INV-NEXT: s_endpgm 4632; 4633; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4634; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4635; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4636; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4637; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4638; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4639; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4640; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4641; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4642; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4643; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 4644; 4645; GFX90A-TGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4646; GFX90A-TGSPLIT: ; %bb.0: ; %entry 4647; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4648; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4649; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4650; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4651; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4652; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4653; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4654; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 4655; GFX90A-TGSPLIT-NEXT: s_endpgm 4656; 4657; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4658; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 4659; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4660; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4661; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4662; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4663; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4664; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4665; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4666; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4667; GFX940-NOTTGSPLIT-NEXT: s_endpgm 4668; 4669; GFX940-TGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg: 4670; GFX940-TGSPLIT: ; %bb.0: ; %entry 4671; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4672; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4673; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4674; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4675; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4676; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4677; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4678; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 4679; GFX940-TGSPLIT-NEXT: s_endpgm 4680 i32 addrspace(3)* %out, i32 %in, i32 %old) { 4681entry: 4682 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 4683 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release seq_cst 4684 %val0 = extractvalue { i32, i1 } %val, 0 4685 store i32 %val0, i32 addrspace(3)* %out, align 4 4686 ret void 4687} 4688 4689define amdgpu_kernel void @local_singlethread_acq_rel_seq_cst_ret_cmpxchg( 4690; GFX6-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4691; GFX6: ; %bb.0: ; %entry 4692; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 4693; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 4694; GFX6-NEXT: s_mov_b32 m0, -1 4695; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4696; GFX6-NEXT: v_mov_b32_e32 v0, s2 4697; GFX6-NEXT: v_mov_b32_e32 v1, s1 4698; GFX6-NEXT: v_mov_b32_e32 v2, s0 4699; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4700; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4701; GFX6-NEXT: ds_write_b32 v0, v1 4702; GFX6-NEXT: s_endpgm 4703; 4704; GFX7-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4705; GFX7: ; %bb.0: ; %entry 4706; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4707; GFX7-NEXT: s_mov_b32 m0, -1 4708; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4709; GFX7-NEXT: v_mov_b32_e32 v0, s0 4710; GFX7-NEXT: v_mov_b32_e32 v1, s2 4711; GFX7-NEXT: v_mov_b32_e32 v2, s1 4712; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4713; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4714; GFX7-NEXT: ds_write_b32 v0, v1 4715; GFX7-NEXT: s_endpgm 4716; 4717; GFX10-WGP-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4718; GFX10-WGP: ; %bb.0: ; %entry 4719; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4720; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4721; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 4722; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 4723; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 4724; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4725; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4726; GFX10-WGP-NEXT: ds_write_b32 v0, v1 4727; GFX10-WGP-NEXT: s_endpgm 4728; 4729; GFX10-CU-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4730; GFX10-CU: ; %bb.0: ; %entry 4731; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4732; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4733; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4734; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 4735; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 4736; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4737; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4738; GFX10-CU-NEXT: ds_write_b32 v0, v1 4739; GFX10-CU-NEXT: s_endpgm 4740; 4741; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4742; SKIP-CACHE-INV: ; %bb.0: ; %entry 4743; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4744; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4745; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4746; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4747; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 4748; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 4749; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4750; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4751; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 4752; SKIP-CACHE-INV-NEXT: s_endpgm 4753; 4754; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4755; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4756; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4757; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4758; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4759; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4760; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4761; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4762; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4763; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4764; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 4765; 4766; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4767; GFX90A-TGSPLIT: ; %bb.0: ; %entry 4768; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4769; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4770; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4771; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4772; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4773; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4774; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4775; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 4776; GFX90A-TGSPLIT-NEXT: s_endpgm 4777; 4778; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4779; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 4780; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4781; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4782; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4783; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4784; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4785; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4786; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4787; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4788; GFX940-NOTTGSPLIT-NEXT: s_endpgm 4789; 4790; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg: 4791; GFX940-TGSPLIT: ; %bb.0: ; %entry 4792; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4793; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4794; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4795; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4796; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4797; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4798; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4799; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 4800; GFX940-TGSPLIT-NEXT: s_endpgm 4801 i32 addrspace(3)* %out, i32 %in, i32 %old) { 4802entry: 4803 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 4804 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel seq_cst 4805 %val0 = extractvalue { i32, i1 } %val, 0 4806 store i32 %val0, i32 addrspace(3)* %out, align 4 4807 ret void 4808} 4809 4810define amdgpu_kernel void @local_singlethread_seq_cst_seq_cst_ret_cmpxchg( 4811; GFX6-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4812; GFX6: ; %bb.0: ; %entry 4813; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 4814; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 4815; GFX6-NEXT: s_mov_b32 m0, -1 4816; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4817; GFX6-NEXT: v_mov_b32_e32 v0, s2 4818; GFX6-NEXT: v_mov_b32_e32 v1, s1 4819; GFX6-NEXT: v_mov_b32_e32 v2, s0 4820; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4821; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4822; GFX6-NEXT: ds_write_b32 v0, v1 4823; GFX6-NEXT: s_endpgm 4824; 4825; GFX7-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4826; GFX7: ; %bb.0: ; %entry 4827; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4828; GFX7-NEXT: s_mov_b32 m0, -1 4829; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4830; GFX7-NEXT: v_mov_b32_e32 v0, s0 4831; GFX7-NEXT: v_mov_b32_e32 v1, s2 4832; GFX7-NEXT: v_mov_b32_e32 v2, s1 4833; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4834; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4835; GFX7-NEXT: ds_write_b32 v0, v1 4836; GFX7-NEXT: s_endpgm 4837; 4838; GFX10-WGP-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4839; GFX10-WGP: ; %bb.0: ; %entry 4840; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4841; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4842; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 4843; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 4844; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 4845; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4846; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4847; GFX10-WGP-NEXT: ds_write_b32 v0, v1 4848; GFX10-WGP-NEXT: s_endpgm 4849; 4850; GFX10-CU-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4851; GFX10-CU: ; %bb.0: ; %entry 4852; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4853; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4854; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4855; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 4856; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 4857; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4858; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4859; GFX10-CU-NEXT: ds_write_b32 v0, v1 4860; GFX10-CU-NEXT: s_endpgm 4861; 4862; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4863; SKIP-CACHE-INV: ; %bb.0: ; %entry 4864; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4865; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4866; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4867; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4868; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 4869; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 4870; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4871; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4872; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 4873; SKIP-CACHE-INV-NEXT: s_endpgm 4874; 4875; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4876; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4877; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4878; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4879; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4880; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4881; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4882; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4883; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4884; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4885; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 4886; 4887; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4888; GFX90A-TGSPLIT: ; %bb.0: ; %entry 4889; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 4890; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4891; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4892; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4893; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4894; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4895; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4896; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 4897; GFX90A-TGSPLIT-NEXT: s_endpgm 4898; 4899; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4900; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 4901; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4902; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4903; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4904; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4905; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4906; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4907; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4908; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 4909; GFX940-NOTTGSPLIT-NEXT: s_endpgm 4910; 4911; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg: 4912; GFX940-TGSPLIT: ; %bb.0: ; %entry 4913; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 4914; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4915; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4916; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 4917; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 4918; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 4919; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4920; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 4921; GFX940-TGSPLIT-NEXT: s_endpgm 4922 i32 addrspace(3)* %out, i32 %in, i32 %old) { 4923entry: 4924 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 4925 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst seq_cst 4926 %val0 = extractvalue { i32, i1 } %val, 0 4927 store i32 %val0, i32 addrspace(3)* %out, align 4 4928 ret void 4929} 4930 4931define amdgpu_kernel void @local_singlethread_one_as_unordered_load( 4932; GFX6-LABEL: local_singlethread_one_as_unordered_load: 4933; GFX6: ; %bb.0: ; %entry 4934; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 4935; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 4936; GFX6-NEXT: s_mov_b32 m0, -1 4937; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4938; GFX6-NEXT: v_mov_b32_e32 v0, s0 4939; GFX6-NEXT: ds_read_b32 v0, v0 4940; GFX6-NEXT: v_mov_b32_e32 v1, s1 4941; GFX6-NEXT: s_waitcnt lgkmcnt(0) 4942; GFX6-NEXT: ds_write_b32 v1, v0 4943; GFX6-NEXT: s_endpgm 4944; 4945; GFX7-LABEL: local_singlethread_one_as_unordered_load: 4946; GFX7: ; %bb.0: ; %entry 4947; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 4948; GFX7-NEXT: s_mov_b32 m0, -1 4949; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4950; GFX7-NEXT: v_mov_b32_e32 v0, s0 4951; GFX7-NEXT: ds_read_b32 v0, v0 4952; GFX7-NEXT: v_mov_b32_e32 v1, s1 4953; GFX7-NEXT: s_waitcnt lgkmcnt(0) 4954; GFX7-NEXT: ds_write_b32 v1, v0 4955; GFX7-NEXT: s_endpgm 4956; 4957; GFX10-WGP-LABEL: local_singlethread_one_as_unordered_load: 4958; GFX10-WGP: ; %bb.0: ; %entry 4959; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 4960; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4961; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 4962; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 4963; GFX10-WGP-NEXT: ds_read_b32 v0, v0 4964; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 4965; GFX10-WGP-NEXT: ds_write_b32 v1, v0 4966; GFX10-WGP-NEXT: s_endpgm 4967; 4968; GFX10-CU-LABEL: local_singlethread_one_as_unordered_load: 4969; GFX10-CU: ; %bb.0: ; %entry 4970; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 4971; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4972; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 4973; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 4974; GFX10-CU-NEXT: ds_read_b32 v0, v0 4975; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 4976; GFX10-CU-NEXT: ds_write_b32 v1, v0 4977; GFX10-CU-NEXT: s_endpgm 4978; 4979; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_unordered_load: 4980; SKIP-CACHE-INV: ; %bb.0: ; %entry 4981; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 4982; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 4983; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4984; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 4985; SKIP-CACHE-INV-NEXT: ds_read_b32 v0, v0 4986; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 4987; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 4988; SKIP-CACHE-INV-NEXT: ds_write_b32 v1, v0 4989; SKIP-CACHE-INV-NEXT: s_endpgm 4990; 4991; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_load: 4992; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 4993; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 4994; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4995; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 4996; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 4997; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 4998; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 4999; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 5000; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5001; 5002; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_unordered_load: 5003; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5004; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5005; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5006; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5007; GFX90A-TGSPLIT-NEXT: ds_read_b32 v0, v0 5008; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5009; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5010; GFX90A-TGSPLIT-NEXT: ds_write_b32 v1, v0 5011; GFX90A-TGSPLIT-NEXT: s_endpgm 5012; 5013; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_load: 5014; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5015; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5016; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5017; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5018; GFX940-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 5019; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5020; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5021; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 5022; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5023; 5024; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_unordered_load: 5025; GFX940-TGSPLIT: ; %bb.0: ; %entry 5026; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5027; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5028; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5029; GFX940-TGSPLIT-NEXT: ds_read_b32 v0, v0 5030; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5031; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5032; GFX940-TGSPLIT-NEXT: ds_write_b32 v1, v0 5033; GFX940-TGSPLIT-NEXT: s_endpgm 5034 i32 addrspace(3)* %in, i32 addrspace(3)* %out) { 5035entry: 5036 %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread-one-as") unordered, align 4 5037 store i32 %val, i32 addrspace(3)* %out 5038 ret void 5039} 5040 5041define amdgpu_kernel void @local_singlethread_one_as_monotonic_load( 5042; GFX6-LABEL: local_singlethread_one_as_monotonic_load: 5043; GFX6: ; %bb.0: ; %entry 5044; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 5045; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 5046; GFX6-NEXT: s_mov_b32 m0, -1 5047; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5048; GFX6-NEXT: v_mov_b32_e32 v0, s0 5049; GFX6-NEXT: ds_read_b32 v0, v0 5050; GFX6-NEXT: v_mov_b32_e32 v1, s1 5051; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5052; GFX6-NEXT: ds_write_b32 v1, v0 5053; GFX6-NEXT: s_endpgm 5054; 5055; GFX7-LABEL: local_singlethread_one_as_monotonic_load: 5056; GFX7: ; %bb.0: ; %entry 5057; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5058; GFX7-NEXT: s_mov_b32 m0, -1 5059; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5060; GFX7-NEXT: v_mov_b32_e32 v0, s0 5061; GFX7-NEXT: ds_read_b32 v0, v0 5062; GFX7-NEXT: v_mov_b32_e32 v1, s1 5063; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5064; GFX7-NEXT: ds_write_b32 v1, v0 5065; GFX7-NEXT: s_endpgm 5066; 5067; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_load: 5068; GFX10-WGP: ; %bb.0: ; %entry 5069; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5070; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5071; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 5072; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 5073; GFX10-WGP-NEXT: ds_read_b32 v0, v0 5074; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5075; GFX10-WGP-NEXT: ds_write_b32 v1, v0 5076; GFX10-WGP-NEXT: s_endpgm 5077; 5078; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_load: 5079; GFX10-CU: ; %bb.0: ; %entry 5080; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5081; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5082; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 5083; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 5084; GFX10-CU-NEXT: ds_read_b32 v0, v0 5085; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5086; GFX10-CU-NEXT: ds_write_b32 v1, v0 5087; GFX10-CU-NEXT: s_endpgm 5088; 5089; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_load: 5090; SKIP-CACHE-INV: ; %bb.0: ; %entry 5091; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5092; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5093; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5094; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 5095; SKIP-CACHE-INV-NEXT: ds_read_b32 v0, v0 5096; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 5097; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5098; SKIP-CACHE-INV-NEXT: ds_write_b32 v1, v0 5099; SKIP-CACHE-INV-NEXT: s_endpgm 5100; 5101; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_load: 5102; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5103; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5104; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5105; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5106; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 5107; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5108; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5109; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 5110; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5111; 5112; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_load: 5113; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5114; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5115; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5116; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5117; GFX90A-TGSPLIT-NEXT: ds_read_b32 v0, v0 5118; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5119; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5120; GFX90A-TGSPLIT-NEXT: ds_write_b32 v1, v0 5121; GFX90A-TGSPLIT-NEXT: s_endpgm 5122; 5123; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_load: 5124; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5125; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5126; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5127; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5128; GFX940-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 5129; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5130; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5131; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 5132; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5133; 5134; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_load: 5135; GFX940-TGSPLIT: ; %bb.0: ; %entry 5136; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5137; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5138; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5139; GFX940-TGSPLIT-NEXT: ds_read_b32 v0, v0 5140; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5141; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5142; GFX940-TGSPLIT-NEXT: ds_write_b32 v1, v0 5143; GFX940-TGSPLIT-NEXT: s_endpgm 5144 i32 addrspace(3)* %in, i32 addrspace(3)* %out) { 5145entry: 5146 %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread-one-as") monotonic, align 4 5147 store i32 %val, i32 addrspace(3)* %out 5148 ret void 5149} 5150 5151define amdgpu_kernel void @local_singlethread_one_as_acquire_load( 5152; GFX6-LABEL: local_singlethread_one_as_acquire_load: 5153; GFX6: ; %bb.0: ; %entry 5154; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 5155; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 5156; GFX6-NEXT: s_mov_b32 m0, -1 5157; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5158; GFX6-NEXT: v_mov_b32_e32 v0, s0 5159; GFX6-NEXT: ds_read_b32 v0, v0 5160; GFX6-NEXT: v_mov_b32_e32 v1, s1 5161; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5162; GFX6-NEXT: ds_write_b32 v1, v0 5163; GFX6-NEXT: s_endpgm 5164; 5165; GFX7-LABEL: local_singlethread_one_as_acquire_load: 5166; GFX7: ; %bb.0: ; %entry 5167; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5168; GFX7-NEXT: s_mov_b32 m0, -1 5169; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5170; GFX7-NEXT: v_mov_b32_e32 v0, s0 5171; GFX7-NEXT: ds_read_b32 v0, v0 5172; GFX7-NEXT: v_mov_b32_e32 v1, s1 5173; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5174; GFX7-NEXT: ds_write_b32 v1, v0 5175; GFX7-NEXT: s_endpgm 5176; 5177; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_load: 5178; GFX10-WGP: ; %bb.0: ; %entry 5179; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5180; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5181; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 5182; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 5183; GFX10-WGP-NEXT: ds_read_b32 v0, v0 5184; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5185; GFX10-WGP-NEXT: ds_write_b32 v1, v0 5186; GFX10-WGP-NEXT: s_endpgm 5187; 5188; GFX10-CU-LABEL: local_singlethread_one_as_acquire_load: 5189; GFX10-CU: ; %bb.0: ; %entry 5190; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5191; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5192; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 5193; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 5194; GFX10-CU-NEXT: ds_read_b32 v0, v0 5195; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5196; GFX10-CU-NEXT: ds_write_b32 v1, v0 5197; GFX10-CU-NEXT: s_endpgm 5198; 5199; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_load: 5200; SKIP-CACHE-INV: ; %bb.0: ; %entry 5201; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5202; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5203; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5204; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 5205; SKIP-CACHE-INV-NEXT: ds_read_b32 v0, v0 5206; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 5207; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5208; SKIP-CACHE-INV-NEXT: ds_write_b32 v1, v0 5209; SKIP-CACHE-INV-NEXT: s_endpgm 5210; 5211; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_load: 5212; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5213; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5214; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5215; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5216; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 5217; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5218; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5219; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 5220; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5221; 5222; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_load: 5223; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5224; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5225; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5226; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5227; GFX90A-TGSPLIT-NEXT: ds_read_b32 v0, v0 5228; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5229; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5230; GFX90A-TGSPLIT-NEXT: ds_write_b32 v1, v0 5231; GFX90A-TGSPLIT-NEXT: s_endpgm 5232; 5233; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_load: 5234; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5235; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5236; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5237; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5238; GFX940-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 5239; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5240; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5241; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 5242; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5243; 5244; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_load: 5245; GFX940-TGSPLIT: ; %bb.0: ; %entry 5246; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5247; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5248; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5249; GFX940-TGSPLIT-NEXT: ds_read_b32 v0, v0 5250; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5251; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5252; GFX940-TGSPLIT-NEXT: ds_write_b32 v1, v0 5253; GFX940-TGSPLIT-NEXT: s_endpgm 5254 i32 addrspace(3)* %in, i32 addrspace(3)* %out) { 5255entry: 5256 %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread-one-as") acquire, align 4 5257 store i32 %val, i32 addrspace(3)* %out 5258 ret void 5259} 5260 5261define amdgpu_kernel void @local_singlethread_one_as_seq_cst_load( 5262; GFX6-LABEL: local_singlethread_one_as_seq_cst_load: 5263; GFX6: ; %bb.0: ; %entry 5264; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 5265; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 5266; GFX6-NEXT: s_mov_b32 m0, -1 5267; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5268; GFX6-NEXT: v_mov_b32_e32 v0, s0 5269; GFX6-NEXT: ds_read_b32 v0, v0 5270; GFX6-NEXT: v_mov_b32_e32 v1, s1 5271; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5272; GFX6-NEXT: ds_write_b32 v1, v0 5273; GFX6-NEXT: s_endpgm 5274; 5275; GFX7-LABEL: local_singlethread_one_as_seq_cst_load: 5276; GFX7: ; %bb.0: ; %entry 5277; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5278; GFX7-NEXT: s_mov_b32 m0, -1 5279; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5280; GFX7-NEXT: v_mov_b32_e32 v0, s0 5281; GFX7-NEXT: ds_read_b32 v0, v0 5282; GFX7-NEXT: v_mov_b32_e32 v1, s1 5283; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5284; GFX7-NEXT: ds_write_b32 v1, v0 5285; GFX7-NEXT: s_endpgm 5286; 5287; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_load: 5288; GFX10-WGP: ; %bb.0: ; %entry 5289; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5290; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5291; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 5292; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 5293; GFX10-WGP-NEXT: ds_read_b32 v0, v0 5294; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5295; GFX10-WGP-NEXT: ds_write_b32 v1, v0 5296; GFX10-WGP-NEXT: s_endpgm 5297; 5298; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_load: 5299; GFX10-CU: ; %bb.0: ; %entry 5300; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5301; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5302; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 5303; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 5304; GFX10-CU-NEXT: ds_read_b32 v0, v0 5305; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5306; GFX10-CU-NEXT: ds_write_b32 v1, v0 5307; GFX10-CU-NEXT: s_endpgm 5308; 5309; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_load: 5310; SKIP-CACHE-INV: ; %bb.0: ; %entry 5311; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5312; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5313; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5314; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 5315; SKIP-CACHE-INV-NEXT: ds_read_b32 v0, v0 5316; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 5317; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5318; SKIP-CACHE-INV-NEXT: ds_write_b32 v1, v0 5319; SKIP-CACHE-INV-NEXT: s_endpgm 5320; 5321; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load: 5322; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5323; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5324; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5325; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5326; GFX90A-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 5327; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5328; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5329; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 5330; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5331; 5332; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load: 5333; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5334; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5335; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5336; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5337; GFX90A-TGSPLIT-NEXT: ds_read_b32 v0, v0 5338; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5339; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5340; GFX90A-TGSPLIT-NEXT: ds_write_b32 v1, v0 5341; GFX90A-TGSPLIT-NEXT: s_endpgm 5342; 5343; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load: 5344; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5345; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5346; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5347; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5348; GFX940-NOTTGSPLIT-NEXT: ds_read_b32 v0, v0 5349; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5350; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5351; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v1, v0 5352; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5353; 5354; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load: 5355; GFX940-TGSPLIT: ; %bb.0: ; %entry 5356; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5357; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5358; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5359; GFX940-TGSPLIT-NEXT: ds_read_b32 v0, v0 5360; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5361; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5362; GFX940-TGSPLIT-NEXT: ds_write_b32 v1, v0 5363; GFX940-TGSPLIT-NEXT: s_endpgm 5364 i32 addrspace(3)* %in, i32 addrspace(3)* %out) { 5365entry: 5366 %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread-one-as") seq_cst, align 4 5367 store i32 %val, i32 addrspace(3)* %out 5368 ret void 5369} 5370 5371define amdgpu_kernel void @local_singlethread_one_as_unordered_store( 5372; GFX6-LABEL: local_singlethread_one_as_unordered_store: 5373; GFX6: ; %bb.0: ; %entry 5374; GFX6-NEXT: s_load_dword s0, s[4:5], 0x1 5375; GFX6-NEXT: s_load_dword s1, s[4:5], 0x0 5376; GFX6-NEXT: s_mov_b32 m0, -1 5377; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5378; GFX6-NEXT: v_mov_b32_e32 v0, s0 5379; GFX6-NEXT: v_mov_b32_e32 v1, s1 5380; GFX6-NEXT: ds_write_b32 v0, v1 5381; GFX6-NEXT: s_endpgm 5382; 5383; GFX7-LABEL: local_singlethread_one_as_unordered_store: 5384; GFX7: ; %bb.0: ; %entry 5385; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5386; GFX7-NEXT: s_mov_b32 m0, -1 5387; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5388; GFX7-NEXT: v_mov_b32_e32 v0, s1 5389; GFX7-NEXT: v_mov_b32_e32 v1, s0 5390; GFX7-NEXT: ds_write_b32 v0, v1 5391; GFX7-NEXT: s_endpgm 5392; 5393; GFX10-WGP-LABEL: local_singlethread_one_as_unordered_store: 5394; GFX10-WGP: ; %bb.0: ; %entry 5395; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5396; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5397; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s1 5398; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s0 5399; GFX10-WGP-NEXT: ds_write_b32 v0, v1 5400; GFX10-WGP-NEXT: s_endpgm 5401; 5402; GFX10-CU-LABEL: local_singlethread_one_as_unordered_store: 5403; GFX10-CU: ; %bb.0: ; %entry 5404; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5405; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5406; GFX10-CU-NEXT: v_mov_b32_e32 v0, s1 5407; GFX10-CU-NEXT: v_mov_b32_e32 v1, s0 5408; GFX10-CU-NEXT: ds_write_b32 v0, v1 5409; GFX10-CU-NEXT: s_endpgm 5410; 5411; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_unordered_store: 5412; SKIP-CACHE-INV: ; %bb.0: ; %entry 5413; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5414; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5415; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5416; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1 5417; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0 5418; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 5419; SKIP-CACHE-INV-NEXT: s_endpgm 5420; 5421; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_store: 5422; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5423; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5424; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5425; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5426; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5427; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 5428; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5429; 5430; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_unordered_store: 5431; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5432; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5433; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5434; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5435; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5436; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 5437; GFX90A-TGSPLIT-NEXT: s_endpgm 5438; 5439; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_store: 5440; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5441; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5442; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5443; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5444; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5445; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 5446; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5447; 5448; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_unordered_store: 5449; GFX940-TGSPLIT: ; %bb.0: ; %entry 5450; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5451; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5452; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5453; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5454; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 5455; GFX940-TGSPLIT-NEXT: s_endpgm 5456 i32 %in, i32 addrspace(3)* %out) { 5457entry: 5458 store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread-one-as") unordered, align 4 5459 ret void 5460} 5461 5462define amdgpu_kernel void @local_singlethread_one_as_monotonic_store( 5463; GFX6-LABEL: local_singlethread_one_as_monotonic_store: 5464; GFX6: ; %bb.0: ; %entry 5465; GFX6-NEXT: s_load_dword s0, s[4:5], 0x1 5466; GFX6-NEXT: s_load_dword s1, s[4:5], 0x0 5467; GFX6-NEXT: s_mov_b32 m0, -1 5468; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5469; GFX6-NEXT: v_mov_b32_e32 v0, s0 5470; GFX6-NEXT: v_mov_b32_e32 v1, s1 5471; GFX6-NEXT: ds_write_b32 v0, v1 5472; GFX6-NEXT: s_endpgm 5473; 5474; GFX7-LABEL: local_singlethread_one_as_monotonic_store: 5475; GFX7: ; %bb.0: ; %entry 5476; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5477; GFX7-NEXT: s_mov_b32 m0, -1 5478; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5479; GFX7-NEXT: v_mov_b32_e32 v0, s1 5480; GFX7-NEXT: v_mov_b32_e32 v1, s0 5481; GFX7-NEXT: ds_write_b32 v0, v1 5482; GFX7-NEXT: s_endpgm 5483; 5484; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_store: 5485; GFX10-WGP: ; %bb.0: ; %entry 5486; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5487; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5488; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s1 5489; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s0 5490; GFX10-WGP-NEXT: ds_write_b32 v0, v1 5491; GFX10-WGP-NEXT: s_endpgm 5492; 5493; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_store: 5494; GFX10-CU: ; %bb.0: ; %entry 5495; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5496; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5497; GFX10-CU-NEXT: v_mov_b32_e32 v0, s1 5498; GFX10-CU-NEXT: v_mov_b32_e32 v1, s0 5499; GFX10-CU-NEXT: ds_write_b32 v0, v1 5500; GFX10-CU-NEXT: s_endpgm 5501; 5502; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_store: 5503; SKIP-CACHE-INV: ; %bb.0: ; %entry 5504; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5505; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5506; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5507; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1 5508; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0 5509; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 5510; SKIP-CACHE-INV-NEXT: s_endpgm 5511; 5512; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_store: 5513; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5514; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5515; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5516; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5517; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5518; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 5519; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5520; 5521; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_store: 5522; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5523; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5524; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5525; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5526; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5527; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 5528; GFX90A-TGSPLIT-NEXT: s_endpgm 5529; 5530; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_store: 5531; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5532; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5533; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5534; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5535; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5536; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 5537; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5538; 5539; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_store: 5540; GFX940-TGSPLIT: ; %bb.0: ; %entry 5541; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5542; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5543; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5544; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5545; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 5546; GFX940-TGSPLIT-NEXT: s_endpgm 5547 i32 %in, i32 addrspace(3)* %out) { 5548entry: 5549 store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread-one-as") monotonic, align 4 5550 ret void 5551} 5552 5553define amdgpu_kernel void @local_singlethread_one_as_release_store( 5554; GFX6-LABEL: local_singlethread_one_as_release_store: 5555; GFX6: ; %bb.0: ; %entry 5556; GFX6-NEXT: s_load_dword s0, s[4:5], 0x1 5557; GFX6-NEXT: s_load_dword s1, s[4:5], 0x0 5558; GFX6-NEXT: s_mov_b32 m0, -1 5559; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5560; GFX6-NEXT: v_mov_b32_e32 v0, s0 5561; GFX6-NEXT: v_mov_b32_e32 v1, s1 5562; GFX6-NEXT: ds_write_b32 v0, v1 5563; GFX6-NEXT: s_endpgm 5564; 5565; GFX7-LABEL: local_singlethread_one_as_release_store: 5566; GFX7: ; %bb.0: ; %entry 5567; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5568; GFX7-NEXT: s_mov_b32 m0, -1 5569; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5570; GFX7-NEXT: v_mov_b32_e32 v0, s1 5571; GFX7-NEXT: v_mov_b32_e32 v1, s0 5572; GFX7-NEXT: ds_write_b32 v0, v1 5573; GFX7-NEXT: s_endpgm 5574; 5575; GFX10-WGP-LABEL: local_singlethread_one_as_release_store: 5576; GFX10-WGP: ; %bb.0: ; %entry 5577; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5578; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5579; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s1 5580; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s0 5581; GFX10-WGP-NEXT: ds_write_b32 v0, v1 5582; GFX10-WGP-NEXT: s_endpgm 5583; 5584; GFX10-CU-LABEL: local_singlethread_one_as_release_store: 5585; GFX10-CU: ; %bb.0: ; %entry 5586; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5587; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5588; GFX10-CU-NEXT: v_mov_b32_e32 v0, s1 5589; GFX10-CU-NEXT: v_mov_b32_e32 v1, s0 5590; GFX10-CU-NEXT: ds_write_b32 v0, v1 5591; GFX10-CU-NEXT: s_endpgm 5592; 5593; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_store: 5594; SKIP-CACHE-INV: ; %bb.0: ; %entry 5595; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5596; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5597; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5598; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1 5599; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0 5600; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 5601; SKIP-CACHE-INV-NEXT: s_endpgm 5602; 5603; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_store: 5604; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5605; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5606; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5607; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5608; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5609; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 5610; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5611; 5612; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_store: 5613; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5614; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5615; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5616; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5617; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5618; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 5619; GFX90A-TGSPLIT-NEXT: s_endpgm 5620; 5621; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_store: 5622; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5623; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5624; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5625; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5626; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5627; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 5628; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5629; 5630; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_store: 5631; GFX940-TGSPLIT: ; %bb.0: ; %entry 5632; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5633; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5634; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5635; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5636; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 5637; GFX940-TGSPLIT-NEXT: s_endpgm 5638 i32 %in, i32 addrspace(3)* %out) { 5639entry: 5640 store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread-one-as") release, align 4 5641 ret void 5642} 5643 5644define amdgpu_kernel void @local_singlethread_one_as_seq_cst_store( 5645; GFX6-LABEL: local_singlethread_one_as_seq_cst_store: 5646; GFX6: ; %bb.0: ; %entry 5647; GFX6-NEXT: s_load_dword s0, s[4:5], 0x1 5648; GFX6-NEXT: s_load_dword s1, s[4:5], 0x0 5649; GFX6-NEXT: s_mov_b32 m0, -1 5650; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5651; GFX6-NEXT: v_mov_b32_e32 v0, s0 5652; GFX6-NEXT: v_mov_b32_e32 v1, s1 5653; GFX6-NEXT: ds_write_b32 v0, v1 5654; GFX6-NEXT: s_endpgm 5655; 5656; GFX7-LABEL: local_singlethread_one_as_seq_cst_store: 5657; GFX7: ; %bb.0: ; %entry 5658; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5659; GFX7-NEXT: s_mov_b32 m0, -1 5660; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5661; GFX7-NEXT: v_mov_b32_e32 v0, s1 5662; GFX7-NEXT: v_mov_b32_e32 v1, s0 5663; GFX7-NEXT: ds_write_b32 v0, v1 5664; GFX7-NEXT: s_endpgm 5665; 5666; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_store: 5667; GFX10-WGP: ; %bb.0: ; %entry 5668; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5669; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5670; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s1 5671; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s0 5672; GFX10-WGP-NEXT: ds_write_b32 v0, v1 5673; GFX10-WGP-NEXT: s_endpgm 5674; 5675; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_store: 5676; GFX10-CU: ; %bb.0: ; %entry 5677; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5678; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5679; GFX10-CU-NEXT: v_mov_b32_e32 v0, s1 5680; GFX10-CU-NEXT: v_mov_b32_e32 v1, s0 5681; GFX10-CU-NEXT: ds_write_b32 v0, v1 5682; GFX10-CU-NEXT: s_endpgm 5683; 5684; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_store: 5685; SKIP-CACHE-INV: ; %bb.0: ; %entry 5686; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5687; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5688; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5689; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s1 5690; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s0 5691; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 5692; SKIP-CACHE-INV-NEXT: s_endpgm 5693; 5694; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store: 5695; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5696; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5697; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5698; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5699; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5700; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 5701; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5702; 5703; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store: 5704; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5705; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5706; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5707; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5708; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5709; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 5710; GFX90A-TGSPLIT-NEXT: s_endpgm 5711; 5712; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store: 5713; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5714; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5715; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5716; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5717; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5718; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 5719; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5720; 5721; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store: 5722; GFX940-TGSPLIT: ; %bb.0: ; %entry 5723; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5724; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5725; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s1 5726; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s0 5727; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 5728; GFX940-TGSPLIT-NEXT: s_endpgm 5729 i32 %in, i32 addrspace(3)* %out) { 5730entry: 5731 store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread-one-as") seq_cst, align 4 5732 ret void 5733} 5734 5735define amdgpu_kernel void @local_singlethread_one_as_monotonic_atomicrmw( 5736; GFX6-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5737; GFX6: ; %bb.0: ; %entry 5738; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 5739; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 5740; GFX6-NEXT: s_mov_b32 m0, -1 5741; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5742; GFX6-NEXT: v_mov_b32_e32 v0, s0 5743; GFX6-NEXT: v_mov_b32_e32 v1, s1 5744; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5745; GFX6-NEXT: s_endpgm 5746; 5747; GFX7-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5748; GFX7: ; %bb.0: ; %entry 5749; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5750; GFX7-NEXT: s_mov_b32 m0, -1 5751; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5752; GFX7-NEXT: v_mov_b32_e32 v0, s0 5753; GFX7-NEXT: v_mov_b32_e32 v1, s1 5754; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5755; GFX7-NEXT: s_endpgm 5756; 5757; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5758; GFX10-WGP: ; %bb.0: ; %entry 5759; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5760; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5761; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 5762; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 5763; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5764; GFX10-WGP-NEXT: s_endpgm 5765; 5766; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5767; GFX10-CU: ; %bb.0: ; %entry 5768; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5769; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5770; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 5771; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 5772; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5773; GFX10-CU-NEXT: s_endpgm 5774; 5775; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5776; SKIP-CACHE-INV: ; %bb.0: ; %entry 5777; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5778; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5779; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5780; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 5781; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 5782; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5783; SKIP-CACHE-INV-NEXT: s_endpgm 5784; 5785; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5786; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5787; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5788; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5789; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5790; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5791; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5792; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5793; 5794; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5795; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5796; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5797; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5798; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5799; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5800; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5801; GFX90A-TGSPLIT-NEXT: s_endpgm 5802; 5803; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5804; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5805; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5806; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5807; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5808; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5809; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5810; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5811; 5812; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw: 5813; GFX940-TGSPLIT: ; %bb.0: ; %entry 5814; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5815; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5816; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5817; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5818; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5819; GFX940-TGSPLIT-NEXT: s_endpgm 5820 i32 addrspace(3)* %out, i32 %in) { 5821entry: 5822 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") monotonic 5823 ret void 5824} 5825 5826define amdgpu_kernel void @local_singlethread_one_as_acquire_atomicrmw( 5827; GFX6-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5828; GFX6: ; %bb.0: ; %entry 5829; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 5830; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 5831; GFX6-NEXT: s_mov_b32 m0, -1 5832; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5833; GFX6-NEXT: v_mov_b32_e32 v0, s0 5834; GFX6-NEXT: v_mov_b32_e32 v1, s1 5835; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5836; GFX6-NEXT: s_endpgm 5837; 5838; GFX7-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5839; GFX7: ; %bb.0: ; %entry 5840; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5841; GFX7-NEXT: s_mov_b32 m0, -1 5842; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5843; GFX7-NEXT: v_mov_b32_e32 v0, s0 5844; GFX7-NEXT: v_mov_b32_e32 v1, s1 5845; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5846; GFX7-NEXT: s_endpgm 5847; 5848; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5849; GFX10-WGP: ; %bb.0: ; %entry 5850; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5851; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5852; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 5853; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 5854; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5855; GFX10-WGP-NEXT: s_endpgm 5856; 5857; GFX10-CU-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5858; GFX10-CU: ; %bb.0: ; %entry 5859; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5860; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5861; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 5862; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 5863; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5864; GFX10-CU-NEXT: s_endpgm 5865; 5866; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5867; SKIP-CACHE-INV: ; %bb.0: ; %entry 5868; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5869; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5870; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5871; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 5872; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 5873; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5874; SKIP-CACHE-INV-NEXT: s_endpgm 5875; 5876; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5877; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5878; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5879; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5880; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5881; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5882; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5883; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5884; 5885; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5886; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5887; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5888; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5889; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5890; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5891; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5892; GFX90A-TGSPLIT-NEXT: s_endpgm 5893; 5894; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5895; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5896; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5897; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5898; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5899; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5900; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5901; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5902; 5903; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw: 5904; GFX940-TGSPLIT: ; %bb.0: ; %entry 5905; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5906; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5907; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5908; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5909; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5910; GFX940-TGSPLIT-NEXT: s_endpgm 5911 i32 addrspace(3)* %out, i32 %in) { 5912entry: 5913 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") acquire 5914 ret void 5915} 5916 5917define amdgpu_kernel void @local_singlethread_one_as_release_atomicrmw( 5918; GFX6-LABEL: local_singlethread_one_as_release_atomicrmw: 5919; GFX6: ; %bb.0: ; %entry 5920; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 5921; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 5922; GFX6-NEXT: s_mov_b32 m0, -1 5923; GFX6-NEXT: s_waitcnt lgkmcnt(0) 5924; GFX6-NEXT: v_mov_b32_e32 v0, s0 5925; GFX6-NEXT: v_mov_b32_e32 v1, s1 5926; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5927; GFX6-NEXT: s_endpgm 5928; 5929; GFX7-LABEL: local_singlethread_one_as_release_atomicrmw: 5930; GFX7: ; %bb.0: ; %entry 5931; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5932; GFX7-NEXT: s_mov_b32 m0, -1 5933; GFX7-NEXT: s_waitcnt lgkmcnt(0) 5934; GFX7-NEXT: v_mov_b32_e32 v0, s0 5935; GFX7-NEXT: v_mov_b32_e32 v1, s1 5936; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5937; GFX7-NEXT: s_endpgm 5938; 5939; GFX10-WGP-LABEL: local_singlethread_one_as_release_atomicrmw: 5940; GFX10-WGP: ; %bb.0: ; %entry 5941; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5942; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 5943; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 5944; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 5945; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5946; GFX10-WGP-NEXT: s_endpgm 5947; 5948; GFX10-CU-LABEL: local_singlethread_one_as_release_atomicrmw: 5949; GFX10-CU: ; %bb.0: ; %entry 5950; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5951; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 5952; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 5953; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 5954; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5955; GFX10-CU-NEXT: s_endpgm 5956; 5957; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_atomicrmw: 5958; SKIP-CACHE-INV: ; %bb.0: ; %entry 5959; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5960; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 5961; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 5962; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 5963; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 5964; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5965; SKIP-CACHE-INV-NEXT: s_endpgm 5966; 5967; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw: 5968; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 5969; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5970; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5971; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5972; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5973; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5974; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 5975; 5976; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw: 5977; GFX90A-TGSPLIT: ; %bb.0: ; %entry 5978; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 5979; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5980; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5981; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5982; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5983; GFX90A-TGSPLIT-NEXT: s_endpgm 5984; 5985; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw: 5986; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 5987; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5988; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5989; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5990; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 5991; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 5992; GFX940-NOTTGSPLIT-NEXT: s_endpgm 5993; 5994; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw: 5995; GFX940-TGSPLIT: ; %bb.0: ; %entry 5996; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 5997; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 5998; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 5999; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6000; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6001; GFX940-TGSPLIT-NEXT: s_endpgm 6002 i32 addrspace(3)* %out, i32 %in) { 6003entry: 6004 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") release 6005 ret void 6006} 6007 6008define amdgpu_kernel void @local_singlethread_one_as_acq_rel_atomicrmw( 6009; GFX6-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6010; GFX6: ; %bb.0: ; %entry 6011; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 6012; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 6013; GFX6-NEXT: s_mov_b32 m0, -1 6014; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6015; GFX6-NEXT: v_mov_b32_e32 v0, s0 6016; GFX6-NEXT: v_mov_b32_e32 v1, s1 6017; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6018; GFX6-NEXT: s_endpgm 6019; 6020; GFX7-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6021; GFX7: ; %bb.0: ; %entry 6022; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6023; GFX7-NEXT: s_mov_b32 m0, -1 6024; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6025; GFX7-NEXT: v_mov_b32_e32 v0, s0 6026; GFX7-NEXT: v_mov_b32_e32 v1, s1 6027; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6028; GFX7-NEXT: s_endpgm 6029; 6030; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6031; GFX10-WGP: ; %bb.0: ; %entry 6032; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6033; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6034; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6035; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 6036; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6037; GFX10-WGP-NEXT: s_endpgm 6038; 6039; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6040; GFX10-CU: ; %bb.0: ; %entry 6041; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6042; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6043; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6044; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 6045; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6046; GFX10-CU-NEXT: s_endpgm 6047; 6048; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6049; SKIP-CACHE-INV: ; %bb.0: ; %entry 6050; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6051; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6052; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6053; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6054; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 6055; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6056; SKIP-CACHE-INV-NEXT: s_endpgm 6057; 6058; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6059; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6060; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6061; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6062; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6063; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6064; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6065; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6066; 6067; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6068; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6069; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6070; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6071; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6072; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6073; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6074; GFX90A-TGSPLIT-NEXT: s_endpgm 6075; 6076; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6077; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6078; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6079; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6080; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6081; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6082; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6083; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6084; 6085; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw: 6086; GFX940-TGSPLIT: ; %bb.0: ; %entry 6087; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6088; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6089; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6090; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6091; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6092; GFX940-TGSPLIT-NEXT: s_endpgm 6093 i32 addrspace(3)* %out, i32 %in) { 6094entry: 6095 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") acq_rel 6096 ret void 6097} 6098 6099define amdgpu_kernel void @local_singlethread_one_as_seq_cst_atomicrmw( 6100; GFX6-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6101; GFX6: ; %bb.0: ; %entry 6102; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 6103; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 6104; GFX6-NEXT: s_mov_b32 m0, -1 6105; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6106; GFX6-NEXT: v_mov_b32_e32 v0, s0 6107; GFX6-NEXT: v_mov_b32_e32 v1, s1 6108; GFX6-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6109; GFX6-NEXT: s_endpgm 6110; 6111; GFX7-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6112; GFX7: ; %bb.0: ; %entry 6113; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6114; GFX7-NEXT: s_mov_b32 m0, -1 6115; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6116; GFX7-NEXT: v_mov_b32_e32 v0, s0 6117; GFX7-NEXT: v_mov_b32_e32 v1, s1 6118; GFX7-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6119; GFX7-NEXT: s_endpgm 6120; 6121; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6122; GFX10-WGP: ; %bb.0: ; %entry 6123; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6124; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6125; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6126; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 6127; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6128; GFX10-WGP-NEXT: s_endpgm 6129; 6130; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6131; GFX10-CU: ; %bb.0: ; %entry 6132; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6133; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6134; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6135; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 6136; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6137; GFX10-CU-NEXT: s_endpgm 6138; 6139; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6140; SKIP-CACHE-INV: ; %bb.0: ; %entry 6141; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6142; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6143; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6144; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6145; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 6146; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6147; SKIP-CACHE-INV-NEXT: s_endpgm 6148; 6149; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6150; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6151; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6152; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6153; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6154; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6155; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6156; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6157; 6158; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6159; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6160; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6161; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6162; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6163; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6164; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6165; GFX90A-TGSPLIT-NEXT: s_endpgm 6166; 6167; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6168; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6169; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6170; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6171; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6172; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6173; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6174; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6175; 6176; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw: 6177; GFX940-TGSPLIT: ; %bb.0: ; %entry 6178; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6179; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6180; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6181; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6182; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v0, v0, v1 6183; GFX940-TGSPLIT-NEXT: s_endpgm 6184 i32 addrspace(3)* %out, i32 %in) { 6185entry: 6186 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") seq_cst 6187 ret void 6188} 6189 6190define amdgpu_kernel void @local_singlethread_one_as_acquire_ret_atomicrmw( 6191; GFX6-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6192; GFX6: ; %bb.0: ; %entry 6193; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 6194; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 6195; GFX6-NEXT: s_mov_b32 m0, -1 6196; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6197; GFX6-NEXT: v_mov_b32_e32 v0, s0 6198; GFX6-NEXT: v_mov_b32_e32 v1, s1 6199; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6200; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6201; GFX6-NEXT: ds_write_b32 v0, v1 6202; GFX6-NEXT: s_endpgm 6203; 6204; GFX7-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6205; GFX7: ; %bb.0: ; %entry 6206; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6207; GFX7-NEXT: s_mov_b32 m0, -1 6208; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6209; GFX7-NEXT: v_mov_b32_e32 v0, s0 6210; GFX7-NEXT: v_mov_b32_e32 v1, s1 6211; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6212; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6213; GFX7-NEXT: ds_write_b32 v0, v1 6214; GFX7-NEXT: s_endpgm 6215; 6216; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6217; GFX10-WGP: ; %bb.0: ; %entry 6218; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6219; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6220; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6221; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 6222; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6223; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6224; GFX10-WGP-NEXT: ds_write_b32 v0, v1 6225; GFX10-WGP-NEXT: s_endpgm 6226; 6227; GFX10-CU-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6228; GFX10-CU: ; %bb.0: ; %entry 6229; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6230; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6231; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6232; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 6233; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6234; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6235; GFX10-CU-NEXT: ds_write_b32 v0, v1 6236; GFX10-CU-NEXT: s_endpgm 6237; 6238; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6239; SKIP-CACHE-INV: ; %bb.0: ; %entry 6240; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6241; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6242; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6243; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6244; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 6245; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6246; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6247; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 6248; SKIP-CACHE-INV-NEXT: s_endpgm 6249; 6250; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6251; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6252; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6253; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6254; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6255; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6256; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6257; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6258; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 6259; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6260; 6261; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6262; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6263; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6264; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6265; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6266; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6267; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6268; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6269; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 6270; GFX90A-TGSPLIT-NEXT: s_endpgm 6271; 6272; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6273; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6274; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6275; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6276; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6277; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6278; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6279; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6280; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 6281; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6282; 6283; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw: 6284; GFX940-TGSPLIT: ; %bb.0: ; %entry 6285; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6286; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6287; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6288; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6289; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6290; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6291; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 6292; GFX940-TGSPLIT-NEXT: s_endpgm 6293 i32 addrspace(3)* %out, i32 %in) { 6294entry: 6295 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") acquire 6296 store i32 %val, i32 addrspace(3)* %out, align 4 6297 ret void 6298} 6299 6300define amdgpu_kernel void @local_singlethread_one_as_acq_rel_ret_atomicrmw( 6301; GFX6-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6302; GFX6: ; %bb.0: ; %entry 6303; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 6304; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 6305; GFX6-NEXT: s_mov_b32 m0, -1 6306; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6307; GFX6-NEXT: v_mov_b32_e32 v0, s0 6308; GFX6-NEXT: v_mov_b32_e32 v1, s1 6309; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6310; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6311; GFX6-NEXT: ds_write_b32 v0, v1 6312; GFX6-NEXT: s_endpgm 6313; 6314; GFX7-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6315; GFX7: ; %bb.0: ; %entry 6316; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6317; GFX7-NEXT: s_mov_b32 m0, -1 6318; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6319; GFX7-NEXT: v_mov_b32_e32 v0, s0 6320; GFX7-NEXT: v_mov_b32_e32 v1, s1 6321; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6322; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6323; GFX7-NEXT: ds_write_b32 v0, v1 6324; GFX7-NEXT: s_endpgm 6325; 6326; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6327; GFX10-WGP: ; %bb.0: ; %entry 6328; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6329; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6330; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6331; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 6332; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6333; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6334; GFX10-WGP-NEXT: ds_write_b32 v0, v1 6335; GFX10-WGP-NEXT: s_endpgm 6336; 6337; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6338; GFX10-CU: ; %bb.0: ; %entry 6339; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6340; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6341; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6342; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 6343; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6344; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6345; GFX10-CU-NEXT: ds_write_b32 v0, v1 6346; GFX10-CU-NEXT: s_endpgm 6347; 6348; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6349; SKIP-CACHE-INV: ; %bb.0: ; %entry 6350; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6351; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6352; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6353; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6354; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 6355; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6356; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6357; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 6358; SKIP-CACHE-INV-NEXT: s_endpgm 6359; 6360; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6361; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6362; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6363; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6364; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6365; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6366; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6367; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6368; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 6369; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6370; 6371; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6372; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6373; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6374; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6375; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6376; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6377; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6378; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6379; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 6380; GFX90A-TGSPLIT-NEXT: s_endpgm 6381; 6382; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6383; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6384; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6385; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6386; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6387; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6388; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6389; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6390; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 6391; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6392; 6393; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw: 6394; GFX940-TGSPLIT: ; %bb.0: ; %entry 6395; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6396; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6397; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6398; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6399; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6400; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6401; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 6402; GFX940-TGSPLIT-NEXT: s_endpgm 6403 i32 addrspace(3)* %out, i32 %in) { 6404entry: 6405 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") acq_rel 6406 store i32 %val, i32 addrspace(3)* %out, align 4 6407 ret void 6408} 6409 6410define amdgpu_kernel void @local_singlethread_one_as_seq_cst_ret_atomicrmw( 6411; GFX6-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6412; GFX6: ; %bb.0: ; %entry 6413; GFX6-NEXT: s_load_dword s0, s[4:5], 0x0 6414; GFX6-NEXT: s_load_dword s1, s[4:5], 0x1 6415; GFX6-NEXT: s_mov_b32 m0, -1 6416; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6417; GFX6-NEXT: v_mov_b32_e32 v0, s0 6418; GFX6-NEXT: v_mov_b32_e32 v1, s1 6419; GFX6-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6420; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6421; GFX6-NEXT: ds_write_b32 v0, v1 6422; GFX6-NEXT: s_endpgm 6423; 6424; GFX7-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6425; GFX7: ; %bb.0: ; %entry 6426; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6427; GFX7-NEXT: s_mov_b32 m0, -1 6428; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6429; GFX7-NEXT: v_mov_b32_e32 v0, s0 6430; GFX7-NEXT: v_mov_b32_e32 v1, s1 6431; GFX7-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6432; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6433; GFX7-NEXT: ds_write_b32 v0, v1 6434; GFX7-NEXT: s_endpgm 6435; 6436; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6437; GFX10-WGP: ; %bb.0: ; %entry 6438; GFX10-WGP-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6439; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6440; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6441; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s1 6442; GFX10-WGP-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6443; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6444; GFX10-WGP-NEXT: ds_write_b32 v0, v1 6445; GFX10-WGP-NEXT: s_endpgm 6446; 6447; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6448; GFX10-CU: ; %bb.0: ; %entry 6449; GFX10-CU-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6450; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6451; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6452; GFX10-CU-NEXT: v_mov_b32_e32 v1, s1 6453; GFX10-CU-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6454; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6455; GFX10-CU-NEXT: ds_write_b32 v0, v1 6456; GFX10-CU-NEXT: s_endpgm 6457; 6458; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6459; SKIP-CACHE-INV: ; %bb.0: ; %entry 6460; SKIP-CACHE-INV-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6461; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6462; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6463; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6464; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s1 6465; SKIP-CACHE-INV-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6466; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6467; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 6468; SKIP-CACHE-INV-NEXT: s_endpgm 6469; 6470; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6471; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6472; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6473; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6474; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6475; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6476; GFX90A-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6477; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6478; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 6479; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6480; 6481; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6482; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6483; GFX90A-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x0 6484; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6485; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6486; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6487; GFX90A-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6488; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6489; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 6490; GFX90A-TGSPLIT-NEXT: s_endpgm 6491; 6492; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6493; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6494; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6495; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6496; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6497; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6498; GFX940-NOTTGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6499; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6500; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 6501; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6502; 6503; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw: 6504; GFX940-TGSPLIT: ; %bb.0: ; %entry 6505; GFX940-TGSPLIT-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x0 6506; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6507; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6508; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s1 6509; GFX940-TGSPLIT-NEXT: ds_wrxchg_rtn_b32 v1, v0, v1 6510; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6511; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 6512; GFX940-TGSPLIT-NEXT: s_endpgm 6513 i32 addrspace(3)* %out, i32 %in) { 6514entry: 6515 %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") seq_cst 6516 store i32 %val, i32 addrspace(3)* %out, align 4 6517 ret void 6518} 6519 6520define amdgpu_kernel void @local_singlethread_one_as_monotonic_monotonic_cmpxchg( 6521; GFX6-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6522; GFX6: ; %bb.0: ; %entry 6523; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 6524; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 6525; GFX6-NEXT: s_mov_b32 m0, -1 6526; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6527; GFX6-NEXT: v_mov_b32_e32 v0, s2 6528; GFX6-NEXT: v_mov_b32_e32 v1, s1 6529; GFX6-NEXT: v_mov_b32_e32 v2, s0 6530; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6531; GFX6-NEXT: s_endpgm 6532; 6533; GFX7-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6534; GFX7: ; %bb.0: ; %entry 6535; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6536; GFX7-NEXT: s_mov_b32 m0, -1 6537; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6538; GFX7-NEXT: v_mov_b32_e32 v0, s0 6539; GFX7-NEXT: v_mov_b32_e32 v1, s2 6540; GFX7-NEXT: v_mov_b32_e32 v2, s1 6541; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6542; GFX7-NEXT: s_endpgm 6543; 6544; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6545; GFX10-WGP: ; %bb.0: ; %entry 6546; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6547; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6548; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6549; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 6550; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 6551; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6552; GFX10-WGP-NEXT: s_endpgm 6553; 6554; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6555; GFX10-CU: ; %bb.0: ; %entry 6556; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6557; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6558; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6559; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 6560; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 6561; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6562; GFX10-CU-NEXT: s_endpgm 6563; 6564; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6565; SKIP-CACHE-INV: ; %bb.0: ; %entry 6566; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6567; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6568; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6569; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6570; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 6571; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 6572; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6573; SKIP-CACHE-INV-NEXT: s_endpgm 6574; 6575; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6576; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6577; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6578; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6579; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6580; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6581; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6582; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6583; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6584; 6585; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6586; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6587; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6588; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6589; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6590; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6591; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6592; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6593; GFX90A-TGSPLIT-NEXT: s_endpgm 6594; 6595; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6596; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6597; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6598; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6599; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6600; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6601; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6602; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6603; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6604; 6605; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg: 6606; GFX940-TGSPLIT: ; %bb.0: ; %entry 6607; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6608; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6609; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6610; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6611; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6612; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6613; GFX940-TGSPLIT-NEXT: s_endpgm 6614 i32 addrspace(3)* %out, i32 %in, i32 %old) { 6615entry: 6616 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 6617 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic monotonic 6618 ret void 6619} 6620 6621define amdgpu_kernel void @local_singlethread_one_as_acquire_monotonic_cmpxchg( 6622; GFX6-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6623; GFX6: ; %bb.0: ; %entry 6624; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 6625; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 6626; GFX6-NEXT: s_mov_b32 m0, -1 6627; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6628; GFX6-NEXT: v_mov_b32_e32 v0, s2 6629; GFX6-NEXT: v_mov_b32_e32 v1, s1 6630; GFX6-NEXT: v_mov_b32_e32 v2, s0 6631; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6632; GFX6-NEXT: s_endpgm 6633; 6634; GFX7-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6635; GFX7: ; %bb.0: ; %entry 6636; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6637; GFX7-NEXT: s_mov_b32 m0, -1 6638; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6639; GFX7-NEXT: v_mov_b32_e32 v0, s0 6640; GFX7-NEXT: v_mov_b32_e32 v1, s2 6641; GFX7-NEXT: v_mov_b32_e32 v2, s1 6642; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6643; GFX7-NEXT: s_endpgm 6644; 6645; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6646; GFX10-WGP: ; %bb.0: ; %entry 6647; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6648; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6649; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6650; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 6651; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 6652; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6653; GFX10-WGP-NEXT: s_endpgm 6654; 6655; GFX10-CU-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6656; GFX10-CU: ; %bb.0: ; %entry 6657; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6658; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6659; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6660; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 6661; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 6662; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6663; GFX10-CU-NEXT: s_endpgm 6664; 6665; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6666; SKIP-CACHE-INV: ; %bb.0: ; %entry 6667; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6668; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6669; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6670; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6671; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 6672; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 6673; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6674; SKIP-CACHE-INV-NEXT: s_endpgm 6675; 6676; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6677; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6678; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6679; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6680; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6681; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6682; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6683; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6684; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6685; 6686; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6687; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6688; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6689; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6690; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6691; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6692; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6693; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6694; GFX90A-TGSPLIT-NEXT: s_endpgm 6695; 6696; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6697; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6698; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6699; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6700; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6701; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6702; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6703; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6704; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6705; 6706; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg: 6707; GFX940-TGSPLIT: ; %bb.0: ; %entry 6708; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6709; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6710; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6711; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6712; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6713; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6714; GFX940-TGSPLIT-NEXT: s_endpgm 6715 i32 addrspace(3)* %out, i32 %in, i32 %old) { 6716entry: 6717 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 6718 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire monotonic 6719 ret void 6720} 6721 6722define amdgpu_kernel void @local_singlethread_one_as_release_monotonic_cmpxchg( 6723; GFX6-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6724; GFX6: ; %bb.0: ; %entry 6725; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 6726; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 6727; GFX6-NEXT: s_mov_b32 m0, -1 6728; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6729; GFX6-NEXT: v_mov_b32_e32 v0, s2 6730; GFX6-NEXT: v_mov_b32_e32 v1, s1 6731; GFX6-NEXT: v_mov_b32_e32 v2, s0 6732; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6733; GFX6-NEXT: s_endpgm 6734; 6735; GFX7-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6736; GFX7: ; %bb.0: ; %entry 6737; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6738; GFX7-NEXT: s_mov_b32 m0, -1 6739; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6740; GFX7-NEXT: v_mov_b32_e32 v0, s0 6741; GFX7-NEXT: v_mov_b32_e32 v1, s2 6742; GFX7-NEXT: v_mov_b32_e32 v2, s1 6743; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6744; GFX7-NEXT: s_endpgm 6745; 6746; GFX10-WGP-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6747; GFX10-WGP: ; %bb.0: ; %entry 6748; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6749; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6750; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6751; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 6752; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 6753; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6754; GFX10-WGP-NEXT: s_endpgm 6755; 6756; GFX10-CU-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6757; GFX10-CU: ; %bb.0: ; %entry 6758; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6759; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6760; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6761; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 6762; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 6763; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6764; GFX10-CU-NEXT: s_endpgm 6765; 6766; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6767; SKIP-CACHE-INV: ; %bb.0: ; %entry 6768; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6769; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6770; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6771; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6772; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 6773; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 6774; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6775; SKIP-CACHE-INV-NEXT: s_endpgm 6776; 6777; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6778; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6779; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6780; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6781; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6782; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6783; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6784; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6785; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6786; 6787; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6788; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6789; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6790; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6791; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6792; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6793; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6794; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6795; GFX90A-TGSPLIT-NEXT: s_endpgm 6796; 6797; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6798; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6799; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6800; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6801; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6802; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6803; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6804; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6805; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6806; 6807; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg: 6808; GFX940-TGSPLIT: ; %bb.0: ; %entry 6809; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6810; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6811; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6812; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6813; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6814; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6815; GFX940-TGSPLIT-NEXT: s_endpgm 6816 i32 addrspace(3)* %out, i32 %in, i32 %old) { 6817entry: 6818 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 6819 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release monotonic 6820 ret void 6821} 6822 6823define amdgpu_kernel void @local_singlethread_one_as_acq_rel_monotonic_cmpxchg( 6824; GFX6-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6825; GFX6: ; %bb.0: ; %entry 6826; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 6827; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 6828; GFX6-NEXT: s_mov_b32 m0, -1 6829; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6830; GFX6-NEXT: v_mov_b32_e32 v0, s2 6831; GFX6-NEXT: v_mov_b32_e32 v1, s1 6832; GFX6-NEXT: v_mov_b32_e32 v2, s0 6833; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6834; GFX6-NEXT: s_endpgm 6835; 6836; GFX7-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6837; GFX7: ; %bb.0: ; %entry 6838; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6839; GFX7-NEXT: s_mov_b32 m0, -1 6840; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6841; GFX7-NEXT: v_mov_b32_e32 v0, s0 6842; GFX7-NEXT: v_mov_b32_e32 v1, s2 6843; GFX7-NEXT: v_mov_b32_e32 v2, s1 6844; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6845; GFX7-NEXT: s_endpgm 6846; 6847; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6848; GFX10-WGP: ; %bb.0: ; %entry 6849; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6850; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6851; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6852; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 6853; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 6854; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6855; GFX10-WGP-NEXT: s_endpgm 6856; 6857; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6858; GFX10-CU: ; %bb.0: ; %entry 6859; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6860; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6861; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6862; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 6863; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 6864; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6865; GFX10-CU-NEXT: s_endpgm 6866; 6867; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6868; SKIP-CACHE-INV: ; %bb.0: ; %entry 6869; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6870; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6871; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6872; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6873; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 6874; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 6875; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6876; SKIP-CACHE-INV-NEXT: s_endpgm 6877; 6878; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6879; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6880; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6881; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6882; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6883; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6884; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6885; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6886; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6887; 6888; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6889; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6890; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6891; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6892; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6893; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6894; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6895; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6896; GFX90A-TGSPLIT-NEXT: s_endpgm 6897; 6898; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6899; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 6900; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6901; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6902; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6903; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6904; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6905; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6906; GFX940-NOTTGSPLIT-NEXT: s_endpgm 6907; 6908; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg: 6909; GFX940-TGSPLIT: ; %bb.0: ; %entry 6910; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6911; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6912; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6913; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6914; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6915; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6916; GFX940-TGSPLIT-NEXT: s_endpgm 6917 i32 addrspace(3)* %out, i32 %in, i32 %old) { 6918entry: 6919 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 6920 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel monotonic 6921 ret void 6922} 6923 6924define amdgpu_kernel void @local_singlethread_one_as_seq_cst_monotonic_cmpxchg( 6925; GFX6-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 6926; GFX6: ; %bb.0: ; %entry 6927; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 6928; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 6929; GFX6-NEXT: s_mov_b32 m0, -1 6930; GFX6-NEXT: s_waitcnt lgkmcnt(0) 6931; GFX6-NEXT: v_mov_b32_e32 v0, s2 6932; GFX6-NEXT: v_mov_b32_e32 v1, s1 6933; GFX6-NEXT: v_mov_b32_e32 v2, s0 6934; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6935; GFX6-NEXT: s_endpgm 6936; 6937; GFX7-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 6938; GFX7: ; %bb.0: ; %entry 6939; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6940; GFX7-NEXT: s_mov_b32 m0, -1 6941; GFX7-NEXT: s_waitcnt lgkmcnt(0) 6942; GFX7-NEXT: v_mov_b32_e32 v0, s0 6943; GFX7-NEXT: v_mov_b32_e32 v1, s2 6944; GFX7-NEXT: v_mov_b32_e32 v2, s1 6945; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6946; GFX7-NEXT: s_endpgm 6947; 6948; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 6949; GFX10-WGP: ; %bb.0: ; %entry 6950; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6951; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 6952; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 6953; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 6954; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 6955; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6956; GFX10-WGP-NEXT: s_endpgm 6957; 6958; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 6959; GFX10-CU: ; %bb.0: ; %entry 6960; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6961; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 6962; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 6963; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 6964; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 6965; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6966; GFX10-CU-NEXT: s_endpgm 6967; 6968; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 6969; SKIP-CACHE-INV: ; %bb.0: ; %entry 6970; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 6971; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 6972; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 6973; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 6974; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 6975; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 6976; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6977; SKIP-CACHE-INV-NEXT: s_endpgm 6978; 6979; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 6980; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 6981; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6982; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6983; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6984; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6985; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6986; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6987; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 6988; 6989; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 6990; GFX90A-TGSPLIT: ; %bb.0: ; %entry 6991; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 6992; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 6993; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 6994; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 6995; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 6996; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 6997; GFX90A-TGSPLIT-NEXT: s_endpgm 6998; 6999; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 7000; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7001; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7002; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7003; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7004; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7005; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7006; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7007; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7008; 7009; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg: 7010; GFX940-TGSPLIT: ; %bb.0: ; %entry 7011; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7012; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7013; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7014; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7015; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7016; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7017; GFX940-TGSPLIT-NEXT: s_endpgm 7018 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7019entry: 7020 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7021 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst monotonic 7022 ret void 7023} 7024 7025define amdgpu_kernel void @local_singlethread_one_as_monotonic_acquire_cmpxchg( 7026; GFX6-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7027; GFX6: ; %bb.0: ; %entry 7028; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7029; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7030; GFX6-NEXT: s_mov_b32 m0, -1 7031; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7032; GFX6-NEXT: v_mov_b32_e32 v0, s2 7033; GFX6-NEXT: v_mov_b32_e32 v1, s1 7034; GFX6-NEXT: v_mov_b32_e32 v2, s0 7035; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7036; GFX6-NEXT: s_endpgm 7037; 7038; GFX7-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7039; GFX7: ; %bb.0: ; %entry 7040; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7041; GFX7-NEXT: s_mov_b32 m0, -1 7042; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7043; GFX7-NEXT: v_mov_b32_e32 v0, s0 7044; GFX7-NEXT: v_mov_b32_e32 v1, s2 7045; GFX7-NEXT: v_mov_b32_e32 v2, s1 7046; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7047; GFX7-NEXT: s_endpgm 7048; 7049; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7050; GFX10-WGP: ; %bb.0: ; %entry 7051; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7052; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7053; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7054; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7055; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7056; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7057; GFX10-WGP-NEXT: s_endpgm 7058; 7059; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7060; GFX10-CU: ; %bb.0: ; %entry 7061; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7062; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7063; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7064; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7065; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7066; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7067; GFX10-CU-NEXT: s_endpgm 7068; 7069; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7070; SKIP-CACHE-INV: ; %bb.0: ; %entry 7071; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7072; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7073; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7074; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7075; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7076; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7077; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7078; SKIP-CACHE-INV-NEXT: s_endpgm 7079; 7080; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7081; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7082; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7083; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7084; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7085; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7086; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7087; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7088; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7089; 7090; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7091; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7092; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7093; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7094; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7095; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7096; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7097; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7098; GFX90A-TGSPLIT-NEXT: s_endpgm 7099; 7100; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7101; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7102; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7103; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7104; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7105; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7106; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7107; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7108; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7109; 7110; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg: 7111; GFX940-TGSPLIT: ; %bb.0: ; %entry 7112; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7113; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7114; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7115; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7116; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7117; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7118; GFX940-TGSPLIT-NEXT: s_endpgm 7119 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7120entry: 7121 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7122 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic acquire 7123 ret void 7124} 7125 7126define amdgpu_kernel void @local_singlethread_one_as_acquire_acquire_cmpxchg( 7127; GFX6-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7128; GFX6: ; %bb.0: ; %entry 7129; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7130; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7131; GFX6-NEXT: s_mov_b32 m0, -1 7132; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7133; GFX6-NEXT: v_mov_b32_e32 v0, s2 7134; GFX6-NEXT: v_mov_b32_e32 v1, s1 7135; GFX6-NEXT: v_mov_b32_e32 v2, s0 7136; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7137; GFX6-NEXT: s_endpgm 7138; 7139; GFX7-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7140; GFX7: ; %bb.0: ; %entry 7141; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7142; GFX7-NEXT: s_mov_b32 m0, -1 7143; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7144; GFX7-NEXT: v_mov_b32_e32 v0, s0 7145; GFX7-NEXT: v_mov_b32_e32 v1, s2 7146; GFX7-NEXT: v_mov_b32_e32 v2, s1 7147; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7148; GFX7-NEXT: s_endpgm 7149; 7150; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7151; GFX10-WGP: ; %bb.0: ; %entry 7152; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7153; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7154; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7155; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7156; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7157; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7158; GFX10-WGP-NEXT: s_endpgm 7159; 7160; GFX10-CU-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7161; GFX10-CU: ; %bb.0: ; %entry 7162; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7163; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7164; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7165; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7166; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7167; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7168; GFX10-CU-NEXT: s_endpgm 7169; 7170; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7171; SKIP-CACHE-INV: ; %bb.0: ; %entry 7172; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7173; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7174; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7175; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7176; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7177; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7178; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7179; SKIP-CACHE-INV-NEXT: s_endpgm 7180; 7181; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7182; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7183; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7184; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7185; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7186; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7187; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7188; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7189; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7190; 7191; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7192; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7193; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7194; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7195; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7196; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7197; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7198; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7199; GFX90A-TGSPLIT-NEXT: s_endpgm 7200; 7201; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7202; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7203; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7204; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7205; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7206; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7207; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7208; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7209; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7210; 7211; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg: 7212; GFX940-TGSPLIT: ; %bb.0: ; %entry 7213; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7214; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7215; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7216; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7217; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7218; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7219; GFX940-TGSPLIT-NEXT: s_endpgm 7220 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7221entry: 7222 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7223 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire acquire 7224 ret void 7225} 7226 7227define amdgpu_kernel void @local_singlethread_one_as_release_acquire_cmpxchg( 7228; GFX6-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7229; GFX6: ; %bb.0: ; %entry 7230; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7231; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7232; GFX6-NEXT: s_mov_b32 m0, -1 7233; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7234; GFX6-NEXT: v_mov_b32_e32 v0, s2 7235; GFX6-NEXT: v_mov_b32_e32 v1, s1 7236; GFX6-NEXT: v_mov_b32_e32 v2, s0 7237; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7238; GFX6-NEXT: s_endpgm 7239; 7240; GFX7-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7241; GFX7: ; %bb.0: ; %entry 7242; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7243; GFX7-NEXT: s_mov_b32 m0, -1 7244; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7245; GFX7-NEXT: v_mov_b32_e32 v0, s0 7246; GFX7-NEXT: v_mov_b32_e32 v1, s2 7247; GFX7-NEXT: v_mov_b32_e32 v2, s1 7248; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7249; GFX7-NEXT: s_endpgm 7250; 7251; GFX10-WGP-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7252; GFX10-WGP: ; %bb.0: ; %entry 7253; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7254; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7255; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7256; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7257; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7258; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7259; GFX10-WGP-NEXT: s_endpgm 7260; 7261; GFX10-CU-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7262; GFX10-CU: ; %bb.0: ; %entry 7263; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7264; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7265; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7266; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7267; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7268; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7269; GFX10-CU-NEXT: s_endpgm 7270; 7271; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7272; SKIP-CACHE-INV: ; %bb.0: ; %entry 7273; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7274; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7275; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7276; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7277; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7278; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7279; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7280; SKIP-CACHE-INV-NEXT: s_endpgm 7281; 7282; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7283; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7284; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7285; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7286; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7287; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7288; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7289; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7290; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7291; 7292; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7293; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7294; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7295; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7296; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7297; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7298; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7299; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7300; GFX90A-TGSPLIT-NEXT: s_endpgm 7301; 7302; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7303; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7304; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7305; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7306; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7307; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7308; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7309; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7310; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7311; 7312; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg: 7313; GFX940-TGSPLIT: ; %bb.0: ; %entry 7314; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7315; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7316; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7317; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7318; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7319; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7320; GFX940-TGSPLIT-NEXT: s_endpgm 7321 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7322entry: 7323 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7324 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release acquire 7325 ret void 7326} 7327 7328define amdgpu_kernel void @local_singlethread_one_as_acq_rel_acquire_cmpxchg( 7329; GFX6-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7330; GFX6: ; %bb.0: ; %entry 7331; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7332; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7333; GFX6-NEXT: s_mov_b32 m0, -1 7334; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7335; GFX6-NEXT: v_mov_b32_e32 v0, s2 7336; GFX6-NEXT: v_mov_b32_e32 v1, s1 7337; GFX6-NEXT: v_mov_b32_e32 v2, s0 7338; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7339; GFX6-NEXT: s_endpgm 7340; 7341; GFX7-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7342; GFX7: ; %bb.0: ; %entry 7343; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7344; GFX7-NEXT: s_mov_b32 m0, -1 7345; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7346; GFX7-NEXT: v_mov_b32_e32 v0, s0 7347; GFX7-NEXT: v_mov_b32_e32 v1, s2 7348; GFX7-NEXT: v_mov_b32_e32 v2, s1 7349; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7350; GFX7-NEXT: s_endpgm 7351; 7352; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7353; GFX10-WGP: ; %bb.0: ; %entry 7354; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7355; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7356; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7357; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7358; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7359; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7360; GFX10-WGP-NEXT: s_endpgm 7361; 7362; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7363; GFX10-CU: ; %bb.0: ; %entry 7364; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7365; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7366; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7367; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7368; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7369; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7370; GFX10-CU-NEXT: s_endpgm 7371; 7372; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7373; SKIP-CACHE-INV: ; %bb.0: ; %entry 7374; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7375; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7376; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7377; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7378; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7379; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7380; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7381; SKIP-CACHE-INV-NEXT: s_endpgm 7382; 7383; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7384; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7385; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7386; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7387; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7388; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7389; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7390; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7391; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7392; 7393; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7394; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7395; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7396; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7397; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7398; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7399; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7400; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7401; GFX90A-TGSPLIT-NEXT: s_endpgm 7402; 7403; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7404; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7405; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7406; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7407; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7408; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7409; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7410; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7411; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7412; 7413; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg: 7414; GFX940-TGSPLIT: ; %bb.0: ; %entry 7415; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7416; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7417; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7418; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7419; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7420; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7421; GFX940-TGSPLIT-NEXT: s_endpgm 7422 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7423entry: 7424 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7425 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel acquire 7426 ret void 7427} 7428 7429define amdgpu_kernel void @local_singlethread_one_as_seq_cst_acquire_cmpxchg( 7430; GFX6-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7431; GFX6: ; %bb.0: ; %entry 7432; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7433; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7434; GFX6-NEXT: s_mov_b32 m0, -1 7435; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7436; GFX6-NEXT: v_mov_b32_e32 v0, s2 7437; GFX6-NEXT: v_mov_b32_e32 v1, s1 7438; GFX6-NEXT: v_mov_b32_e32 v2, s0 7439; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7440; GFX6-NEXT: s_endpgm 7441; 7442; GFX7-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7443; GFX7: ; %bb.0: ; %entry 7444; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7445; GFX7-NEXT: s_mov_b32 m0, -1 7446; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7447; GFX7-NEXT: v_mov_b32_e32 v0, s0 7448; GFX7-NEXT: v_mov_b32_e32 v1, s2 7449; GFX7-NEXT: v_mov_b32_e32 v2, s1 7450; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7451; GFX7-NEXT: s_endpgm 7452; 7453; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7454; GFX10-WGP: ; %bb.0: ; %entry 7455; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7456; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7457; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7458; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7459; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7460; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7461; GFX10-WGP-NEXT: s_endpgm 7462; 7463; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7464; GFX10-CU: ; %bb.0: ; %entry 7465; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7466; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7467; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7468; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7469; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7470; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7471; GFX10-CU-NEXT: s_endpgm 7472; 7473; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7474; SKIP-CACHE-INV: ; %bb.0: ; %entry 7475; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7476; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7477; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7478; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7479; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7480; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7481; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7482; SKIP-CACHE-INV-NEXT: s_endpgm 7483; 7484; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7485; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7486; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7487; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7488; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7489; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7490; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7491; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7492; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7493; 7494; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7495; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7496; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7497; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7498; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7499; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7500; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7501; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7502; GFX90A-TGSPLIT-NEXT: s_endpgm 7503; 7504; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7505; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7506; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7507; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7508; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7509; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7510; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7511; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7512; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7513; 7514; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg: 7515; GFX940-TGSPLIT: ; %bb.0: ; %entry 7516; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7517; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7518; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7519; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7520; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7521; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7522; GFX940-TGSPLIT-NEXT: s_endpgm 7523 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7524entry: 7525 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7526 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst acquire 7527 ret void 7528} 7529 7530define amdgpu_kernel void @local_singlethread_one_as_monotonic_seq_cst_cmpxchg( 7531; GFX6-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7532; GFX6: ; %bb.0: ; %entry 7533; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7534; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7535; GFX6-NEXT: s_mov_b32 m0, -1 7536; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7537; GFX6-NEXT: v_mov_b32_e32 v0, s2 7538; GFX6-NEXT: v_mov_b32_e32 v1, s1 7539; GFX6-NEXT: v_mov_b32_e32 v2, s0 7540; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7541; GFX6-NEXT: s_endpgm 7542; 7543; GFX7-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7544; GFX7: ; %bb.0: ; %entry 7545; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7546; GFX7-NEXT: s_mov_b32 m0, -1 7547; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7548; GFX7-NEXT: v_mov_b32_e32 v0, s0 7549; GFX7-NEXT: v_mov_b32_e32 v1, s2 7550; GFX7-NEXT: v_mov_b32_e32 v2, s1 7551; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7552; GFX7-NEXT: s_endpgm 7553; 7554; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7555; GFX10-WGP: ; %bb.0: ; %entry 7556; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7557; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7558; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7559; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7560; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7561; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7562; GFX10-WGP-NEXT: s_endpgm 7563; 7564; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7565; GFX10-CU: ; %bb.0: ; %entry 7566; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7567; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7568; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7569; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7570; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7571; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7572; GFX10-CU-NEXT: s_endpgm 7573; 7574; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7575; SKIP-CACHE-INV: ; %bb.0: ; %entry 7576; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7577; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7578; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7579; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7580; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7581; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7582; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7583; SKIP-CACHE-INV-NEXT: s_endpgm 7584; 7585; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7586; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7587; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7588; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7589; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7590; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7591; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7592; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7593; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7594; 7595; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7596; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7597; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7598; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7599; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7600; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7601; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7602; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7603; GFX90A-TGSPLIT-NEXT: s_endpgm 7604; 7605; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7606; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7607; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7608; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7609; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7610; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7611; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7612; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7613; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7614; 7615; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg: 7616; GFX940-TGSPLIT: ; %bb.0: ; %entry 7617; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7618; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7619; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7620; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7621; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7622; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7623; GFX940-TGSPLIT-NEXT: s_endpgm 7624 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7625entry: 7626 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7627 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic seq_cst 7628 ret void 7629} 7630 7631define amdgpu_kernel void @local_singlethread_one_as_acquire_seq_cst_cmpxchg( 7632; GFX6-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7633; GFX6: ; %bb.0: ; %entry 7634; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7635; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7636; GFX6-NEXT: s_mov_b32 m0, -1 7637; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7638; GFX6-NEXT: v_mov_b32_e32 v0, s2 7639; GFX6-NEXT: v_mov_b32_e32 v1, s1 7640; GFX6-NEXT: v_mov_b32_e32 v2, s0 7641; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7642; GFX6-NEXT: s_endpgm 7643; 7644; GFX7-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7645; GFX7: ; %bb.0: ; %entry 7646; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7647; GFX7-NEXT: s_mov_b32 m0, -1 7648; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7649; GFX7-NEXT: v_mov_b32_e32 v0, s0 7650; GFX7-NEXT: v_mov_b32_e32 v1, s2 7651; GFX7-NEXT: v_mov_b32_e32 v2, s1 7652; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7653; GFX7-NEXT: s_endpgm 7654; 7655; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7656; GFX10-WGP: ; %bb.0: ; %entry 7657; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7658; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7659; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7660; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7661; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7662; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7663; GFX10-WGP-NEXT: s_endpgm 7664; 7665; GFX10-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7666; GFX10-CU: ; %bb.0: ; %entry 7667; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7668; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7669; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7670; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7671; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7672; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7673; GFX10-CU-NEXT: s_endpgm 7674; 7675; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7676; SKIP-CACHE-INV: ; %bb.0: ; %entry 7677; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7678; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7679; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7680; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7681; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7682; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7683; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7684; SKIP-CACHE-INV-NEXT: s_endpgm 7685; 7686; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7687; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7688; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7689; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7690; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7691; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7692; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7693; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7694; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7695; 7696; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7697; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7698; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7699; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7700; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7701; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7702; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7703; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7704; GFX90A-TGSPLIT-NEXT: s_endpgm 7705; 7706; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7707; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7708; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7709; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7710; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7711; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7712; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7713; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7714; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7715; 7716; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg: 7717; GFX940-TGSPLIT: ; %bb.0: ; %entry 7718; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7719; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7720; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7721; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7722; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7723; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7724; GFX940-TGSPLIT-NEXT: s_endpgm 7725 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7726entry: 7727 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7728 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire seq_cst 7729 ret void 7730} 7731 7732define amdgpu_kernel void @local_singlethread_one_as_release_seq_cst_cmpxchg( 7733; GFX6-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7734; GFX6: ; %bb.0: ; %entry 7735; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7736; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7737; GFX6-NEXT: s_mov_b32 m0, -1 7738; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7739; GFX6-NEXT: v_mov_b32_e32 v0, s2 7740; GFX6-NEXT: v_mov_b32_e32 v1, s1 7741; GFX6-NEXT: v_mov_b32_e32 v2, s0 7742; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7743; GFX6-NEXT: s_endpgm 7744; 7745; GFX7-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7746; GFX7: ; %bb.0: ; %entry 7747; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7748; GFX7-NEXT: s_mov_b32 m0, -1 7749; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7750; GFX7-NEXT: v_mov_b32_e32 v0, s0 7751; GFX7-NEXT: v_mov_b32_e32 v1, s2 7752; GFX7-NEXT: v_mov_b32_e32 v2, s1 7753; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7754; GFX7-NEXT: s_endpgm 7755; 7756; GFX10-WGP-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7757; GFX10-WGP: ; %bb.0: ; %entry 7758; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7759; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7760; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7761; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7762; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7763; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7764; GFX10-WGP-NEXT: s_endpgm 7765; 7766; GFX10-CU-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7767; GFX10-CU: ; %bb.0: ; %entry 7768; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7769; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7770; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7771; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7772; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7773; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7774; GFX10-CU-NEXT: s_endpgm 7775; 7776; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7777; SKIP-CACHE-INV: ; %bb.0: ; %entry 7778; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7779; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7780; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7781; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7782; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7783; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7784; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7785; SKIP-CACHE-INV-NEXT: s_endpgm 7786; 7787; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7788; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7789; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7790; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7791; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7792; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7793; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7794; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7795; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7796; 7797; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7798; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7799; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7800; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7801; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7802; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7803; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7804; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7805; GFX90A-TGSPLIT-NEXT: s_endpgm 7806; 7807; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7808; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7809; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7810; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7811; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7812; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7813; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7814; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7815; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7816; 7817; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg: 7818; GFX940-TGSPLIT: ; %bb.0: ; %entry 7819; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7820; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7821; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7822; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7823; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7824; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7825; GFX940-TGSPLIT-NEXT: s_endpgm 7826 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7827entry: 7828 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7829 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release seq_cst 7830 ret void 7831} 7832 7833define amdgpu_kernel void @local_singlethread_one_as_acq_rel_seq_cst_cmpxchg( 7834; GFX6-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7835; GFX6: ; %bb.0: ; %entry 7836; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7837; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7838; GFX6-NEXT: s_mov_b32 m0, -1 7839; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7840; GFX6-NEXT: v_mov_b32_e32 v0, s2 7841; GFX6-NEXT: v_mov_b32_e32 v1, s1 7842; GFX6-NEXT: v_mov_b32_e32 v2, s0 7843; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7844; GFX6-NEXT: s_endpgm 7845; 7846; GFX7-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7847; GFX7: ; %bb.0: ; %entry 7848; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7849; GFX7-NEXT: s_mov_b32 m0, -1 7850; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7851; GFX7-NEXT: v_mov_b32_e32 v0, s0 7852; GFX7-NEXT: v_mov_b32_e32 v1, s2 7853; GFX7-NEXT: v_mov_b32_e32 v2, s1 7854; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7855; GFX7-NEXT: s_endpgm 7856; 7857; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7858; GFX10-WGP: ; %bb.0: ; %entry 7859; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7860; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7861; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7862; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7863; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7864; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7865; GFX10-WGP-NEXT: s_endpgm 7866; 7867; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7868; GFX10-CU: ; %bb.0: ; %entry 7869; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7870; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7871; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7872; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7873; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7874; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7875; GFX10-CU-NEXT: s_endpgm 7876; 7877; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7878; SKIP-CACHE-INV: ; %bb.0: ; %entry 7879; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7880; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7881; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7882; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7883; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7884; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7885; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7886; SKIP-CACHE-INV-NEXT: s_endpgm 7887; 7888; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7889; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7890; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7891; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7892; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7893; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7894; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7895; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7896; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7897; 7898; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7899; GFX90A-TGSPLIT: ; %bb.0: ; %entry 7900; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7901; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7902; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7903; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7904; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7905; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7906; GFX90A-TGSPLIT-NEXT: s_endpgm 7907; 7908; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7909; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 7910; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7911; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7912; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7913; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7914; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7915; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7916; GFX940-NOTTGSPLIT-NEXT: s_endpgm 7917; 7918; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg: 7919; GFX940-TGSPLIT: ; %bb.0: ; %entry 7920; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7921; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7922; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7923; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7924; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7925; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7926; GFX940-TGSPLIT-NEXT: s_endpgm 7927 i32 addrspace(3)* %out, i32 %in, i32 %old) { 7928entry: 7929 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 7930 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel seq_cst 7931 ret void 7932} 7933 7934define amdgpu_kernel void @local_singlethread_one_as_seq_cst_seq_cst_cmpxchg( 7935; GFX6-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 7936; GFX6: ; %bb.0: ; %entry 7937; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 7938; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 7939; GFX6-NEXT: s_mov_b32 m0, -1 7940; GFX6-NEXT: s_waitcnt lgkmcnt(0) 7941; GFX6-NEXT: v_mov_b32_e32 v0, s2 7942; GFX6-NEXT: v_mov_b32_e32 v1, s1 7943; GFX6-NEXT: v_mov_b32_e32 v2, s0 7944; GFX6-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7945; GFX6-NEXT: s_endpgm 7946; 7947; GFX7-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 7948; GFX7: ; %bb.0: ; %entry 7949; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7950; GFX7-NEXT: s_mov_b32 m0, -1 7951; GFX7-NEXT: s_waitcnt lgkmcnt(0) 7952; GFX7-NEXT: v_mov_b32_e32 v0, s0 7953; GFX7-NEXT: v_mov_b32_e32 v1, s2 7954; GFX7-NEXT: v_mov_b32_e32 v2, s1 7955; GFX7-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7956; GFX7-NEXT: s_endpgm 7957; 7958; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 7959; GFX10-WGP: ; %bb.0: ; %entry 7960; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7961; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 7962; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 7963; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 7964; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 7965; GFX10-WGP-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7966; GFX10-WGP-NEXT: s_endpgm 7967; 7968; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 7969; GFX10-CU: ; %bb.0: ; %entry 7970; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7971; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 7972; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 7973; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 7974; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 7975; GFX10-CU-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7976; GFX10-CU-NEXT: s_endpgm 7977; 7978; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 7979; SKIP-CACHE-INV: ; %bb.0: ; %entry 7980; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 7981; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 7982; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 7983; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 7984; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 7985; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 7986; SKIP-CACHE-INV-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7987; SKIP-CACHE-INV-NEXT: s_endpgm 7988; 7989; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 7990; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 7991; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 7992; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 7993; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 7994; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 7995; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 7996; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 7997; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 7998; 7999; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 8000; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8001; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8002; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8003; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8004; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8005; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8006; GFX90A-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 8007; GFX90A-TGSPLIT-NEXT: s_endpgm 8008; 8009; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 8010; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8011; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8012; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8013; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8014; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8015; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8016; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 8017; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8018; 8019; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg: 8020; GFX940-TGSPLIT: ; %bb.0: ; %entry 8021; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8022; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8023; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8024; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8025; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8026; GFX940-TGSPLIT-NEXT: ds_cmpst_b32 v0, v1, v2 offset:16 8027; GFX940-TGSPLIT-NEXT: s_endpgm 8028 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8029entry: 8030 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8031 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst seq_cst 8032 ret void 8033} 8034 8035define amdgpu_kernel void @local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg( 8036; GFX6-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8037; GFX6: ; %bb.0: ; %entry 8038; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 8039; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 8040; GFX6-NEXT: s_mov_b32 m0, -1 8041; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8042; GFX6-NEXT: v_mov_b32_e32 v0, s2 8043; GFX6-NEXT: v_mov_b32_e32 v1, s1 8044; GFX6-NEXT: v_mov_b32_e32 v2, s0 8045; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8046; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8047; GFX6-NEXT: ds_write_b32 v0, v1 8048; GFX6-NEXT: s_endpgm 8049; 8050; GFX7-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8051; GFX7: ; %bb.0: ; %entry 8052; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8053; GFX7-NEXT: s_mov_b32 m0, -1 8054; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8055; GFX7-NEXT: v_mov_b32_e32 v0, s0 8056; GFX7-NEXT: v_mov_b32_e32 v1, s2 8057; GFX7-NEXT: v_mov_b32_e32 v2, s1 8058; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8059; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8060; GFX7-NEXT: ds_write_b32 v0, v1 8061; GFX7-NEXT: s_endpgm 8062; 8063; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8064; GFX10-WGP: ; %bb.0: ; %entry 8065; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8066; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8067; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 8068; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 8069; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 8070; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8071; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8072; GFX10-WGP-NEXT: ds_write_b32 v0, v1 8073; GFX10-WGP-NEXT: s_endpgm 8074; 8075; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8076; GFX10-CU: ; %bb.0: ; %entry 8077; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8078; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8079; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 8080; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 8081; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 8082; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8083; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8084; GFX10-CU-NEXT: ds_write_b32 v0, v1 8085; GFX10-CU-NEXT: s_endpgm 8086; 8087; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8088; SKIP-CACHE-INV: ; %bb.0: ; %entry 8089; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8090; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 8091; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8092; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 8093; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 8094; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 8095; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8096; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8097; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 8098; SKIP-CACHE-INV-NEXT: s_endpgm 8099; 8100; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8101; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 8102; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8103; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8104; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8105; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8106; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8107; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8108; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8109; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8110; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 8111; 8112; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8113; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8114; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8115; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8116; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8117; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8118; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8119; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8120; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8121; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 8122; GFX90A-TGSPLIT-NEXT: s_endpgm 8123; 8124; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8125; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8126; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8127; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8128; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8129; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8130; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8131; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8132; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8133; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8134; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8135; 8136; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg: 8137; GFX940-TGSPLIT: ; %bb.0: ; %entry 8138; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8139; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8140; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8141; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8142; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8143; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8144; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8145; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 8146; GFX940-TGSPLIT-NEXT: s_endpgm 8147 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8148entry: 8149 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8150 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic monotonic 8151 %val0 = extractvalue { i32, i1 } %val, 0 8152 store i32 %val0, i32 addrspace(3)* %out, align 4 8153 ret void 8154} 8155 8156define amdgpu_kernel void @local_singlethread_one_as_acquire_monotonic_ret_cmpxchg( 8157; GFX6-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8158; GFX6: ; %bb.0: ; %entry 8159; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 8160; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 8161; GFX6-NEXT: s_mov_b32 m0, -1 8162; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8163; GFX6-NEXT: v_mov_b32_e32 v0, s2 8164; GFX6-NEXT: v_mov_b32_e32 v1, s1 8165; GFX6-NEXT: v_mov_b32_e32 v2, s0 8166; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8167; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8168; GFX6-NEXT: ds_write_b32 v0, v1 8169; GFX6-NEXT: s_endpgm 8170; 8171; GFX7-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8172; GFX7: ; %bb.0: ; %entry 8173; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8174; GFX7-NEXT: s_mov_b32 m0, -1 8175; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8176; GFX7-NEXT: v_mov_b32_e32 v0, s0 8177; GFX7-NEXT: v_mov_b32_e32 v1, s2 8178; GFX7-NEXT: v_mov_b32_e32 v2, s1 8179; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8180; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8181; GFX7-NEXT: ds_write_b32 v0, v1 8182; GFX7-NEXT: s_endpgm 8183; 8184; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8185; GFX10-WGP: ; %bb.0: ; %entry 8186; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8187; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8188; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 8189; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 8190; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 8191; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8192; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8193; GFX10-WGP-NEXT: ds_write_b32 v0, v1 8194; GFX10-WGP-NEXT: s_endpgm 8195; 8196; GFX10-CU-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8197; GFX10-CU: ; %bb.0: ; %entry 8198; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8199; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8200; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 8201; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 8202; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 8203; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8204; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8205; GFX10-CU-NEXT: ds_write_b32 v0, v1 8206; GFX10-CU-NEXT: s_endpgm 8207; 8208; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8209; SKIP-CACHE-INV: ; %bb.0: ; %entry 8210; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8211; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 8212; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8213; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 8214; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 8215; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 8216; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8217; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8218; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 8219; SKIP-CACHE-INV-NEXT: s_endpgm 8220; 8221; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8222; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 8223; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8224; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8225; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8226; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8227; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8228; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8229; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8230; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8231; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 8232; 8233; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8234; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8235; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8236; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8237; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8238; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8239; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8240; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8241; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8242; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 8243; GFX90A-TGSPLIT-NEXT: s_endpgm 8244; 8245; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8246; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8247; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8248; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8249; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8250; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8251; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8252; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8253; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8254; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8255; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8256; 8257; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg: 8258; GFX940-TGSPLIT: ; %bb.0: ; %entry 8259; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8260; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8261; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8262; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8263; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8264; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8265; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8266; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 8267; GFX940-TGSPLIT-NEXT: s_endpgm 8268 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8269entry: 8270 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8271 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire monotonic 8272 %val0 = extractvalue { i32, i1 } %val, 0 8273 store i32 %val0, i32 addrspace(3)* %out, align 4 8274 ret void 8275} 8276 8277define amdgpu_kernel void @local_singlethread_one_as_release_monotonic_ret_cmpxchg( 8278; GFX6-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8279; GFX6: ; %bb.0: ; %entry 8280; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 8281; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 8282; GFX6-NEXT: s_mov_b32 m0, -1 8283; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8284; GFX6-NEXT: v_mov_b32_e32 v0, s2 8285; GFX6-NEXT: v_mov_b32_e32 v1, s1 8286; GFX6-NEXT: v_mov_b32_e32 v2, s0 8287; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8288; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8289; GFX6-NEXT: ds_write_b32 v0, v1 8290; GFX6-NEXT: s_endpgm 8291; 8292; GFX7-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8293; GFX7: ; %bb.0: ; %entry 8294; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8295; GFX7-NEXT: s_mov_b32 m0, -1 8296; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8297; GFX7-NEXT: v_mov_b32_e32 v0, s0 8298; GFX7-NEXT: v_mov_b32_e32 v1, s2 8299; GFX7-NEXT: v_mov_b32_e32 v2, s1 8300; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8301; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8302; GFX7-NEXT: ds_write_b32 v0, v1 8303; GFX7-NEXT: s_endpgm 8304; 8305; GFX10-WGP-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8306; GFX10-WGP: ; %bb.0: ; %entry 8307; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8308; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8309; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 8310; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 8311; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 8312; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8313; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8314; GFX10-WGP-NEXT: ds_write_b32 v0, v1 8315; GFX10-WGP-NEXT: s_endpgm 8316; 8317; GFX10-CU-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8318; GFX10-CU: ; %bb.0: ; %entry 8319; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8320; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8321; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 8322; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 8323; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 8324; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8325; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8326; GFX10-CU-NEXT: ds_write_b32 v0, v1 8327; GFX10-CU-NEXT: s_endpgm 8328; 8329; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8330; SKIP-CACHE-INV: ; %bb.0: ; %entry 8331; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8332; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 8333; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8334; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 8335; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 8336; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 8337; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8338; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8339; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 8340; SKIP-CACHE-INV-NEXT: s_endpgm 8341; 8342; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8343; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 8344; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8345; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8346; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8347; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8348; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8349; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8350; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8351; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8352; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 8353; 8354; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8355; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8356; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8357; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8358; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8359; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8360; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8361; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8362; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8363; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 8364; GFX90A-TGSPLIT-NEXT: s_endpgm 8365; 8366; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8367; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8368; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8369; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8370; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8371; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8372; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8373; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8374; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8375; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8376; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8377; 8378; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg: 8379; GFX940-TGSPLIT: ; %bb.0: ; %entry 8380; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8381; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8382; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8383; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8384; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8385; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8386; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8387; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 8388; GFX940-TGSPLIT-NEXT: s_endpgm 8389 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8390entry: 8391 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8392 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release monotonic 8393 %val0 = extractvalue { i32, i1 } %val, 0 8394 store i32 %val0, i32 addrspace(3)* %out, align 4 8395 ret void 8396} 8397 8398define amdgpu_kernel void @local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg( 8399; GFX6-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8400; GFX6: ; %bb.0: ; %entry 8401; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 8402; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 8403; GFX6-NEXT: s_mov_b32 m0, -1 8404; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8405; GFX6-NEXT: v_mov_b32_e32 v0, s2 8406; GFX6-NEXT: v_mov_b32_e32 v1, s1 8407; GFX6-NEXT: v_mov_b32_e32 v2, s0 8408; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8409; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8410; GFX6-NEXT: ds_write_b32 v0, v1 8411; GFX6-NEXT: s_endpgm 8412; 8413; GFX7-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8414; GFX7: ; %bb.0: ; %entry 8415; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8416; GFX7-NEXT: s_mov_b32 m0, -1 8417; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8418; GFX7-NEXT: v_mov_b32_e32 v0, s0 8419; GFX7-NEXT: v_mov_b32_e32 v1, s2 8420; GFX7-NEXT: v_mov_b32_e32 v2, s1 8421; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8422; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8423; GFX7-NEXT: ds_write_b32 v0, v1 8424; GFX7-NEXT: s_endpgm 8425; 8426; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8427; GFX10-WGP: ; %bb.0: ; %entry 8428; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8429; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8430; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 8431; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 8432; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 8433; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8434; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8435; GFX10-WGP-NEXT: ds_write_b32 v0, v1 8436; GFX10-WGP-NEXT: s_endpgm 8437; 8438; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8439; GFX10-CU: ; %bb.0: ; %entry 8440; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8441; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8442; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 8443; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 8444; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 8445; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8446; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8447; GFX10-CU-NEXT: ds_write_b32 v0, v1 8448; GFX10-CU-NEXT: s_endpgm 8449; 8450; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8451; SKIP-CACHE-INV: ; %bb.0: ; %entry 8452; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8453; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 8454; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8455; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 8456; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 8457; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 8458; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8459; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8460; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 8461; SKIP-CACHE-INV-NEXT: s_endpgm 8462; 8463; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8464; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 8465; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8466; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8467; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8468; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8469; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8470; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8471; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8472; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8473; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 8474; 8475; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8476; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8477; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8478; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8479; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8480; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8481; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8482; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8483; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8484; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 8485; GFX90A-TGSPLIT-NEXT: s_endpgm 8486; 8487; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8488; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8489; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8490; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8491; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8492; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8493; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8494; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8495; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8496; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8497; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8498; 8499; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg: 8500; GFX940-TGSPLIT: ; %bb.0: ; %entry 8501; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8502; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8503; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8504; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8505; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8506; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8507; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8508; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 8509; GFX940-TGSPLIT-NEXT: s_endpgm 8510 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8511entry: 8512 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8513 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel monotonic 8514 %val0 = extractvalue { i32, i1 } %val, 0 8515 store i32 %val0, i32 addrspace(3)* %out, align 4 8516 ret void 8517} 8518 8519define amdgpu_kernel void @local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg( 8520; GFX6-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8521; GFX6: ; %bb.0: ; %entry 8522; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 8523; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 8524; GFX6-NEXT: s_mov_b32 m0, -1 8525; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8526; GFX6-NEXT: v_mov_b32_e32 v0, s2 8527; GFX6-NEXT: v_mov_b32_e32 v1, s1 8528; GFX6-NEXT: v_mov_b32_e32 v2, s0 8529; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8530; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8531; GFX6-NEXT: ds_write_b32 v0, v1 8532; GFX6-NEXT: s_endpgm 8533; 8534; GFX7-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8535; GFX7: ; %bb.0: ; %entry 8536; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8537; GFX7-NEXT: s_mov_b32 m0, -1 8538; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8539; GFX7-NEXT: v_mov_b32_e32 v0, s0 8540; GFX7-NEXT: v_mov_b32_e32 v1, s2 8541; GFX7-NEXT: v_mov_b32_e32 v2, s1 8542; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8543; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8544; GFX7-NEXT: ds_write_b32 v0, v1 8545; GFX7-NEXT: s_endpgm 8546; 8547; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8548; GFX10-WGP: ; %bb.0: ; %entry 8549; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8550; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8551; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 8552; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 8553; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 8554; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8555; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8556; GFX10-WGP-NEXT: ds_write_b32 v0, v1 8557; GFX10-WGP-NEXT: s_endpgm 8558; 8559; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8560; GFX10-CU: ; %bb.0: ; %entry 8561; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8562; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8563; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 8564; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 8565; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 8566; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8567; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8568; GFX10-CU-NEXT: ds_write_b32 v0, v1 8569; GFX10-CU-NEXT: s_endpgm 8570; 8571; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8572; SKIP-CACHE-INV: ; %bb.0: ; %entry 8573; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8574; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 8575; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8576; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 8577; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 8578; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 8579; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8580; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8581; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 8582; SKIP-CACHE-INV-NEXT: s_endpgm 8583; 8584; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8585; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 8586; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8587; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8588; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8589; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8590; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8591; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8592; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8593; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8594; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 8595; 8596; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8597; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8598; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8599; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8600; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8601; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8602; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8603; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8604; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8605; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 8606; GFX90A-TGSPLIT-NEXT: s_endpgm 8607; 8608; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8609; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8610; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8611; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8612; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8613; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8614; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8615; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8616; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8617; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8618; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8619; 8620; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg: 8621; GFX940-TGSPLIT: ; %bb.0: ; %entry 8622; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8623; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8624; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8625; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8626; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8627; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8628; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8629; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 8630; GFX940-TGSPLIT-NEXT: s_endpgm 8631 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8632entry: 8633 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8634 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst monotonic 8635 %val0 = extractvalue { i32, i1 } %val, 0 8636 store i32 %val0, i32 addrspace(3)* %out, align 4 8637 ret void 8638} 8639 8640define amdgpu_kernel void @local_singlethread_one_as_monotonic_acquire_ret_cmpxchg( 8641; GFX6-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8642; GFX6: ; %bb.0: ; %entry 8643; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 8644; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 8645; GFX6-NEXT: s_mov_b32 m0, -1 8646; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8647; GFX6-NEXT: v_mov_b32_e32 v0, s2 8648; GFX6-NEXT: v_mov_b32_e32 v1, s1 8649; GFX6-NEXT: v_mov_b32_e32 v2, s0 8650; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8651; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8652; GFX6-NEXT: ds_write_b32 v0, v1 8653; GFX6-NEXT: s_endpgm 8654; 8655; GFX7-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8656; GFX7: ; %bb.0: ; %entry 8657; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8658; GFX7-NEXT: s_mov_b32 m0, -1 8659; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8660; GFX7-NEXT: v_mov_b32_e32 v0, s0 8661; GFX7-NEXT: v_mov_b32_e32 v1, s2 8662; GFX7-NEXT: v_mov_b32_e32 v2, s1 8663; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8664; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8665; GFX7-NEXT: ds_write_b32 v0, v1 8666; GFX7-NEXT: s_endpgm 8667; 8668; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8669; GFX10-WGP: ; %bb.0: ; %entry 8670; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8671; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8672; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 8673; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 8674; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 8675; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8676; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8677; GFX10-WGP-NEXT: ds_write_b32 v0, v1 8678; GFX10-WGP-NEXT: s_endpgm 8679; 8680; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8681; GFX10-CU: ; %bb.0: ; %entry 8682; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8683; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8684; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 8685; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 8686; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 8687; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8688; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8689; GFX10-CU-NEXT: ds_write_b32 v0, v1 8690; GFX10-CU-NEXT: s_endpgm 8691; 8692; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8693; SKIP-CACHE-INV: ; %bb.0: ; %entry 8694; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8695; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 8696; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8697; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 8698; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 8699; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 8700; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8701; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8702; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 8703; SKIP-CACHE-INV-NEXT: s_endpgm 8704; 8705; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8706; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 8707; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8708; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8709; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8710; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8711; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8712; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8713; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8714; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8715; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 8716; 8717; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8718; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8719; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8720; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8721; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8722; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8723; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8724; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8725; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8726; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 8727; GFX90A-TGSPLIT-NEXT: s_endpgm 8728; 8729; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8730; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8731; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8732; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8733; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8734; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8735; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8736; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8737; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8738; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8739; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8740; 8741; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg: 8742; GFX940-TGSPLIT: ; %bb.0: ; %entry 8743; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8744; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8745; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8746; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8747; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8748; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8749; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8750; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 8751; GFX940-TGSPLIT-NEXT: s_endpgm 8752 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8753entry: 8754 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8755 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic acquire 8756 %val0 = extractvalue { i32, i1 } %val, 0 8757 store i32 %val0, i32 addrspace(3)* %out, align 4 8758 ret void 8759} 8760 8761define amdgpu_kernel void @local_singlethread_one_as_acquire_acquire_ret_cmpxchg( 8762; GFX6-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8763; GFX6: ; %bb.0: ; %entry 8764; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 8765; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 8766; GFX6-NEXT: s_mov_b32 m0, -1 8767; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8768; GFX6-NEXT: v_mov_b32_e32 v0, s2 8769; GFX6-NEXT: v_mov_b32_e32 v1, s1 8770; GFX6-NEXT: v_mov_b32_e32 v2, s0 8771; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8772; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8773; GFX6-NEXT: ds_write_b32 v0, v1 8774; GFX6-NEXT: s_endpgm 8775; 8776; GFX7-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8777; GFX7: ; %bb.0: ; %entry 8778; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8779; GFX7-NEXT: s_mov_b32 m0, -1 8780; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8781; GFX7-NEXT: v_mov_b32_e32 v0, s0 8782; GFX7-NEXT: v_mov_b32_e32 v1, s2 8783; GFX7-NEXT: v_mov_b32_e32 v2, s1 8784; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8785; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8786; GFX7-NEXT: ds_write_b32 v0, v1 8787; GFX7-NEXT: s_endpgm 8788; 8789; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8790; GFX10-WGP: ; %bb.0: ; %entry 8791; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8792; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8793; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 8794; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 8795; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 8796; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8797; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8798; GFX10-WGP-NEXT: ds_write_b32 v0, v1 8799; GFX10-WGP-NEXT: s_endpgm 8800; 8801; GFX10-CU-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8802; GFX10-CU: ; %bb.0: ; %entry 8803; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8804; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8805; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 8806; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 8807; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 8808; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8809; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8810; GFX10-CU-NEXT: ds_write_b32 v0, v1 8811; GFX10-CU-NEXT: s_endpgm 8812; 8813; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8814; SKIP-CACHE-INV: ; %bb.0: ; %entry 8815; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8816; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 8817; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8818; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 8819; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 8820; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 8821; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8822; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8823; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 8824; SKIP-CACHE-INV-NEXT: s_endpgm 8825; 8826; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8827; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 8828; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8829; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8830; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8831; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8832; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8833; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8834; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8835; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8836; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 8837; 8838; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8839; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8840; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8841; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8842; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8843; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8844; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8845; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8846; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8847; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 8848; GFX90A-TGSPLIT-NEXT: s_endpgm 8849; 8850; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8851; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8852; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8853; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8854; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8855; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8856; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8857; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8858; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8859; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8860; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8861; 8862; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg: 8863; GFX940-TGSPLIT: ; %bb.0: ; %entry 8864; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8865; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8866; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8867; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8868; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8869; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8870; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8871; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 8872; GFX940-TGSPLIT-NEXT: s_endpgm 8873 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8874entry: 8875 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8876 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire acquire 8877 %val0 = extractvalue { i32, i1 } %val, 0 8878 store i32 %val0, i32 addrspace(3)* %out, align 4 8879 ret void 8880} 8881 8882define amdgpu_kernel void @local_singlethread_one_as_release_acquire_ret_cmpxchg( 8883; GFX6-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8884; GFX6: ; %bb.0: ; %entry 8885; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 8886; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 8887; GFX6-NEXT: s_mov_b32 m0, -1 8888; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8889; GFX6-NEXT: v_mov_b32_e32 v0, s2 8890; GFX6-NEXT: v_mov_b32_e32 v1, s1 8891; GFX6-NEXT: v_mov_b32_e32 v2, s0 8892; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8893; GFX6-NEXT: s_waitcnt lgkmcnt(0) 8894; GFX6-NEXT: ds_write_b32 v0, v1 8895; GFX6-NEXT: s_endpgm 8896; 8897; GFX7-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8898; GFX7: ; %bb.0: ; %entry 8899; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8900; GFX7-NEXT: s_mov_b32 m0, -1 8901; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8902; GFX7-NEXT: v_mov_b32_e32 v0, s0 8903; GFX7-NEXT: v_mov_b32_e32 v1, s2 8904; GFX7-NEXT: v_mov_b32_e32 v2, s1 8905; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8906; GFX7-NEXT: s_waitcnt lgkmcnt(0) 8907; GFX7-NEXT: ds_write_b32 v0, v1 8908; GFX7-NEXT: s_endpgm 8909; 8910; GFX10-WGP-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8911; GFX10-WGP: ; %bb.0: ; %entry 8912; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8913; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8914; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 8915; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 8916; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 8917; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8918; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 8919; GFX10-WGP-NEXT: ds_write_b32 v0, v1 8920; GFX10-WGP-NEXT: s_endpgm 8921; 8922; GFX10-CU-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8923; GFX10-CU: ; %bb.0: ; %entry 8924; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8925; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8926; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 8927; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 8928; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 8929; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8930; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 8931; GFX10-CU-NEXT: ds_write_b32 v0, v1 8932; GFX10-CU-NEXT: s_endpgm 8933; 8934; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8935; SKIP-CACHE-INV: ; %bb.0: ; %entry 8936; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8937; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 8938; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8939; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 8940; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 8941; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 8942; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8943; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 8944; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 8945; SKIP-CACHE-INV-NEXT: s_endpgm 8946; 8947; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8948; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 8949; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8950; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8951; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8952; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8953; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8954; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8955; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8956; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8957; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 8958; 8959; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8960; GFX90A-TGSPLIT: ; %bb.0: ; %entry 8961; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 8962; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8963; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8964; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8965; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8966; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8967; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8968; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 8969; GFX90A-TGSPLIT-NEXT: s_endpgm 8970; 8971; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8972; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 8973; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8974; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8975; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8976; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8977; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8978; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8979; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8980; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 8981; GFX940-NOTTGSPLIT-NEXT: s_endpgm 8982; 8983; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg: 8984; GFX940-TGSPLIT: ; %bb.0: ; %entry 8985; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 8986; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8987; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 8988; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 8989; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 8990; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 8991; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 8992; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 8993; GFX940-TGSPLIT-NEXT: s_endpgm 8994 i32 addrspace(3)* %out, i32 %in, i32 %old) { 8995entry: 8996 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 8997 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release acquire 8998 %val0 = extractvalue { i32, i1 } %val, 0 8999 store i32 %val0, i32 addrspace(3)* %out, align 4 9000 ret void 9001} 9002 9003define amdgpu_kernel void @local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg( 9004; GFX6-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9005; GFX6: ; %bb.0: ; %entry 9006; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 9007; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 9008; GFX6-NEXT: s_mov_b32 m0, -1 9009; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9010; GFX6-NEXT: v_mov_b32_e32 v0, s2 9011; GFX6-NEXT: v_mov_b32_e32 v1, s1 9012; GFX6-NEXT: v_mov_b32_e32 v2, s0 9013; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9014; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9015; GFX6-NEXT: ds_write_b32 v0, v1 9016; GFX6-NEXT: s_endpgm 9017; 9018; GFX7-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9019; GFX7: ; %bb.0: ; %entry 9020; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9021; GFX7-NEXT: s_mov_b32 m0, -1 9022; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9023; GFX7-NEXT: v_mov_b32_e32 v0, s0 9024; GFX7-NEXT: v_mov_b32_e32 v1, s2 9025; GFX7-NEXT: v_mov_b32_e32 v2, s1 9026; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9027; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9028; GFX7-NEXT: ds_write_b32 v0, v1 9029; GFX7-NEXT: s_endpgm 9030; 9031; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9032; GFX10-WGP: ; %bb.0: ; %entry 9033; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9034; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9035; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 9036; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 9037; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 9038; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9039; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9040; GFX10-WGP-NEXT: ds_write_b32 v0, v1 9041; GFX10-WGP-NEXT: s_endpgm 9042; 9043; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9044; GFX10-CU: ; %bb.0: ; %entry 9045; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9046; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9047; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 9048; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 9049; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 9050; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9051; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9052; GFX10-CU-NEXT: ds_write_b32 v0, v1 9053; GFX10-CU-NEXT: s_endpgm 9054; 9055; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9056; SKIP-CACHE-INV: ; %bb.0: ; %entry 9057; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9058; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 9059; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9060; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 9061; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 9062; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 9063; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9064; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9065; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 9066; SKIP-CACHE-INV-NEXT: s_endpgm 9067; 9068; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9069; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 9070; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9071; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9072; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9073; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9074; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9075; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9076; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9077; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9078; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 9079; 9080; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9081; GFX90A-TGSPLIT: ; %bb.0: ; %entry 9082; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9083; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9084; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9085; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9086; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9087; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9088; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9089; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 9090; GFX90A-TGSPLIT-NEXT: s_endpgm 9091; 9092; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9093; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 9094; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9095; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9096; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9097; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9098; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9099; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9100; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9101; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9102; GFX940-NOTTGSPLIT-NEXT: s_endpgm 9103; 9104; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg: 9105; GFX940-TGSPLIT: ; %bb.0: ; %entry 9106; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9107; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9108; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9109; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9110; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9111; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9112; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9113; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 9114; GFX940-TGSPLIT-NEXT: s_endpgm 9115 i32 addrspace(3)* %out, i32 %in, i32 %old) { 9116entry: 9117 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 9118 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel acquire 9119 %val0 = extractvalue { i32, i1 } %val, 0 9120 store i32 %val0, i32 addrspace(3)* %out, align 4 9121 ret void 9122} 9123 9124define amdgpu_kernel void @local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg( 9125; GFX6-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9126; GFX6: ; %bb.0: ; %entry 9127; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 9128; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 9129; GFX6-NEXT: s_mov_b32 m0, -1 9130; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9131; GFX6-NEXT: v_mov_b32_e32 v0, s2 9132; GFX6-NEXT: v_mov_b32_e32 v1, s1 9133; GFX6-NEXT: v_mov_b32_e32 v2, s0 9134; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9135; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9136; GFX6-NEXT: ds_write_b32 v0, v1 9137; GFX6-NEXT: s_endpgm 9138; 9139; GFX7-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9140; GFX7: ; %bb.0: ; %entry 9141; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9142; GFX7-NEXT: s_mov_b32 m0, -1 9143; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9144; GFX7-NEXT: v_mov_b32_e32 v0, s0 9145; GFX7-NEXT: v_mov_b32_e32 v1, s2 9146; GFX7-NEXT: v_mov_b32_e32 v2, s1 9147; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9148; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9149; GFX7-NEXT: ds_write_b32 v0, v1 9150; GFX7-NEXT: s_endpgm 9151; 9152; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9153; GFX10-WGP: ; %bb.0: ; %entry 9154; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9155; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9156; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 9157; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 9158; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 9159; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9160; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9161; GFX10-WGP-NEXT: ds_write_b32 v0, v1 9162; GFX10-WGP-NEXT: s_endpgm 9163; 9164; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9165; GFX10-CU: ; %bb.0: ; %entry 9166; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9167; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9168; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 9169; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 9170; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 9171; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9172; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9173; GFX10-CU-NEXT: ds_write_b32 v0, v1 9174; GFX10-CU-NEXT: s_endpgm 9175; 9176; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9177; SKIP-CACHE-INV: ; %bb.0: ; %entry 9178; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9179; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 9180; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9181; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 9182; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 9183; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 9184; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9185; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9186; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 9187; SKIP-CACHE-INV-NEXT: s_endpgm 9188; 9189; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9190; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 9191; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9192; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9193; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9194; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9195; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9196; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9197; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9198; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9199; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 9200; 9201; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9202; GFX90A-TGSPLIT: ; %bb.0: ; %entry 9203; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9204; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9205; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9206; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9207; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9208; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9209; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9210; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 9211; GFX90A-TGSPLIT-NEXT: s_endpgm 9212; 9213; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9214; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 9215; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9216; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9217; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9218; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9219; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9220; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9221; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9222; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9223; GFX940-NOTTGSPLIT-NEXT: s_endpgm 9224; 9225; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg: 9226; GFX940-TGSPLIT: ; %bb.0: ; %entry 9227; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9228; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9229; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9230; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9231; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9232; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9233; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9234; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 9235; GFX940-TGSPLIT-NEXT: s_endpgm 9236 i32 addrspace(3)* %out, i32 %in, i32 %old) { 9237entry: 9238 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 9239 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst acquire 9240 %val0 = extractvalue { i32, i1 } %val, 0 9241 store i32 %val0, i32 addrspace(3)* %out, align 4 9242 ret void 9243} 9244 9245define amdgpu_kernel void @local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg( 9246; GFX6-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9247; GFX6: ; %bb.0: ; %entry 9248; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 9249; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 9250; GFX6-NEXT: s_mov_b32 m0, -1 9251; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9252; GFX6-NEXT: v_mov_b32_e32 v0, s2 9253; GFX6-NEXT: v_mov_b32_e32 v1, s1 9254; GFX6-NEXT: v_mov_b32_e32 v2, s0 9255; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9256; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9257; GFX6-NEXT: ds_write_b32 v0, v1 9258; GFX6-NEXT: s_endpgm 9259; 9260; GFX7-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9261; GFX7: ; %bb.0: ; %entry 9262; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9263; GFX7-NEXT: s_mov_b32 m0, -1 9264; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9265; GFX7-NEXT: v_mov_b32_e32 v0, s0 9266; GFX7-NEXT: v_mov_b32_e32 v1, s2 9267; GFX7-NEXT: v_mov_b32_e32 v2, s1 9268; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9269; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9270; GFX7-NEXT: ds_write_b32 v0, v1 9271; GFX7-NEXT: s_endpgm 9272; 9273; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9274; GFX10-WGP: ; %bb.0: ; %entry 9275; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9276; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9277; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 9278; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 9279; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 9280; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9281; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9282; GFX10-WGP-NEXT: ds_write_b32 v0, v1 9283; GFX10-WGP-NEXT: s_endpgm 9284; 9285; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9286; GFX10-CU: ; %bb.0: ; %entry 9287; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9288; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9289; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 9290; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 9291; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 9292; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9293; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9294; GFX10-CU-NEXT: ds_write_b32 v0, v1 9295; GFX10-CU-NEXT: s_endpgm 9296; 9297; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9298; SKIP-CACHE-INV: ; %bb.0: ; %entry 9299; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9300; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 9301; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9302; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 9303; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 9304; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 9305; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9306; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9307; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 9308; SKIP-CACHE-INV-NEXT: s_endpgm 9309; 9310; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9311; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 9312; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9313; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9314; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9315; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9316; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9317; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9318; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9319; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9320; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 9321; 9322; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9323; GFX90A-TGSPLIT: ; %bb.0: ; %entry 9324; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9325; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9326; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9327; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9328; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9329; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9330; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9331; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 9332; GFX90A-TGSPLIT-NEXT: s_endpgm 9333; 9334; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9335; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 9336; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9337; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9338; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9339; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9340; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9341; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9342; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9343; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9344; GFX940-NOTTGSPLIT-NEXT: s_endpgm 9345; 9346; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg: 9347; GFX940-TGSPLIT: ; %bb.0: ; %entry 9348; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9349; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9350; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9351; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9352; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9353; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9354; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9355; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 9356; GFX940-TGSPLIT-NEXT: s_endpgm 9357 i32 addrspace(3)* %out, i32 %in, i32 %old) { 9358entry: 9359 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 9360 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic seq_cst 9361 %val0 = extractvalue { i32, i1 } %val, 0 9362 store i32 %val0, i32 addrspace(3)* %out, align 4 9363 ret void 9364} 9365 9366define amdgpu_kernel void @local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg( 9367; GFX6-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9368; GFX6: ; %bb.0: ; %entry 9369; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 9370; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 9371; GFX6-NEXT: s_mov_b32 m0, -1 9372; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9373; GFX6-NEXT: v_mov_b32_e32 v0, s2 9374; GFX6-NEXT: v_mov_b32_e32 v1, s1 9375; GFX6-NEXT: v_mov_b32_e32 v2, s0 9376; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9377; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9378; GFX6-NEXT: ds_write_b32 v0, v1 9379; GFX6-NEXT: s_endpgm 9380; 9381; GFX7-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9382; GFX7: ; %bb.0: ; %entry 9383; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9384; GFX7-NEXT: s_mov_b32 m0, -1 9385; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9386; GFX7-NEXT: v_mov_b32_e32 v0, s0 9387; GFX7-NEXT: v_mov_b32_e32 v1, s2 9388; GFX7-NEXT: v_mov_b32_e32 v2, s1 9389; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9390; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9391; GFX7-NEXT: ds_write_b32 v0, v1 9392; GFX7-NEXT: s_endpgm 9393; 9394; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9395; GFX10-WGP: ; %bb.0: ; %entry 9396; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9397; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9398; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 9399; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 9400; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 9401; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9402; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9403; GFX10-WGP-NEXT: ds_write_b32 v0, v1 9404; GFX10-WGP-NEXT: s_endpgm 9405; 9406; GFX10-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9407; GFX10-CU: ; %bb.0: ; %entry 9408; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9409; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9410; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 9411; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 9412; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 9413; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9414; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9415; GFX10-CU-NEXT: ds_write_b32 v0, v1 9416; GFX10-CU-NEXT: s_endpgm 9417; 9418; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9419; SKIP-CACHE-INV: ; %bb.0: ; %entry 9420; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9421; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 9422; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9423; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 9424; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 9425; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 9426; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9427; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9428; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 9429; SKIP-CACHE-INV-NEXT: s_endpgm 9430; 9431; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9432; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 9433; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9434; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9435; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9436; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9437; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9438; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9439; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9440; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9441; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 9442; 9443; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9444; GFX90A-TGSPLIT: ; %bb.0: ; %entry 9445; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9446; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9447; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9448; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9449; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9450; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9451; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9452; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 9453; GFX90A-TGSPLIT-NEXT: s_endpgm 9454; 9455; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9456; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 9457; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9458; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9459; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9460; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9461; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9462; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9463; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9464; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9465; GFX940-NOTTGSPLIT-NEXT: s_endpgm 9466; 9467; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg: 9468; GFX940-TGSPLIT: ; %bb.0: ; %entry 9469; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9470; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9471; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9472; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9473; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9474; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9475; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9476; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 9477; GFX940-TGSPLIT-NEXT: s_endpgm 9478 i32 addrspace(3)* %out, i32 %in, i32 %old) { 9479entry: 9480 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 9481 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire seq_cst 9482 %val0 = extractvalue { i32, i1 } %val, 0 9483 store i32 %val0, i32 addrspace(3)* %out, align 4 9484 ret void 9485} 9486 9487define amdgpu_kernel void @local_singlethread_one_as_release_seq_cst_ret_cmpxchg( 9488; GFX6-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9489; GFX6: ; %bb.0: ; %entry 9490; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 9491; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 9492; GFX6-NEXT: s_mov_b32 m0, -1 9493; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9494; GFX6-NEXT: v_mov_b32_e32 v0, s2 9495; GFX6-NEXT: v_mov_b32_e32 v1, s1 9496; GFX6-NEXT: v_mov_b32_e32 v2, s0 9497; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9498; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9499; GFX6-NEXT: ds_write_b32 v0, v1 9500; GFX6-NEXT: s_endpgm 9501; 9502; GFX7-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9503; GFX7: ; %bb.0: ; %entry 9504; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9505; GFX7-NEXT: s_mov_b32 m0, -1 9506; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9507; GFX7-NEXT: v_mov_b32_e32 v0, s0 9508; GFX7-NEXT: v_mov_b32_e32 v1, s2 9509; GFX7-NEXT: v_mov_b32_e32 v2, s1 9510; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9511; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9512; GFX7-NEXT: ds_write_b32 v0, v1 9513; GFX7-NEXT: s_endpgm 9514; 9515; GFX10-WGP-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9516; GFX10-WGP: ; %bb.0: ; %entry 9517; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9518; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9519; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 9520; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 9521; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 9522; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9523; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9524; GFX10-WGP-NEXT: ds_write_b32 v0, v1 9525; GFX10-WGP-NEXT: s_endpgm 9526; 9527; GFX10-CU-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9528; GFX10-CU: ; %bb.0: ; %entry 9529; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9530; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9531; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 9532; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 9533; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 9534; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9535; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9536; GFX10-CU-NEXT: ds_write_b32 v0, v1 9537; GFX10-CU-NEXT: s_endpgm 9538; 9539; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9540; SKIP-CACHE-INV: ; %bb.0: ; %entry 9541; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9542; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 9543; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9544; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 9545; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 9546; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 9547; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9548; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9549; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 9550; SKIP-CACHE-INV-NEXT: s_endpgm 9551; 9552; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9553; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 9554; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9555; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9556; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9557; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9558; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9559; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9560; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9561; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9562; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 9563; 9564; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9565; GFX90A-TGSPLIT: ; %bb.0: ; %entry 9566; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9567; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9568; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9569; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9570; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9571; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9572; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9573; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 9574; GFX90A-TGSPLIT-NEXT: s_endpgm 9575; 9576; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9577; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 9578; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9579; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9580; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9581; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9582; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9583; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9584; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9585; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9586; GFX940-NOTTGSPLIT-NEXT: s_endpgm 9587; 9588; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg: 9589; GFX940-TGSPLIT: ; %bb.0: ; %entry 9590; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9591; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9592; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9593; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9594; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9595; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9596; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9597; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 9598; GFX940-TGSPLIT-NEXT: s_endpgm 9599 i32 addrspace(3)* %out, i32 %in, i32 %old) { 9600entry: 9601 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 9602 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release seq_cst 9603 %val0 = extractvalue { i32, i1 } %val, 0 9604 store i32 %val0, i32 addrspace(3)* %out, align 4 9605 ret void 9606} 9607 9608define amdgpu_kernel void @local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg( 9609; GFX6-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9610; GFX6: ; %bb.0: ; %entry 9611; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 9612; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 9613; GFX6-NEXT: s_mov_b32 m0, -1 9614; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9615; GFX6-NEXT: v_mov_b32_e32 v0, s2 9616; GFX6-NEXT: v_mov_b32_e32 v1, s1 9617; GFX6-NEXT: v_mov_b32_e32 v2, s0 9618; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9619; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9620; GFX6-NEXT: ds_write_b32 v0, v1 9621; GFX6-NEXT: s_endpgm 9622; 9623; GFX7-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9624; GFX7: ; %bb.0: ; %entry 9625; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9626; GFX7-NEXT: s_mov_b32 m0, -1 9627; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9628; GFX7-NEXT: v_mov_b32_e32 v0, s0 9629; GFX7-NEXT: v_mov_b32_e32 v1, s2 9630; GFX7-NEXT: v_mov_b32_e32 v2, s1 9631; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9632; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9633; GFX7-NEXT: ds_write_b32 v0, v1 9634; GFX7-NEXT: s_endpgm 9635; 9636; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9637; GFX10-WGP: ; %bb.0: ; %entry 9638; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9639; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9640; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 9641; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 9642; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 9643; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9644; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9645; GFX10-WGP-NEXT: ds_write_b32 v0, v1 9646; GFX10-WGP-NEXT: s_endpgm 9647; 9648; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9649; GFX10-CU: ; %bb.0: ; %entry 9650; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9651; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9652; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 9653; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 9654; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 9655; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9656; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9657; GFX10-CU-NEXT: ds_write_b32 v0, v1 9658; GFX10-CU-NEXT: s_endpgm 9659; 9660; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9661; SKIP-CACHE-INV: ; %bb.0: ; %entry 9662; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9663; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 9664; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9665; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 9666; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 9667; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 9668; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9669; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9670; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 9671; SKIP-CACHE-INV-NEXT: s_endpgm 9672; 9673; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9674; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 9675; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9676; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9677; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9678; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9679; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9680; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9681; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9682; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9683; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 9684; 9685; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9686; GFX90A-TGSPLIT: ; %bb.0: ; %entry 9687; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9688; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9689; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9690; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9691; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9692; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9693; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9694; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 9695; GFX90A-TGSPLIT-NEXT: s_endpgm 9696; 9697; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9698; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 9699; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9700; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9701; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9702; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9703; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9704; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9705; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9706; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9707; GFX940-NOTTGSPLIT-NEXT: s_endpgm 9708; 9709; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg: 9710; GFX940-TGSPLIT: ; %bb.0: ; %entry 9711; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9712; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9713; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9714; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9715; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9716; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9717; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9718; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 9719; GFX940-TGSPLIT-NEXT: s_endpgm 9720 i32 addrspace(3)* %out, i32 %in, i32 %old) { 9721entry: 9722 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 9723 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel seq_cst 9724 %val0 = extractvalue { i32, i1 } %val, 0 9725 store i32 %val0, i32 addrspace(3)* %out, align 4 9726 ret void 9727} 9728 9729define amdgpu_kernel void @local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg( 9730; GFX6-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9731; GFX6: ; %bb.0: ; %entry 9732; GFX6-NEXT: s_load_dword s2, s[4:5], 0x0 9733; GFX6-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x1 9734; GFX6-NEXT: s_mov_b32 m0, -1 9735; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9736; GFX6-NEXT: v_mov_b32_e32 v0, s2 9737; GFX6-NEXT: v_mov_b32_e32 v1, s1 9738; GFX6-NEXT: v_mov_b32_e32 v2, s0 9739; GFX6-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9740; GFX6-NEXT: s_waitcnt lgkmcnt(0) 9741; GFX6-NEXT: ds_write_b32 v0, v1 9742; GFX6-NEXT: s_endpgm 9743; 9744; GFX7-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9745; GFX7: ; %bb.0: ; %entry 9746; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9747; GFX7-NEXT: s_mov_b32 m0, -1 9748; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9749; GFX7-NEXT: v_mov_b32_e32 v0, s0 9750; GFX7-NEXT: v_mov_b32_e32 v1, s2 9751; GFX7-NEXT: v_mov_b32_e32 v2, s1 9752; GFX7-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9753; GFX7-NEXT: s_waitcnt lgkmcnt(0) 9754; GFX7-NEXT: ds_write_b32 v0, v1 9755; GFX7-NEXT: s_endpgm 9756; 9757; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9758; GFX10-WGP: ; %bb.0: ; %entry 9759; GFX10-WGP-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9760; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9761; GFX10-WGP-NEXT: v_mov_b32_e32 v0, s0 9762; GFX10-WGP-NEXT: v_mov_b32_e32 v1, s2 9763; GFX10-WGP-NEXT: v_mov_b32_e32 v2, s1 9764; GFX10-WGP-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9765; GFX10-WGP-NEXT: s_waitcnt lgkmcnt(0) 9766; GFX10-WGP-NEXT: ds_write_b32 v0, v1 9767; GFX10-WGP-NEXT: s_endpgm 9768; 9769; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9770; GFX10-CU: ; %bb.0: ; %entry 9771; GFX10-CU-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9772; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9773; GFX10-CU-NEXT: v_mov_b32_e32 v0, s0 9774; GFX10-CU-NEXT: v_mov_b32_e32 v1, s2 9775; GFX10-CU-NEXT: v_mov_b32_e32 v2, s1 9776; GFX10-CU-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9777; GFX10-CU-NEXT: s_waitcnt lgkmcnt(0) 9778; GFX10-CU-NEXT: ds_write_b32 v0, v1 9779; GFX10-CU-NEXT: s_endpgm 9780; 9781; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9782; SKIP-CACHE-INV: ; %bb.0: ; %entry 9783; SKIP-CACHE-INV-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9784; SKIP-CACHE-INV-NEXT: s_mov_b32 m0, -1 9785; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9786; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v0, s0 9787; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v1, s2 9788; SKIP-CACHE-INV-NEXT: v_mov_b32_e32 v2, s1 9789; SKIP-CACHE-INV-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9790; SKIP-CACHE-INV-NEXT: s_waitcnt lgkmcnt(0) 9791; SKIP-CACHE-INV-NEXT: ds_write_b32 v0, v1 9792; SKIP-CACHE-INV-NEXT: s_endpgm 9793; 9794; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9795; GFX90A-NOTTGSPLIT: ; %bb.0: ; %entry 9796; GFX90A-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9797; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9798; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9799; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9800; GFX90A-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9801; GFX90A-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9802; GFX90A-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9803; GFX90A-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9804; GFX90A-NOTTGSPLIT-NEXT: s_endpgm 9805; 9806; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9807; GFX90A-TGSPLIT: ; %bb.0: ; %entry 9808; GFX90A-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 9809; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9810; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9811; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9812; GFX90A-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9813; GFX90A-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9814; GFX90A-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9815; GFX90A-TGSPLIT-NEXT: ds_write_b32 v0, v1 9816; GFX90A-TGSPLIT-NEXT: s_endpgm 9817; 9818; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9819; GFX940-NOTTGSPLIT: ; %bb.0: ; %entry 9820; GFX940-NOTTGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9821; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9822; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9823; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9824; GFX940-NOTTGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9825; GFX940-NOTTGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9826; GFX940-NOTTGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9827; GFX940-NOTTGSPLIT-NEXT: ds_write_b32 v0, v1 9828; GFX940-NOTTGSPLIT-NEXT: s_endpgm 9829; 9830; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg: 9831; GFX940-TGSPLIT: ; %bb.0: ; %entry 9832; GFX940-TGSPLIT-NEXT: s_load_dwordx4 s[0:3], s[0:1], 0x0 9833; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9834; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v0, s0 9835; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v1, s2 9836; GFX940-TGSPLIT-NEXT: v_mov_b32_e32 v2, s1 9837; GFX940-TGSPLIT-NEXT: ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16 9838; GFX940-TGSPLIT-NEXT: s_waitcnt lgkmcnt(0) 9839; GFX940-TGSPLIT-NEXT: ds_write_b32 v0, v1 9840; GFX940-TGSPLIT-NEXT: s_endpgm 9841 i32 addrspace(3)* %out, i32 %in, i32 %old) { 9842entry: 9843 %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4 9844 %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst seq_cst 9845 %val0 = extractvalue { i32, i1 } %val, 0 9846 store i32 %val0, i32 addrspace(3)* %out, align 4 9847 ret void 9848} 9849 9850