14902 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=amdgcn -mcpu=gfx90a -amdgpu-atomic-optimizer-strategy=None < %s | FileCheck -check-prefixes=CHECK,GFX90A %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx950 -amdgpu-atomic-optimizer-strategy=None < %s | FileCheck -check-prefixes=CHECK,GFX950 %s4 5;---------------------------------------------------------------------6; xchg i32 cases7;---------------------------------------------------------------------8 9; Input and result use AGPR10define void @global_atomic_xchg_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {11; GFX90A-LABEL: global_atomic_xchg_i32_ret_a_a:12; GFX90A: ; %bb.0:13; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14; GFX90A-NEXT: ;;#ASMSTART15; GFX90A-NEXT: ; def a016; GFX90A-NEXT: ;;#ASMEND17; GFX90A-NEXT: v_accvgpr_read_b32 v2, a018; GFX90A-NEXT: buffer_wbl219; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc20; GFX90A-NEXT: s_waitcnt vmcnt(0)21; GFX90A-NEXT: buffer_invl222; GFX90A-NEXT: buffer_wbinvl1_vol23; GFX90A-NEXT: v_accvgpr_write_b32 a0, v024; GFX90A-NEXT: ;;#ASMSTART25; GFX90A-NEXT: ; use a026; GFX90A-NEXT: ;;#ASMEND27; GFX90A-NEXT: s_setpc_b64 s[30:31]28;29; GFX950-LABEL: global_atomic_xchg_i32_ret_a_a:30; GFX950: ; %bb.0:31; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)32; GFX950-NEXT: ;;#ASMSTART33; GFX950-NEXT: ; def a034; GFX950-NEXT: ;;#ASMEND35; GFX950-NEXT: s_nop 036; GFX950-NEXT: v_accvgpr_read_b32 v2, a037; GFX950-NEXT: buffer_wbl2 sc0 sc138; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc139; GFX950-NEXT: s_waitcnt vmcnt(0)40; GFX950-NEXT: buffer_inv sc0 sc141; GFX950-NEXT: v_accvgpr_write_b32 a0, v042; GFX950-NEXT: ;;#ASMSTART43; GFX950-NEXT: ; use a044; GFX950-NEXT: ;;#ASMEND45; GFX950-NEXT: s_setpc_b64 s[30:31]46 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1047 %data = call i32 asm "; def $0", "=a"()48 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst49 call void asm "; use $0", "a"(i32 %result)50 ret void51}52 53; Input is AGPR, result used as VGPR.54define void @global_atomic_xchg_i32_ret_a_v(ptr addrspace(1) %ptr) #0 {55; GFX90A-LABEL: global_atomic_xchg_i32_ret_a_v:56; GFX90A: ; %bb.0:57; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)58; GFX90A-NEXT: ;;#ASMSTART59; GFX90A-NEXT: ; def a060; GFX90A-NEXT: ;;#ASMEND61; GFX90A-NEXT: v_accvgpr_read_b32 v2, a062; GFX90A-NEXT: buffer_wbl263; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc64; GFX90A-NEXT: s_waitcnt vmcnt(0)65; GFX90A-NEXT: buffer_invl266; GFX90A-NEXT: buffer_wbinvl1_vol67; GFX90A-NEXT: ;;#ASMSTART68; GFX90A-NEXT: ; use v069; GFX90A-NEXT: ;;#ASMEND70; GFX90A-NEXT: s_setpc_b64 s[30:31]71;72; GFX950-LABEL: global_atomic_xchg_i32_ret_a_v:73; GFX950: ; %bb.0:74; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)75; GFX950-NEXT: ;;#ASMSTART76; GFX950-NEXT: ; def a077; GFX950-NEXT: ;;#ASMEND78; GFX950-NEXT: s_nop 079; GFX950-NEXT: v_accvgpr_read_b32 v2, a080; GFX950-NEXT: buffer_wbl2 sc0 sc181; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc182; GFX950-NEXT: s_waitcnt vmcnt(0)83; GFX950-NEXT: buffer_inv sc0 sc184; GFX950-NEXT: ;;#ASMSTART85; GFX950-NEXT: ; use v086; GFX950-NEXT: ;;#ASMEND87; GFX950-NEXT: s_setpc_b64 s[30:31]88 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1089 %data = call i32 asm "; def $0", "=a"()90 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst91 call void asm "; use $0", "v"(i32 %result)92 ret void93}94 95; Input is VGPR, result used as AGPR96define void @global_atomic_xchg_i32_ret_v_a(ptr addrspace(1) %ptr) #0 {97; GFX90A-LABEL: global_atomic_xchg_i32_ret_v_a:98; GFX90A: ; %bb.0:99; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)100; GFX90A-NEXT: ;;#ASMSTART101; GFX90A-NEXT: ; def v2102; GFX90A-NEXT: ;;#ASMEND103; GFX90A-NEXT: buffer_wbl2104; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc105; GFX90A-NEXT: s_waitcnt vmcnt(0)106; GFX90A-NEXT: buffer_invl2107; GFX90A-NEXT: buffer_wbinvl1_vol108; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0109; GFX90A-NEXT: ;;#ASMSTART110; GFX90A-NEXT: ; use a0111; GFX90A-NEXT: ;;#ASMEND112; GFX90A-NEXT: s_setpc_b64 s[30:31]113;114; GFX950-LABEL: global_atomic_xchg_i32_ret_v_a:115; GFX950: ; %bb.0:116; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)117; GFX950-NEXT: ;;#ASMSTART118; GFX950-NEXT: ; def v2119; GFX950-NEXT: ;;#ASMEND120; GFX950-NEXT: buffer_wbl2 sc0 sc1121; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc1122; GFX950-NEXT: s_waitcnt vmcnt(0)123; GFX950-NEXT: buffer_inv sc0 sc1124; GFX950-NEXT: v_accvgpr_write_b32 a0, v0125; GFX950-NEXT: ;;#ASMSTART126; GFX950-NEXT: ; use a0127; GFX950-NEXT: ;;#ASMEND128; GFX950-NEXT: s_setpc_b64 s[30:31]129 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10130 %data = call i32 asm "; def $0", "=v"()131 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst132 call void asm "; use $0", "a"(i32 %result)133 ret void134}135 136; Input is AV, result also used as AV137define void @global_atomic_xchg_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {138; GFX90A-LABEL: global_atomic_xchg_i32_ret_av_av:139; GFX90A: ; %bb.0:140; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)141; GFX90A-NEXT: ;;#ASMSTART142; GFX90A-NEXT: ; def v2143; GFX90A-NEXT: ;;#ASMEND144; GFX90A-NEXT: buffer_wbl2145; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc146; GFX90A-NEXT: s_waitcnt vmcnt(0)147; GFX90A-NEXT: buffer_invl2148; GFX90A-NEXT: buffer_wbinvl1_vol149; GFX90A-NEXT: ;;#ASMSTART150; GFX90A-NEXT: ; use v0151; GFX90A-NEXT: ;;#ASMEND152; GFX90A-NEXT: s_setpc_b64 s[30:31]153;154; GFX950-LABEL: global_atomic_xchg_i32_ret_av_av:155; GFX950: ; %bb.0:156; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)157; GFX950-NEXT: ;;#ASMSTART158; GFX950-NEXT: ; def v2159; GFX950-NEXT: ;;#ASMEND160; GFX950-NEXT: buffer_wbl2 sc0 sc1161; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc1162; GFX950-NEXT: s_waitcnt vmcnt(0)163; GFX950-NEXT: buffer_inv sc0 sc1164; GFX950-NEXT: ;;#ASMSTART165; GFX950-NEXT: ; use v0166; GFX950-NEXT: ;;#ASMEND167; GFX950-NEXT: s_setpc_b64 s[30:31]168 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10169 %data = call i32 asm "; def $0", "=^VA"()170 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst171 call void asm "; use $0", "^VA"(i32 %result)172 ret void173}174 175; Input is AV, used as v176define void @global_atomic_xchg_i32_ret_av_v(ptr addrspace(1) %ptr) #0 {177; GFX90A-LABEL: global_atomic_xchg_i32_ret_av_v:178; GFX90A: ; %bb.0:179; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)180; GFX90A-NEXT: ;;#ASMSTART181; GFX90A-NEXT: ; def v2182; GFX90A-NEXT: ;;#ASMEND183; GFX90A-NEXT: buffer_wbl2184; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc185; GFX90A-NEXT: s_waitcnt vmcnt(0)186; GFX90A-NEXT: buffer_invl2187; GFX90A-NEXT: buffer_wbinvl1_vol188; GFX90A-NEXT: ;;#ASMSTART189; GFX90A-NEXT: ; use v0190; GFX90A-NEXT: ;;#ASMEND191; GFX90A-NEXT: s_setpc_b64 s[30:31]192;193; GFX950-LABEL: global_atomic_xchg_i32_ret_av_v:194; GFX950: ; %bb.0:195; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)196; GFX950-NEXT: ;;#ASMSTART197; GFX950-NEXT: ; def v2198; GFX950-NEXT: ;;#ASMEND199; GFX950-NEXT: buffer_wbl2 sc0 sc1200; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc1201; GFX950-NEXT: s_waitcnt vmcnt(0)202; GFX950-NEXT: buffer_inv sc0 sc1203; GFX950-NEXT: ;;#ASMSTART204; GFX950-NEXT: ; use v0205; GFX950-NEXT: ;;#ASMEND206; GFX950-NEXT: s_setpc_b64 s[30:31]207 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10208 %data = call i32 asm "; def $0", "=^VA"()209 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst210 call void asm "; use $0", "v"(i32 %result)211 ret void212}213 214; Input is AV, used as a215define void @global_atomic_xchg_i32_ret_av_a(ptr addrspace(1) %ptr) #0 {216; GFX90A-LABEL: global_atomic_xchg_i32_ret_av_a:217; GFX90A: ; %bb.0:218; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)219; GFX90A-NEXT: ;;#ASMSTART220; GFX90A-NEXT: ; def v2221; GFX90A-NEXT: ;;#ASMEND222; GFX90A-NEXT: buffer_wbl2223; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc224; GFX90A-NEXT: s_waitcnt vmcnt(0)225; GFX90A-NEXT: buffer_invl2226; GFX90A-NEXT: buffer_wbinvl1_vol227; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0228; GFX90A-NEXT: ;;#ASMSTART229; GFX90A-NEXT: ; use a0230; GFX90A-NEXT: ;;#ASMEND231; GFX90A-NEXT: s_setpc_b64 s[30:31]232;233; GFX950-LABEL: global_atomic_xchg_i32_ret_av_a:234; GFX950: ; %bb.0:235; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)236; GFX950-NEXT: ;;#ASMSTART237; GFX950-NEXT: ; def v2238; GFX950-NEXT: ;;#ASMEND239; GFX950-NEXT: buffer_wbl2 sc0 sc1240; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc1241; GFX950-NEXT: s_waitcnt vmcnt(0)242; GFX950-NEXT: buffer_inv sc0 sc1243; GFX950-NEXT: v_accvgpr_write_b32 a0, v0244; GFX950-NEXT: ;;#ASMSTART245; GFX950-NEXT: ; use a0246; GFX950-NEXT: ;;#ASMEND247; GFX950-NEXT: s_setpc_b64 s[30:31]248 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10249 %data = call i32 asm "; def $0", "=^VA"()250 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst251 call void asm "; use $0", "a"(i32 %result)252 ret void253}254 255; Input is a, result used as AV256define void @global_atomic_xchg_i32_ret_a_av(ptr addrspace(1) %ptr) #0 {257; GFX90A-LABEL: global_atomic_xchg_i32_ret_a_av:258; GFX90A: ; %bb.0:259; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)260; GFX90A-NEXT: ;;#ASMSTART261; GFX90A-NEXT: ; def a0262; GFX90A-NEXT: ;;#ASMEND263; GFX90A-NEXT: v_accvgpr_read_b32 v2, a0264; GFX90A-NEXT: buffer_wbl2265; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc266; GFX90A-NEXT: s_waitcnt vmcnt(0)267; GFX90A-NEXT: buffer_invl2268; GFX90A-NEXT: buffer_wbinvl1_vol269; GFX90A-NEXT: ;;#ASMSTART270; GFX90A-NEXT: ; use v0271; GFX90A-NEXT: ;;#ASMEND272; GFX90A-NEXT: s_setpc_b64 s[30:31]273;274; GFX950-LABEL: global_atomic_xchg_i32_ret_a_av:275; GFX950: ; %bb.0:276; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)277; GFX950-NEXT: ;;#ASMSTART278; GFX950-NEXT: ; def a0279; GFX950-NEXT: ;;#ASMEND280; GFX950-NEXT: s_nop 0281; GFX950-NEXT: v_accvgpr_read_b32 v2, a0282; GFX950-NEXT: buffer_wbl2 sc0 sc1283; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc1284; GFX950-NEXT: s_waitcnt vmcnt(0)285; GFX950-NEXT: buffer_inv sc0 sc1286; GFX950-NEXT: ;;#ASMSTART287; GFX950-NEXT: ; use v0288; GFX950-NEXT: ;;#ASMEND289; GFX950-NEXT: s_setpc_b64 s[30:31]290 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10291 %data = call i32 asm "; def $0", "=a"()292 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst293 call void asm "; use $0", "^VA"(i32 %result)294 ret void295}296 297; Input is v, result used as AV298define void @global_atomic_xchg_i32_ret_v_av(ptr addrspace(1) %ptr) #0 {299; GFX90A-LABEL: global_atomic_xchg_i32_ret_v_av:300; GFX90A: ; %bb.0:301; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)302; GFX90A-NEXT: ;;#ASMSTART303; GFX90A-NEXT: ; def v2304; GFX90A-NEXT: ;;#ASMEND305; GFX90A-NEXT: buffer_wbl2306; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc307; GFX90A-NEXT: s_waitcnt vmcnt(0)308; GFX90A-NEXT: buffer_invl2309; GFX90A-NEXT: buffer_wbinvl1_vol310; GFX90A-NEXT: ;;#ASMSTART311; GFX90A-NEXT: ; use v0312; GFX90A-NEXT: ;;#ASMEND313; GFX90A-NEXT: s_setpc_b64 s[30:31]314;315; GFX950-LABEL: global_atomic_xchg_i32_ret_v_av:316; GFX950: ; %bb.0:317; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)318; GFX950-NEXT: ;;#ASMSTART319; GFX950-NEXT: ; def v2320; GFX950-NEXT: ;;#ASMEND321; GFX950-NEXT: buffer_wbl2 sc0 sc1322; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc1323; GFX950-NEXT: s_waitcnt vmcnt(0)324; GFX950-NEXT: buffer_inv sc0 sc1325; GFX950-NEXT: ;;#ASMSTART326; GFX950-NEXT: ; use v0327; GFX950-NEXT: ;;#ASMEND328; GFX950-NEXT: s_setpc_b64 s[30:31]329 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10330 %data = call i32 asm "; def $0", "=v"()331 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst332 call void asm "; use $0", "^VA"(i32 %result)333 ret void334}335 336define void @global_atomic_xchg_i32_ret_av_av_no_agprs(ptr addrspace(1) %ptr) #0 {337; GFX90A-LABEL: global_atomic_xchg_i32_ret_av_av_no_agprs:338; GFX90A: ; %bb.0:339; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)340; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0341; GFX90A-NEXT: v_accvgpr_write_b32 a3, v40 ; Reload Reuse342; GFX90A-NEXT: v_accvgpr_write_b32 a4, v41 ; Reload Reuse343; GFX90A-NEXT: v_accvgpr_write_b32 a5, v42 ; Reload Reuse344; GFX90A-NEXT: v_accvgpr_write_b32 a6, v43 ; Reload Reuse345; GFX90A-NEXT: v_accvgpr_write_b32 a7, v44 ; Reload Reuse346; GFX90A-NEXT: v_accvgpr_write_b32 a8, v45 ; Reload Reuse347; GFX90A-NEXT: v_accvgpr_write_b32 a9, v46 ; Reload Reuse348; GFX90A-NEXT: v_accvgpr_write_b32 a10, v47 ; Reload Reuse349; GFX90A-NEXT: v_accvgpr_write_b32 a11, v56 ; Reload Reuse350; GFX90A-NEXT: v_accvgpr_write_b32 a12, v57 ; Reload Reuse351; GFX90A-NEXT: v_accvgpr_write_b32 a13, v58 ; Reload Reuse352; GFX90A-NEXT: v_accvgpr_write_b32 a14, v59 ; Reload Reuse353; GFX90A-NEXT: v_accvgpr_write_b32 a15, v60 ; Reload Reuse354; GFX90A-NEXT: v_accvgpr_write_b32 a16, v61 ; Reload Reuse355; GFX90A-NEXT: v_accvgpr_write_b32 a17, v62 ; Reload Reuse356; GFX90A-NEXT: v_accvgpr_write_b32 a18, v63 ; Reload Reuse357; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1358; GFX90A-NEXT: ;;#ASMSTART359; GFX90A-NEXT: ; def v[0:31]360; GFX90A-NEXT: ;;#ASMEND361; GFX90A-NEXT: buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill362; GFX90A-NEXT: s_nop 0363; GFX90A-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill364; GFX90A-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Spill365; GFX90A-NEXT: buffer_store_dword v3, off, s[0:3], s32 offset:12 ; 4-byte Folded Spill366; GFX90A-NEXT: buffer_store_dword v4, off, s[0:3], s32 offset:16 ; 4-byte Folded Spill367; GFX90A-NEXT: buffer_store_dword v5, off, s[0:3], s32 offset:20 ; 4-byte Folded Spill368; GFX90A-NEXT: buffer_store_dword v6, off, s[0:3], s32 offset:24 ; 4-byte Folded Spill369; GFX90A-NEXT: buffer_store_dword v7, off, s[0:3], s32 offset:28 ; 4-byte Folded Spill370; GFX90A-NEXT: buffer_store_dword v8, off, s[0:3], s32 offset:32 ; 4-byte Folded Spill371; GFX90A-NEXT: buffer_store_dword v9, off, s[0:3], s32 offset:36 ; 4-byte Folded Spill372; GFX90A-NEXT: buffer_store_dword v10, off, s[0:3], s32 offset:40 ; 4-byte Folded Spill373; GFX90A-NEXT: buffer_store_dword v11, off, s[0:3], s32 offset:44 ; 4-byte Folded Spill374; GFX90A-NEXT: buffer_store_dword v12, off, s[0:3], s32 offset:48 ; 4-byte Folded Spill375; GFX90A-NEXT: buffer_store_dword v13, off, s[0:3], s32 offset:52 ; 4-byte Folded Spill376; GFX90A-NEXT: buffer_store_dword v14, off, s[0:3], s32 offset:56 ; 4-byte Folded Spill377; GFX90A-NEXT: buffer_store_dword v15, off, s[0:3], s32 offset:60 ; 4-byte Folded Spill378; GFX90A-NEXT: buffer_store_dword v16, off, s[0:3], s32 offset:64 ; 4-byte Folded Spill379; GFX90A-NEXT: buffer_store_dword v17, off, s[0:3], s32 offset:68 ; 4-byte Folded Spill380; GFX90A-NEXT: buffer_store_dword v18, off, s[0:3], s32 offset:72 ; 4-byte Folded Spill381; GFX90A-NEXT: ;;#ASMSTART382; GFX90A-NEXT: ; def a2383; GFX90A-NEXT: ;;#ASMEND384; GFX90A-NEXT: v_accvgpr_write_b32 a19, v31 ; Reload Reuse385; GFX90A-NEXT: v_accvgpr_read_b32 v0, a0386; GFX90A-NEXT: v_accvgpr_read_b32 v1, a1387; GFX90A-NEXT: v_accvgpr_read_b32 v2, a2388; GFX90A-NEXT: buffer_wbl2389; GFX90A-NEXT: s_waitcnt vmcnt(0)390; GFX90A-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 glc391; GFX90A-NEXT: s_waitcnt vmcnt(0)392; GFX90A-NEXT: buffer_invl2393; GFX90A-NEXT: buffer_wbinvl1_vol394; GFX90A-NEXT: v_accvgpr_write_b32 a31, v19 ; Reload Reuse395; GFX90A-NEXT: v_accvgpr_write_b32 a30, v20 ; Reload Reuse396; GFX90A-NEXT: v_accvgpr_write_b32 a29, v21 ; Reload Reuse397; GFX90A-NEXT: v_accvgpr_write_b32 a28, v22 ; Reload Reuse398; GFX90A-NEXT: v_accvgpr_write_b32 a27, v23 ; Reload Reuse399; GFX90A-NEXT: v_accvgpr_write_b32 a26, v24 ; Reload Reuse400; GFX90A-NEXT: v_accvgpr_write_b32 a25, v25 ; Reload Reuse401; GFX90A-NEXT: v_accvgpr_write_b32 a24, v26 ; Reload Reuse402; GFX90A-NEXT: v_accvgpr_write_b32 a23, v27 ; Reload Reuse403; GFX90A-NEXT: v_accvgpr_write_b32 a22, v28 ; Reload Reuse404; GFX90A-NEXT: v_accvgpr_write_b32 a21, v29 ; Reload Reuse405; GFX90A-NEXT: v_accvgpr_write_b32 a20, v30 ; Reload Reuse406; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0407; GFX90A-NEXT: buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload408; GFX90A-NEXT: buffer_load_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload409; GFX90A-NEXT: buffer_load_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Reload410; GFX90A-NEXT: buffer_load_dword v3, off, s[0:3], s32 offset:12 ; 4-byte Folded Reload411; GFX90A-NEXT: buffer_load_dword v4, off, s[0:3], s32 offset:16 ; 4-byte Folded Reload412; GFX90A-NEXT: buffer_load_dword v5, off, s[0:3], s32 offset:20 ; 4-byte Folded Reload413; GFX90A-NEXT: buffer_load_dword v6, off, s[0:3], s32 offset:24 ; 4-byte Folded Reload414; GFX90A-NEXT: buffer_load_dword v7, off, s[0:3], s32 offset:28 ; 4-byte Folded Reload415; GFX90A-NEXT: buffer_load_dword v8, off, s[0:3], s32 offset:32 ; 4-byte Folded Reload416; GFX90A-NEXT: buffer_load_dword v9, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload417; GFX90A-NEXT: buffer_load_dword v10, off, s[0:3], s32 offset:40 ; 4-byte Folded Reload418; GFX90A-NEXT: buffer_load_dword v11, off, s[0:3], s32 offset:44 ; 4-byte Folded Reload419; GFX90A-NEXT: buffer_load_dword v12, off, s[0:3], s32 offset:48 ; 4-byte Folded Reload420; GFX90A-NEXT: buffer_load_dword v13, off, s[0:3], s32 offset:52 ; 4-byte Folded Reload421; GFX90A-NEXT: buffer_load_dword v14, off, s[0:3], s32 offset:56 ; 4-byte Folded Reload422; GFX90A-NEXT: buffer_load_dword v15, off, s[0:3], s32 offset:60 ; 4-byte Folded Reload423; GFX90A-NEXT: buffer_load_dword v16, off, s[0:3], s32 offset:64 ; 4-byte Folded Reload424; GFX90A-NEXT: buffer_load_dword v17, off, s[0:3], s32 offset:68 ; 4-byte Folded Reload425; GFX90A-NEXT: buffer_load_dword v18, off, s[0:3], s32 offset:72 ; 4-byte Folded Reload426; GFX90A-NEXT: v_accvgpr_read_b32 v19, a31 ; Reload Reuse427; GFX90A-NEXT: v_accvgpr_read_b32 v20, a30 ; Reload Reuse428; GFX90A-NEXT: v_accvgpr_read_b32 v21, a29 ; Reload Reuse429; GFX90A-NEXT: v_accvgpr_read_b32 v22, a28 ; Reload Reuse430; GFX90A-NEXT: v_accvgpr_read_b32 v23, a27 ; Reload Reuse431; GFX90A-NEXT: v_accvgpr_read_b32 v24, a26 ; Reload Reuse432; GFX90A-NEXT: v_accvgpr_read_b32 v25, a25 ; Reload Reuse433; GFX90A-NEXT: v_accvgpr_read_b32 v26, a24 ; Reload Reuse434; GFX90A-NEXT: v_accvgpr_read_b32 v27, a23 ; Reload Reuse435; GFX90A-NEXT: v_accvgpr_read_b32 v28, a22 ; Reload Reuse436; GFX90A-NEXT: v_accvgpr_read_b32 v29, a21 ; Reload Reuse437; GFX90A-NEXT: v_accvgpr_read_b32 v30, a20 ; Reload Reuse438; GFX90A-NEXT: ;;#ASMSTART439; GFX90A-NEXT: ; use a0440; GFX90A-NEXT: ;;#ASMEND441; GFX90A-NEXT: s_waitcnt vmcnt(0)442; GFX90A-NEXT: v_accvgpr_read_b32 v31, a19 ; Reload Reuse443; GFX90A-NEXT: ;;#ASMSTART444; GFX90A-NEXT: ; use v[0:31]445; GFX90A-NEXT: ;;#ASMEND446; GFX90A-NEXT: v_accvgpr_read_b32 v63, a18 ; Reload Reuse447; GFX90A-NEXT: v_accvgpr_read_b32 v62, a17 ; Reload Reuse448; GFX90A-NEXT: v_accvgpr_read_b32 v61, a16 ; Reload Reuse449; GFX90A-NEXT: v_accvgpr_read_b32 v60, a15 ; Reload Reuse450; GFX90A-NEXT: v_accvgpr_read_b32 v59, a14 ; Reload Reuse451; GFX90A-NEXT: v_accvgpr_read_b32 v58, a13 ; Reload Reuse452; GFX90A-NEXT: v_accvgpr_read_b32 v57, a12 ; Reload Reuse453; GFX90A-NEXT: v_accvgpr_read_b32 v56, a11 ; Reload Reuse454; GFX90A-NEXT: v_accvgpr_read_b32 v47, a10 ; Reload Reuse455; GFX90A-NEXT: v_accvgpr_read_b32 v46, a9 ; Reload Reuse456; GFX90A-NEXT: v_accvgpr_read_b32 v45, a8 ; Reload Reuse457; GFX90A-NEXT: v_accvgpr_read_b32 v44, a7 ; Reload Reuse458; GFX90A-NEXT: v_accvgpr_read_b32 v43, a6 ; Reload Reuse459; GFX90A-NEXT: v_accvgpr_read_b32 v42, a5 ; Reload Reuse460; GFX90A-NEXT: v_accvgpr_read_b32 v41, a4 ; Reload Reuse461; GFX90A-NEXT: v_accvgpr_read_b32 v40, a3 ; Reload Reuse462; GFX90A-NEXT: s_setpc_b64 s[30:31]463;464; GFX950-LABEL: global_atomic_xchg_i32_ret_av_av_no_agprs:465; GFX950: ; %bb.0:466; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)467; GFX950-NEXT: v_accvgpr_write_b32 a0, v0468; GFX950-NEXT: v_accvgpr_write_b32 a3, v40 ; Reload Reuse469; GFX950-NEXT: v_accvgpr_write_b32 a4, v41 ; Reload Reuse470; GFX950-NEXT: v_accvgpr_write_b32 a5, v42 ; Reload Reuse471; GFX950-NEXT: v_accvgpr_write_b32 a6, v43 ; Reload Reuse472; GFX950-NEXT: v_accvgpr_write_b32 a7, v44 ; Reload Reuse473; GFX950-NEXT: v_accvgpr_write_b32 a8, v45 ; Reload Reuse474; GFX950-NEXT: v_accvgpr_write_b32 a9, v46 ; Reload Reuse475; GFX950-NEXT: v_accvgpr_write_b32 a10, v47 ; Reload Reuse476; GFX950-NEXT: v_accvgpr_write_b32 a11, v56 ; Reload Reuse477; GFX950-NEXT: v_accvgpr_write_b32 a12, v57 ; Reload Reuse478; GFX950-NEXT: v_accvgpr_write_b32 a13, v58 ; Reload Reuse479; GFX950-NEXT: v_accvgpr_write_b32 a14, v59 ; Reload Reuse480; GFX950-NEXT: v_accvgpr_write_b32 a15, v60 ; Reload Reuse481; GFX950-NEXT: v_accvgpr_write_b32 a16, v61 ; Reload Reuse482; GFX950-NEXT: v_accvgpr_write_b32 a17, v62 ; Reload Reuse483; GFX950-NEXT: v_accvgpr_write_b32 a18, v63 ; Reload Reuse484; GFX950-NEXT: v_accvgpr_write_b32 a1, v1485; GFX950-NEXT: ;;#ASMSTART486; GFX950-NEXT: ; def v[0:31]487; GFX950-NEXT: ;;#ASMEND488; GFX950-NEXT: scratch_store_dwordx4 off, v[0:3], s32 ; 16-byte Folded Spill489; GFX950-NEXT: s_nop 0490; GFX950-NEXT: scratch_store_dwordx4 off, v[4:7], s32 offset:16 ; 16-byte Folded Spill491; GFX950-NEXT: scratch_store_dwordx4 off, v[8:11], s32 offset:32 ; 16-byte Folded Spill492; GFX950-NEXT: scratch_store_dwordx4 off, v[12:15], s32 offset:48 ; 16-byte Folded Spill493; GFX950-NEXT: ;;#ASMSTART494; GFX950-NEXT: ; def a2495; GFX950-NEXT: ;;#ASMEND496; GFX950-NEXT: v_accvgpr_write_b32 a19, v31 ; Reload Reuse497; GFX950-NEXT: v_accvgpr_write_b32 a20, v30 ; Reload Reuse498; GFX950-NEXT: v_accvgpr_write_b32 a21, v29 ; Reload Reuse499; GFX950-NEXT: v_accvgpr_write_b32 a22, v28 ; Reload Reuse500; GFX950-NEXT: v_accvgpr_read_b32 v0, a0501; GFX950-NEXT: scratch_store_dwordx3 off, v[16:18], s32 offset:64 ; 12-byte Folded Spill502; GFX950-NEXT: v_accvgpr_read_b32 v1, a1503; GFX950-NEXT: v_accvgpr_read_b32 v2, a2504; GFX950-NEXT: buffer_wbl2 sc0 sc1505; GFX950-NEXT: s_waitcnt vmcnt(0)506; GFX950-NEXT: global_atomic_swap v0, v[0:1], v2, off offset:40 sc0 sc1507; GFX950-NEXT: s_waitcnt vmcnt(0)508; GFX950-NEXT: buffer_inv sc0 sc1509; GFX950-NEXT: v_accvgpr_write_b32 a31, v19 ; Reload Reuse510; GFX950-NEXT: v_accvgpr_write_b32 a27, v23 ; Reload Reuse511; GFX950-NEXT: v_accvgpr_write_b32 a28, v22 ; Reload Reuse512; GFX950-NEXT: v_accvgpr_write_b32 a29, v21 ; Reload Reuse513; GFX950-NEXT: v_accvgpr_write_b32 a30, v20 ; Reload Reuse514; GFX950-NEXT: v_accvgpr_write_b32 a23, v27 ; Reload Reuse515; GFX950-NEXT: v_accvgpr_write_b32 a24, v26 ; Reload Reuse516; GFX950-NEXT: v_accvgpr_write_b32 a25, v25 ; Reload Reuse517; GFX950-NEXT: v_accvgpr_write_b32 a26, v24 ; Reload Reuse518; GFX950-NEXT: v_accvgpr_write_b32 a0, v0519; GFX950-NEXT: scratch_load_dwordx4 v[0:3], off, s32 ; 16-byte Folded Reload520; GFX950-NEXT: scratch_load_dwordx4 v[4:7], off, s32 offset:16 ; 16-byte Folded Reload521; GFX950-NEXT: scratch_load_dwordx4 v[8:11], off, s32 offset:32 ; 16-byte Folded Reload522; GFX950-NEXT: scratch_load_dwordx4 v[12:15], off, s32 offset:48 ; 16-byte Folded Reload523; GFX950-NEXT: v_accvgpr_read_b32 v19, a31 ; Reload Reuse524; GFX950-NEXT: scratch_load_dwordx3 v[16:18], off, s32 offset:64 ; 12-byte Folded Reload525; GFX950-NEXT: v_accvgpr_read_b32 v23, a27 ; Reload Reuse526; GFX950-NEXT: v_accvgpr_read_b32 v22, a28 ; Reload Reuse527; GFX950-NEXT: v_accvgpr_read_b32 v21, a29 ; Reload Reuse528; GFX950-NEXT: v_accvgpr_read_b32 v20, a30 ; Reload Reuse529; GFX950-NEXT: v_accvgpr_read_b32 v27, a23 ; Reload Reuse530; GFX950-NEXT: v_accvgpr_read_b32 v26, a24 ; Reload Reuse531; GFX950-NEXT: v_accvgpr_read_b32 v25, a25 ; Reload Reuse532; GFX950-NEXT: v_accvgpr_read_b32 v24, a26 ; Reload Reuse533; GFX950-NEXT: ;;#ASMSTART534; GFX950-NEXT: ; use a0535; GFX950-NEXT: ;;#ASMEND536; GFX950-NEXT: s_waitcnt vmcnt(0)537; GFX950-NEXT: v_accvgpr_read_b32 v31, a19 ; Reload Reuse538; GFX950-NEXT: v_accvgpr_read_b32 v30, a20 ; Reload Reuse539; GFX950-NEXT: v_accvgpr_read_b32 v29, a21 ; Reload Reuse540; GFX950-NEXT: v_accvgpr_read_b32 v28, a22 ; Reload Reuse541; GFX950-NEXT: ;;#ASMSTART542; GFX950-NEXT: ; use v[0:31]543; GFX950-NEXT: ;;#ASMEND544; GFX950-NEXT: v_accvgpr_read_b32 v63, a18 ; Reload Reuse545; GFX950-NEXT: v_accvgpr_read_b32 v62, a17 ; Reload Reuse546; GFX950-NEXT: v_accvgpr_read_b32 v61, a16 ; Reload Reuse547; GFX950-NEXT: v_accvgpr_read_b32 v60, a15 ; Reload Reuse548; GFX950-NEXT: v_accvgpr_read_b32 v59, a14 ; Reload Reuse549; GFX950-NEXT: v_accvgpr_read_b32 v58, a13 ; Reload Reuse550; GFX950-NEXT: v_accvgpr_read_b32 v57, a12 ; Reload Reuse551; GFX950-NEXT: v_accvgpr_read_b32 v56, a11 ; Reload Reuse552; GFX950-NEXT: v_accvgpr_read_b32 v47, a10 ; Reload Reuse553; GFX950-NEXT: v_accvgpr_read_b32 v46, a9 ; Reload Reuse554; GFX950-NEXT: v_accvgpr_read_b32 v45, a8 ; Reload Reuse555; GFX950-NEXT: v_accvgpr_read_b32 v44, a7 ; Reload Reuse556; GFX950-NEXT: v_accvgpr_read_b32 v43, a6 ; Reload Reuse557; GFX950-NEXT: v_accvgpr_read_b32 v42, a5 ; Reload Reuse558; GFX950-NEXT: v_accvgpr_read_b32 v41, a4 ; Reload Reuse559; GFX950-NEXT: v_accvgpr_read_b32 v40, a3 ; Reload Reuse560; GFX950-NEXT: s_setpc_b64 s[30:31]561 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10562 %data = call i32 asm "; def $0", "=^VA"()563 %vgpr.def = call { <32 x i32>, <32 x i32> } asm sideeffect "; def $0", "=${v[0:31]},=${v[32:63]}"()564 %vgpr.0 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 0565 %vgpr.1 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 1566 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst567 call void asm sideeffect "; use $0", "{v[0:31]},{v[32:63]}"(<32 x i32> %vgpr.0, <32 x i32> %vgpr.1)568 call void asm "; use $0", "^VA"(i32 %result)569 ret void570}571 572define void @global_atomic_xchg_i32_noret_a(ptr addrspace(1) %ptr) #0 {573; GFX90A-LABEL: global_atomic_xchg_i32_noret_a:574; GFX90A: ; %bb.0:575; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)576; GFX90A-NEXT: ;;#ASMSTART577; GFX90A-NEXT: ; def a0578; GFX90A-NEXT: ;;#ASMEND579; GFX90A-NEXT: buffer_wbl2580; GFX90A-NEXT: global_atomic_swap v[0:1], a0, off offset:40581; GFX90A-NEXT: s_waitcnt vmcnt(0)582; GFX90A-NEXT: buffer_invl2583; GFX90A-NEXT: buffer_wbinvl1_vol584; GFX90A-NEXT: s_setpc_b64 s[30:31]585;586; GFX950-LABEL: global_atomic_xchg_i32_noret_a:587; GFX950: ; %bb.0:588; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)589; GFX950-NEXT: ;;#ASMSTART590; GFX950-NEXT: ; def a0591; GFX950-NEXT: ;;#ASMEND592; GFX950-NEXT: buffer_wbl2 sc0 sc1593; GFX950-NEXT: global_atomic_swap v[0:1], a0, off offset:40 sc1594; GFX950-NEXT: s_waitcnt vmcnt(0)595; GFX950-NEXT: buffer_inv sc0 sc1596; GFX950-NEXT: s_setpc_b64 s[30:31]597 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10598 %data = call i32 asm "; def $0", "=a"()599 %unused = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst600 ret void601}602 603define void @global_atomic_xchg_i32_noret_av(ptr addrspace(1) %ptr) #0 {604; GFX90A-LABEL: global_atomic_xchg_i32_noret_av:605; GFX90A: ; %bb.0:606; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)607; GFX90A-NEXT: ;;#ASMSTART608; GFX90A-NEXT: ; def v2609; GFX90A-NEXT: ;;#ASMEND610; GFX90A-NEXT: buffer_wbl2611; GFX90A-NEXT: global_atomic_swap v[0:1], v2, off offset:40612; GFX90A-NEXT: s_waitcnt vmcnt(0)613; GFX90A-NEXT: buffer_invl2614; GFX90A-NEXT: buffer_wbinvl1_vol615; GFX90A-NEXT: s_setpc_b64 s[30:31]616;617; GFX950-LABEL: global_atomic_xchg_i32_noret_av:618; GFX950: ; %bb.0:619; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)620; GFX950-NEXT: ;;#ASMSTART621; GFX950-NEXT: ; def v2622; GFX950-NEXT: ;;#ASMEND623; GFX950-NEXT: buffer_wbl2 sc0 sc1624; GFX950-NEXT: global_atomic_swap v[0:1], v2, off offset:40 sc1625; GFX950-NEXT: s_waitcnt vmcnt(0)626; GFX950-NEXT: buffer_inv sc0 sc1627; GFX950-NEXT: s_setpc_b64 s[30:31]628 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10629 %data = call i32 asm "; def $0", "=^VA"()630 %unused = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data seq_cst631 ret void632}633 634;---------------------------------------------------------------------635; xchg i64 cases636;---------------------------------------------------------------------637 638; Input and result use AGPR639define void @global_atomic_xchg_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {640; GFX90A-LABEL: global_atomic_xchg_i64_ret_a_a:641; GFX90A: ; %bb.0:642; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)643; GFX90A-NEXT: ;;#ASMSTART644; GFX90A-NEXT: ; def a[0:1]645; GFX90A-NEXT: ;;#ASMEND646; GFX90A-NEXT: v_accvgpr_read_b32 v3, a1647; GFX90A-NEXT: v_accvgpr_read_b32 v2, a0648; GFX90A-NEXT: buffer_wbl2649; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc650; GFX90A-NEXT: s_waitcnt vmcnt(0)651; GFX90A-NEXT: buffer_invl2652; GFX90A-NEXT: buffer_wbinvl1_vol653; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0654; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1655; GFX90A-NEXT: ;;#ASMSTART656; GFX90A-NEXT: ; use a[0:1]657; GFX90A-NEXT: ;;#ASMEND658; GFX90A-NEXT: s_setpc_b64 s[30:31]659;660; GFX950-LABEL: global_atomic_xchg_i64_ret_a_a:661; GFX950: ; %bb.0:662; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)663; GFX950-NEXT: ;;#ASMSTART664; GFX950-NEXT: ; def a[0:1]665; GFX950-NEXT: ;;#ASMEND666; GFX950-NEXT: s_nop 0667; GFX950-NEXT: v_accvgpr_read_b32 v3, a1668; GFX950-NEXT: v_accvgpr_read_b32 v2, a0669; GFX950-NEXT: buffer_wbl2 sc0 sc1670; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc0 sc1671; GFX950-NEXT: s_waitcnt vmcnt(0)672; GFX950-NEXT: buffer_inv sc0 sc1673; GFX950-NEXT: v_accvgpr_write_b32 a0, v0674; GFX950-NEXT: v_accvgpr_write_b32 a1, v1675; GFX950-NEXT: ;;#ASMSTART676; GFX950-NEXT: ; use a[0:1]677; GFX950-NEXT: ;;#ASMEND678; GFX950-NEXT: s_setpc_b64 s[30:31]679 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10680 %data = call i64 asm "; def $0", "=a"()681 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data seq_cst682 call void asm "; use $0", "a"(i64 %result)683 ret void684}685 686; Input is AGPR, result used as VGPR.687define void @global_atomic_xchg_i64_ret_a_v(ptr addrspace(1) %ptr) #0 {688; GFX90A-LABEL: global_atomic_xchg_i64_ret_a_v:689; GFX90A: ; %bb.0:690; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)691; GFX90A-NEXT: ;;#ASMSTART692; GFX90A-NEXT: ; def a[0:1]693; GFX90A-NEXT: ;;#ASMEND694; GFX90A-NEXT: v_accvgpr_read_b32 v3, a1695; GFX90A-NEXT: v_accvgpr_read_b32 v2, a0696; GFX90A-NEXT: buffer_wbl2697; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc698; GFX90A-NEXT: s_waitcnt vmcnt(0)699; GFX90A-NEXT: buffer_invl2700; GFX90A-NEXT: buffer_wbinvl1_vol701; GFX90A-NEXT: ;;#ASMSTART702; GFX90A-NEXT: ; use v[0:1]703; GFX90A-NEXT: ;;#ASMEND704; GFX90A-NEXT: s_setpc_b64 s[30:31]705;706; GFX950-LABEL: global_atomic_xchg_i64_ret_a_v:707; GFX950: ; %bb.0:708; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)709; GFX950-NEXT: ;;#ASMSTART710; GFX950-NEXT: ; def a[0:1]711; GFX950-NEXT: ;;#ASMEND712; GFX950-NEXT: s_nop 0713; GFX950-NEXT: v_accvgpr_read_b32 v3, a1714; GFX950-NEXT: v_accvgpr_read_b32 v2, a0715; GFX950-NEXT: buffer_wbl2 sc0 sc1716; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc0 sc1717; GFX950-NEXT: s_waitcnt vmcnt(0)718; GFX950-NEXT: buffer_inv sc0 sc1719; GFX950-NEXT: ;;#ASMSTART720; GFX950-NEXT: ; use v[0:1]721; GFX950-NEXT: ;;#ASMEND722; GFX950-NEXT: s_setpc_b64 s[30:31]723 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10724 %data = call i64 asm "; def $0", "=a"()725 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data seq_cst726 call void asm "; use $0", "v"(i64 %result)727 ret void728}729 730; Input is VGPR, result used as AGPR731define void @global_atomic_xchg_i64_ret_v_a(ptr addrspace(1) %ptr) #0 {732; GFX90A-LABEL: global_atomic_xchg_i64_ret_v_a:733; GFX90A: ; %bb.0:734; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)735; GFX90A-NEXT: ;;#ASMSTART736; GFX90A-NEXT: ; def v[2:3]737; GFX90A-NEXT: ;;#ASMEND738; GFX90A-NEXT: buffer_wbl2739; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc740; GFX90A-NEXT: s_waitcnt vmcnt(0)741; GFX90A-NEXT: buffer_invl2742; GFX90A-NEXT: buffer_wbinvl1_vol743; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0744; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1745; GFX90A-NEXT: ;;#ASMSTART746; GFX90A-NEXT: ; use a[0:1]747; GFX90A-NEXT: ;;#ASMEND748; GFX90A-NEXT: s_setpc_b64 s[30:31]749;750; GFX950-LABEL: global_atomic_xchg_i64_ret_v_a:751; GFX950: ; %bb.0:752; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)753; GFX950-NEXT: ;;#ASMSTART754; GFX950-NEXT: ; def v[2:3]755; GFX950-NEXT: ;;#ASMEND756; GFX950-NEXT: buffer_wbl2 sc0 sc1757; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc0 sc1758; GFX950-NEXT: s_waitcnt vmcnt(0)759; GFX950-NEXT: buffer_inv sc0 sc1760; GFX950-NEXT: v_accvgpr_write_b32 a0, v0761; GFX950-NEXT: v_accvgpr_write_b32 a1, v1762; GFX950-NEXT: ;;#ASMSTART763; GFX950-NEXT: ; use a[0:1]764; GFX950-NEXT: ;;#ASMEND765; GFX950-NEXT: s_setpc_b64 s[30:31]766 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10767 %data = call i64 asm "; def $0", "=v"()768 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data seq_cst769 call void asm "; use $0", "a"(i64 %result)770 ret void771}772 773; Input is AV, result also used as AV774define void @global_atomic_xchg_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {775; GFX90A-LABEL: global_atomic_xchg_i64_ret_av_av:776; GFX90A: ; %bb.0:777; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)778; GFX90A-NEXT: ;;#ASMSTART779; GFX90A-NEXT: ; def v[2:3]780; GFX90A-NEXT: ;;#ASMEND781; GFX90A-NEXT: buffer_wbl2782; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc783; GFX90A-NEXT: s_waitcnt vmcnt(0)784; GFX90A-NEXT: buffer_invl2785; GFX90A-NEXT: buffer_wbinvl1_vol786; GFX90A-NEXT: ;;#ASMSTART787; GFX90A-NEXT: ; use v[0:1]788; GFX90A-NEXT: ;;#ASMEND789; GFX90A-NEXT: s_setpc_b64 s[30:31]790;791; GFX950-LABEL: global_atomic_xchg_i64_ret_av_av:792; GFX950: ; %bb.0:793; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)794; GFX950-NEXT: ;;#ASMSTART795; GFX950-NEXT: ; def v[2:3]796; GFX950-NEXT: ;;#ASMEND797; GFX950-NEXT: buffer_wbl2 sc0 sc1798; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc0 sc1799; GFX950-NEXT: s_waitcnt vmcnt(0)800; GFX950-NEXT: buffer_inv sc0 sc1801; GFX950-NEXT: ;;#ASMSTART802; GFX950-NEXT: ; use v[0:1]803; GFX950-NEXT: ;;#ASMEND804; GFX950-NEXT: s_setpc_b64 s[30:31]805 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10806 %data = call i64 asm "; def $0", "=^VA"()807 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data seq_cst808 call void asm "; use $0", "^VA"(i64 %result)809 ret void810}811 812; Input is AV, used as v813define void @global_atomic_xchg_i64_ret_av_v(ptr addrspace(1) %ptr) #0 {814; GFX90A-LABEL: global_atomic_xchg_i64_ret_av_v:815; GFX90A: ; %bb.0:816; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)817; GFX90A-NEXT: ;;#ASMSTART818; GFX90A-NEXT: ; def v[2:3]819; GFX90A-NEXT: ;;#ASMEND820; GFX90A-NEXT: buffer_wbl2821; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc822; GFX90A-NEXT: s_waitcnt vmcnt(0)823; GFX90A-NEXT: buffer_invl2824; GFX90A-NEXT: buffer_wbinvl1_vol825; GFX90A-NEXT: ;;#ASMSTART826; GFX90A-NEXT: ; use v[0:1]827; GFX90A-NEXT: ;;#ASMEND828; GFX90A-NEXT: s_setpc_b64 s[30:31]829;830; GFX950-LABEL: global_atomic_xchg_i64_ret_av_v:831; GFX950: ; %bb.0:832; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)833; GFX950-NEXT: ;;#ASMSTART834; GFX950-NEXT: ; def v[2:3]835; GFX950-NEXT: ;;#ASMEND836; GFX950-NEXT: buffer_wbl2 sc0 sc1837; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc0 sc1838; GFX950-NEXT: s_waitcnt vmcnt(0)839; GFX950-NEXT: buffer_inv sc0 sc1840; GFX950-NEXT: ;;#ASMSTART841; GFX950-NEXT: ; use v[0:1]842; GFX950-NEXT: ;;#ASMEND843; GFX950-NEXT: s_setpc_b64 s[30:31]844 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10845 %data = call i64 asm "; def $0", "=^VA"()846 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data seq_cst847 call void asm "; use $0", "v"(i64 %result)848 ret void849}850 851; Input is AV, used as a852define void @global_atomic_xchg_i64_ret_av_a(ptr addrspace(1) %ptr) #0 {853; GFX90A-LABEL: global_atomic_xchg_i64_ret_av_a:854; GFX90A: ; %bb.0:855; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)856; GFX90A-NEXT: ;;#ASMSTART857; GFX90A-NEXT: ; def v[2:3]858; GFX90A-NEXT: ;;#ASMEND859; GFX90A-NEXT: buffer_wbl2860; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc861; GFX90A-NEXT: s_waitcnt vmcnt(0)862; GFX90A-NEXT: buffer_invl2863; GFX90A-NEXT: buffer_wbinvl1_vol864; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0865; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1866; GFX90A-NEXT: ;;#ASMSTART867; GFX90A-NEXT: ; use a[0:1]868; GFX90A-NEXT: ;;#ASMEND869; GFX90A-NEXT: s_setpc_b64 s[30:31]870;871; GFX950-LABEL: global_atomic_xchg_i64_ret_av_a:872; GFX950: ; %bb.0:873; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)874; GFX950-NEXT: ;;#ASMSTART875; GFX950-NEXT: ; def v[2:3]876; GFX950-NEXT: ;;#ASMEND877; GFX950-NEXT: buffer_wbl2 sc0 sc1878; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc0 sc1879; GFX950-NEXT: s_waitcnt vmcnt(0)880; GFX950-NEXT: buffer_inv sc0 sc1881; GFX950-NEXT: v_accvgpr_write_b32 a0, v0882; GFX950-NEXT: v_accvgpr_write_b32 a1, v1883; GFX950-NEXT: ;;#ASMSTART884; GFX950-NEXT: ; use a[0:1]885; GFX950-NEXT: ;;#ASMEND886; GFX950-NEXT: s_setpc_b64 s[30:31]887 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10888 %data = call i64 asm "; def $0", "=^VA"()889 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data seq_cst890 call void asm "; use $0", "a"(i64 %result)891 ret void892}893 894; Input is a, result used as AV895define void @global_atomic_xchg_i64_ret_a_av(ptr addrspace(1) %ptr) #0 {896; GFX90A-LABEL: global_atomic_xchg_i64_ret_a_av:897; GFX90A: ; %bb.0:898; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)899; GFX90A-NEXT: ;;#ASMSTART900; GFX90A-NEXT: ; def a[0:1]901; GFX90A-NEXT: ;;#ASMEND902; GFX90A-NEXT: v_accvgpr_read_b32 v3, a1903; GFX90A-NEXT: v_accvgpr_read_b32 v2, a0904; GFX90A-NEXT: buffer_wbl2905; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc906; GFX90A-NEXT: s_waitcnt vmcnt(0)907; GFX90A-NEXT: buffer_invl2908; GFX90A-NEXT: buffer_wbinvl1_vol909; GFX90A-NEXT: ;;#ASMSTART910; GFX90A-NEXT: ; use v[0:1]911; GFX90A-NEXT: ;;#ASMEND912; GFX90A-NEXT: s_setpc_b64 s[30:31]913;914; GFX950-LABEL: global_atomic_xchg_i64_ret_a_av:915; GFX950: ; %bb.0:916; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)917; GFX950-NEXT: ;;#ASMSTART918; GFX950-NEXT: ; def a[0:1]919; GFX950-NEXT: ;;#ASMEND920; GFX950-NEXT: s_nop 0921; GFX950-NEXT: v_accvgpr_read_b32 v3, a1922; GFX950-NEXT: v_accvgpr_read_b32 v2, a0923; GFX950-NEXT: buffer_wbl2 sc0 sc1924; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc0 sc1925; GFX950-NEXT: s_waitcnt vmcnt(0)926; GFX950-NEXT: buffer_inv sc0 sc1927; GFX950-NEXT: ;;#ASMSTART928; GFX950-NEXT: ; use v[0:1]929; GFX950-NEXT: ;;#ASMEND930; GFX950-NEXT: s_setpc_b64 s[30:31]931 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10932 %data = call i64 asm "; def $0", "=a"()933 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data seq_cst934 call void asm "; use $0", "^VA"(i64 %result)935 ret void936}937 938; Input is v, result used as AV939define void @global_atomic_xchg_i64_ret_v_av(ptr addrspace(1) %ptr) #0 {940; GFX90A-LABEL: global_atomic_xchg_i64_ret_v_av:941; GFX90A: ; %bb.0:942; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)943; GFX90A-NEXT: ;;#ASMSTART944; GFX90A-NEXT: ; def v[2:3]945; GFX90A-NEXT: ;;#ASMEND946; GFX90A-NEXT: buffer_wbl2947; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc948; GFX90A-NEXT: s_waitcnt vmcnt(0)949; GFX90A-NEXT: buffer_invl2950; GFX90A-NEXT: buffer_wbinvl1_vol951; GFX90A-NEXT: ;;#ASMSTART952; GFX90A-NEXT: ; use v[0:1]953; GFX90A-NEXT: ;;#ASMEND954; GFX90A-NEXT: s_setpc_b64 s[30:31]955;956; GFX950-LABEL: global_atomic_xchg_i64_ret_v_av:957; GFX950: ; %bb.0:958; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)959; GFX950-NEXT: ;;#ASMSTART960; GFX950-NEXT: ; def v[2:3]961; GFX950-NEXT: ;;#ASMEND962; GFX950-NEXT: buffer_wbl2 sc0 sc1963; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc0 sc1964; GFX950-NEXT: s_waitcnt vmcnt(0)965; GFX950-NEXT: buffer_inv sc0 sc1966; GFX950-NEXT: ;;#ASMSTART967; GFX950-NEXT: ; use v[0:1]968; GFX950-NEXT: ;;#ASMEND969; GFX950-NEXT: s_setpc_b64 s[30:31]970 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10971 %data = call i64 asm "; def $0", "=v"()972 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data seq_cst973 call void asm "; use $0", "^VA"(i64 %result)974 ret void975}976 977define void @global_atomic_xchg_i64_noret_a(ptr addrspace(1) %ptr) #0 {978; GFX90A-LABEL: global_atomic_xchg_i64_noret_a:979; GFX90A: ; %bb.0:980; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)981; GFX90A-NEXT: ;;#ASMSTART982; GFX90A-NEXT: ; def a[0:1]983; GFX90A-NEXT: ;;#ASMEND984; GFX90A-NEXT: buffer_wbl2985; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], a[0:1], off986; GFX90A-NEXT: s_waitcnt vmcnt(0)987; GFX90A-NEXT: buffer_invl2988; GFX90A-NEXT: buffer_wbinvl1_vol989; GFX90A-NEXT: s_setpc_b64 s[30:31]990;991; GFX950-LABEL: global_atomic_xchg_i64_noret_a:992; GFX950: ; %bb.0:993; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)994; GFX950-NEXT: ;;#ASMSTART995; GFX950-NEXT: ; def a[0:1]996; GFX950-NEXT: ;;#ASMEND997; GFX950-NEXT: buffer_wbl2 sc0 sc1998; GFX950-NEXT: global_atomic_swap_x2 v[0:1], a[0:1], off sc1999; GFX950-NEXT: s_waitcnt vmcnt(0)1000; GFX950-NEXT: buffer_inv sc0 sc11001; GFX950-NEXT: s_setpc_b64 s[30:31]1002 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 101003 %data = call i64 asm "; def $0", "=a"()1004 %unused = atomicrmw xchg ptr addrspace(1) %ptr, i64 %data seq_cst1005 ret void1006}1007 1008define void @global_atomic_xchg_i64_noret_av(ptr addrspace(1) %ptr) #0 {1009; GFX90A-LABEL: global_atomic_xchg_i64_noret_av:1010; GFX90A: ; %bb.0:1011; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1012; GFX90A-NEXT: ;;#ASMSTART1013; GFX90A-NEXT: ; def v[2:3]1014; GFX90A-NEXT: ;;#ASMEND1015; GFX90A-NEXT: buffer_wbl21016; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v[2:3], off1017; GFX90A-NEXT: s_waitcnt vmcnt(0)1018; GFX90A-NEXT: buffer_invl21019; GFX90A-NEXT: buffer_wbinvl1_vol1020; GFX90A-NEXT: s_setpc_b64 s[30:31]1021;1022; GFX950-LABEL: global_atomic_xchg_i64_noret_av:1023; GFX950: ; %bb.0:1024; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1025; GFX950-NEXT: ;;#ASMSTART1026; GFX950-NEXT: ; def v[2:3]1027; GFX950-NEXT: ;;#ASMEND1028; GFX950-NEXT: buffer_wbl2 sc0 sc11029; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v[2:3], off sc11030; GFX950-NEXT: s_waitcnt vmcnt(0)1031; GFX950-NEXT: buffer_inv sc0 sc11032; GFX950-NEXT: s_setpc_b64 s[30:31]1033 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 101034 %data = call i64 asm "; def $0", "=^VA"()1035 %unused = atomicrmw xchg ptr addrspace(1) %ptr, i64 %data seq_cst1036 ret void1037}1038 1039;---------------------------------------------------------------------1040; xor i32 cases with cmpxchg expansion1041;---------------------------------------------------------------------1042 1043; Input and result use AGPR1044define void @global_atomic_xor_expansion_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {1045; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_a_a:1046; GFX90A: ; %bb.0:1047; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1048; GFX90A-NEXT: global_load_dword v3, v[0:1], off1049; GFX90A-NEXT: ;;#ASMSTART1050; GFX90A-NEXT: ; def a01051; GFX90A-NEXT: ;;#ASMEND1052; GFX90A-NEXT: v_accvgpr_read_b32 v4, a01053; GFX90A-NEXT: s_mov_b64 s[4:5], 01054; GFX90A-NEXT: .LBB21_1: ; %atomicrmw.start1055; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11056; GFX90A-NEXT: s_waitcnt vmcnt(0)1057; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41058; GFX90A-NEXT: buffer_wbl21059; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1060; GFX90A-NEXT: s_waitcnt vmcnt(0)1061; GFX90A-NEXT: buffer_invl21062; GFX90A-NEXT: buffer_wbinvl1_vol1063; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31064; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1065; GFX90A-NEXT: v_mov_b32_e32 v3, v21066; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1067; GFX90A-NEXT: s_cbranch_execnz .LBB21_11068; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1069; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1070; GFX90A-NEXT: v_accvgpr_write_b32 a0, v21071; GFX90A-NEXT: ;;#ASMSTART1072; GFX90A-NEXT: ; use a01073; GFX90A-NEXT: ;;#ASMEND1074; GFX90A-NEXT: s_setpc_b64 s[30:31]1075;1076; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_a_a:1077; GFX950: ; %bb.0:1078; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1079; GFX950-NEXT: global_load_dword v3, v[0:1], off1080; GFX950-NEXT: ;;#ASMSTART1081; GFX950-NEXT: ; def a01082; GFX950-NEXT: ;;#ASMEND1083; GFX950-NEXT: s_mov_b64 s[0:1], 01084; GFX950-NEXT: v_accvgpr_read_b32 v4, a01085; GFX950-NEXT: .LBB21_1: ; %atomicrmw.start1086; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11087; GFX950-NEXT: s_waitcnt vmcnt(0)1088; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41089; GFX950-NEXT: buffer_wbl2 sc0 sc11090; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11091; GFX950-NEXT: s_waitcnt vmcnt(0)1092; GFX950-NEXT: buffer_inv sc0 sc11093; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31094; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1095; GFX950-NEXT: v_mov_b32_e32 v3, v21096; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1097; GFX950-NEXT: s_cbranch_execnz .LBB21_11098; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1099; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1100; GFX950-NEXT: v_accvgpr_write_b32 a0, v21101; GFX950-NEXT: ;;#ASMSTART1102; GFX950-NEXT: ; use a01103; GFX950-NEXT: ;;#ASMEND1104; GFX950-NEXT: s_setpc_b64 s[30:31]1105 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101106 %data = call i32 asm "; def $0", "=a"()1107 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1108 call void asm "; use $0", "a"(i32 %result)1109 ret void1110}1111 1112; Input is AGPR, result used as VGPR.1113define void @global_atomic_xor_expansion_i32_ret_a_v(ptr addrspace(1) %ptr) #0 {1114; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_a_v:1115; GFX90A: ; %bb.0:1116; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1117; GFX90A-NEXT: global_load_dword v3, v[0:1], off1118; GFX90A-NEXT: ;;#ASMSTART1119; GFX90A-NEXT: ; def a01120; GFX90A-NEXT: ;;#ASMEND1121; GFX90A-NEXT: v_accvgpr_read_b32 v4, a01122; GFX90A-NEXT: s_mov_b64 s[4:5], 01123; GFX90A-NEXT: .LBB22_1: ; %atomicrmw.start1124; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11125; GFX90A-NEXT: s_waitcnt vmcnt(0)1126; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41127; GFX90A-NEXT: buffer_wbl21128; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1129; GFX90A-NEXT: s_waitcnt vmcnt(0)1130; GFX90A-NEXT: buffer_invl21131; GFX90A-NEXT: buffer_wbinvl1_vol1132; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31133; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1134; GFX90A-NEXT: v_mov_b32_e32 v3, v21135; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1136; GFX90A-NEXT: s_cbranch_execnz .LBB22_11137; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1138; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1139; GFX90A-NEXT: ;;#ASMSTART1140; GFX90A-NEXT: ; use v21141; GFX90A-NEXT: ;;#ASMEND1142; GFX90A-NEXT: s_setpc_b64 s[30:31]1143;1144; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_a_v:1145; GFX950: ; %bb.0:1146; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1147; GFX950-NEXT: global_load_dword v3, v[0:1], off1148; GFX950-NEXT: ;;#ASMSTART1149; GFX950-NEXT: ; def a01150; GFX950-NEXT: ;;#ASMEND1151; GFX950-NEXT: s_mov_b64 s[0:1], 01152; GFX950-NEXT: v_accvgpr_read_b32 v4, a01153; GFX950-NEXT: .LBB22_1: ; %atomicrmw.start1154; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11155; GFX950-NEXT: s_waitcnt vmcnt(0)1156; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41157; GFX950-NEXT: buffer_wbl2 sc0 sc11158; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11159; GFX950-NEXT: s_waitcnt vmcnt(0)1160; GFX950-NEXT: buffer_inv sc0 sc11161; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31162; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1163; GFX950-NEXT: v_mov_b32_e32 v3, v21164; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1165; GFX950-NEXT: s_cbranch_execnz .LBB22_11166; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1167; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1168; GFX950-NEXT: ;;#ASMSTART1169; GFX950-NEXT: ; use v21170; GFX950-NEXT: ;;#ASMEND1171; GFX950-NEXT: s_setpc_b64 s[30:31]1172 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101173 %data = call i32 asm "; def $0", "=a"()1174 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1175 call void asm "; use $0", "v"(i32 %result)1176 ret void1177}1178 1179; Input is VGPR, result used as AGPR1180define void @global_atomic_xor_expansion_i32_ret_v_a(ptr addrspace(1) %ptr) #0 {1181; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_v_a:1182; GFX90A: ; %bb.0:1183; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1184; GFX90A-NEXT: global_load_dword v3, v[0:1], off1185; GFX90A-NEXT: s_mov_b64 s[4:5], 01186; GFX90A-NEXT: ;;#ASMSTART1187; GFX90A-NEXT: ; def v41188; GFX90A-NEXT: ;;#ASMEND1189; GFX90A-NEXT: .LBB23_1: ; %atomicrmw.start1190; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11191; GFX90A-NEXT: s_waitcnt vmcnt(0)1192; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41193; GFX90A-NEXT: buffer_wbl21194; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1195; GFX90A-NEXT: s_waitcnt vmcnt(0)1196; GFX90A-NEXT: buffer_invl21197; GFX90A-NEXT: buffer_wbinvl1_vol1198; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31199; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1200; GFX90A-NEXT: v_mov_b32_e32 v3, v21201; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1202; GFX90A-NEXT: s_cbranch_execnz .LBB23_11203; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1204; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1205; GFX90A-NEXT: v_accvgpr_write_b32 a0, v21206; GFX90A-NEXT: ;;#ASMSTART1207; GFX90A-NEXT: ; use a01208; GFX90A-NEXT: ;;#ASMEND1209; GFX90A-NEXT: s_setpc_b64 s[30:31]1210;1211; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_v_a:1212; GFX950: ; %bb.0:1213; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1214; GFX950-NEXT: global_load_dword v3, v[0:1], off1215; GFX950-NEXT: s_mov_b64 s[0:1], 01216; GFX950-NEXT: ;;#ASMSTART1217; GFX950-NEXT: ; def v41218; GFX950-NEXT: ;;#ASMEND1219; GFX950-NEXT: .LBB23_1: ; %atomicrmw.start1220; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11221; GFX950-NEXT: s_waitcnt vmcnt(0)1222; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41223; GFX950-NEXT: buffer_wbl2 sc0 sc11224; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11225; GFX950-NEXT: s_waitcnt vmcnt(0)1226; GFX950-NEXT: buffer_inv sc0 sc11227; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31228; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1229; GFX950-NEXT: v_mov_b32_e32 v3, v21230; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1231; GFX950-NEXT: s_cbranch_execnz .LBB23_11232; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1233; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1234; GFX950-NEXT: v_accvgpr_write_b32 a0, v21235; GFX950-NEXT: ;;#ASMSTART1236; GFX950-NEXT: ; use a01237; GFX950-NEXT: ;;#ASMEND1238; GFX950-NEXT: s_setpc_b64 s[30:31]1239 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101240 %data = call i32 asm "; def $0", "=v"()1241 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1242 call void asm "; use $0", "a"(i32 %result)1243 ret void1244}1245 1246; Input is AV, result also used as AV1247define void @global_atomic_xor_expansion_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {1248; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_av_av:1249; GFX90A: ; %bb.0:1250; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1251; GFX90A-NEXT: global_load_dword v3, v[0:1], off1252; GFX90A-NEXT: s_mov_b64 s[4:5], 01253; GFX90A-NEXT: ;;#ASMSTART1254; GFX90A-NEXT: ; def v41255; GFX90A-NEXT: ;;#ASMEND1256; GFX90A-NEXT: .LBB24_1: ; %atomicrmw.start1257; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11258; GFX90A-NEXT: s_waitcnt vmcnt(0)1259; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41260; GFX90A-NEXT: buffer_wbl21261; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1262; GFX90A-NEXT: s_waitcnt vmcnt(0)1263; GFX90A-NEXT: buffer_invl21264; GFX90A-NEXT: buffer_wbinvl1_vol1265; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31266; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1267; GFX90A-NEXT: v_mov_b32_e32 v3, v21268; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1269; GFX90A-NEXT: s_cbranch_execnz .LBB24_11270; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1271; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1272; GFX90A-NEXT: ;;#ASMSTART1273; GFX90A-NEXT: ; use v21274; GFX90A-NEXT: ;;#ASMEND1275; GFX90A-NEXT: s_setpc_b64 s[30:31]1276;1277; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_av_av:1278; GFX950: ; %bb.0:1279; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1280; GFX950-NEXT: global_load_dword v3, v[0:1], off1281; GFX950-NEXT: s_mov_b64 s[0:1], 01282; GFX950-NEXT: ;;#ASMSTART1283; GFX950-NEXT: ; def v41284; GFX950-NEXT: ;;#ASMEND1285; GFX950-NEXT: .LBB24_1: ; %atomicrmw.start1286; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11287; GFX950-NEXT: s_waitcnt vmcnt(0)1288; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41289; GFX950-NEXT: buffer_wbl2 sc0 sc11290; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11291; GFX950-NEXT: s_waitcnt vmcnt(0)1292; GFX950-NEXT: buffer_inv sc0 sc11293; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31294; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1295; GFX950-NEXT: v_mov_b32_e32 v3, v21296; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1297; GFX950-NEXT: s_cbranch_execnz .LBB24_11298; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1299; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1300; GFX950-NEXT: ;;#ASMSTART1301; GFX950-NEXT: ; use v21302; GFX950-NEXT: ;;#ASMEND1303; GFX950-NEXT: s_setpc_b64 s[30:31]1304 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101305 %data = call i32 asm "; def $0", "=^VA"()1306 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1307 call void asm "; use $0", "^VA"(i32 %result)1308 ret void1309}1310 1311; Input is AV, used as v1312define void @global_atomic_xor_expansion_i32_ret_av_v(ptr addrspace(1) %ptr) #0 {1313; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_av_v:1314; GFX90A: ; %bb.0:1315; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1316; GFX90A-NEXT: global_load_dword v3, v[0:1], off1317; GFX90A-NEXT: s_mov_b64 s[4:5], 01318; GFX90A-NEXT: ;;#ASMSTART1319; GFX90A-NEXT: ; def v41320; GFX90A-NEXT: ;;#ASMEND1321; GFX90A-NEXT: .LBB25_1: ; %atomicrmw.start1322; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11323; GFX90A-NEXT: s_waitcnt vmcnt(0)1324; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41325; GFX90A-NEXT: buffer_wbl21326; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1327; GFX90A-NEXT: s_waitcnt vmcnt(0)1328; GFX90A-NEXT: buffer_invl21329; GFX90A-NEXT: buffer_wbinvl1_vol1330; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31331; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1332; GFX90A-NEXT: v_mov_b32_e32 v3, v21333; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1334; GFX90A-NEXT: s_cbranch_execnz .LBB25_11335; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1336; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1337; GFX90A-NEXT: ;;#ASMSTART1338; GFX90A-NEXT: ; use v21339; GFX90A-NEXT: ;;#ASMEND1340; GFX90A-NEXT: s_setpc_b64 s[30:31]1341;1342; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_av_v:1343; GFX950: ; %bb.0:1344; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1345; GFX950-NEXT: global_load_dword v3, v[0:1], off1346; GFX950-NEXT: s_mov_b64 s[0:1], 01347; GFX950-NEXT: ;;#ASMSTART1348; GFX950-NEXT: ; def v41349; GFX950-NEXT: ;;#ASMEND1350; GFX950-NEXT: .LBB25_1: ; %atomicrmw.start1351; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11352; GFX950-NEXT: s_waitcnt vmcnt(0)1353; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41354; GFX950-NEXT: buffer_wbl2 sc0 sc11355; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11356; GFX950-NEXT: s_waitcnt vmcnt(0)1357; GFX950-NEXT: buffer_inv sc0 sc11358; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31359; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1360; GFX950-NEXT: v_mov_b32_e32 v3, v21361; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1362; GFX950-NEXT: s_cbranch_execnz .LBB25_11363; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1364; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1365; GFX950-NEXT: ;;#ASMSTART1366; GFX950-NEXT: ; use v21367; GFX950-NEXT: ;;#ASMEND1368; GFX950-NEXT: s_setpc_b64 s[30:31]1369 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101370 %data = call i32 asm "; def $0", "=^VA"()1371 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1372 call void asm "; use $0", "v"(i32 %result)1373 ret void1374}1375 1376; Input is AV, used as a1377define void @global_atomic_xor_expansion_i32_ret_av_a(ptr addrspace(1) %ptr) #0 {1378; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_av_a:1379; GFX90A: ; %bb.0:1380; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1381; GFX90A-NEXT: global_load_dword v3, v[0:1], off1382; GFX90A-NEXT: s_mov_b64 s[4:5], 01383; GFX90A-NEXT: ;;#ASMSTART1384; GFX90A-NEXT: ; def v41385; GFX90A-NEXT: ;;#ASMEND1386; GFX90A-NEXT: .LBB26_1: ; %atomicrmw.start1387; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11388; GFX90A-NEXT: s_waitcnt vmcnt(0)1389; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41390; GFX90A-NEXT: buffer_wbl21391; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1392; GFX90A-NEXT: s_waitcnt vmcnt(0)1393; GFX90A-NEXT: buffer_invl21394; GFX90A-NEXT: buffer_wbinvl1_vol1395; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31396; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1397; GFX90A-NEXT: v_mov_b32_e32 v3, v21398; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1399; GFX90A-NEXT: s_cbranch_execnz .LBB26_11400; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1401; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1402; GFX90A-NEXT: v_accvgpr_write_b32 a0, v21403; GFX90A-NEXT: ;;#ASMSTART1404; GFX90A-NEXT: ; use a01405; GFX90A-NEXT: ;;#ASMEND1406; GFX90A-NEXT: s_setpc_b64 s[30:31]1407;1408; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_av_a:1409; GFX950: ; %bb.0:1410; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1411; GFX950-NEXT: global_load_dword v3, v[0:1], off1412; GFX950-NEXT: s_mov_b64 s[0:1], 01413; GFX950-NEXT: ;;#ASMSTART1414; GFX950-NEXT: ; def v41415; GFX950-NEXT: ;;#ASMEND1416; GFX950-NEXT: .LBB26_1: ; %atomicrmw.start1417; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11418; GFX950-NEXT: s_waitcnt vmcnt(0)1419; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41420; GFX950-NEXT: buffer_wbl2 sc0 sc11421; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11422; GFX950-NEXT: s_waitcnt vmcnt(0)1423; GFX950-NEXT: buffer_inv sc0 sc11424; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31425; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1426; GFX950-NEXT: v_mov_b32_e32 v3, v21427; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1428; GFX950-NEXT: s_cbranch_execnz .LBB26_11429; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1430; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1431; GFX950-NEXT: v_accvgpr_write_b32 a0, v21432; GFX950-NEXT: ;;#ASMSTART1433; GFX950-NEXT: ; use a01434; GFX950-NEXT: ;;#ASMEND1435; GFX950-NEXT: s_setpc_b64 s[30:31]1436 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101437 %data = call i32 asm "; def $0", "=^VA"()1438 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1439 call void asm "; use $0", "a"(i32 %result)1440 ret void1441}1442 1443; Input is a, result used as AV1444define void @global_atomic_xor_expansion_i32_ret_a_av(ptr addrspace(1) %ptr) #0 {1445; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_a_av:1446; GFX90A: ; %bb.0:1447; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1448; GFX90A-NEXT: global_load_dword v3, v[0:1], off1449; GFX90A-NEXT: ;;#ASMSTART1450; GFX90A-NEXT: ; def a01451; GFX90A-NEXT: ;;#ASMEND1452; GFX90A-NEXT: v_accvgpr_read_b32 v4, a01453; GFX90A-NEXT: s_mov_b64 s[4:5], 01454; GFX90A-NEXT: .LBB27_1: ; %atomicrmw.start1455; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11456; GFX90A-NEXT: s_waitcnt vmcnt(0)1457; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41458; GFX90A-NEXT: buffer_wbl21459; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1460; GFX90A-NEXT: s_waitcnt vmcnt(0)1461; GFX90A-NEXT: buffer_invl21462; GFX90A-NEXT: buffer_wbinvl1_vol1463; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31464; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1465; GFX90A-NEXT: v_mov_b32_e32 v3, v21466; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1467; GFX90A-NEXT: s_cbranch_execnz .LBB27_11468; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1469; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1470; GFX90A-NEXT: ;;#ASMSTART1471; GFX90A-NEXT: ; use v21472; GFX90A-NEXT: ;;#ASMEND1473; GFX90A-NEXT: s_setpc_b64 s[30:31]1474;1475; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_a_av:1476; GFX950: ; %bb.0:1477; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1478; GFX950-NEXT: global_load_dword v3, v[0:1], off1479; GFX950-NEXT: ;;#ASMSTART1480; GFX950-NEXT: ; def a01481; GFX950-NEXT: ;;#ASMEND1482; GFX950-NEXT: s_mov_b64 s[0:1], 01483; GFX950-NEXT: v_accvgpr_read_b32 v4, a01484; GFX950-NEXT: .LBB27_1: ; %atomicrmw.start1485; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11486; GFX950-NEXT: s_waitcnt vmcnt(0)1487; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41488; GFX950-NEXT: buffer_wbl2 sc0 sc11489; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11490; GFX950-NEXT: s_waitcnt vmcnt(0)1491; GFX950-NEXT: buffer_inv sc0 sc11492; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31493; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1494; GFX950-NEXT: v_mov_b32_e32 v3, v21495; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1496; GFX950-NEXT: s_cbranch_execnz .LBB27_11497; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1498; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1499; GFX950-NEXT: ;;#ASMSTART1500; GFX950-NEXT: ; use v21501; GFX950-NEXT: ;;#ASMEND1502; GFX950-NEXT: s_setpc_b64 s[30:31]1503 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101504 %data = call i32 asm "; def $0", "=a"()1505 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1506 call void asm "; use $0", "^VA"(i32 %result)1507 ret void1508}1509 1510; Input is v, result used as AV1511define void @global_atomic_xor_expansion_i32_ret_v_av(ptr addrspace(1) %ptr) #0 {1512; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_v_av:1513; GFX90A: ; %bb.0:1514; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1515; GFX90A-NEXT: global_load_dword v3, v[0:1], off1516; GFX90A-NEXT: s_mov_b64 s[4:5], 01517; GFX90A-NEXT: ;;#ASMSTART1518; GFX90A-NEXT: ; def v41519; GFX90A-NEXT: ;;#ASMEND1520; GFX90A-NEXT: .LBB28_1: ; %atomicrmw.start1521; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11522; GFX90A-NEXT: s_waitcnt vmcnt(0)1523; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41524; GFX90A-NEXT: buffer_wbl21525; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1526; GFX90A-NEXT: s_waitcnt vmcnt(0)1527; GFX90A-NEXT: buffer_invl21528; GFX90A-NEXT: buffer_wbinvl1_vol1529; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31530; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1531; GFX90A-NEXT: v_mov_b32_e32 v3, v21532; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1533; GFX90A-NEXT: s_cbranch_execnz .LBB28_11534; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1535; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1536; GFX90A-NEXT: ;;#ASMSTART1537; GFX90A-NEXT: ; use v21538; GFX90A-NEXT: ;;#ASMEND1539; GFX90A-NEXT: s_setpc_b64 s[30:31]1540;1541; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_v_av:1542; GFX950: ; %bb.0:1543; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1544; GFX950-NEXT: global_load_dword v3, v[0:1], off1545; GFX950-NEXT: s_mov_b64 s[0:1], 01546; GFX950-NEXT: ;;#ASMSTART1547; GFX950-NEXT: ; def v41548; GFX950-NEXT: ;;#ASMEND1549; GFX950-NEXT: .LBB28_1: ; %atomicrmw.start1550; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11551; GFX950-NEXT: s_waitcnt vmcnt(0)1552; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41553; GFX950-NEXT: buffer_wbl2 sc0 sc11554; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11555; GFX950-NEXT: s_waitcnt vmcnt(0)1556; GFX950-NEXT: buffer_inv sc0 sc11557; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31558; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1559; GFX950-NEXT: v_mov_b32_e32 v3, v21560; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1561; GFX950-NEXT: s_cbranch_execnz .LBB28_11562; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1563; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1564; GFX950-NEXT: ;;#ASMSTART1565; GFX950-NEXT: ; use v21566; GFX950-NEXT: ;;#ASMEND1567; GFX950-NEXT: s_setpc_b64 s[30:31]1568 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101569 %data = call i32 asm "; def $0", "=v"()1570 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1571 call void asm "; use $0", "^VA"(i32 %result)1572 ret void1573}1574 1575define void @global_atomic_xor_expansion_i32_ret_av_av_no_agprs(ptr addrspace(1) %ptr) #0 {1576; GFX90A-LABEL: global_atomic_xor_expansion_i32_ret_av_av_no_agprs:1577; GFX90A: ; %bb.0:1578; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1579; GFX90A-NEXT: buffer_store_dword v40, off, s[0:3], s32 offset:72 ; 4-byte Folded Spill1580; GFX90A-NEXT: buffer_store_dword v41, off, s[0:3], s32 offset:68 ; 4-byte Folded Spill1581; GFX90A-NEXT: buffer_store_dword v42, off, s[0:3], s32 offset:64 ; 4-byte Folded Spill1582; GFX90A-NEXT: buffer_store_dword v43, off, s[0:3], s32 offset:60 ; 4-byte Folded Spill1583; GFX90A-NEXT: buffer_store_dword v44, off, s[0:3], s32 offset:56 ; 4-byte Folded Spill1584; GFX90A-NEXT: buffer_store_dword v45, off, s[0:3], s32 offset:52 ; 4-byte Folded Spill1585; GFX90A-NEXT: buffer_store_dword v46, off, s[0:3], s32 offset:48 ; 4-byte Folded Spill1586; GFX90A-NEXT: buffer_store_dword v47, off, s[0:3], s32 offset:44 ; 4-byte Folded Spill1587; GFX90A-NEXT: buffer_store_dword v56, off, s[0:3], s32 offset:40 ; 4-byte Folded Spill1588; GFX90A-NEXT: buffer_store_dword v57, off, s[0:3], s32 offset:36 ; 4-byte Folded Spill1589; GFX90A-NEXT: buffer_store_dword v58, off, s[0:3], s32 offset:32 ; 4-byte Folded Spill1590; GFX90A-NEXT: buffer_store_dword v59, off, s[0:3], s32 offset:28 ; 4-byte Folded Spill1591; GFX90A-NEXT: buffer_store_dword v60, off, s[0:3], s32 offset:24 ; 4-byte Folded Spill1592; GFX90A-NEXT: buffer_store_dword v61, off, s[0:3], s32 offset:20 ; 4-byte Folded Spill1593; GFX90A-NEXT: buffer_store_dword v62, off, s[0:3], s32 offset:16 ; 4-byte Folded Spill1594; GFX90A-NEXT: buffer_store_dword v63, off, s[0:3], s32 offset:12 ; 4-byte Folded Spill1595; GFX90A-NEXT: buffer_store_dword a32, off, s[0:3], s32 offset:8 ; 4-byte Folded Spill1596; GFX90A-NEXT: buffer_store_dword a33, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill1597; GFX90A-NEXT: buffer_store_dword a34, off, s[0:3], s32 ; 4-byte Folded Spill1598; GFX90A-NEXT: v_accvgpr_write_b32 a33, v11599; GFX90A-NEXT: v_accvgpr_write_b32 a32, v01600; GFX90A-NEXT: ;;#ASMSTART1601; GFX90A-NEXT: ; def v[0:31]1602; GFX90A-NEXT: ;;#ASMEND1603; GFX90A-NEXT: v_accvgpr_write_b32 a0, v01604; GFX90A-NEXT: v_accvgpr_write_b32 a1, v11605; GFX90A-NEXT: v_accvgpr_write_b32 a2, v21606; GFX90A-NEXT: v_accvgpr_write_b32 a3, v31607; GFX90A-NEXT: v_accvgpr_write_b32 a4, v41608; GFX90A-NEXT: v_accvgpr_write_b32 a5, v51609; GFX90A-NEXT: v_accvgpr_write_b32 a6, v61610; GFX90A-NEXT: v_accvgpr_write_b32 a7, v71611; GFX90A-NEXT: v_accvgpr_write_b32 a8, v81612; GFX90A-NEXT: v_accvgpr_write_b32 a9, v91613; GFX90A-NEXT: v_accvgpr_write_b32 a10, v101614; GFX90A-NEXT: v_accvgpr_write_b32 a11, v111615; GFX90A-NEXT: v_accvgpr_write_b32 a12, v121616; GFX90A-NEXT: v_accvgpr_write_b32 a13, v131617; GFX90A-NEXT: v_accvgpr_write_b32 a14, v141618; GFX90A-NEXT: v_accvgpr_write_b32 a15, v151619; GFX90A-NEXT: v_accvgpr_write_b32 a16, v161620; GFX90A-NEXT: v_accvgpr_write_b32 a17, v171621; GFX90A-NEXT: v_accvgpr_write_b32 a18, v181622; GFX90A-NEXT: v_accvgpr_write_b32 a19, v191623; GFX90A-NEXT: v_accvgpr_write_b32 a20, v201624; GFX90A-NEXT: v_accvgpr_write_b32 a21, v211625; GFX90A-NEXT: v_accvgpr_write_b32 a22, v221626; GFX90A-NEXT: v_accvgpr_write_b32 a23, v231627; GFX90A-NEXT: v_accvgpr_write_b32 a24, v241628; GFX90A-NEXT: v_accvgpr_write_b32 a25, v251629; GFX90A-NEXT: v_accvgpr_write_b32 a26, v261630; GFX90A-NEXT: v_accvgpr_write_b32 a27, v271631; GFX90A-NEXT: v_accvgpr_write_b32 a28, v281632; GFX90A-NEXT: v_accvgpr_write_b32 a29, v291633; GFX90A-NEXT: v_accvgpr_write_b32 a30, v301634; GFX90A-NEXT: v_accvgpr_write_b32 a31, v311635; GFX90A-NEXT: v_accvgpr_read_b32 v2, a321636; GFX90A-NEXT: v_accvgpr_read_b32 v3, a331637; GFX90A-NEXT: global_load_dword v1, v[2:3], off1638; GFX90A-NEXT: ;;#ASMSTART1639; GFX90A-NEXT: ; def a341640; GFX90A-NEXT: ;;#ASMEND1641; GFX90A-NEXT: s_mov_b64 s[4:5], 01642; GFX90A-NEXT: v_accvgpr_read_b32 v4, a341643; GFX90A-NEXT: .LBB29_1: ; %atomicrmw.start1644; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11645; GFX90A-NEXT: s_waitcnt vmcnt(0)1646; GFX90A-NEXT: v_xor_b32_e32 v0, v1, v41647; GFX90A-NEXT: buffer_wbl21648; GFX90A-NEXT: global_atomic_cmpswap v0, v[2:3], v[0:1], off glc1649; GFX90A-NEXT: s_waitcnt vmcnt(0)1650; GFX90A-NEXT: buffer_invl21651; GFX90A-NEXT: buffer_wbinvl1_vol1652; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v11653; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1654; GFX90A-NEXT: v_mov_b32_e32 v1, v01655; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1656; GFX90A-NEXT: s_cbranch_execnz .LBB29_11657; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1658; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1659; GFX90A-NEXT: v_accvgpr_write_b32 a32, v01660; GFX90A-NEXT: v_accvgpr_read_b32 v0, a01661; GFX90A-NEXT: v_accvgpr_read_b32 v1, a11662; GFX90A-NEXT: v_accvgpr_read_b32 v2, a21663; GFX90A-NEXT: v_accvgpr_read_b32 v3, a31664; GFX90A-NEXT: v_accvgpr_read_b32 v4, a41665; GFX90A-NEXT: v_accvgpr_read_b32 v5, a51666; GFX90A-NEXT: v_accvgpr_read_b32 v6, a61667; GFX90A-NEXT: v_accvgpr_read_b32 v7, a71668; GFX90A-NEXT: v_accvgpr_read_b32 v8, a81669; GFX90A-NEXT: v_accvgpr_read_b32 v9, a91670; GFX90A-NEXT: v_accvgpr_read_b32 v10, a101671; GFX90A-NEXT: v_accvgpr_read_b32 v11, a111672; GFX90A-NEXT: v_accvgpr_read_b32 v12, a121673; GFX90A-NEXT: v_accvgpr_read_b32 v13, a131674; GFX90A-NEXT: v_accvgpr_read_b32 v14, a141675; GFX90A-NEXT: v_accvgpr_read_b32 v15, a151676; GFX90A-NEXT: v_accvgpr_read_b32 v16, a161677; GFX90A-NEXT: v_accvgpr_read_b32 v17, a171678; GFX90A-NEXT: v_accvgpr_read_b32 v18, a181679; GFX90A-NEXT: v_accvgpr_read_b32 v19, a191680; GFX90A-NEXT: v_accvgpr_read_b32 v20, a201681; GFX90A-NEXT: v_accvgpr_read_b32 v21, a211682; GFX90A-NEXT: v_accvgpr_read_b32 v22, a221683; GFX90A-NEXT: v_accvgpr_read_b32 v23, a231684; GFX90A-NEXT: v_accvgpr_read_b32 v24, a241685; GFX90A-NEXT: v_accvgpr_read_b32 v25, a251686; GFX90A-NEXT: v_accvgpr_read_b32 v26, a261687; GFX90A-NEXT: v_accvgpr_read_b32 v27, a271688; GFX90A-NEXT: v_accvgpr_read_b32 v28, a281689; GFX90A-NEXT: v_accvgpr_read_b32 v29, a291690; GFX90A-NEXT: v_accvgpr_read_b32 v30, a301691; GFX90A-NEXT: v_accvgpr_read_b32 v31, a311692; GFX90A-NEXT: ;;#ASMSTART1693; GFX90A-NEXT: ; use v[0:31]1694; GFX90A-NEXT: ;;#ASMEND1695; GFX90A-NEXT: ;;#ASMSTART1696; GFX90A-NEXT: ; use a321697; GFX90A-NEXT: ;;#ASMEND1698; GFX90A-NEXT: buffer_load_dword a34, off, s[0:3], s32 ; 4-byte Folded Reload1699; GFX90A-NEXT: buffer_load_dword a33, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload1700; GFX90A-NEXT: buffer_load_dword a32, off, s[0:3], s32 offset:8 ; 4-byte Folded Reload1701; GFX90A-NEXT: buffer_load_dword v63, off, s[0:3], s32 offset:12 ; 4-byte Folded Reload1702; GFX90A-NEXT: buffer_load_dword v62, off, s[0:3], s32 offset:16 ; 4-byte Folded Reload1703; GFX90A-NEXT: buffer_load_dword v61, off, s[0:3], s32 offset:20 ; 4-byte Folded Reload1704; GFX90A-NEXT: buffer_load_dword v60, off, s[0:3], s32 offset:24 ; 4-byte Folded Reload1705; GFX90A-NEXT: buffer_load_dword v59, off, s[0:3], s32 offset:28 ; 4-byte Folded Reload1706; GFX90A-NEXT: buffer_load_dword v58, off, s[0:3], s32 offset:32 ; 4-byte Folded Reload1707; GFX90A-NEXT: buffer_load_dword v57, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload1708; GFX90A-NEXT: buffer_load_dword v56, off, s[0:3], s32 offset:40 ; 4-byte Folded Reload1709; GFX90A-NEXT: buffer_load_dword v47, off, s[0:3], s32 offset:44 ; 4-byte Folded Reload1710; GFX90A-NEXT: buffer_load_dword v46, off, s[0:3], s32 offset:48 ; 4-byte Folded Reload1711; GFX90A-NEXT: buffer_load_dword v45, off, s[0:3], s32 offset:52 ; 4-byte Folded Reload1712; GFX90A-NEXT: buffer_load_dword v44, off, s[0:3], s32 offset:56 ; 4-byte Folded Reload1713; GFX90A-NEXT: buffer_load_dword v43, off, s[0:3], s32 offset:60 ; 4-byte Folded Reload1714; GFX90A-NEXT: buffer_load_dword v42, off, s[0:3], s32 offset:64 ; 4-byte Folded Reload1715; GFX90A-NEXT: buffer_load_dword v41, off, s[0:3], s32 offset:68 ; 4-byte Folded Reload1716; GFX90A-NEXT: buffer_load_dword v40, off, s[0:3], s32 offset:72 ; 4-byte Folded Reload1717; GFX90A-NEXT: s_waitcnt vmcnt(0)1718; GFX90A-NEXT: s_setpc_b64 s[30:31]1719;1720; GFX950-LABEL: global_atomic_xor_expansion_i32_ret_av_av_no_agprs:1721; GFX950: ; %bb.0:1722; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1723; GFX950-NEXT: scratch_store_dword off, v40, s32 offset:72 ; 4-byte Folded Spill1724; GFX950-NEXT: scratch_store_dword off, v41, s32 offset:68 ; 4-byte Folded Spill1725; GFX950-NEXT: scratch_store_dword off, v42, s32 offset:64 ; 4-byte Folded Spill1726; GFX950-NEXT: scratch_store_dword off, v43, s32 offset:60 ; 4-byte Folded Spill1727; GFX950-NEXT: scratch_store_dword off, v44, s32 offset:56 ; 4-byte Folded Spill1728; GFX950-NEXT: scratch_store_dword off, v45, s32 offset:52 ; 4-byte Folded Spill1729; GFX950-NEXT: scratch_store_dword off, v46, s32 offset:48 ; 4-byte Folded Spill1730; GFX950-NEXT: scratch_store_dword off, v47, s32 offset:44 ; 4-byte Folded Spill1731; GFX950-NEXT: scratch_store_dword off, v56, s32 offset:40 ; 4-byte Folded Spill1732; GFX950-NEXT: scratch_store_dword off, v57, s32 offset:36 ; 4-byte Folded Spill1733; GFX950-NEXT: scratch_store_dword off, v58, s32 offset:32 ; 4-byte Folded Spill1734; GFX950-NEXT: scratch_store_dword off, v59, s32 offset:28 ; 4-byte Folded Spill1735; GFX950-NEXT: scratch_store_dword off, v60, s32 offset:24 ; 4-byte Folded Spill1736; GFX950-NEXT: scratch_store_dword off, v61, s32 offset:20 ; 4-byte Folded Spill1737; GFX950-NEXT: scratch_store_dword off, v62, s32 offset:16 ; 4-byte Folded Spill1738; GFX950-NEXT: scratch_store_dword off, v63, s32 offset:12 ; 4-byte Folded Spill1739; GFX950-NEXT: scratch_store_dword off, a32, s32 offset:8 ; 4-byte Folded Spill1740; GFX950-NEXT: scratch_store_dword off, a33, s32 offset:4 ; 4-byte Folded Spill1741; GFX950-NEXT: scratch_store_dword off, a34, s32 ; 4-byte Folded Spill1742; GFX950-NEXT: v_accvgpr_write_b32 a33, v11743; GFX950-NEXT: v_accvgpr_write_b32 a32, v01744; GFX950-NEXT: ;;#ASMSTART1745; GFX950-NEXT: ; def v[0:31]1746; GFX950-NEXT: ;;#ASMEND1747; GFX950-NEXT: ;;#ASMSTART1748; GFX950-NEXT: ; def a341749; GFX950-NEXT: ;;#ASMEND1750; GFX950-NEXT: s_mov_b64 s[0:1], 01751; GFX950-NEXT: v_accvgpr_write_b32 a0, v01752; GFX950-NEXT: v_accvgpr_write_b32 a1, v11753; GFX950-NEXT: v_accvgpr_write_b32 a2, v21754; GFX950-NEXT: v_accvgpr_write_b32 a3, v31755; GFX950-NEXT: v_accvgpr_write_b32 a4, v41756; GFX950-NEXT: v_accvgpr_write_b32 a5, v51757; GFX950-NEXT: v_accvgpr_write_b32 a6, v61758; GFX950-NEXT: v_accvgpr_write_b32 a7, v71759; GFX950-NEXT: v_accvgpr_write_b32 a8, v81760; GFX950-NEXT: v_accvgpr_write_b32 a9, v91761; GFX950-NEXT: v_accvgpr_write_b32 a10, v101762; GFX950-NEXT: v_accvgpr_write_b32 a11, v111763; GFX950-NEXT: v_accvgpr_write_b32 a12, v121764; GFX950-NEXT: v_accvgpr_write_b32 a13, v131765; GFX950-NEXT: v_accvgpr_write_b32 a14, v141766; GFX950-NEXT: v_accvgpr_write_b32 a15, v151767; GFX950-NEXT: v_accvgpr_write_b32 a16, v161768; GFX950-NEXT: v_accvgpr_write_b32 a17, v171769; GFX950-NEXT: v_accvgpr_write_b32 a18, v181770; GFX950-NEXT: v_accvgpr_write_b32 a19, v191771; GFX950-NEXT: v_accvgpr_write_b32 a20, v201772; GFX950-NEXT: v_accvgpr_write_b32 a21, v211773; GFX950-NEXT: v_accvgpr_write_b32 a22, v221774; GFX950-NEXT: v_accvgpr_write_b32 a23, v231775; GFX950-NEXT: v_accvgpr_write_b32 a24, v241776; GFX950-NEXT: v_accvgpr_write_b32 a25, v251777; GFX950-NEXT: v_accvgpr_write_b32 a26, v261778; GFX950-NEXT: v_accvgpr_write_b32 a27, v271779; GFX950-NEXT: v_accvgpr_write_b32 a28, v281780; GFX950-NEXT: v_accvgpr_write_b32 a29, v291781; GFX950-NEXT: v_accvgpr_write_b32 a30, v301782; GFX950-NEXT: v_accvgpr_write_b32 a31, v311783; GFX950-NEXT: v_accvgpr_read_b32 v2, a321784; GFX950-NEXT: v_accvgpr_read_b32 v3, a331785; GFX950-NEXT: global_load_dword v1, v[2:3], off1786; GFX950-NEXT: v_accvgpr_read_b32 v4, a341787; GFX950-NEXT: .LBB29_1: ; %atomicrmw.start1788; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11789; GFX950-NEXT: s_waitcnt vmcnt(0)1790; GFX950-NEXT: v_xor_b32_e32 v0, v1, v41791; GFX950-NEXT: buffer_wbl2 sc0 sc11792; GFX950-NEXT: global_atomic_cmpswap v0, v[2:3], v[0:1], off sc0 sc11793; GFX950-NEXT: s_waitcnt vmcnt(0)1794; GFX950-NEXT: buffer_inv sc0 sc11795; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v11796; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1797; GFX950-NEXT: v_mov_b32_e32 v1, v01798; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1799; GFX950-NEXT: s_cbranch_execnz .LBB29_11800; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1801; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1802; GFX950-NEXT: v_accvgpr_write_b32 a32, v01803; GFX950-NEXT: v_accvgpr_read_b32 v0, a01804; GFX950-NEXT: v_accvgpr_read_b32 v1, a11805; GFX950-NEXT: v_accvgpr_read_b32 v2, a21806; GFX950-NEXT: v_accvgpr_read_b32 v3, a31807; GFX950-NEXT: v_accvgpr_read_b32 v4, a41808; GFX950-NEXT: v_accvgpr_read_b32 v5, a51809; GFX950-NEXT: v_accvgpr_read_b32 v6, a61810; GFX950-NEXT: v_accvgpr_read_b32 v7, a71811; GFX950-NEXT: v_accvgpr_read_b32 v8, a81812; GFX950-NEXT: v_accvgpr_read_b32 v9, a91813; GFX950-NEXT: v_accvgpr_read_b32 v10, a101814; GFX950-NEXT: v_accvgpr_read_b32 v11, a111815; GFX950-NEXT: v_accvgpr_read_b32 v12, a121816; GFX950-NEXT: v_accvgpr_read_b32 v13, a131817; GFX950-NEXT: v_accvgpr_read_b32 v14, a141818; GFX950-NEXT: v_accvgpr_read_b32 v15, a151819; GFX950-NEXT: v_accvgpr_read_b32 v16, a161820; GFX950-NEXT: v_accvgpr_read_b32 v17, a171821; GFX950-NEXT: v_accvgpr_read_b32 v18, a181822; GFX950-NEXT: v_accvgpr_read_b32 v19, a191823; GFX950-NEXT: v_accvgpr_read_b32 v20, a201824; GFX950-NEXT: v_accvgpr_read_b32 v21, a211825; GFX950-NEXT: v_accvgpr_read_b32 v22, a221826; GFX950-NEXT: v_accvgpr_read_b32 v23, a231827; GFX950-NEXT: v_accvgpr_read_b32 v24, a241828; GFX950-NEXT: v_accvgpr_read_b32 v25, a251829; GFX950-NEXT: v_accvgpr_read_b32 v26, a261830; GFX950-NEXT: v_accvgpr_read_b32 v27, a271831; GFX950-NEXT: v_accvgpr_read_b32 v28, a281832; GFX950-NEXT: v_accvgpr_read_b32 v29, a291833; GFX950-NEXT: v_accvgpr_read_b32 v30, a301834; GFX950-NEXT: v_accvgpr_read_b32 v31, a311835; GFX950-NEXT: ;;#ASMSTART1836; GFX950-NEXT: ; use v[0:31]1837; GFX950-NEXT: ;;#ASMEND1838; GFX950-NEXT: ;;#ASMSTART1839; GFX950-NEXT: ; use a321840; GFX950-NEXT: ;;#ASMEND1841; GFX950-NEXT: scratch_load_dword a34, off, s32 ; 4-byte Folded Reload1842; GFX950-NEXT: scratch_load_dword a33, off, s32 offset:4 ; 4-byte Folded Reload1843; GFX950-NEXT: scratch_load_dword a32, off, s32 offset:8 ; 4-byte Folded Reload1844; GFX950-NEXT: scratch_load_dword v63, off, s32 offset:12 ; 4-byte Folded Reload1845; GFX950-NEXT: scratch_load_dword v62, off, s32 offset:16 ; 4-byte Folded Reload1846; GFX950-NEXT: scratch_load_dword v61, off, s32 offset:20 ; 4-byte Folded Reload1847; GFX950-NEXT: scratch_load_dword v60, off, s32 offset:24 ; 4-byte Folded Reload1848; GFX950-NEXT: scratch_load_dword v59, off, s32 offset:28 ; 4-byte Folded Reload1849; GFX950-NEXT: scratch_load_dword v58, off, s32 offset:32 ; 4-byte Folded Reload1850; GFX950-NEXT: scratch_load_dword v57, off, s32 offset:36 ; 4-byte Folded Reload1851; GFX950-NEXT: scratch_load_dword v56, off, s32 offset:40 ; 4-byte Folded Reload1852; GFX950-NEXT: scratch_load_dword v47, off, s32 offset:44 ; 4-byte Folded Reload1853; GFX950-NEXT: scratch_load_dword v46, off, s32 offset:48 ; 4-byte Folded Reload1854; GFX950-NEXT: scratch_load_dword v45, off, s32 offset:52 ; 4-byte Folded Reload1855; GFX950-NEXT: scratch_load_dword v44, off, s32 offset:56 ; 4-byte Folded Reload1856; GFX950-NEXT: scratch_load_dword v43, off, s32 offset:60 ; 4-byte Folded Reload1857; GFX950-NEXT: scratch_load_dword v42, off, s32 offset:64 ; 4-byte Folded Reload1858; GFX950-NEXT: scratch_load_dword v41, off, s32 offset:68 ; 4-byte Folded Reload1859; GFX950-NEXT: scratch_load_dword v40, off, s32 offset:72 ; 4-byte Folded Reload1860; GFX950-NEXT: s_waitcnt vmcnt(0)1861; GFX950-NEXT: s_setpc_b64 s[30:31]1862 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101863 %data = call i32 asm "; def $0", "=^VA"()1864 %vgpr.def = call { <32 x i32>, <32 x i32> } asm sideeffect "; def $0", "=${v[0:31]},=${v[32:63]}"()1865 %vgpr.0 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 01866 %vgpr.1 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 11867 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1868 call void asm sideeffect "; use $0", "{v[0:31]},{v[32:63]}"(<32 x i32> %vgpr.0, <32 x i32> %vgpr.1)1869 call void asm "; use $0", "^VA"(i32 %result)1870 ret void1871}1872 1873define void @global_atomic_xor_expansion_i32_noret_a(ptr addrspace(1) %ptr) #0 {1874; GFX90A-LABEL: global_atomic_xor_expansion_i32_noret_a:1875; GFX90A: ; %bb.0:1876; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1877; GFX90A-NEXT: global_load_dword v3, v[0:1], off1878; GFX90A-NEXT: ;;#ASMSTART1879; GFX90A-NEXT: ; def a01880; GFX90A-NEXT: ;;#ASMEND1881; GFX90A-NEXT: v_accvgpr_read_b32 v4, a01882; GFX90A-NEXT: s_mov_b64 s[4:5], 01883; GFX90A-NEXT: .LBB30_1: ; %atomicrmw.start1884; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11885; GFX90A-NEXT: s_waitcnt vmcnt(0)1886; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41887; GFX90A-NEXT: buffer_wbl21888; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1889; GFX90A-NEXT: s_waitcnt vmcnt(0)1890; GFX90A-NEXT: buffer_invl21891; GFX90A-NEXT: buffer_wbinvl1_vol1892; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31893; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1894; GFX90A-NEXT: v_mov_b32_e32 v3, v21895; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1896; GFX90A-NEXT: s_cbranch_execnz .LBB30_11897; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1898; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1899; GFX90A-NEXT: s_setpc_b64 s[30:31]1900;1901; GFX950-LABEL: global_atomic_xor_expansion_i32_noret_a:1902; GFX950: ; %bb.0:1903; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1904; GFX950-NEXT: global_load_dword v3, v[0:1], off1905; GFX950-NEXT: ;;#ASMSTART1906; GFX950-NEXT: ; def a01907; GFX950-NEXT: ;;#ASMEND1908; GFX950-NEXT: s_mov_b64 s[0:1], 01909; GFX950-NEXT: v_accvgpr_read_b32 v4, a01910; GFX950-NEXT: .LBB30_1: ; %atomicrmw.start1911; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11912; GFX950-NEXT: s_waitcnt vmcnt(0)1913; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41914; GFX950-NEXT: buffer_wbl2 sc0 sc11915; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11916; GFX950-NEXT: s_waitcnt vmcnt(0)1917; GFX950-NEXT: buffer_inv sc0 sc11918; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31919; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1920; GFX950-NEXT: v_mov_b32_e32 v3, v21921; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1922; GFX950-NEXT: s_cbranch_execnz .LBB30_11923; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1924; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1925; GFX950-NEXT: s_setpc_b64 s[30:31]1926 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101927 %data = call i32 asm "; def $0", "=a"()1928 %unused = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1929 ret void1930}1931 1932define void @global_atomic_xor_expansion_i32_noret_av(ptr addrspace(1) %ptr) #0 {1933; GFX90A-LABEL: global_atomic_xor_expansion_i32_noret_av:1934; GFX90A: ; %bb.0:1935; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1936; GFX90A-NEXT: global_load_dword v3, v[0:1], off1937; GFX90A-NEXT: s_mov_b64 s[4:5], 01938; GFX90A-NEXT: ;;#ASMSTART1939; GFX90A-NEXT: ; def v41940; GFX90A-NEXT: ;;#ASMEND1941; GFX90A-NEXT: .LBB31_1: ; %atomicrmw.start1942; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=11943; GFX90A-NEXT: s_waitcnt vmcnt(0)1944; GFX90A-NEXT: v_xor_b32_e32 v2, v3, v41945; GFX90A-NEXT: buffer_wbl21946; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off glc1947; GFX90A-NEXT: s_waitcnt vmcnt(0)1948; GFX90A-NEXT: buffer_invl21949; GFX90A-NEXT: buffer_wbinvl1_vol1950; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31951; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1952; GFX90A-NEXT: v_mov_b32_e32 v3, v21953; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]1954; GFX90A-NEXT: s_cbranch_execnz .LBB31_11955; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end1956; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]1957; GFX90A-NEXT: s_setpc_b64 s[30:31]1958;1959; GFX950-LABEL: global_atomic_xor_expansion_i32_noret_av:1960; GFX950: ; %bb.0:1961; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1962; GFX950-NEXT: global_load_dword v3, v[0:1], off1963; GFX950-NEXT: s_mov_b64 s[0:1], 01964; GFX950-NEXT: ;;#ASMSTART1965; GFX950-NEXT: ; def v41966; GFX950-NEXT: ;;#ASMEND1967; GFX950-NEXT: .LBB31_1: ; %atomicrmw.start1968; GFX950-NEXT: ; =>This Inner Loop Header: Depth=11969; GFX950-NEXT: s_waitcnt vmcnt(0)1970; GFX950-NEXT: v_xor_b32_e32 v2, v3, v41971; GFX950-NEXT: buffer_wbl2 sc0 sc11972; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off sc0 sc11973; GFX950-NEXT: s_waitcnt vmcnt(0)1974; GFX950-NEXT: buffer_inv sc0 sc11975; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v31976; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]1977; GFX950-NEXT: v_mov_b32_e32 v3, v21978; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]1979; GFX950-NEXT: s_cbranch_execnz .LBB31_11980; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end1981; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]1982; GFX950-NEXT: s_setpc_b64 s[30:31]1983 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 101984 %data = call i32 asm "; def $0", "=^VA"()1985 %unused = atomicrmw xor ptr addrspace(1) %ptr, i32 %data seq_cst1986 ret void1987}1988 1989;---------------------------------------------------------------------1990; xor i64 cases with cmpxchg expansion1991;---------------------------------------------------------------------1992 1993; Input and result use AGPR1994define void @global_atomic_xor_expansion_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {1995; GFX90A-LABEL: global_atomic_xor_expansion_i64_ret_a_a:1996; GFX90A: ; %bb.0:1997; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1998; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off1999; GFX90A-NEXT: ;;#ASMSTART2000; GFX90A-NEXT: ; def a[0:1]2001; GFX90A-NEXT: ;;#ASMEND2002; GFX90A-NEXT: v_accvgpr_read_b32 v7, a12003; GFX90A-NEXT: v_accvgpr_read_b32 v6, a02004; GFX90A-NEXT: s_mov_b64 s[4:5], 02005; GFX90A-NEXT: .LBB32_1: ; %atomicrmw.start2006; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12007; GFX90A-NEXT: s_waitcnt vmcnt(0)2008; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72009; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62010; GFX90A-NEXT: buffer_wbl22011; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2012; GFX90A-NEXT: s_waitcnt vmcnt(0)2013; GFX90A-NEXT: buffer_invl22014; GFX90A-NEXT: buffer_wbinvl1_vol2015; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2016; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2017; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2018; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2019; GFX90A-NEXT: s_cbranch_execnz .LBB32_12020; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2021; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2022; GFX90A-NEXT: v_accvgpr_write_b32 a0, v22023; GFX90A-NEXT: v_accvgpr_write_b32 a1, v32024; GFX90A-NEXT: ;;#ASMSTART2025; GFX90A-NEXT: ; use a[0:1]2026; GFX90A-NEXT: ;;#ASMEND2027; GFX90A-NEXT: s_setpc_b64 s[30:31]2028;2029; GFX950-LABEL: global_atomic_xor_expansion_i64_ret_a_a:2030; GFX950: ; %bb.0:2031; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2032; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2033; GFX950-NEXT: ;;#ASMSTART2034; GFX950-NEXT: ; def a[0:1]2035; GFX950-NEXT: ;;#ASMEND2036; GFX950-NEXT: s_mov_b64 s[0:1], 02037; GFX950-NEXT: v_accvgpr_read_b32 v7, a12038; GFX950-NEXT: v_accvgpr_read_b32 v6, a02039; GFX950-NEXT: .LBB32_1: ; %atomicrmw.start2040; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12041; GFX950-NEXT: s_waitcnt vmcnt(0)2042; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72043; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62044; GFX950-NEXT: buffer_wbl2 sc0 sc12045; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12046; GFX950-NEXT: s_waitcnt vmcnt(0)2047; GFX950-NEXT: buffer_inv sc0 sc12048; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2049; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2050; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2051; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2052; GFX950-NEXT: s_cbranch_execnz .LBB32_12053; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2054; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2055; GFX950-NEXT: v_accvgpr_write_b32 a0, v22056; GFX950-NEXT: v_accvgpr_write_b32 a1, v32057; GFX950-NEXT: ;;#ASMSTART2058; GFX950-NEXT: ; use a[0:1]2059; GFX950-NEXT: ;;#ASMEND2060; GFX950-NEXT: s_setpc_b64 s[30:31]2061 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102062 %data = call i64 asm "; def $0", "=a"()2063 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2064 call void asm "; use $0", "a"(i64 %result)2065 ret void2066}2067 2068; Input is AGPR, result used as VGPR.2069define void @global_atomic_xor_expansion_i64_ret_a_v(ptr addrspace(1) %ptr) #0 {2070; GFX90A-LABEL: global_atomic_xor_expansion_i64_ret_a_v:2071; GFX90A: ; %bb.0:2072; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2073; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2074; GFX90A-NEXT: ;;#ASMSTART2075; GFX90A-NEXT: ; def a[0:1]2076; GFX90A-NEXT: ;;#ASMEND2077; GFX90A-NEXT: v_accvgpr_read_b32 v7, a12078; GFX90A-NEXT: v_accvgpr_read_b32 v6, a02079; GFX90A-NEXT: s_mov_b64 s[4:5], 02080; GFX90A-NEXT: .LBB33_1: ; %atomicrmw.start2081; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12082; GFX90A-NEXT: s_waitcnt vmcnt(0)2083; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72084; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62085; GFX90A-NEXT: buffer_wbl22086; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2087; GFX90A-NEXT: s_waitcnt vmcnt(0)2088; GFX90A-NEXT: buffer_invl22089; GFX90A-NEXT: buffer_wbinvl1_vol2090; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2091; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2092; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2093; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2094; GFX90A-NEXT: s_cbranch_execnz .LBB33_12095; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2096; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2097; GFX90A-NEXT: ;;#ASMSTART2098; GFX90A-NEXT: ; use v[2:3]2099; GFX90A-NEXT: ;;#ASMEND2100; GFX90A-NEXT: s_setpc_b64 s[30:31]2101;2102; GFX950-LABEL: global_atomic_xor_expansion_i64_ret_a_v:2103; GFX950: ; %bb.0:2104; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2105; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2106; GFX950-NEXT: ;;#ASMSTART2107; GFX950-NEXT: ; def a[0:1]2108; GFX950-NEXT: ;;#ASMEND2109; GFX950-NEXT: s_mov_b64 s[0:1], 02110; GFX950-NEXT: v_accvgpr_read_b32 v7, a12111; GFX950-NEXT: v_accvgpr_read_b32 v6, a02112; GFX950-NEXT: .LBB33_1: ; %atomicrmw.start2113; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12114; GFX950-NEXT: s_waitcnt vmcnt(0)2115; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72116; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62117; GFX950-NEXT: buffer_wbl2 sc0 sc12118; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12119; GFX950-NEXT: s_waitcnt vmcnt(0)2120; GFX950-NEXT: buffer_inv sc0 sc12121; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2122; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2123; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2124; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2125; GFX950-NEXT: s_cbranch_execnz .LBB33_12126; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2127; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2128; GFX950-NEXT: ;;#ASMSTART2129; GFX950-NEXT: ; use v[2:3]2130; GFX950-NEXT: ;;#ASMEND2131; GFX950-NEXT: s_setpc_b64 s[30:31]2132 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102133 %data = call i64 asm "; def $0", "=a"()2134 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2135 call void asm "; use $0", "v"(i64 %result)2136 ret void2137}2138 2139; Input is VGPR, result used as AGPR2140define void @global_atomic_xor_expansion_i64_ret_v_a(ptr addrspace(1) %ptr) #0 {2141; GFX90A-LABEL: global_atomic_xor_expansion_i64_ret_v_a:2142; GFX90A: ; %bb.0:2143; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2144; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2145; GFX90A-NEXT: s_mov_b64 s[4:5], 02146; GFX90A-NEXT: ;;#ASMSTART2147; GFX90A-NEXT: ; def v[6:7]2148; GFX90A-NEXT: ;;#ASMEND2149; GFX90A-NEXT: .LBB34_1: ; %atomicrmw.start2150; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12151; GFX90A-NEXT: s_waitcnt vmcnt(0)2152; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72153; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62154; GFX90A-NEXT: buffer_wbl22155; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2156; GFX90A-NEXT: s_waitcnt vmcnt(0)2157; GFX90A-NEXT: buffer_invl22158; GFX90A-NEXT: buffer_wbinvl1_vol2159; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2160; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2161; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2162; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2163; GFX90A-NEXT: s_cbranch_execnz .LBB34_12164; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2165; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2166; GFX90A-NEXT: v_accvgpr_write_b32 a0, v22167; GFX90A-NEXT: v_accvgpr_write_b32 a1, v32168; GFX90A-NEXT: ;;#ASMSTART2169; GFX90A-NEXT: ; use a[0:1]2170; GFX90A-NEXT: ;;#ASMEND2171; GFX90A-NEXT: s_setpc_b64 s[30:31]2172;2173; GFX950-LABEL: global_atomic_xor_expansion_i64_ret_v_a:2174; GFX950: ; %bb.0:2175; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2176; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2177; GFX950-NEXT: s_mov_b64 s[0:1], 02178; GFX950-NEXT: ;;#ASMSTART2179; GFX950-NEXT: ; def v[6:7]2180; GFX950-NEXT: ;;#ASMEND2181; GFX950-NEXT: .LBB34_1: ; %atomicrmw.start2182; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12183; GFX950-NEXT: s_waitcnt vmcnt(0)2184; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72185; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62186; GFX950-NEXT: buffer_wbl2 sc0 sc12187; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12188; GFX950-NEXT: s_waitcnt vmcnt(0)2189; GFX950-NEXT: buffer_inv sc0 sc12190; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2191; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2192; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2193; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2194; GFX950-NEXT: s_cbranch_execnz .LBB34_12195; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2196; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2197; GFX950-NEXT: v_accvgpr_write_b32 a0, v22198; GFX950-NEXT: v_accvgpr_write_b32 a1, v32199; GFX950-NEXT: ;;#ASMSTART2200; GFX950-NEXT: ; use a[0:1]2201; GFX950-NEXT: ;;#ASMEND2202; GFX950-NEXT: s_setpc_b64 s[30:31]2203 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102204 %data = call i64 asm "; def $0", "=v"()2205 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2206 call void asm "; use $0", "a"(i64 %result)2207 ret void2208}2209 2210; Input is AV, result also used as AV2211define void @global_atomic_xor_expansion_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {2212; GFX90A-LABEL: global_atomic_xor_expansion_i64_ret_av_av:2213; GFX90A: ; %bb.0:2214; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2215; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2216; GFX90A-NEXT: s_mov_b64 s[4:5], 02217; GFX90A-NEXT: ;;#ASMSTART2218; GFX90A-NEXT: ; def v[6:7]2219; GFX90A-NEXT: ;;#ASMEND2220; GFX90A-NEXT: .LBB35_1: ; %atomicrmw.start2221; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12222; GFX90A-NEXT: s_waitcnt vmcnt(0)2223; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72224; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62225; GFX90A-NEXT: buffer_wbl22226; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2227; GFX90A-NEXT: s_waitcnt vmcnt(0)2228; GFX90A-NEXT: buffer_invl22229; GFX90A-NEXT: buffer_wbinvl1_vol2230; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2231; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2232; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2233; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2234; GFX90A-NEXT: s_cbranch_execnz .LBB35_12235; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2236; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2237; GFX90A-NEXT: ;;#ASMSTART2238; GFX90A-NEXT: ; use v[2:3]2239; GFX90A-NEXT: ;;#ASMEND2240; GFX90A-NEXT: s_setpc_b64 s[30:31]2241;2242; GFX950-LABEL: global_atomic_xor_expansion_i64_ret_av_av:2243; GFX950: ; %bb.0:2244; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2245; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2246; GFX950-NEXT: s_mov_b64 s[0:1], 02247; GFX950-NEXT: ;;#ASMSTART2248; GFX950-NEXT: ; def v[6:7]2249; GFX950-NEXT: ;;#ASMEND2250; GFX950-NEXT: .LBB35_1: ; %atomicrmw.start2251; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12252; GFX950-NEXT: s_waitcnt vmcnt(0)2253; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72254; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62255; GFX950-NEXT: buffer_wbl2 sc0 sc12256; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12257; GFX950-NEXT: s_waitcnt vmcnt(0)2258; GFX950-NEXT: buffer_inv sc0 sc12259; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2260; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2261; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2262; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2263; GFX950-NEXT: s_cbranch_execnz .LBB35_12264; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2265; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2266; GFX950-NEXT: ;;#ASMSTART2267; GFX950-NEXT: ; use v[2:3]2268; GFX950-NEXT: ;;#ASMEND2269; GFX950-NEXT: s_setpc_b64 s[30:31]2270 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102271 %data = call i64 asm "; def $0", "=^VA"()2272 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2273 call void asm "; use $0", "^VA"(i64 %result)2274 ret void2275}2276 2277; Input is AV, used as v2278define void @global_atomic_xor_expansion_i64_ret_av_v(ptr addrspace(1) %ptr) #0 {2279; GFX90A-LABEL: global_atomic_xor_expansion_i64_ret_av_v:2280; GFX90A: ; %bb.0:2281; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2282; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2283; GFX90A-NEXT: s_mov_b64 s[4:5], 02284; GFX90A-NEXT: ;;#ASMSTART2285; GFX90A-NEXT: ; def v[6:7]2286; GFX90A-NEXT: ;;#ASMEND2287; GFX90A-NEXT: .LBB36_1: ; %atomicrmw.start2288; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12289; GFX90A-NEXT: s_waitcnt vmcnt(0)2290; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72291; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62292; GFX90A-NEXT: buffer_wbl22293; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2294; GFX90A-NEXT: s_waitcnt vmcnt(0)2295; GFX90A-NEXT: buffer_invl22296; GFX90A-NEXT: buffer_wbinvl1_vol2297; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2298; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2299; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2300; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2301; GFX90A-NEXT: s_cbranch_execnz .LBB36_12302; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2303; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2304; GFX90A-NEXT: ;;#ASMSTART2305; GFX90A-NEXT: ; use v[2:3]2306; GFX90A-NEXT: ;;#ASMEND2307; GFX90A-NEXT: s_setpc_b64 s[30:31]2308;2309; GFX950-LABEL: global_atomic_xor_expansion_i64_ret_av_v:2310; GFX950: ; %bb.0:2311; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2312; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2313; GFX950-NEXT: s_mov_b64 s[0:1], 02314; GFX950-NEXT: ;;#ASMSTART2315; GFX950-NEXT: ; def v[6:7]2316; GFX950-NEXT: ;;#ASMEND2317; GFX950-NEXT: .LBB36_1: ; %atomicrmw.start2318; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12319; GFX950-NEXT: s_waitcnt vmcnt(0)2320; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72321; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62322; GFX950-NEXT: buffer_wbl2 sc0 sc12323; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12324; GFX950-NEXT: s_waitcnt vmcnt(0)2325; GFX950-NEXT: buffer_inv sc0 sc12326; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2327; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2328; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2329; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2330; GFX950-NEXT: s_cbranch_execnz .LBB36_12331; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2332; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2333; GFX950-NEXT: ;;#ASMSTART2334; GFX950-NEXT: ; use v[2:3]2335; GFX950-NEXT: ;;#ASMEND2336; GFX950-NEXT: s_setpc_b64 s[30:31]2337 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102338 %data = call i64 asm "; def $0", "=^VA"()2339 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2340 call void asm "; use $0", "v"(i64 %result)2341 ret void2342}2343 2344; Input is AV, used as a2345define void @global_atomic_xor_expansion_i64_ret_av_a(ptr addrspace(1) %ptr) #0 {2346; GFX90A-LABEL: global_atomic_xor_expansion_i64_ret_av_a:2347; GFX90A: ; %bb.0:2348; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2349; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2350; GFX90A-NEXT: s_mov_b64 s[4:5], 02351; GFX90A-NEXT: ;;#ASMSTART2352; GFX90A-NEXT: ; def v[6:7]2353; GFX90A-NEXT: ;;#ASMEND2354; GFX90A-NEXT: .LBB37_1: ; %atomicrmw.start2355; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12356; GFX90A-NEXT: s_waitcnt vmcnt(0)2357; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72358; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62359; GFX90A-NEXT: buffer_wbl22360; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2361; GFX90A-NEXT: s_waitcnt vmcnt(0)2362; GFX90A-NEXT: buffer_invl22363; GFX90A-NEXT: buffer_wbinvl1_vol2364; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2365; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2366; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2367; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2368; GFX90A-NEXT: s_cbranch_execnz .LBB37_12369; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2370; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2371; GFX90A-NEXT: v_accvgpr_write_b32 a0, v22372; GFX90A-NEXT: v_accvgpr_write_b32 a1, v32373; GFX90A-NEXT: ;;#ASMSTART2374; GFX90A-NEXT: ; use a[0:1]2375; GFX90A-NEXT: ;;#ASMEND2376; GFX90A-NEXT: s_setpc_b64 s[30:31]2377;2378; GFX950-LABEL: global_atomic_xor_expansion_i64_ret_av_a:2379; GFX950: ; %bb.0:2380; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2381; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2382; GFX950-NEXT: s_mov_b64 s[0:1], 02383; GFX950-NEXT: ;;#ASMSTART2384; GFX950-NEXT: ; def v[6:7]2385; GFX950-NEXT: ;;#ASMEND2386; GFX950-NEXT: .LBB37_1: ; %atomicrmw.start2387; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12388; GFX950-NEXT: s_waitcnt vmcnt(0)2389; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72390; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62391; GFX950-NEXT: buffer_wbl2 sc0 sc12392; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12393; GFX950-NEXT: s_waitcnt vmcnt(0)2394; GFX950-NEXT: buffer_inv sc0 sc12395; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2396; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2397; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2398; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2399; GFX950-NEXT: s_cbranch_execnz .LBB37_12400; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2401; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2402; GFX950-NEXT: v_accvgpr_write_b32 a0, v22403; GFX950-NEXT: v_accvgpr_write_b32 a1, v32404; GFX950-NEXT: ;;#ASMSTART2405; GFX950-NEXT: ; use a[0:1]2406; GFX950-NEXT: ;;#ASMEND2407; GFX950-NEXT: s_setpc_b64 s[30:31]2408 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102409 %data = call i64 asm "; def $0", "=^VA"()2410 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2411 call void asm "; use $0", "a"(i64 %result)2412 ret void2413}2414 2415; Input is a, result used as AV2416define void @global_atomic_xor_expansion_i64_ret_a_av(ptr addrspace(1) %ptr) #0 {2417; GFX90A-LABEL: global_atomic_xor_expansion_i64_ret_a_av:2418; GFX90A: ; %bb.0:2419; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2420; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2421; GFX90A-NEXT: ;;#ASMSTART2422; GFX90A-NEXT: ; def a[0:1]2423; GFX90A-NEXT: ;;#ASMEND2424; GFX90A-NEXT: v_accvgpr_read_b32 v7, a12425; GFX90A-NEXT: v_accvgpr_read_b32 v6, a02426; GFX90A-NEXT: s_mov_b64 s[4:5], 02427; GFX90A-NEXT: .LBB38_1: ; %atomicrmw.start2428; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12429; GFX90A-NEXT: s_waitcnt vmcnt(0)2430; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72431; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62432; GFX90A-NEXT: buffer_wbl22433; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2434; GFX90A-NEXT: s_waitcnt vmcnt(0)2435; GFX90A-NEXT: buffer_invl22436; GFX90A-NEXT: buffer_wbinvl1_vol2437; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2438; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2439; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2440; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2441; GFX90A-NEXT: s_cbranch_execnz .LBB38_12442; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2443; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2444; GFX90A-NEXT: ;;#ASMSTART2445; GFX90A-NEXT: ; use v[2:3]2446; GFX90A-NEXT: ;;#ASMEND2447; GFX90A-NEXT: s_setpc_b64 s[30:31]2448;2449; GFX950-LABEL: global_atomic_xor_expansion_i64_ret_a_av:2450; GFX950: ; %bb.0:2451; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2452; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2453; GFX950-NEXT: ;;#ASMSTART2454; GFX950-NEXT: ; def a[0:1]2455; GFX950-NEXT: ;;#ASMEND2456; GFX950-NEXT: s_mov_b64 s[0:1], 02457; GFX950-NEXT: v_accvgpr_read_b32 v7, a12458; GFX950-NEXT: v_accvgpr_read_b32 v6, a02459; GFX950-NEXT: .LBB38_1: ; %atomicrmw.start2460; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12461; GFX950-NEXT: s_waitcnt vmcnt(0)2462; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72463; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62464; GFX950-NEXT: buffer_wbl2 sc0 sc12465; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12466; GFX950-NEXT: s_waitcnt vmcnt(0)2467; GFX950-NEXT: buffer_inv sc0 sc12468; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2469; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2470; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2471; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2472; GFX950-NEXT: s_cbranch_execnz .LBB38_12473; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2474; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2475; GFX950-NEXT: ;;#ASMSTART2476; GFX950-NEXT: ; use v[2:3]2477; GFX950-NEXT: ;;#ASMEND2478; GFX950-NEXT: s_setpc_b64 s[30:31]2479 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102480 %data = call i64 asm "; def $0", "=a"()2481 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2482 call void asm "; use $0", "^VA"(i64 %result)2483 ret void2484}2485 2486; Input is v, result used as AV2487define void @global_atomic_xor_expansion_i64_ret_v_av(ptr addrspace(1) %ptr) #0 {2488; GFX90A-LABEL: global_atomic_xor_expansion_i64_ret_v_av:2489; GFX90A: ; %bb.0:2490; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2491; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2492; GFX90A-NEXT: s_mov_b64 s[4:5], 02493; GFX90A-NEXT: ;;#ASMSTART2494; GFX90A-NEXT: ; def v[6:7]2495; GFX90A-NEXT: ;;#ASMEND2496; GFX90A-NEXT: .LBB39_1: ; %atomicrmw.start2497; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12498; GFX90A-NEXT: s_waitcnt vmcnt(0)2499; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72500; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62501; GFX90A-NEXT: buffer_wbl22502; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2503; GFX90A-NEXT: s_waitcnt vmcnt(0)2504; GFX90A-NEXT: buffer_invl22505; GFX90A-NEXT: buffer_wbinvl1_vol2506; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2507; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2508; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2509; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2510; GFX90A-NEXT: s_cbranch_execnz .LBB39_12511; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2512; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2513; GFX90A-NEXT: ;;#ASMSTART2514; GFX90A-NEXT: ; use v[2:3]2515; GFX90A-NEXT: ;;#ASMEND2516; GFX90A-NEXT: s_setpc_b64 s[30:31]2517;2518; GFX950-LABEL: global_atomic_xor_expansion_i64_ret_v_av:2519; GFX950: ; %bb.0:2520; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2521; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2522; GFX950-NEXT: s_mov_b64 s[0:1], 02523; GFX950-NEXT: ;;#ASMSTART2524; GFX950-NEXT: ; def v[6:7]2525; GFX950-NEXT: ;;#ASMEND2526; GFX950-NEXT: .LBB39_1: ; %atomicrmw.start2527; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12528; GFX950-NEXT: s_waitcnt vmcnt(0)2529; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72530; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62531; GFX950-NEXT: buffer_wbl2 sc0 sc12532; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12533; GFX950-NEXT: s_waitcnt vmcnt(0)2534; GFX950-NEXT: buffer_inv sc0 sc12535; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2536; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2537; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2538; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2539; GFX950-NEXT: s_cbranch_execnz .LBB39_12540; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2541; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2542; GFX950-NEXT: ;;#ASMSTART2543; GFX950-NEXT: ; use v[2:3]2544; GFX950-NEXT: ;;#ASMEND2545; GFX950-NEXT: s_setpc_b64 s[30:31]2546 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102547 %data = call i64 asm "; def $0", "=v"()2548 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2549 call void asm "; use $0", "^VA"(i64 %result)2550 ret void2551}2552 2553define void @global_atomic_xor_expansion_i64_noret_a(ptr addrspace(1) %ptr) #0 {2554; GFX90A-LABEL: global_atomic_xor_expansion_i64_noret_a:2555; GFX90A: ; %bb.0:2556; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2557; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2558; GFX90A-NEXT: ;;#ASMSTART2559; GFX90A-NEXT: ; def a[0:1]2560; GFX90A-NEXT: ;;#ASMEND2561; GFX90A-NEXT: v_accvgpr_read_b32 v7, a12562; GFX90A-NEXT: v_accvgpr_read_b32 v6, a02563; GFX90A-NEXT: s_mov_b64 s[4:5], 02564; GFX90A-NEXT: .LBB40_1: ; %atomicrmw.start2565; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12566; GFX90A-NEXT: s_waitcnt vmcnt(0)2567; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72568; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62569; GFX90A-NEXT: buffer_wbl22570; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2571; GFX90A-NEXT: s_waitcnt vmcnt(0)2572; GFX90A-NEXT: buffer_invl22573; GFX90A-NEXT: buffer_wbinvl1_vol2574; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2575; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2576; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2577; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2578; GFX90A-NEXT: s_cbranch_execnz .LBB40_12579; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2580; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2581; GFX90A-NEXT: s_setpc_b64 s[30:31]2582;2583; GFX950-LABEL: global_atomic_xor_expansion_i64_noret_a:2584; GFX950: ; %bb.0:2585; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2586; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2587; GFX950-NEXT: ;;#ASMSTART2588; GFX950-NEXT: ; def a[0:1]2589; GFX950-NEXT: ;;#ASMEND2590; GFX950-NEXT: s_mov_b64 s[0:1], 02591; GFX950-NEXT: v_accvgpr_read_b32 v7, a12592; GFX950-NEXT: v_accvgpr_read_b32 v6, a02593; GFX950-NEXT: .LBB40_1: ; %atomicrmw.start2594; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12595; GFX950-NEXT: s_waitcnt vmcnt(0)2596; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72597; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62598; GFX950-NEXT: buffer_wbl2 sc0 sc12599; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12600; GFX950-NEXT: s_waitcnt vmcnt(0)2601; GFX950-NEXT: buffer_inv sc0 sc12602; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2603; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2604; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2605; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2606; GFX950-NEXT: s_cbranch_execnz .LBB40_12607; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2608; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2609; GFX950-NEXT: s_setpc_b64 s[30:31]2610 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102611 %data = call i64 asm "; def $0", "=a"()2612 %unused = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2613 ret void2614}2615 2616define void @global_atomic_xor_expansion_i64_noret_av(ptr addrspace(1) %ptr) #0 {2617; GFX90A-LABEL: global_atomic_xor_expansion_i64_noret_av:2618; GFX90A: ; %bb.0:2619; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2620; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2621; GFX90A-NEXT: s_mov_b64 s[4:5], 02622; GFX90A-NEXT: ;;#ASMSTART2623; GFX90A-NEXT: ; def v[6:7]2624; GFX90A-NEXT: ;;#ASMEND2625; GFX90A-NEXT: .LBB41_1: ; %atomicrmw.start2626; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=12627; GFX90A-NEXT: s_waitcnt vmcnt(0)2628; GFX90A-NEXT: v_xor_b32_e32 v3, v5, v72629; GFX90A-NEXT: v_xor_b32_e32 v2, v4, v62630; GFX90A-NEXT: buffer_wbl22631; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off glc2632; GFX90A-NEXT: s_waitcnt vmcnt(0)2633; GFX90A-NEXT: buffer_invl22634; GFX90A-NEXT: buffer_wbinvl1_vol2635; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2636; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]2637; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]2638; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]2639; GFX90A-NEXT: s_cbranch_execnz .LBB41_12640; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end2641; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]2642; GFX90A-NEXT: s_setpc_b64 s[30:31]2643;2644; GFX950-LABEL: global_atomic_xor_expansion_i64_noret_av:2645; GFX950: ; %bb.0:2646; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2647; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off2648; GFX950-NEXT: s_mov_b64 s[0:1], 02649; GFX950-NEXT: ;;#ASMSTART2650; GFX950-NEXT: ; def v[6:7]2651; GFX950-NEXT: ;;#ASMEND2652; GFX950-NEXT: .LBB41_1: ; %atomicrmw.start2653; GFX950-NEXT: ; =>This Inner Loop Header: Depth=12654; GFX950-NEXT: s_waitcnt vmcnt(0)2655; GFX950-NEXT: v_xor_b32_e32 v3, v5, v72656; GFX950-NEXT: v_xor_b32_e32 v2, v4, v62657; GFX950-NEXT: buffer_wbl2 sc0 sc12658; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off sc0 sc12659; GFX950-NEXT: s_waitcnt vmcnt(0)2660; GFX950-NEXT: buffer_inv sc0 sc12661; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]2662; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]2663; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]2664; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]2665; GFX950-NEXT: s_cbranch_execnz .LBB41_12666; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end2667; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]2668; GFX950-NEXT: s_setpc_b64 s[30:31]2669 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 102670 %data = call i64 asm "; def $0", "=^VA"()2671 %unused = atomicrmw xor ptr addrspace(1) %ptr, i64 %data seq_cst2672 ret void2673}2674 2675;---------------------------------------------------------------------2676; xor i32 cases with instruction2677;---------------------------------------------------------------------2678 2679; Input and result use AGPR2680define void @global_atomic_xor_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {2681; GFX90A-LABEL: global_atomic_xor_i32_ret_a_a:2682; GFX90A: ; %bb.0:2683; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2684; GFX90A-NEXT: ;;#ASMSTART2685; GFX90A-NEXT: ; def a02686; GFX90A-NEXT: ;;#ASMEND2687; GFX90A-NEXT: v_accvgpr_read_b32 v2, a02688; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc2689; GFX90A-NEXT: s_waitcnt vmcnt(0)2690; GFX90A-NEXT: buffer_wbinvl1_vol2691; GFX90A-NEXT: v_accvgpr_write_b32 a0, v02692; GFX90A-NEXT: ;;#ASMSTART2693; GFX90A-NEXT: ; use a02694; GFX90A-NEXT: ;;#ASMEND2695; GFX90A-NEXT: s_setpc_b64 s[30:31]2696;2697; GFX950-LABEL: global_atomic_xor_i32_ret_a_a:2698; GFX950: ; %bb.0:2699; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2700; GFX950-NEXT: ;;#ASMSTART2701; GFX950-NEXT: ; def a02702; GFX950-NEXT: ;;#ASMEND2703; GFX950-NEXT: s_nop 02704; GFX950-NEXT: v_accvgpr_read_b32 v2, a02705; GFX950-NEXT: buffer_wbl2 sc12706; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc02707; GFX950-NEXT: s_waitcnt vmcnt(0)2708; GFX950-NEXT: buffer_inv sc12709; GFX950-NEXT: v_accvgpr_write_b32 a0, v02710; GFX950-NEXT: ;;#ASMSTART2711; GFX950-NEXT: ; use a02712; GFX950-NEXT: ;;#ASMEND2713; GFX950-NEXT: s_setpc_b64 s[30:31]2714 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 102715 %data = call i32 asm "; def $0", "=a"()2716 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.fine.grained.memory !02717 call void asm "; use $0", "a"(i32 %result)2718 ret void2719}2720 2721; Input is AGPR, result used as VGPR.2722define void @global_atomic_xor_i32_ret_a_v(ptr addrspace(1) %ptr) #0 {2723; GFX90A-LABEL: global_atomic_xor_i32_ret_a_v:2724; GFX90A: ; %bb.0:2725; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2726; GFX90A-NEXT: ;;#ASMSTART2727; GFX90A-NEXT: ; def a02728; GFX90A-NEXT: ;;#ASMEND2729; GFX90A-NEXT: v_accvgpr_read_b32 v2, a02730; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc2731; GFX90A-NEXT: s_waitcnt vmcnt(0)2732; GFX90A-NEXT: buffer_wbinvl1_vol2733; GFX90A-NEXT: ;;#ASMSTART2734; GFX90A-NEXT: ; use v02735; GFX90A-NEXT: ;;#ASMEND2736; GFX90A-NEXT: s_setpc_b64 s[30:31]2737;2738; GFX950-LABEL: global_atomic_xor_i32_ret_a_v:2739; GFX950: ; %bb.0:2740; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2741; GFX950-NEXT: ;;#ASMSTART2742; GFX950-NEXT: ; def a02743; GFX950-NEXT: ;;#ASMEND2744; GFX950-NEXT: s_nop 02745; GFX950-NEXT: v_accvgpr_read_b32 v2, a02746; GFX950-NEXT: buffer_wbl2 sc12747; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc02748; GFX950-NEXT: s_waitcnt vmcnt(0)2749; GFX950-NEXT: buffer_inv sc12750; GFX950-NEXT: ;;#ASMSTART2751; GFX950-NEXT: ; use v02752; GFX950-NEXT: ;;#ASMEND2753; GFX950-NEXT: s_setpc_b64 s[30:31]2754 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 102755 %data = call i32 asm "; def $0", "=a"()2756 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02757 call void asm "; use $0", "v"(i32 %result)2758 ret void2759}2760 2761; Input is VGPR, result used as AGPR2762define void @global_atomic_xor_i32_ret_v_a(ptr addrspace(1) %ptr) #0 {2763; GFX90A-LABEL: global_atomic_xor_i32_ret_v_a:2764; GFX90A: ; %bb.0:2765; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2766; GFX90A-NEXT: ;;#ASMSTART2767; GFX90A-NEXT: ; def v22768; GFX90A-NEXT: ;;#ASMEND2769; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc2770; GFX90A-NEXT: s_waitcnt vmcnt(0)2771; GFX90A-NEXT: buffer_wbinvl1_vol2772; GFX90A-NEXT: v_accvgpr_write_b32 a0, v02773; GFX90A-NEXT: ;;#ASMSTART2774; GFX90A-NEXT: ; use a02775; GFX90A-NEXT: ;;#ASMEND2776; GFX90A-NEXT: s_setpc_b64 s[30:31]2777;2778; GFX950-LABEL: global_atomic_xor_i32_ret_v_a:2779; GFX950: ; %bb.0:2780; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2781; GFX950-NEXT: ;;#ASMSTART2782; GFX950-NEXT: ; def v22783; GFX950-NEXT: ;;#ASMEND2784; GFX950-NEXT: buffer_wbl2 sc12785; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc02786; GFX950-NEXT: s_waitcnt vmcnt(0)2787; GFX950-NEXT: buffer_inv sc12788; GFX950-NEXT: v_accvgpr_write_b32 a0, v02789; GFX950-NEXT: ;;#ASMSTART2790; GFX950-NEXT: ; use a02791; GFX950-NEXT: ;;#ASMEND2792; GFX950-NEXT: s_setpc_b64 s[30:31]2793 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 102794 %data = call i32 asm "; def $0", "=v"()2795 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02796 call void asm "; use $0", "a"(i32 %result)2797 ret void2798}2799 2800; Input is AV, result also used as AV2801define void @global_atomic_xor_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {2802; GFX90A-LABEL: global_atomic_xor_i32_ret_av_av:2803; GFX90A: ; %bb.0:2804; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2805; GFX90A-NEXT: ;;#ASMSTART2806; GFX90A-NEXT: ; def v22807; GFX90A-NEXT: ;;#ASMEND2808; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc2809; GFX90A-NEXT: s_waitcnt vmcnt(0)2810; GFX90A-NEXT: buffer_wbinvl1_vol2811; GFX90A-NEXT: ;;#ASMSTART2812; GFX90A-NEXT: ; use v02813; GFX90A-NEXT: ;;#ASMEND2814; GFX90A-NEXT: s_setpc_b64 s[30:31]2815;2816; GFX950-LABEL: global_atomic_xor_i32_ret_av_av:2817; GFX950: ; %bb.0:2818; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2819; GFX950-NEXT: ;;#ASMSTART2820; GFX950-NEXT: ; def v22821; GFX950-NEXT: ;;#ASMEND2822; GFX950-NEXT: buffer_wbl2 sc12823; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc02824; GFX950-NEXT: s_waitcnt vmcnt(0)2825; GFX950-NEXT: buffer_inv sc12826; GFX950-NEXT: ;;#ASMSTART2827; GFX950-NEXT: ; use v02828; GFX950-NEXT: ;;#ASMEND2829; GFX950-NEXT: s_setpc_b64 s[30:31]2830 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 102831 %data = call i32 asm "; def $0", "=^VA"()2832 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02833 call void asm "; use $0", "^VA"(i32 %result)2834 ret void2835}2836 2837; Input is AV, used as v2838define void @global_atomic_xor_i32_ret_av_v(ptr addrspace(1) %ptr) #0 {2839; GFX90A-LABEL: global_atomic_xor_i32_ret_av_v:2840; GFX90A: ; %bb.0:2841; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2842; GFX90A-NEXT: ;;#ASMSTART2843; GFX90A-NEXT: ; def v22844; GFX90A-NEXT: ;;#ASMEND2845; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc2846; GFX90A-NEXT: s_waitcnt vmcnt(0)2847; GFX90A-NEXT: buffer_wbinvl1_vol2848; GFX90A-NEXT: ;;#ASMSTART2849; GFX90A-NEXT: ; use v02850; GFX90A-NEXT: ;;#ASMEND2851; GFX90A-NEXT: s_setpc_b64 s[30:31]2852;2853; GFX950-LABEL: global_atomic_xor_i32_ret_av_v:2854; GFX950: ; %bb.0:2855; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2856; GFX950-NEXT: ;;#ASMSTART2857; GFX950-NEXT: ; def v22858; GFX950-NEXT: ;;#ASMEND2859; GFX950-NEXT: buffer_wbl2 sc12860; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc02861; GFX950-NEXT: s_waitcnt vmcnt(0)2862; GFX950-NEXT: buffer_inv sc12863; GFX950-NEXT: ;;#ASMSTART2864; GFX950-NEXT: ; use v02865; GFX950-NEXT: ;;#ASMEND2866; GFX950-NEXT: s_setpc_b64 s[30:31]2867 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 102868 %data = call i32 asm "; def $0", "=^VA"()2869 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02870 call void asm "; use $0", "v"(i32 %result)2871 ret void2872}2873 2874; Input is AV, used as a2875define void @global_atomic_xor_i32_ret_av_a(ptr addrspace(1) %ptr) #0 {2876; GFX90A-LABEL: global_atomic_xor_i32_ret_av_a:2877; GFX90A: ; %bb.0:2878; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2879; GFX90A-NEXT: ;;#ASMSTART2880; GFX90A-NEXT: ; def v22881; GFX90A-NEXT: ;;#ASMEND2882; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc2883; GFX90A-NEXT: s_waitcnt vmcnt(0)2884; GFX90A-NEXT: buffer_wbinvl1_vol2885; GFX90A-NEXT: v_accvgpr_write_b32 a0, v02886; GFX90A-NEXT: ;;#ASMSTART2887; GFX90A-NEXT: ; use a02888; GFX90A-NEXT: ;;#ASMEND2889; GFX90A-NEXT: s_setpc_b64 s[30:31]2890;2891; GFX950-LABEL: global_atomic_xor_i32_ret_av_a:2892; GFX950: ; %bb.0:2893; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2894; GFX950-NEXT: ;;#ASMSTART2895; GFX950-NEXT: ; def v22896; GFX950-NEXT: ;;#ASMEND2897; GFX950-NEXT: buffer_wbl2 sc12898; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc02899; GFX950-NEXT: s_waitcnt vmcnt(0)2900; GFX950-NEXT: buffer_inv sc12901; GFX950-NEXT: v_accvgpr_write_b32 a0, v02902; GFX950-NEXT: ;;#ASMSTART2903; GFX950-NEXT: ; use a02904; GFX950-NEXT: ;;#ASMEND2905; GFX950-NEXT: s_setpc_b64 s[30:31]2906 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 102907 %data = call i32 asm "; def $0", "=^VA"()2908 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02909 call void asm "; use $0", "a"(i32 %result)2910 ret void2911}2912 2913; Input is a, result used as AV2914define void @global_atomic_xor_i32_ret_a_av(ptr addrspace(1) %ptr) #0 {2915; GFX90A-LABEL: global_atomic_xor_i32_ret_a_av:2916; GFX90A: ; %bb.0:2917; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2918; GFX90A-NEXT: ;;#ASMSTART2919; GFX90A-NEXT: ; def a02920; GFX90A-NEXT: ;;#ASMEND2921; GFX90A-NEXT: v_accvgpr_read_b32 v2, a02922; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc2923; GFX90A-NEXT: s_waitcnt vmcnt(0)2924; GFX90A-NEXT: buffer_wbinvl1_vol2925; GFX90A-NEXT: ;;#ASMSTART2926; GFX90A-NEXT: ; use v02927; GFX90A-NEXT: ;;#ASMEND2928; GFX90A-NEXT: s_setpc_b64 s[30:31]2929;2930; GFX950-LABEL: global_atomic_xor_i32_ret_a_av:2931; GFX950: ; %bb.0:2932; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2933; GFX950-NEXT: ;;#ASMSTART2934; GFX950-NEXT: ; def a02935; GFX950-NEXT: ;;#ASMEND2936; GFX950-NEXT: s_nop 02937; GFX950-NEXT: v_accvgpr_read_b32 v2, a02938; GFX950-NEXT: buffer_wbl2 sc12939; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc02940; GFX950-NEXT: s_waitcnt vmcnt(0)2941; GFX950-NEXT: buffer_inv sc12942; GFX950-NEXT: ;;#ASMSTART2943; GFX950-NEXT: ; use v02944; GFX950-NEXT: ;;#ASMEND2945; GFX950-NEXT: s_setpc_b64 s[30:31]2946 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 102947 %data = call i32 asm "; def $0", "=a"()2948 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02949 call void asm "; use $0", "^VA"(i32 %result)2950 ret void2951}2952 2953; Input is v, result used as AV2954define void @global_atomic_xor_i32_ret_v_av(ptr addrspace(1) %ptr) #0 {2955; GFX90A-LABEL: global_atomic_xor_i32_ret_v_av:2956; GFX90A: ; %bb.0:2957; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2958; GFX90A-NEXT: ;;#ASMSTART2959; GFX90A-NEXT: ; def v22960; GFX90A-NEXT: ;;#ASMEND2961; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc2962; GFX90A-NEXT: s_waitcnt vmcnt(0)2963; GFX90A-NEXT: buffer_wbinvl1_vol2964; GFX90A-NEXT: ;;#ASMSTART2965; GFX90A-NEXT: ; use v02966; GFX90A-NEXT: ;;#ASMEND2967; GFX90A-NEXT: s_setpc_b64 s[30:31]2968;2969; GFX950-LABEL: global_atomic_xor_i32_ret_v_av:2970; GFX950: ; %bb.0:2971; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2972; GFX950-NEXT: ;;#ASMSTART2973; GFX950-NEXT: ; def v22974; GFX950-NEXT: ;;#ASMEND2975; GFX950-NEXT: buffer_wbl2 sc12976; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc02977; GFX950-NEXT: s_waitcnt vmcnt(0)2978; GFX950-NEXT: buffer_inv sc12979; GFX950-NEXT: ;;#ASMSTART2980; GFX950-NEXT: ; use v02981; GFX950-NEXT: ;;#ASMEND2982; GFX950-NEXT: s_setpc_b64 s[30:31]2983 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 102984 %data = call i32 asm "; def $0", "=v"()2985 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !02986 call void asm "; use $0", "^VA"(i32 %result)2987 ret void2988}2989 2990define void @global_atomic_xor_i32_ret_av_av_no_agprs(ptr addrspace(1) %ptr) #0 {2991; GFX90A-LABEL: global_atomic_xor_i32_ret_av_av_no_agprs:2992; GFX90A: ; %bb.0:2993; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2994; GFX90A-NEXT: v_accvgpr_write_b32 a0, v02995; GFX90A-NEXT: v_accvgpr_write_b32 a3, v40 ; Reload Reuse2996; GFX90A-NEXT: v_accvgpr_write_b32 a4, v41 ; Reload Reuse2997; GFX90A-NEXT: v_accvgpr_write_b32 a5, v42 ; Reload Reuse2998; GFX90A-NEXT: v_accvgpr_write_b32 a6, v43 ; Reload Reuse2999; GFX90A-NEXT: v_accvgpr_write_b32 a7, v44 ; Reload Reuse3000; GFX90A-NEXT: v_accvgpr_write_b32 a8, v45 ; Reload Reuse3001; GFX90A-NEXT: v_accvgpr_write_b32 a9, v46 ; Reload Reuse3002; GFX90A-NEXT: v_accvgpr_write_b32 a10, v47 ; Reload Reuse3003; GFX90A-NEXT: v_accvgpr_write_b32 a11, v56 ; Reload Reuse3004; GFX90A-NEXT: v_accvgpr_write_b32 a12, v57 ; Reload Reuse3005; GFX90A-NEXT: v_accvgpr_write_b32 a13, v58 ; Reload Reuse3006; GFX90A-NEXT: v_accvgpr_write_b32 a14, v59 ; Reload Reuse3007; GFX90A-NEXT: v_accvgpr_write_b32 a15, v60 ; Reload Reuse3008; GFX90A-NEXT: v_accvgpr_write_b32 a16, v61 ; Reload Reuse3009; GFX90A-NEXT: v_accvgpr_write_b32 a17, v62 ; Reload Reuse3010; GFX90A-NEXT: v_accvgpr_write_b32 a18, v63 ; Reload Reuse3011; GFX90A-NEXT: v_accvgpr_write_b32 a1, v13012; GFX90A-NEXT: ;;#ASMSTART3013; GFX90A-NEXT: ; def v[0:31]3014; GFX90A-NEXT: ;;#ASMEND3015; GFX90A-NEXT: buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill3016; GFX90A-NEXT: s_nop 03017; GFX90A-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill3018; GFX90A-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Spill3019; GFX90A-NEXT: buffer_store_dword v3, off, s[0:3], s32 offset:12 ; 4-byte Folded Spill3020; GFX90A-NEXT: buffer_store_dword v4, off, s[0:3], s32 offset:16 ; 4-byte Folded Spill3021; GFX90A-NEXT: buffer_store_dword v5, off, s[0:3], s32 offset:20 ; 4-byte Folded Spill3022; GFX90A-NEXT: buffer_store_dword v6, off, s[0:3], s32 offset:24 ; 4-byte Folded Spill3023; GFX90A-NEXT: buffer_store_dword v7, off, s[0:3], s32 offset:28 ; 4-byte Folded Spill3024; GFX90A-NEXT: buffer_store_dword v8, off, s[0:3], s32 offset:32 ; 4-byte Folded Spill3025; GFX90A-NEXT: buffer_store_dword v9, off, s[0:3], s32 offset:36 ; 4-byte Folded Spill3026; GFX90A-NEXT: buffer_store_dword v10, off, s[0:3], s32 offset:40 ; 4-byte Folded Spill3027; GFX90A-NEXT: buffer_store_dword v11, off, s[0:3], s32 offset:44 ; 4-byte Folded Spill3028; GFX90A-NEXT: buffer_store_dword v12, off, s[0:3], s32 offset:48 ; 4-byte Folded Spill3029; GFX90A-NEXT: buffer_store_dword v13, off, s[0:3], s32 offset:52 ; 4-byte Folded Spill3030; GFX90A-NEXT: buffer_store_dword v14, off, s[0:3], s32 offset:56 ; 4-byte Folded Spill3031; GFX90A-NEXT: buffer_store_dword v15, off, s[0:3], s32 offset:60 ; 4-byte Folded Spill3032; GFX90A-NEXT: buffer_store_dword v16, off, s[0:3], s32 offset:64 ; 4-byte Folded Spill3033; GFX90A-NEXT: buffer_store_dword v17, off, s[0:3], s32 offset:68 ; 4-byte Folded Spill3034; GFX90A-NEXT: buffer_store_dword v18, off, s[0:3], s32 offset:72 ; 4-byte Folded Spill3035; GFX90A-NEXT: ;;#ASMSTART3036; GFX90A-NEXT: ; def a23037; GFX90A-NEXT: ;;#ASMEND3038; GFX90A-NEXT: v_accvgpr_write_b32 a19, v31 ; Reload Reuse3039; GFX90A-NEXT: v_accvgpr_read_b32 v0, a03040; GFX90A-NEXT: v_accvgpr_read_b32 v1, a13041; GFX90A-NEXT: v_accvgpr_read_b32 v2, a23042; GFX90A-NEXT: s_waitcnt vmcnt(0)3043; GFX90A-NEXT: global_atomic_xor v0, v[0:1], v2, off glc3044; GFX90A-NEXT: s_waitcnt vmcnt(0)3045; GFX90A-NEXT: buffer_wbinvl1_vol3046; GFX90A-NEXT: v_accvgpr_write_b32 a31, v19 ; Reload Reuse3047; GFX90A-NEXT: v_accvgpr_write_b32 a30, v20 ; Reload Reuse3048; GFX90A-NEXT: v_accvgpr_write_b32 a29, v21 ; Reload Reuse3049; GFX90A-NEXT: v_accvgpr_write_b32 a28, v22 ; Reload Reuse3050; GFX90A-NEXT: v_accvgpr_write_b32 a27, v23 ; Reload Reuse3051; GFX90A-NEXT: v_accvgpr_write_b32 a26, v24 ; Reload Reuse3052; GFX90A-NEXT: v_accvgpr_write_b32 a25, v25 ; Reload Reuse3053; GFX90A-NEXT: v_accvgpr_write_b32 a24, v26 ; Reload Reuse3054; GFX90A-NEXT: v_accvgpr_write_b32 a23, v27 ; Reload Reuse3055; GFX90A-NEXT: v_accvgpr_write_b32 a22, v28 ; Reload Reuse3056; GFX90A-NEXT: v_accvgpr_write_b32 a21, v29 ; Reload Reuse3057; GFX90A-NEXT: v_accvgpr_write_b32 a20, v30 ; Reload Reuse3058; GFX90A-NEXT: v_accvgpr_write_b32 a0, v03059; GFX90A-NEXT: buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload3060; GFX90A-NEXT: buffer_load_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload3061; GFX90A-NEXT: buffer_load_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Reload3062; GFX90A-NEXT: buffer_load_dword v3, off, s[0:3], s32 offset:12 ; 4-byte Folded Reload3063; GFX90A-NEXT: buffer_load_dword v4, off, s[0:3], s32 offset:16 ; 4-byte Folded Reload3064; GFX90A-NEXT: buffer_load_dword v5, off, s[0:3], s32 offset:20 ; 4-byte Folded Reload3065; GFX90A-NEXT: buffer_load_dword v6, off, s[0:3], s32 offset:24 ; 4-byte Folded Reload3066; GFX90A-NEXT: buffer_load_dword v7, off, s[0:3], s32 offset:28 ; 4-byte Folded Reload3067; GFX90A-NEXT: buffer_load_dword v8, off, s[0:3], s32 offset:32 ; 4-byte Folded Reload3068; GFX90A-NEXT: buffer_load_dword v9, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload3069; GFX90A-NEXT: buffer_load_dword v10, off, s[0:3], s32 offset:40 ; 4-byte Folded Reload3070; GFX90A-NEXT: buffer_load_dword v11, off, s[0:3], s32 offset:44 ; 4-byte Folded Reload3071; GFX90A-NEXT: buffer_load_dword v12, off, s[0:3], s32 offset:48 ; 4-byte Folded Reload3072; GFX90A-NEXT: buffer_load_dword v13, off, s[0:3], s32 offset:52 ; 4-byte Folded Reload3073; GFX90A-NEXT: buffer_load_dword v14, off, s[0:3], s32 offset:56 ; 4-byte Folded Reload3074; GFX90A-NEXT: buffer_load_dword v15, off, s[0:3], s32 offset:60 ; 4-byte Folded Reload3075; GFX90A-NEXT: buffer_load_dword v16, off, s[0:3], s32 offset:64 ; 4-byte Folded Reload3076; GFX90A-NEXT: buffer_load_dword v17, off, s[0:3], s32 offset:68 ; 4-byte Folded Reload3077; GFX90A-NEXT: buffer_load_dword v18, off, s[0:3], s32 offset:72 ; 4-byte Folded Reload3078; GFX90A-NEXT: v_accvgpr_read_b32 v19, a31 ; Reload Reuse3079; GFX90A-NEXT: v_accvgpr_read_b32 v20, a30 ; Reload Reuse3080; GFX90A-NEXT: v_accvgpr_read_b32 v21, a29 ; Reload Reuse3081; GFX90A-NEXT: v_accvgpr_read_b32 v22, a28 ; Reload Reuse3082; GFX90A-NEXT: v_accvgpr_read_b32 v23, a27 ; Reload Reuse3083; GFX90A-NEXT: v_accvgpr_read_b32 v24, a26 ; Reload Reuse3084; GFX90A-NEXT: v_accvgpr_read_b32 v25, a25 ; Reload Reuse3085; GFX90A-NEXT: v_accvgpr_read_b32 v26, a24 ; Reload Reuse3086; GFX90A-NEXT: v_accvgpr_read_b32 v27, a23 ; Reload Reuse3087; GFX90A-NEXT: v_accvgpr_read_b32 v28, a22 ; Reload Reuse3088; GFX90A-NEXT: v_accvgpr_read_b32 v29, a21 ; Reload Reuse3089; GFX90A-NEXT: v_accvgpr_read_b32 v30, a20 ; Reload Reuse3090; GFX90A-NEXT: ;;#ASMSTART3091; GFX90A-NEXT: ; use a03092; GFX90A-NEXT: ;;#ASMEND3093; GFX90A-NEXT: s_waitcnt vmcnt(0)3094; GFX90A-NEXT: v_accvgpr_read_b32 v31, a19 ; Reload Reuse3095; GFX90A-NEXT: ;;#ASMSTART3096; GFX90A-NEXT: ; use v[0:31]3097; GFX90A-NEXT: ;;#ASMEND3098; GFX90A-NEXT: v_accvgpr_read_b32 v63, a18 ; Reload Reuse3099; GFX90A-NEXT: v_accvgpr_read_b32 v62, a17 ; Reload Reuse3100; GFX90A-NEXT: v_accvgpr_read_b32 v61, a16 ; Reload Reuse3101; GFX90A-NEXT: v_accvgpr_read_b32 v60, a15 ; Reload Reuse3102; GFX90A-NEXT: v_accvgpr_read_b32 v59, a14 ; Reload Reuse3103; GFX90A-NEXT: v_accvgpr_read_b32 v58, a13 ; Reload Reuse3104; GFX90A-NEXT: v_accvgpr_read_b32 v57, a12 ; Reload Reuse3105; GFX90A-NEXT: v_accvgpr_read_b32 v56, a11 ; Reload Reuse3106; GFX90A-NEXT: v_accvgpr_read_b32 v47, a10 ; Reload Reuse3107; GFX90A-NEXT: v_accvgpr_read_b32 v46, a9 ; Reload Reuse3108; GFX90A-NEXT: v_accvgpr_read_b32 v45, a8 ; Reload Reuse3109; GFX90A-NEXT: v_accvgpr_read_b32 v44, a7 ; Reload Reuse3110; GFX90A-NEXT: v_accvgpr_read_b32 v43, a6 ; Reload Reuse3111; GFX90A-NEXT: v_accvgpr_read_b32 v42, a5 ; Reload Reuse3112; GFX90A-NEXT: v_accvgpr_read_b32 v41, a4 ; Reload Reuse3113; GFX90A-NEXT: v_accvgpr_read_b32 v40, a3 ; Reload Reuse3114; GFX90A-NEXT: s_setpc_b64 s[30:31]3115;3116; GFX950-LABEL: global_atomic_xor_i32_ret_av_av_no_agprs:3117; GFX950: ; %bb.0:3118; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3119; GFX950-NEXT: v_accvgpr_write_b32 a0, v03120; GFX950-NEXT: v_accvgpr_write_b32 a3, v40 ; Reload Reuse3121; GFX950-NEXT: v_accvgpr_write_b32 a4, v41 ; Reload Reuse3122; GFX950-NEXT: v_accvgpr_write_b32 a5, v42 ; Reload Reuse3123; GFX950-NEXT: v_accvgpr_write_b32 a6, v43 ; Reload Reuse3124; GFX950-NEXT: v_accvgpr_write_b32 a7, v44 ; Reload Reuse3125; GFX950-NEXT: v_accvgpr_write_b32 a8, v45 ; Reload Reuse3126; GFX950-NEXT: v_accvgpr_write_b32 a9, v46 ; Reload Reuse3127; GFX950-NEXT: v_accvgpr_write_b32 a10, v47 ; Reload Reuse3128; GFX950-NEXT: v_accvgpr_write_b32 a11, v56 ; Reload Reuse3129; GFX950-NEXT: v_accvgpr_write_b32 a12, v57 ; Reload Reuse3130; GFX950-NEXT: v_accvgpr_write_b32 a13, v58 ; Reload Reuse3131; GFX950-NEXT: v_accvgpr_write_b32 a14, v59 ; Reload Reuse3132; GFX950-NEXT: v_accvgpr_write_b32 a15, v60 ; Reload Reuse3133; GFX950-NEXT: v_accvgpr_write_b32 a16, v61 ; Reload Reuse3134; GFX950-NEXT: v_accvgpr_write_b32 a17, v62 ; Reload Reuse3135; GFX950-NEXT: v_accvgpr_write_b32 a18, v63 ; Reload Reuse3136; GFX950-NEXT: v_accvgpr_write_b32 a1, v13137; GFX950-NEXT: ;;#ASMSTART3138; GFX950-NEXT: ; def v[0:31]3139; GFX950-NEXT: ;;#ASMEND3140; GFX950-NEXT: scratch_store_dwordx4 off, v[0:3], s32 ; 16-byte Folded Spill3141; GFX950-NEXT: s_nop 03142; GFX950-NEXT: scratch_store_dwordx4 off, v[4:7], s32 offset:16 ; 16-byte Folded Spill3143; GFX950-NEXT: scratch_store_dwordx4 off, v[8:11], s32 offset:32 ; 16-byte Folded Spill3144; GFX950-NEXT: scratch_store_dwordx4 off, v[12:15], s32 offset:48 ; 16-byte Folded Spill3145; GFX950-NEXT: ;;#ASMSTART3146; GFX950-NEXT: ; def a23147; GFX950-NEXT: ;;#ASMEND3148; GFX950-NEXT: v_accvgpr_write_b32 a19, v31 ; Reload Reuse3149; GFX950-NEXT: v_accvgpr_write_b32 a20, v30 ; Reload Reuse3150; GFX950-NEXT: v_accvgpr_write_b32 a21, v29 ; Reload Reuse3151; GFX950-NEXT: v_accvgpr_write_b32 a22, v28 ; Reload Reuse3152; GFX950-NEXT: v_accvgpr_read_b32 v0, a03153; GFX950-NEXT: scratch_store_dwordx3 off, v[16:18], s32 offset:64 ; 12-byte Folded Spill3154; GFX950-NEXT: v_accvgpr_read_b32 v1, a13155; GFX950-NEXT: v_accvgpr_read_b32 v2, a23156; GFX950-NEXT: buffer_wbl2 sc13157; GFX950-NEXT: s_waitcnt vmcnt(0)3158; GFX950-NEXT: global_atomic_xor v0, v[0:1], v2, off sc03159; GFX950-NEXT: s_waitcnt vmcnt(0)3160; GFX950-NEXT: buffer_inv sc13161; GFX950-NEXT: v_accvgpr_write_b32 a31, v19 ; Reload Reuse3162; GFX950-NEXT: v_accvgpr_write_b32 a27, v23 ; Reload Reuse3163; GFX950-NEXT: v_accvgpr_write_b32 a28, v22 ; Reload Reuse3164; GFX950-NEXT: v_accvgpr_write_b32 a29, v21 ; Reload Reuse3165; GFX950-NEXT: v_accvgpr_write_b32 a30, v20 ; Reload Reuse3166; GFX950-NEXT: v_accvgpr_write_b32 a23, v27 ; Reload Reuse3167; GFX950-NEXT: v_accvgpr_write_b32 a24, v26 ; Reload Reuse3168; GFX950-NEXT: v_accvgpr_write_b32 a25, v25 ; Reload Reuse3169; GFX950-NEXT: v_accvgpr_write_b32 a26, v24 ; Reload Reuse3170; GFX950-NEXT: v_accvgpr_write_b32 a0, v03171; GFX950-NEXT: scratch_load_dwordx4 v[0:3], off, s32 ; 16-byte Folded Reload3172; GFX950-NEXT: scratch_load_dwordx4 v[4:7], off, s32 offset:16 ; 16-byte Folded Reload3173; GFX950-NEXT: scratch_load_dwordx4 v[8:11], off, s32 offset:32 ; 16-byte Folded Reload3174; GFX950-NEXT: scratch_load_dwordx4 v[12:15], off, s32 offset:48 ; 16-byte Folded Reload3175; GFX950-NEXT: v_accvgpr_read_b32 v19, a31 ; Reload Reuse3176; GFX950-NEXT: scratch_load_dwordx3 v[16:18], off, s32 offset:64 ; 12-byte Folded Reload3177; GFX950-NEXT: v_accvgpr_read_b32 v23, a27 ; Reload Reuse3178; GFX950-NEXT: v_accvgpr_read_b32 v22, a28 ; Reload Reuse3179; GFX950-NEXT: v_accvgpr_read_b32 v21, a29 ; Reload Reuse3180; GFX950-NEXT: v_accvgpr_read_b32 v20, a30 ; Reload Reuse3181; GFX950-NEXT: v_accvgpr_read_b32 v27, a23 ; Reload Reuse3182; GFX950-NEXT: v_accvgpr_read_b32 v26, a24 ; Reload Reuse3183; GFX950-NEXT: v_accvgpr_read_b32 v25, a25 ; Reload Reuse3184; GFX950-NEXT: v_accvgpr_read_b32 v24, a26 ; Reload Reuse3185; GFX950-NEXT: ;;#ASMSTART3186; GFX950-NEXT: ; use a03187; GFX950-NEXT: ;;#ASMEND3188; GFX950-NEXT: s_waitcnt vmcnt(0)3189; GFX950-NEXT: v_accvgpr_read_b32 v31, a19 ; Reload Reuse3190; GFX950-NEXT: v_accvgpr_read_b32 v30, a20 ; Reload Reuse3191; GFX950-NEXT: v_accvgpr_read_b32 v29, a21 ; Reload Reuse3192; GFX950-NEXT: v_accvgpr_read_b32 v28, a22 ; Reload Reuse3193; GFX950-NEXT: ;;#ASMSTART3194; GFX950-NEXT: ; use v[0:31]3195; GFX950-NEXT: ;;#ASMEND3196; GFX950-NEXT: v_accvgpr_read_b32 v63, a18 ; Reload Reuse3197; GFX950-NEXT: v_accvgpr_read_b32 v62, a17 ; Reload Reuse3198; GFX950-NEXT: v_accvgpr_read_b32 v61, a16 ; Reload Reuse3199; GFX950-NEXT: v_accvgpr_read_b32 v60, a15 ; Reload Reuse3200; GFX950-NEXT: v_accvgpr_read_b32 v59, a14 ; Reload Reuse3201; GFX950-NEXT: v_accvgpr_read_b32 v58, a13 ; Reload Reuse3202; GFX950-NEXT: v_accvgpr_read_b32 v57, a12 ; Reload Reuse3203; GFX950-NEXT: v_accvgpr_read_b32 v56, a11 ; Reload Reuse3204; GFX950-NEXT: v_accvgpr_read_b32 v47, a10 ; Reload Reuse3205; GFX950-NEXT: v_accvgpr_read_b32 v46, a9 ; Reload Reuse3206; GFX950-NEXT: v_accvgpr_read_b32 v45, a8 ; Reload Reuse3207; GFX950-NEXT: v_accvgpr_read_b32 v44, a7 ; Reload Reuse3208; GFX950-NEXT: v_accvgpr_read_b32 v43, a6 ; Reload Reuse3209; GFX950-NEXT: v_accvgpr_read_b32 v42, a5 ; Reload Reuse3210; GFX950-NEXT: v_accvgpr_read_b32 v41, a4 ; Reload Reuse3211; GFX950-NEXT: v_accvgpr_read_b32 v40, a3 ; Reload Reuse3212; GFX950-NEXT: s_setpc_b64 s[30:31]3213 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103214 %data = call i32 asm "; def $0", "=^VA"()3215 %vgpr.def = call { <32 x i32>, <32 x i32> } asm sideeffect "; def $0", "=${v[0:31]},=${v[32:63]}"()3216 %vgpr.0 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 03217 %vgpr.1 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 13218 %result = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03219 call void asm sideeffect "; use $0", "{v[0:31]},{v[32:63]}"(<32 x i32> %vgpr.0, <32 x i32> %vgpr.1)3220 call void asm "; use $0", "^VA"(i32 %result)3221 ret void3222}3223 3224define void @global_atomic_xor_i32_noret_a(ptr addrspace(1) %ptr) #0 {3225; GFX90A-LABEL: global_atomic_xor_i32_noret_a:3226; GFX90A: ; %bb.0:3227; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3228; GFX90A-NEXT: ;;#ASMSTART3229; GFX90A-NEXT: ; def a03230; GFX90A-NEXT: ;;#ASMEND3231; GFX90A-NEXT: global_atomic_xor v[0:1], a0, off3232; GFX90A-NEXT: s_waitcnt vmcnt(0)3233; GFX90A-NEXT: buffer_wbinvl1_vol3234; GFX90A-NEXT: s_setpc_b64 s[30:31]3235;3236; GFX950-LABEL: global_atomic_xor_i32_noret_a:3237; GFX950: ; %bb.0:3238; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3239; GFX950-NEXT: ;;#ASMSTART3240; GFX950-NEXT: ; def a03241; GFX950-NEXT: ;;#ASMEND3242; GFX950-NEXT: buffer_wbl2 sc13243; GFX950-NEXT: global_atomic_xor v[0:1], a0, off3244; GFX950-NEXT: s_waitcnt vmcnt(0)3245; GFX950-NEXT: buffer_inv sc13246; GFX950-NEXT: s_setpc_b64 s[30:31]3247 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103248 %data = call i32 asm "; def $0", "=a"()3249 %unused = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03250 ret void3251}3252 3253define void @global_atomic_xor_i32_noret_av(ptr addrspace(1) %ptr) #0 {3254; GFX90A-LABEL: global_atomic_xor_i32_noret_av:3255; GFX90A: ; %bb.0:3256; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3257; GFX90A-NEXT: ;;#ASMSTART3258; GFX90A-NEXT: ; def v23259; GFX90A-NEXT: ;;#ASMEND3260; GFX90A-NEXT: global_atomic_xor v[0:1], v2, off3261; GFX90A-NEXT: s_waitcnt vmcnt(0)3262; GFX90A-NEXT: buffer_wbinvl1_vol3263; GFX90A-NEXT: s_setpc_b64 s[30:31]3264;3265; GFX950-LABEL: global_atomic_xor_i32_noret_av:3266; GFX950: ; %bb.0:3267; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3268; GFX950-NEXT: ;;#ASMSTART3269; GFX950-NEXT: ; def v23270; GFX950-NEXT: ;;#ASMEND3271; GFX950-NEXT: buffer_wbl2 sc13272; GFX950-NEXT: global_atomic_xor v[0:1], v2, off3273; GFX950-NEXT: s_waitcnt vmcnt(0)3274; GFX950-NEXT: buffer_inv sc13275; GFX950-NEXT: s_setpc_b64 s[30:31]3276 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103277 %data = call i32 asm "; def $0", "=^VA"()3278 %unused = atomicrmw xor ptr addrspace(1) %ptr, i32 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03279 ret void3280}3281 3282;---------------------------------------------------------------------3283; xor i64 cases with instruction3284;---------------------------------------------------------------------3285 3286; Input and result use AGPR3287define void @global_atomic_xor_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {3288; GFX90A-LABEL: global_atomic_xor_i64_ret_a_a:3289; GFX90A: ; %bb.0:3290; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3291; GFX90A-NEXT: ;;#ASMSTART3292; GFX90A-NEXT: ; def a[0:1]3293; GFX90A-NEXT: ;;#ASMEND3294; GFX90A-NEXT: v_accvgpr_read_b32 v3, a13295; GFX90A-NEXT: v_accvgpr_read_b32 v2, a03296; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off glc3297; GFX90A-NEXT: s_waitcnt vmcnt(0)3298; GFX90A-NEXT: buffer_wbinvl1_vol3299; GFX90A-NEXT: v_accvgpr_write_b32 a0, v03300; GFX90A-NEXT: v_accvgpr_write_b32 a1, v13301; GFX90A-NEXT: ;;#ASMSTART3302; GFX90A-NEXT: ; use a[0:1]3303; GFX90A-NEXT: ;;#ASMEND3304; GFX90A-NEXT: s_setpc_b64 s[30:31]3305;3306; GFX950-LABEL: global_atomic_xor_i64_ret_a_a:3307; GFX950: ; %bb.0:3308; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3309; GFX950-NEXT: ;;#ASMSTART3310; GFX950-NEXT: ; def a[0:1]3311; GFX950-NEXT: ;;#ASMEND3312; GFX950-NEXT: s_nop 03313; GFX950-NEXT: v_accvgpr_read_b32 v3, a13314; GFX950-NEXT: v_accvgpr_read_b32 v2, a03315; GFX950-NEXT: buffer_wbl2 sc13316; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off sc03317; GFX950-NEXT: s_waitcnt vmcnt(0)3318; GFX950-NEXT: buffer_inv sc13319; GFX950-NEXT: v_accvgpr_write_b32 a0, v03320; GFX950-NEXT: v_accvgpr_write_b32 a1, v13321; GFX950-NEXT: ;;#ASMSTART3322; GFX950-NEXT: ; use a[0:1]3323; GFX950-NEXT: ;;#ASMEND3324; GFX950-NEXT: s_setpc_b64 s[30:31]3325 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103326 %data = call i64 asm "; def $0", "=a"()3327 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03328 call void asm "; use $0", "a"(i64 %result)3329 ret void3330}3331 3332; Input is AGPR, result used as VGPR.3333define void @global_atomic_xor_i64_ret_a_v(ptr addrspace(1) %ptr) #0 {3334; GFX90A-LABEL: global_atomic_xor_i64_ret_a_v:3335; GFX90A: ; %bb.0:3336; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3337; GFX90A-NEXT: ;;#ASMSTART3338; GFX90A-NEXT: ; def a[0:1]3339; GFX90A-NEXT: ;;#ASMEND3340; GFX90A-NEXT: v_accvgpr_read_b32 v3, a13341; GFX90A-NEXT: v_accvgpr_read_b32 v2, a03342; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off glc3343; GFX90A-NEXT: s_waitcnt vmcnt(0)3344; GFX90A-NEXT: buffer_wbinvl1_vol3345; GFX90A-NEXT: ;;#ASMSTART3346; GFX90A-NEXT: ; use v[0:1]3347; GFX90A-NEXT: ;;#ASMEND3348; GFX90A-NEXT: s_setpc_b64 s[30:31]3349;3350; GFX950-LABEL: global_atomic_xor_i64_ret_a_v:3351; GFX950: ; %bb.0:3352; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3353; GFX950-NEXT: ;;#ASMSTART3354; GFX950-NEXT: ; def a[0:1]3355; GFX950-NEXT: ;;#ASMEND3356; GFX950-NEXT: s_nop 03357; GFX950-NEXT: v_accvgpr_read_b32 v3, a13358; GFX950-NEXT: v_accvgpr_read_b32 v2, a03359; GFX950-NEXT: buffer_wbl2 sc13360; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off sc03361; GFX950-NEXT: s_waitcnt vmcnt(0)3362; GFX950-NEXT: buffer_inv sc13363; GFX950-NEXT: ;;#ASMSTART3364; GFX950-NEXT: ; use v[0:1]3365; GFX950-NEXT: ;;#ASMEND3366; GFX950-NEXT: s_setpc_b64 s[30:31]3367 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103368 %data = call i64 asm "; def $0", "=a"()3369 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03370 call void asm "; use $0", "v"(i64 %result)3371 ret void3372}3373 3374; Input is VGPR, result used as AGPR3375define void @global_atomic_xor_i64_ret_v_a(ptr addrspace(1) %ptr) #0 {3376; GFX90A-LABEL: global_atomic_xor_i64_ret_v_a:3377; GFX90A: ; %bb.0:3378; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3379; GFX90A-NEXT: ;;#ASMSTART3380; GFX90A-NEXT: ; def v[2:3]3381; GFX90A-NEXT: ;;#ASMEND3382; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off glc3383; GFX90A-NEXT: s_waitcnt vmcnt(0)3384; GFX90A-NEXT: buffer_wbinvl1_vol3385; GFX90A-NEXT: v_accvgpr_write_b32 a0, v03386; GFX90A-NEXT: v_accvgpr_write_b32 a1, v13387; GFX90A-NEXT: ;;#ASMSTART3388; GFX90A-NEXT: ; use a[0:1]3389; GFX90A-NEXT: ;;#ASMEND3390; GFX90A-NEXT: s_setpc_b64 s[30:31]3391;3392; GFX950-LABEL: global_atomic_xor_i64_ret_v_a:3393; GFX950: ; %bb.0:3394; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3395; GFX950-NEXT: ;;#ASMSTART3396; GFX950-NEXT: ; def v[2:3]3397; GFX950-NEXT: ;;#ASMEND3398; GFX950-NEXT: buffer_wbl2 sc13399; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off sc03400; GFX950-NEXT: s_waitcnt vmcnt(0)3401; GFX950-NEXT: buffer_inv sc13402; GFX950-NEXT: v_accvgpr_write_b32 a0, v03403; GFX950-NEXT: v_accvgpr_write_b32 a1, v13404; GFX950-NEXT: ;;#ASMSTART3405; GFX950-NEXT: ; use a[0:1]3406; GFX950-NEXT: ;;#ASMEND3407; GFX950-NEXT: s_setpc_b64 s[30:31]3408 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103409 %data = call i64 asm "; def $0", "=v"()3410 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03411 call void asm "; use $0", "a"(i64 %result)3412 ret void3413}3414 3415; Input is AV, result also used as AV3416define void @global_atomic_xor_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {3417; GFX90A-LABEL: global_atomic_xor_i64_ret_av_av:3418; GFX90A: ; %bb.0:3419; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3420; GFX90A-NEXT: ;;#ASMSTART3421; GFX90A-NEXT: ; def v[2:3]3422; GFX90A-NEXT: ;;#ASMEND3423; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off glc3424; GFX90A-NEXT: s_waitcnt vmcnt(0)3425; GFX90A-NEXT: buffer_wbinvl1_vol3426; GFX90A-NEXT: ;;#ASMSTART3427; GFX90A-NEXT: ; use v[0:1]3428; GFX90A-NEXT: ;;#ASMEND3429; GFX90A-NEXT: s_setpc_b64 s[30:31]3430;3431; GFX950-LABEL: global_atomic_xor_i64_ret_av_av:3432; GFX950: ; %bb.0:3433; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3434; GFX950-NEXT: ;;#ASMSTART3435; GFX950-NEXT: ; def v[2:3]3436; GFX950-NEXT: ;;#ASMEND3437; GFX950-NEXT: buffer_wbl2 sc13438; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off sc03439; GFX950-NEXT: s_waitcnt vmcnt(0)3440; GFX950-NEXT: buffer_inv sc13441; GFX950-NEXT: ;;#ASMSTART3442; GFX950-NEXT: ; use v[0:1]3443; GFX950-NEXT: ;;#ASMEND3444; GFX950-NEXT: s_setpc_b64 s[30:31]3445 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103446 %data = call i64 asm "; def $0", "=^VA"()3447 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03448 call void asm "; use $0", "^VA"(i64 %result)3449 ret void3450}3451 3452; Input is AV, used as v3453define void @global_atomic_xor_i64_ret_av_v(ptr addrspace(1) %ptr) #0 {3454; GFX90A-LABEL: global_atomic_xor_i64_ret_av_v:3455; GFX90A: ; %bb.0:3456; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3457; GFX90A-NEXT: ;;#ASMSTART3458; GFX90A-NEXT: ; def v[2:3]3459; GFX90A-NEXT: ;;#ASMEND3460; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off glc3461; GFX90A-NEXT: s_waitcnt vmcnt(0)3462; GFX90A-NEXT: buffer_wbinvl1_vol3463; GFX90A-NEXT: ;;#ASMSTART3464; GFX90A-NEXT: ; use v[0:1]3465; GFX90A-NEXT: ;;#ASMEND3466; GFX90A-NEXT: s_setpc_b64 s[30:31]3467;3468; GFX950-LABEL: global_atomic_xor_i64_ret_av_v:3469; GFX950: ; %bb.0:3470; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3471; GFX950-NEXT: ;;#ASMSTART3472; GFX950-NEXT: ; def v[2:3]3473; GFX950-NEXT: ;;#ASMEND3474; GFX950-NEXT: buffer_wbl2 sc13475; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off sc03476; GFX950-NEXT: s_waitcnt vmcnt(0)3477; GFX950-NEXT: buffer_inv sc13478; GFX950-NEXT: ;;#ASMSTART3479; GFX950-NEXT: ; use v[0:1]3480; GFX950-NEXT: ;;#ASMEND3481; GFX950-NEXT: s_setpc_b64 s[30:31]3482 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103483 %data = call i64 asm "; def $0", "=^VA"()3484 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03485 call void asm "; use $0", "v"(i64 %result)3486 ret void3487}3488 3489; Input is AV, used as a3490define void @global_atomic_xor_i64_ret_av_a(ptr addrspace(1) %ptr) #0 {3491; GFX90A-LABEL: global_atomic_xor_i64_ret_av_a:3492; GFX90A: ; %bb.0:3493; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3494; GFX90A-NEXT: ;;#ASMSTART3495; GFX90A-NEXT: ; def v[2:3]3496; GFX90A-NEXT: ;;#ASMEND3497; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off glc3498; GFX90A-NEXT: s_waitcnt vmcnt(0)3499; GFX90A-NEXT: buffer_wbinvl1_vol3500; GFX90A-NEXT: v_accvgpr_write_b32 a0, v03501; GFX90A-NEXT: v_accvgpr_write_b32 a1, v13502; GFX90A-NEXT: ;;#ASMSTART3503; GFX90A-NEXT: ; use a[0:1]3504; GFX90A-NEXT: ;;#ASMEND3505; GFX90A-NEXT: s_setpc_b64 s[30:31]3506;3507; GFX950-LABEL: global_atomic_xor_i64_ret_av_a:3508; GFX950: ; %bb.0:3509; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3510; GFX950-NEXT: ;;#ASMSTART3511; GFX950-NEXT: ; def v[2:3]3512; GFX950-NEXT: ;;#ASMEND3513; GFX950-NEXT: buffer_wbl2 sc13514; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off sc03515; GFX950-NEXT: s_waitcnt vmcnt(0)3516; GFX950-NEXT: buffer_inv sc13517; GFX950-NEXT: v_accvgpr_write_b32 a0, v03518; GFX950-NEXT: v_accvgpr_write_b32 a1, v13519; GFX950-NEXT: ;;#ASMSTART3520; GFX950-NEXT: ; use a[0:1]3521; GFX950-NEXT: ;;#ASMEND3522; GFX950-NEXT: s_setpc_b64 s[30:31]3523 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103524 %data = call i64 asm "; def $0", "=^VA"()3525 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03526 call void asm "; use $0", "a"(i64 %result)3527 ret void3528}3529 3530; Input is a, result used as AV3531define void @global_atomic_xor_i64_ret_a_av(ptr addrspace(1) %ptr) #0 {3532; GFX90A-LABEL: global_atomic_xor_i64_ret_a_av:3533; GFX90A: ; %bb.0:3534; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3535; GFX90A-NEXT: ;;#ASMSTART3536; GFX90A-NEXT: ; def a[0:1]3537; GFX90A-NEXT: ;;#ASMEND3538; GFX90A-NEXT: v_accvgpr_read_b32 v3, a13539; GFX90A-NEXT: v_accvgpr_read_b32 v2, a03540; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off glc3541; GFX90A-NEXT: s_waitcnt vmcnt(0)3542; GFX90A-NEXT: buffer_wbinvl1_vol3543; GFX90A-NEXT: ;;#ASMSTART3544; GFX90A-NEXT: ; use v[0:1]3545; GFX90A-NEXT: ;;#ASMEND3546; GFX90A-NEXT: s_setpc_b64 s[30:31]3547;3548; GFX950-LABEL: global_atomic_xor_i64_ret_a_av:3549; GFX950: ; %bb.0:3550; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3551; GFX950-NEXT: ;;#ASMSTART3552; GFX950-NEXT: ; def a[0:1]3553; GFX950-NEXT: ;;#ASMEND3554; GFX950-NEXT: s_nop 03555; GFX950-NEXT: v_accvgpr_read_b32 v3, a13556; GFX950-NEXT: v_accvgpr_read_b32 v2, a03557; GFX950-NEXT: buffer_wbl2 sc13558; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off sc03559; GFX950-NEXT: s_waitcnt vmcnt(0)3560; GFX950-NEXT: buffer_inv sc13561; GFX950-NEXT: ;;#ASMSTART3562; GFX950-NEXT: ; use v[0:1]3563; GFX950-NEXT: ;;#ASMEND3564; GFX950-NEXT: s_setpc_b64 s[30:31]3565 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103566 %data = call i64 asm "; def $0", "=a"()3567 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03568 call void asm "; use $0", "^VA"(i64 %result)3569 ret void3570}3571 3572; Input is v, result used as AV3573define void @global_atomic_xor_i64_ret_v_av(ptr addrspace(1) %ptr) #0 {3574; GFX90A-LABEL: global_atomic_xor_i64_ret_v_av:3575; GFX90A: ; %bb.0:3576; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3577; GFX90A-NEXT: ;;#ASMSTART3578; GFX90A-NEXT: ; def v[2:3]3579; GFX90A-NEXT: ;;#ASMEND3580; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off glc3581; GFX90A-NEXT: s_waitcnt vmcnt(0)3582; GFX90A-NEXT: buffer_wbinvl1_vol3583; GFX90A-NEXT: ;;#ASMSTART3584; GFX90A-NEXT: ; use v[0:1]3585; GFX90A-NEXT: ;;#ASMEND3586; GFX90A-NEXT: s_setpc_b64 s[30:31]3587;3588; GFX950-LABEL: global_atomic_xor_i64_ret_v_av:3589; GFX950: ; %bb.0:3590; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3591; GFX950-NEXT: ;;#ASMSTART3592; GFX950-NEXT: ; def v[2:3]3593; GFX950-NEXT: ;;#ASMEND3594; GFX950-NEXT: buffer_wbl2 sc13595; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[0:1], v[2:3], off sc03596; GFX950-NEXT: s_waitcnt vmcnt(0)3597; GFX950-NEXT: buffer_inv sc13598; GFX950-NEXT: ;;#ASMSTART3599; GFX950-NEXT: ; use v[0:1]3600; GFX950-NEXT: ;;#ASMEND3601; GFX950-NEXT: s_setpc_b64 s[30:31]3602 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103603 %data = call i64 asm "; def $0", "=v"()3604 %result = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03605 call void asm "; use $0", "^VA"(i64 %result)3606 ret void3607}3608 3609define void @global_atomic_xor_i64_noret_a(ptr addrspace(1) %ptr) #0 {3610; GFX90A-LABEL: global_atomic_xor_i64_noret_a:3611; GFX90A: ; %bb.0:3612; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3613; GFX90A-NEXT: ;;#ASMSTART3614; GFX90A-NEXT: ; def a[0:1]3615; GFX90A-NEXT: ;;#ASMEND3616; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], a[0:1], off3617; GFX90A-NEXT: s_waitcnt vmcnt(0)3618; GFX90A-NEXT: buffer_wbinvl1_vol3619; GFX90A-NEXT: s_setpc_b64 s[30:31]3620;3621; GFX950-LABEL: global_atomic_xor_i64_noret_a:3622; GFX950: ; %bb.0:3623; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3624; GFX950-NEXT: ;;#ASMSTART3625; GFX950-NEXT: ; def a[0:1]3626; GFX950-NEXT: ;;#ASMEND3627; GFX950-NEXT: buffer_wbl2 sc13628; GFX950-NEXT: global_atomic_xor_x2 v[0:1], a[0:1], off3629; GFX950-NEXT: s_waitcnt vmcnt(0)3630; GFX950-NEXT: buffer_inv sc13631; GFX950-NEXT: s_setpc_b64 s[30:31]3632 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103633 %data = call i64 asm "; def $0", "=a"()3634 %unused = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03635 ret void3636}3637 3638define void @global_atomic_xor_i64_noret_av(ptr addrspace(1) %ptr) #0 {3639; GFX90A-LABEL: global_atomic_xor_i64_noret_av:3640; GFX90A: ; %bb.0:3641; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3642; GFX90A-NEXT: ;;#ASMSTART3643; GFX90A-NEXT: ; def v[2:3]3644; GFX90A-NEXT: ;;#ASMEND3645; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v[2:3], off3646; GFX90A-NEXT: s_waitcnt vmcnt(0)3647; GFX90A-NEXT: buffer_wbinvl1_vol3648; GFX90A-NEXT: s_setpc_b64 s[30:31]3649;3650; GFX950-LABEL: global_atomic_xor_i64_noret_av:3651; GFX950: ; %bb.0:3652; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3653; GFX950-NEXT: ;;#ASMSTART3654; GFX950-NEXT: ; def v[2:3]3655; GFX950-NEXT: ;;#ASMEND3656; GFX950-NEXT: buffer_wbl2 sc13657; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v[2:3], off3658; GFX950-NEXT: s_waitcnt vmcnt(0)3659; GFX950-NEXT: buffer_inv sc13660; GFX950-NEXT: s_setpc_b64 s[30:31]3661 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 103662 %data = call i64 asm "; def $0", "=^VA"()3663 %unused = atomicrmw xor ptr addrspace(1) %ptr, i64 %data syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !03664 ret void3665}3666 3667;---------------------------------------------------------------------3668; other atomics i32, with aa+av cases3669;---------------------------------------------------------------------3670 3671define void @global_atomic_add_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {3672; GFX90A-LABEL: global_atomic_add_i32_ret_a_a:3673; GFX90A: ; %bb.0:3674; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3675; GFX90A-NEXT: ;;#ASMSTART3676; GFX90A-NEXT: ; def a03677; GFX90A-NEXT: ;;#ASMEND3678; GFX90A-NEXT: v_accvgpr_read_b32 v2, a03679; GFX90A-NEXT: global_atomic_add v0, v[0:1], v2, off offset:40 glc3680; GFX90A-NEXT: s_waitcnt vmcnt(0)3681; GFX90A-NEXT: v_accvgpr_write_b32 a0, v03682; GFX90A-NEXT: ;;#ASMSTART3683; GFX90A-NEXT: ; use a03684; GFX90A-NEXT: ;;#ASMEND3685; GFX90A-NEXT: s_setpc_b64 s[30:31]3686;3687; GFX950-LABEL: global_atomic_add_i32_ret_a_a:3688; GFX950: ; %bb.0:3689; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3690; GFX950-NEXT: ;;#ASMSTART3691; GFX950-NEXT: ; def a03692; GFX950-NEXT: ;;#ASMEND3693; GFX950-NEXT: s_nop 03694; GFX950-NEXT: v_accvgpr_read_b32 v2, a03695; GFX950-NEXT: global_atomic_add v0, v[0:1], v2, off offset:40 sc03696; GFX950-NEXT: s_waitcnt vmcnt(0)3697; GFX950-NEXT: v_accvgpr_write_b32 a0, v03698; GFX950-NEXT: ;;#ASMSTART3699; GFX950-NEXT: ; use a03700; GFX950-NEXT: ;;#ASMEND3701; GFX950-NEXT: s_setpc_b64 s[30:31]3702 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103703 %data = call i32 asm "; def $0", "=a"()3704 %result = atomicrmw add ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03705 call void asm "; use $0", "a"(i32 %result)3706 ret void3707}3708 3709define void @global_atomic_add_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {3710; GFX90A-LABEL: global_atomic_add_i32_ret_av_av:3711; GFX90A: ; %bb.0:3712; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3713; GFX90A-NEXT: ;;#ASMSTART3714; GFX90A-NEXT: ; def v23715; GFX90A-NEXT: ;;#ASMEND3716; GFX90A-NEXT: global_atomic_add v0, v[0:1], v2, off offset:40 glc3717; GFX90A-NEXT: s_waitcnt vmcnt(0)3718; GFX90A-NEXT: ;;#ASMSTART3719; GFX90A-NEXT: ; use v03720; GFX90A-NEXT: ;;#ASMEND3721; GFX90A-NEXT: s_setpc_b64 s[30:31]3722;3723; GFX950-LABEL: global_atomic_add_i32_ret_av_av:3724; GFX950: ; %bb.0:3725; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3726; GFX950-NEXT: ;;#ASMSTART3727; GFX950-NEXT: ; def v23728; GFX950-NEXT: ;;#ASMEND3729; GFX950-NEXT: global_atomic_add v0, v[0:1], v2, off offset:40 sc03730; GFX950-NEXT: s_waitcnt vmcnt(0)3731; GFX950-NEXT: ;;#ASMSTART3732; GFX950-NEXT: ; use v03733; GFX950-NEXT: ;;#ASMEND3734; GFX950-NEXT: s_setpc_b64 s[30:31]3735 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103736 %data = call i32 asm "; def $0", "=^VA"()3737 %result = atomicrmw add ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03738 call void asm "; use $0", "^VA"(i32 %result)3739 ret void3740}3741 3742define void @global_atomic_sub_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {3743; GFX90A-LABEL: global_atomic_sub_i32_ret_a_a:3744; GFX90A: ; %bb.0:3745; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3746; GFX90A-NEXT: ;;#ASMSTART3747; GFX90A-NEXT: ; def a03748; GFX90A-NEXT: ;;#ASMEND3749; GFX90A-NEXT: v_accvgpr_read_b32 v2, a03750; GFX90A-NEXT: global_atomic_sub v0, v[0:1], v2, off offset:40 glc3751; GFX90A-NEXT: s_waitcnt vmcnt(0)3752; GFX90A-NEXT: v_accvgpr_write_b32 a0, v03753; GFX90A-NEXT: ;;#ASMSTART3754; GFX90A-NEXT: ; use a03755; GFX90A-NEXT: ;;#ASMEND3756; GFX90A-NEXT: s_setpc_b64 s[30:31]3757;3758; GFX950-LABEL: global_atomic_sub_i32_ret_a_a:3759; GFX950: ; %bb.0:3760; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3761; GFX950-NEXT: ;;#ASMSTART3762; GFX950-NEXT: ; def a03763; GFX950-NEXT: ;;#ASMEND3764; GFX950-NEXT: s_nop 03765; GFX950-NEXT: v_accvgpr_read_b32 v2, a03766; GFX950-NEXT: global_atomic_sub v0, v[0:1], v2, off offset:40 sc03767; GFX950-NEXT: s_waitcnt vmcnt(0)3768; GFX950-NEXT: v_accvgpr_write_b32 a0, v03769; GFX950-NEXT: ;;#ASMSTART3770; GFX950-NEXT: ; use a03771; GFX950-NEXT: ;;#ASMEND3772; GFX950-NEXT: s_setpc_b64 s[30:31]3773 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103774 %data = call i32 asm "; def $0", "=a"()3775 %result = atomicrmw sub ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03776 call void asm "; use $0", "a"(i32 %result)3777 ret void3778}3779 3780define void @global_atomic_sub_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {3781; GFX90A-LABEL: global_atomic_sub_i32_ret_av_av:3782; GFX90A: ; %bb.0:3783; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3784; GFX90A-NEXT: ;;#ASMSTART3785; GFX90A-NEXT: ; def v23786; GFX90A-NEXT: ;;#ASMEND3787; GFX90A-NEXT: global_atomic_sub v0, v[0:1], v2, off offset:40 glc3788; GFX90A-NEXT: s_waitcnt vmcnt(0)3789; GFX90A-NEXT: ;;#ASMSTART3790; GFX90A-NEXT: ; use v03791; GFX90A-NEXT: ;;#ASMEND3792; GFX90A-NEXT: s_setpc_b64 s[30:31]3793;3794; GFX950-LABEL: global_atomic_sub_i32_ret_av_av:3795; GFX950: ; %bb.0:3796; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3797; GFX950-NEXT: ;;#ASMSTART3798; GFX950-NEXT: ; def v23799; GFX950-NEXT: ;;#ASMEND3800; GFX950-NEXT: global_atomic_sub v0, v[0:1], v2, off offset:40 sc03801; GFX950-NEXT: s_waitcnt vmcnt(0)3802; GFX950-NEXT: ;;#ASMSTART3803; GFX950-NEXT: ; use v03804; GFX950-NEXT: ;;#ASMEND3805; GFX950-NEXT: s_setpc_b64 s[30:31]3806 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103807 %data = call i32 asm "; def $0", "=^VA"()3808 %result = atomicrmw sub ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03809 call void asm "; use $0", "^VA"(i32 %result)3810 ret void3811}3812 3813define void @global_atomic_and_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {3814; GFX90A-LABEL: global_atomic_and_i32_ret_a_a:3815; GFX90A: ; %bb.0:3816; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3817; GFX90A-NEXT: ;;#ASMSTART3818; GFX90A-NEXT: ; def a03819; GFX90A-NEXT: ;;#ASMEND3820; GFX90A-NEXT: v_accvgpr_read_b32 v2, a03821; GFX90A-NEXT: global_atomic_and v0, v[0:1], v2, off offset:40 glc3822; GFX90A-NEXT: s_waitcnt vmcnt(0)3823; GFX90A-NEXT: v_accvgpr_write_b32 a0, v03824; GFX90A-NEXT: ;;#ASMSTART3825; GFX90A-NEXT: ; use a03826; GFX90A-NEXT: ;;#ASMEND3827; GFX90A-NEXT: s_setpc_b64 s[30:31]3828;3829; GFX950-LABEL: global_atomic_and_i32_ret_a_a:3830; GFX950: ; %bb.0:3831; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3832; GFX950-NEXT: ;;#ASMSTART3833; GFX950-NEXT: ; def a03834; GFX950-NEXT: ;;#ASMEND3835; GFX950-NEXT: s_nop 03836; GFX950-NEXT: v_accvgpr_read_b32 v2, a03837; GFX950-NEXT: global_atomic_and v0, v[0:1], v2, off offset:40 sc03838; GFX950-NEXT: s_waitcnt vmcnt(0)3839; GFX950-NEXT: v_accvgpr_write_b32 a0, v03840; GFX950-NEXT: ;;#ASMSTART3841; GFX950-NEXT: ; use a03842; GFX950-NEXT: ;;#ASMEND3843; GFX950-NEXT: s_setpc_b64 s[30:31]3844 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103845 %data = call i32 asm "; def $0", "=a"()3846 %result = atomicrmw and ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03847 call void asm "; use $0", "a"(i32 %result)3848 ret void3849}3850 3851define void @global_atomic_and_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {3852; GFX90A-LABEL: global_atomic_and_i32_ret_av_av:3853; GFX90A: ; %bb.0:3854; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3855; GFX90A-NEXT: ;;#ASMSTART3856; GFX90A-NEXT: ; def v23857; GFX90A-NEXT: ;;#ASMEND3858; GFX90A-NEXT: global_atomic_and v0, v[0:1], v2, off offset:40 glc3859; GFX90A-NEXT: s_waitcnt vmcnt(0)3860; GFX90A-NEXT: ;;#ASMSTART3861; GFX90A-NEXT: ; use v03862; GFX90A-NEXT: ;;#ASMEND3863; GFX90A-NEXT: s_setpc_b64 s[30:31]3864;3865; GFX950-LABEL: global_atomic_and_i32_ret_av_av:3866; GFX950: ; %bb.0:3867; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3868; GFX950-NEXT: ;;#ASMSTART3869; GFX950-NEXT: ; def v23870; GFX950-NEXT: ;;#ASMEND3871; GFX950-NEXT: global_atomic_and v0, v[0:1], v2, off offset:40 sc03872; GFX950-NEXT: s_waitcnt vmcnt(0)3873; GFX950-NEXT: ;;#ASMSTART3874; GFX950-NEXT: ; use v03875; GFX950-NEXT: ;;#ASMEND3876; GFX950-NEXT: s_setpc_b64 s[30:31]3877 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103878 %data = call i32 asm "; def $0", "=^VA"()3879 %result = atomicrmw and ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03880 call void asm "; use $0", "^VA"(i32 %result)3881 ret void3882}3883 3884define void @global_atomic_nand_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {3885; GFX90A-LABEL: global_atomic_nand_i32_ret_a_a:3886; GFX90A: ; %bb.0:3887; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3888; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:403889; GFX90A-NEXT: ;;#ASMSTART3890; GFX90A-NEXT: ; def a03891; GFX90A-NEXT: ;;#ASMEND3892; GFX90A-NEXT: v_accvgpr_read_b32 v4, a03893; GFX90A-NEXT: s_mov_b64 s[4:5], 03894; GFX90A-NEXT: .LBB69_1: ; %atomicrmw.start3895; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=13896; GFX90A-NEXT: s_waitcnt vmcnt(0)3897; GFX90A-NEXT: v_and_b32_e32 v2, v3, v43898; GFX90A-NEXT: v_not_b32_e32 v2, v23899; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc3900; GFX90A-NEXT: s_waitcnt vmcnt(0)3901; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v33902; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]3903; GFX90A-NEXT: v_mov_b32_e32 v3, v23904; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]3905; GFX90A-NEXT: s_cbranch_execnz .LBB69_13906; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end3907; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]3908; GFX90A-NEXT: v_accvgpr_write_b32 a0, v23909; GFX90A-NEXT: ;;#ASMSTART3910; GFX90A-NEXT: ; use a03911; GFX90A-NEXT: ;;#ASMEND3912; GFX90A-NEXT: s_setpc_b64 s[30:31]3913;3914; GFX950-LABEL: global_atomic_nand_i32_ret_a_a:3915; GFX950: ; %bb.0:3916; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3917; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:403918; GFX950-NEXT: ;;#ASMSTART3919; GFX950-NEXT: ; def a03920; GFX950-NEXT: ;;#ASMEND3921; GFX950-NEXT: s_mov_b64 s[0:1], 03922; GFX950-NEXT: v_accvgpr_read_b32 v4, a03923; GFX950-NEXT: .LBB69_1: ; %atomicrmw.start3924; GFX950-NEXT: ; =>This Inner Loop Header: Depth=13925; GFX950-NEXT: s_waitcnt vmcnt(0)3926; GFX950-NEXT: v_bitop3_b32 v2, v3, v4, v3 bitop3:0x3f3927; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc03928; GFX950-NEXT: s_waitcnt vmcnt(0)3929; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v33930; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]3931; GFX950-NEXT: v_mov_b32_e32 v3, v23932; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]3933; GFX950-NEXT: s_cbranch_execnz .LBB69_13934; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end3935; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]3936; GFX950-NEXT: v_accvgpr_write_b32 a0, v23937; GFX950-NEXT: ;;#ASMSTART3938; GFX950-NEXT: ; use a03939; GFX950-NEXT: ;;#ASMEND3940; GFX950-NEXT: s_setpc_b64 s[30:31]3941 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 103942 %data = call i32 asm "; def $0", "=a"()3943 %result = atomicrmw nand ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !03944 call void asm "; use $0", "a"(i32 %result)3945 ret void3946}3947 3948define void @global_atomic_nand_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {3949; GFX90A-LABEL: global_atomic_nand_i32_ret_av_av:3950; GFX90A: ; %bb.0:3951; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3952; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:403953; GFX90A-NEXT: s_mov_b64 s[4:5], 03954; GFX90A-NEXT: ;;#ASMSTART3955; GFX90A-NEXT: ; def v43956; GFX90A-NEXT: ;;#ASMEND3957; GFX90A-NEXT: .LBB70_1: ; %atomicrmw.start3958; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=13959; GFX90A-NEXT: s_waitcnt vmcnt(0)3960; GFX90A-NEXT: v_and_b32_e32 v2, v3, v43961; GFX90A-NEXT: v_not_b32_e32 v2, v23962; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc3963; GFX90A-NEXT: s_waitcnt vmcnt(0)3964; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v33965; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]3966; GFX90A-NEXT: v_mov_b32_e32 v3, v23967; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]3968; GFX90A-NEXT: s_cbranch_execnz .LBB70_13969; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end3970; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]3971; GFX90A-NEXT: ;;#ASMSTART3972; GFX90A-NEXT: ; use v23973; GFX90A-NEXT: ;;#ASMEND3974; GFX90A-NEXT: s_setpc_b64 s[30:31]3975;3976; GFX950-LABEL: global_atomic_nand_i32_ret_av_av:3977; GFX950: ; %bb.0:3978; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3979; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:403980; GFX950-NEXT: s_mov_b64 s[0:1], 03981; GFX950-NEXT: ;;#ASMSTART3982; GFX950-NEXT: ; def v43983; GFX950-NEXT: ;;#ASMEND3984; GFX950-NEXT: .LBB70_1: ; %atomicrmw.start3985; GFX950-NEXT: ; =>This Inner Loop Header: Depth=13986; GFX950-NEXT: s_waitcnt vmcnt(0)3987; GFX950-NEXT: v_bitop3_b32 v2, v3, v4, v3 bitop3:0x3f3988; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc03989; GFX950-NEXT: s_waitcnt vmcnt(0)3990; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v33991; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]3992; GFX950-NEXT: v_mov_b32_e32 v3, v23993; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]3994; GFX950-NEXT: s_cbranch_execnz .LBB70_13995; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end3996; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]3997; GFX950-NEXT: ;;#ASMSTART3998; GFX950-NEXT: ; use v23999; GFX950-NEXT: ;;#ASMEND4000; GFX950-NEXT: s_setpc_b64 s[30:31]4001 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104002 %data = call i32 asm "; def $0", "=^VA"()4003 %result = atomicrmw nand ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04004 call void asm "; use $0", "^VA"(i32 %result)4005 ret void4006}4007 4008define void @global_atomic_or_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4009; GFX90A-LABEL: global_atomic_or_i32_ret_a_a:4010; GFX90A: ; %bb.0:4011; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4012; GFX90A-NEXT: ;;#ASMSTART4013; GFX90A-NEXT: ; def a04014; GFX90A-NEXT: ;;#ASMEND4015; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04016; GFX90A-NEXT: global_atomic_or v0, v[0:1], v2, off offset:40 glc4017; GFX90A-NEXT: s_waitcnt vmcnt(0)4018; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04019; GFX90A-NEXT: ;;#ASMSTART4020; GFX90A-NEXT: ; use a04021; GFX90A-NEXT: ;;#ASMEND4022; GFX90A-NEXT: s_setpc_b64 s[30:31]4023;4024; GFX950-LABEL: global_atomic_or_i32_ret_a_a:4025; GFX950: ; %bb.0:4026; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4027; GFX950-NEXT: ;;#ASMSTART4028; GFX950-NEXT: ; def a04029; GFX950-NEXT: ;;#ASMEND4030; GFX950-NEXT: s_nop 04031; GFX950-NEXT: v_accvgpr_read_b32 v2, a04032; GFX950-NEXT: global_atomic_or v0, v[0:1], v2, off offset:40 sc04033; GFX950-NEXT: s_waitcnt vmcnt(0)4034; GFX950-NEXT: v_accvgpr_write_b32 a0, v04035; GFX950-NEXT: ;;#ASMSTART4036; GFX950-NEXT: ; use a04037; GFX950-NEXT: ;;#ASMEND4038; GFX950-NEXT: s_setpc_b64 s[30:31]4039 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104040 %data = call i32 asm "; def $0", "=a"()4041 %result = atomicrmw or ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04042 call void asm "; use $0", "a"(i32 %result)4043 ret void4044}4045 4046define void @global_atomic_or_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4047; GFX90A-LABEL: global_atomic_or_i32_ret_av_av:4048; GFX90A: ; %bb.0:4049; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4050; GFX90A-NEXT: ;;#ASMSTART4051; GFX90A-NEXT: ; def v24052; GFX90A-NEXT: ;;#ASMEND4053; GFX90A-NEXT: global_atomic_or v0, v[0:1], v2, off offset:40 glc4054; GFX90A-NEXT: s_waitcnt vmcnt(0)4055; GFX90A-NEXT: ;;#ASMSTART4056; GFX90A-NEXT: ; use v04057; GFX90A-NEXT: ;;#ASMEND4058; GFX90A-NEXT: s_setpc_b64 s[30:31]4059;4060; GFX950-LABEL: global_atomic_or_i32_ret_av_av:4061; GFX950: ; %bb.0:4062; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4063; GFX950-NEXT: ;;#ASMSTART4064; GFX950-NEXT: ; def v24065; GFX950-NEXT: ;;#ASMEND4066; GFX950-NEXT: global_atomic_or v0, v[0:1], v2, off offset:40 sc04067; GFX950-NEXT: s_waitcnt vmcnt(0)4068; GFX950-NEXT: ;;#ASMSTART4069; GFX950-NEXT: ; use v04070; GFX950-NEXT: ;;#ASMEND4071; GFX950-NEXT: s_setpc_b64 s[30:31]4072 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104073 %data = call i32 asm "; def $0", "=^VA"()4074 %result = atomicrmw or ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04075 call void asm "; use $0", "^VA"(i32 %result)4076 ret void4077}4078 4079define void @global_atomic_max_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4080; GFX90A-LABEL: global_atomic_max_i32_ret_a_a:4081; GFX90A: ; %bb.0:4082; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4083; GFX90A-NEXT: ;;#ASMSTART4084; GFX90A-NEXT: ; def a04085; GFX90A-NEXT: ;;#ASMEND4086; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04087; GFX90A-NEXT: global_atomic_smax v0, v[0:1], v2, off offset:40 glc4088; GFX90A-NEXT: s_waitcnt vmcnt(0)4089; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04090; GFX90A-NEXT: ;;#ASMSTART4091; GFX90A-NEXT: ; use a04092; GFX90A-NEXT: ;;#ASMEND4093; GFX90A-NEXT: s_setpc_b64 s[30:31]4094;4095; GFX950-LABEL: global_atomic_max_i32_ret_a_a:4096; GFX950: ; %bb.0:4097; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4098; GFX950-NEXT: ;;#ASMSTART4099; GFX950-NEXT: ; def a04100; GFX950-NEXT: ;;#ASMEND4101; GFX950-NEXT: s_nop 04102; GFX950-NEXT: v_accvgpr_read_b32 v2, a04103; GFX950-NEXT: global_atomic_smax v0, v[0:1], v2, off offset:40 sc04104; GFX950-NEXT: s_waitcnt vmcnt(0)4105; GFX950-NEXT: v_accvgpr_write_b32 a0, v04106; GFX950-NEXT: ;;#ASMSTART4107; GFX950-NEXT: ; use a04108; GFX950-NEXT: ;;#ASMEND4109; GFX950-NEXT: s_setpc_b64 s[30:31]4110 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104111 %data = call i32 asm "; def $0", "=a"()4112 %result = atomicrmw max ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04113 call void asm "; use $0", "a"(i32 %result)4114 ret void4115}4116 4117define void @global_atomic_max_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4118; GFX90A-LABEL: global_atomic_max_i32_ret_av_av:4119; GFX90A: ; %bb.0:4120; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4121; GFX90A-NEXT: ;;#ASMSTART4122; GFX90A-NEXT: ; def v24123; GFX90A-NEXT: ;;#ASMEND4124; GFX90A-NEXT: global_atomic_smax v0, v[0:1], v2, off offset:40 glc4125; GFX90A-NEXT: s_waitcnt vmcnt(0)4126; GFX90A-NEXT: ;;#ASMSTART4127; GFX90A-NEXT: ; use v04128; GFX90A-NEXT: ;;#ASMEND4129; GFX90A-NEXT: s_setpc_b64 s[30:31]4130;4131; GFX950-LABEL: global_atomic_max_i32_ret_av_av:4132; GFX950: ; %bb.0:4133; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4134; GFX950-NEXT: ;;#ASMSTART4135; GFX950-NEXT: ; def v24136; GFX950-NEXT: ;;#ASMEND4137; GFX950-NEXT: global_atomic_smax v0, v[0:1], v2, off offset:40 sc04138; GFX950-NEXT: s_waitcnt vmcnt(0)4139; GFX950-NEXT: ;;#ASMSTART4140; GFX950-NEXT: ; use v04141; GFX950-NEXT: ;;#ASMEND4142; GFX950-NEXT: s_setpc_b64 s[30:31]4143 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104144 %data = call i32 asm "; def $0", "=^VA"()4145 %result = atomicrmw max ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04146 call void asm "; use $0", "^VA"(i32 %result)4147 ret void4148}4149 4150define void @global_atomic_min_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4151; GFX90A-LABEL: global_atomic_min_i32_ret_a_a:4152; GFX90A: ; %bb.0:4153; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4154; GFX90A-NEXT: ;;#ASMSTART4155; GFX90A-NEXT: ; def a04156; GFX90A-NEXT: ;;#ASMEND4157; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04158; GFX90A-NEXT: global_atomic_smin v0, v[0:1], v2, off offset:40 glc4159; GFX90A-NEXT: s_waitcnt vmcnt(0)4160; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04161; GFX90A-NEXT: ;;#ASMSTART4162; GFX90A-NEXT: ; use a04163; GFX90A-NEXT: ;;#ASMEND4164; GFX90A-NEXT: s_setpc_b64 s[30:31]4165;4166; GFX950-LABEL: global_atomic_min_i32_ret_a_a:4167; GFX950: ; %bb.0:4168; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4169; GFX950-NEXT: ;;#ASMSTART4170; GFX950-NEXT: ; def a04171; GFX950-NEXT: ;;#ASMEND4172; GFX950-NEXT: s_nop 04173; GFX950-NEXT: v_accvgpr_read_b32 v2, a04174; GFX950-NEXT: global_atomic_smin v0, v[0:1], v2, off offset:40 sc04175; GFX950-NEXT: s_waitcnt vmcnt(0)4176; GFX950-NEXT: v_accvgpr_write_b32 a0, v04177; GFX950-NEXT: ;;#ASMSTART4178; GFX950-NEXT: ; use a04179; GFX950-NEXT: ;;#ASMEND4180; GFX950-NEXT: s_setpc_b64 s[30:31]4181 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104182 %data = call i32 asm "; def $0", "=a"()4183 %result = atomicrmw min ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04184 call void asm "; use $0", "a"(i32 %result)4185 ret void4186}4187 4188define void @global_atomic_min_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4189; GFX90A-LABEL: global_atomic_min_i32_ret_av_av:4190; GFX90A: ; %bb.0:4191; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4192; GFX90A-NEXT: ;;#ASMSTART4193; GFX90A-NEXT: ; def v24194; GFX90A-NEXT: ;;#ASMEND4195; GFX90A-NEXT: global_atomic_smin v0, v[0:1], v2, off offset:40 glc4196; GFX90A-NEXT: s_waitcnt vmcnt(0)4197; GFX90A-NEXT: ;;#ASMSTART4198; GFX90A-NEXT: ; use v04199; GFX90A-NEXT: ;;#ASMEND4200; GFX90A-NEXT: s_setpc_b64 s[30:31]4201;4202; GFX950-LABEL: global_atomic_min_i32_ret_av_av:4203; GFX950: ; %bb.0:4204; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4205; GFX950-NEXT: ;;#ASMSTART4206; GFX950-NEXT: ; def v24207; GFX950-NEXT: ;;#ASMEND4208; GFX950-NEXT: global_atomic_smin v0, v[0:1], v2, off offset:40 sc04209; GFX950-NEXT: s_waitcnt vmcnt(0)4210; GFX950-NEXT: ;;#ASMSTART4211; GFX950-NEXT: ; use v04212; GFX950-NEXT: ;;#ASMEND4213; GFX950-NEXT: s_setpc_b64 s[30:31]4214 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104215 %data = call i32 asm "; def $0", "=^VA"()4216 %result = atomicrmw min ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04217 call void asm "; use $0", "^VA"(i32 %result)4218 ret void4219}4220 4221define void @global_atomic_umax_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4222; GFX90A-LABEL: global_atomic_umax_i32_ret_a_a:4223; GFX90A: ; %bb.0:4224; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4225; GFX90A-NEXT: ;;#ASMSTART4226; GFX90A-NEXT: ; def a04227; GFX90A-NEXT: ;;#ASMEND4228; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04229; GFX90A-NEXT: global_atomic_umax v0, v[0:1], v2, off offset:40 glc4230; GFX90A-NEXT: s_waitcnt vmcnt(0)4231; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04232; GFX90A-NEXT: ;;#ASMSTART4233; GFX90A-NEXT: ; use a04234; GFX90A-NEXT: ;;#ASMEND4235; GFX90A-NEXT: s_setpc_b64 s[30:31]4236;4237; GFX950-LABEL: global_atomic_umax_i32_ret_a_a:4238; GFX950: ; %bb.0:4239; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4240; GFX950-NEXT: ;;#ASMSTART4241; GFX950-NEXT: ; def a04242; GFX950-NEXT: ;;#ASMEND4243; GFX950-NEXT: s_nop 04244; GFX950-NEXT: v_accvgpr_read_b32 v2, a04245; GFX950-NEXT: global_atomic_umax v0, v[0:1], v2, off offset:40 sc04246; GFX950-NEXT: s_waitcnt vmcnt(0)4247; GFX950-NEXT: v_accvgpr_write_b32 a0, v04248; GFX950-NEXT: ;;#ASMSTART4249; GFX950-NEXT: ; use a04250; GFX950-NEXT: ;;#ASMEND4251; GFX950-NEXT: s_setpc_b64 s[30:31]4252 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104253 %data = call i32 asm "; def $0", "=a"()4254 %result = atomicrmw umax ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04255 call void asm "; use $0", "a"(i32 %result)4256 ret void4257}4258 4259define void @global_atomic_umax_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4260; GFX90A-LABEL: global_atomic_umax_i32_ret_av_av:4261; GFX90A: ; %bb.0:4262; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4263; GFX90A-NEXT: ;;#ASMSTART4264; GFX90A-NEXT: ; def v24265; GFX90A-NEXT: ;;#ASMEND4266; GFX90A-NEXT: global_atomic_umax v0, v[0:1], v2, off offset:40 glc4267; GFX90A-NEXT: s_waitcnt vmcnt(0)4268; GFX90A-NEXT: ;;#ASMSTART4269; GFX90A-NEXT: ; use v04270; GFX90A-NEXT: ;;#ASMEND4271; GFX90A-NEXT: s_setpc_b64 s[30:31]4272;4273; GFX950-LABEL: global_atomic_umax_i32_ret_av_av:4274; GFX950: ; %bb.0:4275; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4276; GFX950-NEXT: ;;#ASMSTART4277; GFX950-NEXT: ; def v24278; GFX950-NEXT: ;;#ASMEND4279; GFX950-NEXT: global_atomic_umax v0, v[0:1], v2, off offset:40 sc04280; GFX950-NEXT: s_waitcnt vmcnt(0)4281; GFX950-NEXT: ;;#ASMSTART4282; GFX950-NEXT: ; use v04283; GFX950-NEXT: ;;#ASMEND4284; GFX950-NEXT: s_setpc_b64 s[30:31]4285 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104286 %data = call i32 asm "; def $0", "=^VA"()4287 %result = atomicrmw umax ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04288 call void asm "; use $0", "^VA"(i32 %result)4289 ret void4290}4291 4292define void @global_atomic_umin_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4293; GFX90A-LABEL: global_atomic_umin_i32_ret_a_a:4294; GFX90A: ; %bb.0:4295; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4296; GFX90A-NEXT: ;;#ASMSTART4297; GFX90A-NEXT: ; def a04298; GFX90A-NEXT: ;;#ASMEND4299; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04300; GFX90A-NEXT: global_atomic_umin v0, v[0:1], v2, off offset:40 glc4301; GFX90A-NEXT: s_waitcnt vmcnt(0)4302; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04303; GFX90A-NEXT: ;;#ASMSTART4304; GFX90A-NEXT: ; use a04305; GFX90A-NEXT: ;;#ASMEND4306; GFX90A-NEXT: s_setpc_b64 s[30:31]4307;4308; GFX950-LABEL: global_atomic_umin_i32_ret_a_a:4309; GFX950: ; %bb.0:4310; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4311; GFX950-NEXT: ;;#ASMSTART4312; GFX950-NEXT: ; def a04313; GFX950-NEXT: ;;#ASMEND4314; GFX950-NEXT: s_nop 04315; GFX950-NEXT: v_accvgpr_read_b32 v2, a04316; GFX950-NEXT: global_atomic_umin v0, v[0:1], v2, off offset:40 sc04317; GFX950-NEXT: s_waitcnt vmcnt(0)4318; GFX950-NEXT: v_accvgpr_write_b32 a0, v04319; GFX950-NEXT: ;;#ASMSTART4320; GFX950-NEXT: ; use a04321; GFX950-NEXT: ;;#ASMEND4322; GFX950-NEXT: s_setpc_b64 s[30:31]4323 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104324 %data = call i32 asm "; def $0", "=a"()4325 %result = atomicrmw umin ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04326 call void asm "; use $0", "a"(i32 %result)4327 ret void4328}4329 4330define void @global_atomic_umin_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4331; GFX90A-LABEL: global_atomic_umin_i32_ret_av_av:4332; GFX90A: ; %bb.0:4333; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4334; GFX90A-NEXT: ;;#ASMSTART4335; GFX90A-NEXT: ; def v24336; GFX90A-NEXT: ;;#ASMEND4337; GFX90A-NEXT: global_atomic_umin v0, v[0:1], v2, off offset:40 glc4338; GFX90A-NEXT: s_waitcnt vmcnt(0)4339; GFX90A-NEXT: ;;#ASMSTART4340; GFX90A-NEXT: ; use v04341; GFX90A-NEXT: ;;#ASMEND4342; GFX90A-NEXT: s_setpc_b64 s[30:31]4343;4344; GFX950-LABEL: global_atomic_umin_i32_ret_av_av:4345; GFX950: ; %bb.0:4346; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4347; GFX950-NEXT: ;;#ASMSTART4348; GFX950-NEXT: ; def v24349; GFX950-NEXT: ;;#ASMEND4350; GFX950-NEXT: global_atomic_umin v0, v[0:1], v2, off offset:40 sc04351; GFX950-NEXT: s_waitcnt vmcnt(0)4352; GFX950-NEXT: ;;#ASMSTART4353; GFX950-NEXT: ; use v04354; GFX950-NEXT: ;;#ASMEND4355; GFX950-NEXT: s_setpc_b64 s[30:31]4356 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104357 %data = call i32 asm "; def $0", "=^VA"()4358 %result = atomicrmw umin ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04359 call void asm "; use $0", "^VA"(i32 %result)4360 ret void4361}4362 4363define void @global_atomic_uinc_wrap_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4364; GFX90A-LABEL: global_atomic_uinc_wrap_i32_ret_a_a:4365; GFX90A: ; %bb.0:4366; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4367; GFX90A-NEXT: ;;#ASMSTART4368; GFX90A-NEXT: ; def a04369; GFX90A-NEXT: ;;#ASMEND4370; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04371; GFX90A-NEXT: global_atomic_inc v0, v[0:1], v2, off offset:40 glc4372; GFX90A-NEXT: s_waitcnt vmcnt(0)4373; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04374; GFX90A-NEXT: ;;#ASMSTART4375; GFX90A-NEXT: ; use a04376; GFX90A-NEXT: ;;#ASMEND4377; GFX90A-NEXT: s_setpc_b64 s[30:31]4378;4379; GFX950-LABEL: global_atomic_uinc_wrap_i32_ret_a_a:4380; GFX950: ; %bb.0:4381; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4382; GFX950-NEXT: ;;#ASMSTART4383; GFX950-NEXT: ; def a04384; GFX950-NEXT: ;;#ASMEND4385; GFX950-NEXT: s_nop 04386; GFX950-NEXT: v_accvgpr_read_b32 v2, a04387; GFX950-NEXT: global_atomic_inc v0, v[0:1], v2, off offset:40 sc04388; GFX950-NEXT: s_waitcnt vmcnt(0)4389; GFX950-NEXT: v_accvgpr_write_b32 a0, v04390; GFX950-NEXT: ;;#ASMSTART4391; GFX950-NEXT: ; use a04392; GFX950-NEXT: ;;#ASMEND4393; GFX950-NEXT: s_setpc_b64 s[30:31]4394 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104395 %data = call i32 asm "; def $0", "=a"()4396 %result = atomicrmw uinc_wrap ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04397 call void asm "; use $0", "a"(i32 %result)4398 ret void4399}4400 4401define void @global_atomic_uinc_wrap_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4402; GFX90A-LABEL: global_atomic_uinc_wrap_i32_ret_av_av:4403; GFX90A: ; %bb.0:4404; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4405; GFX90A-NEXT: ;;#ASMSTART4406; GFX90A-NEXT: ; def v24407; GFX90A-NEXT: ;;#ASMEND4408; GFX90A-NEXT: global_atomic_inc v0, v[0:1], v2, off offset:40 glc4409; GFX90A-NEXT: s_waitcnt vmcnt(0)4410; GFX90A-NEXT: ;;#ASMSTART4411; GFX90A-NEXT: ; use v04412; GFX90A-NEXT: ;;#ASMEND4413; GFX90A-NEXT: s_setpc_b64 s[30:31]4414;4415; GFX950-LABEL: global_atomic_uinc_wrap_i32_ret_av_av:4416; GFX950: ; %bb.0:4417; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4418; GFX950-NEXT: ;;#ASMSTART4419; GFX950-NEXT: ; def v24420; GFX950-NEXT: ;;#ASMEND4421; GFX950-NEXT: global_atomic_inc v0, v[0:1], v2, off offset:40 sc04422; GFX950-NEXT: s_waitcnt vmcnt(0)4423; GFX950-NEXT: ;;#ASMSTART4424; GFX950-NEXT: ; use v04425; GFX950-NEXT: ;;#ASMEND4426; GFX950-NEXT: s_setpc_b64 s[30:31]4427 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104428 %data = call i32 asm "; def $0", "=^VA"()4429 %result = atomicrmw uinc_wrap ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04430 call void asm "; use $0", "^VA"(i32 %result)4431 ret void4432}4433 4434define void @global_atomic_udec_wrap_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4435; GFX90A-LABEL: global_atomic_udec_wrap_i32_ret_a_a:4436; GFX90A: ; %bb.0:4437; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4438; GFX90A-NEXT: ;;#ASMSTART4439; GFX90A-NEXT: ; def a04440; GFX90A-NEXT: ;;#ASMEND4441; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04442; GFX90A-NEXT: global_atomic_dec v0, v[0:1], v2, off offset:40 glc4443; GFX90A-NEXT: s_waitcnt vmcnt(0)4444; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04445; GFX90A-NEXT: ;;#ASMSTART4446; GFX90A-NEXT: ; use a04447; GFX90A-NEXT: ;;#ASMEND4448; GFX90A-NEXT: s_setpc_b64 s[30:31]4449;4450; GFX950-LABEL: global_atomic_udec_wrap_i32_ret_a_a:4451; GFX950: ; %bb.0:4452; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4453; GFX950-NEXT: ;;#ASMSTART4454; GFX950-NEXT: ; def a04455; GFX950-NEXT: ;;#ASMEND4456; GFX950-NEXT: s_nop 04457; GFX950-NEXT: v_accvgpr_read_b32 v2, a04458; GFX950-NEXT: global_atomic_dec v0, v[0:1], v2, off offset:40 sc04459; GFX950-NEXT: s_waitcnt vmcnt(0)4460; GFX950-NEXT: v_accvgpr_write_b32 a0, v04461; GFX950-NEXT: ;;#ASMSTART4462; GFX950-NEXT: ; use a04463; GFX950-NEXT: ;;#ASMEND4464; GFX950-NEXT: s_setpc_b64 s[30:31]4465 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104466 %data = call i32 asm "; def $0", "=a"()4467 %result = atomicrmw udec_wrap ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04468 call void asm "; use $0", "a"(i32 %result)4469 ret void4470}4471 4472define void @global_atomic_udec_wrap_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4473; GFX90A-LABEL: global_atomic_udec_wrap_i32_ret_av_av:4474; GFX90A: ; %bb.0:4475; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4476; GFX90A-NEXT: ;;#ASMSTART4477; GFX90A-NEXT: ; def v24478; GFX90A-NEXT: ;;#ASMEND4479; GFX90A-NEXT: global_atomic_dec v0, v[0:1], v2, off offset:40 glc4480; GFX90A-NEXT: s_waitcnt vmcnt(0)4481; GFX90A-NEXT: ;;#ASMSTART4482; GFX90A-NEXT: ; use v04483; GFX90A-NEXT: ;;#ASMEND4484; GFX90A-NEXT: s_setpc_b64 s[30:31]4485;4486; GFX950-LABEL: global_atomic_udec_wrap_i32_ret_av_av:4487; GFX950: ; %bb.0:4488; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4489; GFX950-NEXT: ;;#ASMSTART4490; GFX950-NEXT: ; def v24491; GFX950-NEXT: ;;#ASMEND4492; GFX950-NEXT: global_atomic_dec v0, v[0:1], v2, off offset:40 sc04493; GFX950-NEXT: s_waitcnt vmcnt(0)4494; GFX950-NEXT: ;;#ASMSTART4495; GFX950-NEXT: ; use v04496; GFX950-NEXT: ;;#ASMEND4497; GFX950-NEXT: s_setpc_b64 s[30:31]4498 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104499 %data = call i32 asm "; def $0", "=^VA"()4500 %result = atomicrmw udec_wrap ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04501 call void asm "; use $0", "^VA"(i32 %result)4502 ret void4503}4504 4505define void @global_atomic_usub_cond_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4506; GFX90A-LABEL: global_atomic_usub_cond_i32_ret_a_a:4507; GFX90A: ; %bb.0:4508; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4509; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:404510; GFX90A-NEXT: ;;#ASMSTART4511; GFX90A-NEXT: ; def a04512; GFX90A-NEXT: ;;#ASMEND4513; GFX90A-NEXT: v_accvgpr_read_b32 v4, a04514; GFX90A-NEXT: s_mov_b64 s[4:5], 04515; GFX90A-NEXT: .LBB85_1: ; %atomicrmw.start4516; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=14517; GFX90A-NEXT: s_waitcnt vmcnt(0)4518; GFX90A-NEXT: v_sub_u32_e32 v2, v3, v44519; GFX90A-NEXT: v_cmp_ge_u32_e32 vcc, v3, v44520; GFX90A-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc4521; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc4522; GFX90A-NEXT: s_waitcnt vmcnt(0)4523; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v34524; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]4525; GFX90A-NEXT: v_mov_b32_e32 v3, v24526; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]4527; GFX90A-NEXT: s_cbranch_execnz .LBB85_14528; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end4529; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]4530; GFX90A-NEXT: v_accvgpr_write_b32 a0, v24531; GFX90A-NEXT: ;;#ASMSTART4532; GFX90A-NEXT: ; use a04533; GFX90A-NEXT: ;;#ASMEND4534; GFX90A-NEXT: s_setpc_b64 s[30:31]4535;4536; GFX950-LABEL: global_atomic_usub_cond_i32_ret_a_a:4537; GFX950: ; %bb.0:4538; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4539; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:404540; GFX950-NEXT: ;;#ASMSTART4541; GFX950-NEXT: ; def a04542; GFX950-NEXT: ;;#ASMEND4543; GFX950-NEXT: s_mov_b64 s[0:1], 04544; GFX950-NEXT: v_accvgpr_read_b32 v4, a04545; GFX950-NEXT: .LBB85_1: ; %atomicrmw.start4546; GFX950-NEXT: ; =>This Inner Loop Header: Depth=14547; GFX950-NEXT: s_waitcnt vmcnt(0)4548; GFX950-NEXT: v_sub_u32_e32 v2, v3, v44549; GFX950-NEXT: v_cmp_ge_u32_e32 vcc, v3, v44550; GFX950-NEXT: s_nop 14551; GFX950-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc4552; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc04553; GFX950-NEXT: s_waitcnt vmcnt(0)4554; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v34555; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]4556; GFX950-NEXT: v_mov_b32_e32 v3, v24557; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]4558; GFX950-NEXT: s_cbranch_execnz .LBB85_14559; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end4560; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]4561; GFX950-NEXT: v_accvgpr_write_b32 a0, v24562; GFX950-NEXT: ;;#ASMSTART4563; GFX950-NEXT: ; use a04564; GFX950-NEXT: ;;#ASMEND4565; GFX950-NEXT: s_setpc_b64 s[30:31]4566 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104567 %data = call i32 asm "; def $0", "=a"()4568 %result = atomicrmw usub_cond ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04569 call void asm "; use $0", "a"(i32 %result)4570 ret void4571}4572 4573define void @global_atomic_usub_cond_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4574; GFX90A-LABEL: global_atomic_usub_cond_i32_ret_av_av:4575; GFX90A: ; %bb.0:4576; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4577; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:404578; GFX90A-NEXT: s_mov_b64 s[4:5], 04579; GFX90A-NEXT: ;;#ASMSTART4580; GFX90A-NEXT: ; def v44581; GFX90A-NEXT: ;;#ASMEND4582; GFX90A-NEXT: .LBB86_1: ; %atomicrmw.start4583; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=14584; GFX90A-NEXT: s_waitcnt vmcnt(0)4585; GFX90A-NEXT: v_sub_u32_e32 v2, v3, v44586; GFX90A-NEXT: v_cmp_ge_u32_e32 vcc, v3, v44587; GFX90A-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc4588; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc4589; GFX90A-NEXT: s_waitcnt vmcnt(0)4590; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v34591; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]4592; GFX90A-NEXT: v_mov_b32_e32 v3, v24593; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]4594; GFX90A-NEXT: s_cbranch_execnz .LBB86_14595; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end4596; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]4597; GFX90A-NEXT: ;;#ASMSTART4598; GFX90A-NEXT: ; use v24599; GFX90A-NEXT: ;;#ASMEND4600; GFX90A-NEXT: s_setpc_b64 s[30:31]4601;4602; GFX950-LABEL: global_atomic_usub_cond_i32_ret_av_av:4603; GFX950: ; %bb.0:4604; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4605; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:404606; GFX950-NEXT: s_mov_b64 s[0:1], 04607; GFX950-NEXT: ;;#ASMSTART4608; GFX950-NEXT: ; def v44609; GFX950-NEXT: ;;#ASMEND4610; GFX950-NEXT: .LBB86_1: ; %atomicrmw.start4611; GFX950-NEXT: ; =>This Inner Loop Header: Depth=14612; GFX950-NEXT: s_waitcnt vmcnt(0)4613; GFX950-NEXT: v_sub_u32_e32 v2, v3, v44614; GFX950-NEXT: v_cmp_ge_u32_e32 vcc, v3, v44615; GFX950-NEXT: s_nop 14616; GFX950-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc4617; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc04618; GFX950-NEXT: s_waitcnt vmcnt(0)4619; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v34620; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]4621; GFX950-NEXT: v_mov_b32_e32 v3, v24622; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]4623; GFX950-NEXT: s_cbranch_execnz .LBB86_14624; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end4625; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]4626; GFX950-NEXT: ;;#ASMSTART4627; GFX950-NEXT: ; use v24628; GFX950-NEXT: ;;#ASMEND4629; GFX950-NEXT: s_setpc_b64 s[30:31]4630 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104631 %data = call i32 asm "; def $0", "=^VA"()4632 %result = atomicrmw usub_cond ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04633 call void asm "; use $0", "^VA"(i32 %result)4634 ret void4635}4636 4637define void @global_atomic_usub_sat_i32_ret_a_a(ptr addrspace(1) %ptr) #0 {4638; GFX90A-LABEL: global_atomic_usub_sat_i32_ret_a_a:4639; GFX90A: ; %bb.0:4640; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4641; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:404642; GFX90A-NEXT: ;;#ASMSTART4643; GFX90A-NEXT: ; def a04644; GFX90A-NEXT: ;;#ASMEND4645; GFX90A-NEXT: v_accvgpr_read_b32 v4, a04646; GFX90A-NEXT: s_mov_b64 s[4:5], 04647; GFX90A-NEXT: .LBB87_1: ; %atomicrmw.start4648; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=14649; GFX90A-NEXT: s_waitcnt vmcnt(0)4650; GFX90A-NEXT: v_sub_u32_e64 v2, v3, v4 clamp4651; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc4652; GFX90A-NEXT: s_waitcnt vmcnt(0)4653; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v34654; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]4655; GFX90A-NEXT: v_mov_b32_e32 v3, v24656; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]4657; GFX90A-NEXT: s_cbranch_execnz .LBB87_14658; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end4659; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]4660; GFX90A-NEXT: v_accvgpr_write_b32 a0, v24661; GFX90A-NEXT: ;;#ASMSTART4662; GFX90A-NEXT: ; use a04663; GFX90A-NEXT: ;;#ASMEND4664; GFX90A-NEXT: s_setpc_b64 s[30:31]4665;4666; GFX950-LABEL: global_atomic_usub_sat_i32_ret_a_a:4667; GFX950: ; %bb.0:4668; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4669; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:404670; GFX950-NEXT: ;;#ASMSTART4671; GFX950-NEXT: ; def a04672; GFX950-NEXT: ;;#ASMEND4673; GFX950-NEXT: s_mov_b64 s[0:1], 04674; GFX950-NEXT: v_accvgpr_read_b32 v4, a04675; GFX950-NEXT: .LBB87_1: ; %atomicrmw.start4676; GFX950-NEXT: ; =>This Inner Loop Header: Depth=14677; GFX950-NEXT: s_waitcnt vmcnt(0)4678; GFX950-NEXT: v_sub_u32_e64 v2, v3, v4 clamp4679; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc04680; GFX950-NEXT: s_waitcnt vmcnt(0)4681; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v34682; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]4683; GFX950-NEXT: v_mov_b32_e32 v3, v24684; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]4685; GFX950-NEXT: s_cbranch_execnz .LBB87_14686; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end4687; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]4688; GFX950-NEXT: v_accvgpr_write_b32 a0, v24689; GFX950-NEXT: ;;#ASMSTART4690; GFX950-NEXT: ; use a04691; GFX950-NEXT: ;;#ASMEND4692; GFX950-NEXT: s_setpc_b64 s[30:31]4693 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104694 %data = call i32 asm "; def $0", "=a"()4695 %result = atomicrmw usub_sat ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04696 call void asm "; use $0", "a"(i32 %result)4697 ret void4698}4699 4700define void @global_atomic_usub_sat_i32_ret_av_av(ptr addrspace(1) %ptr) #0 {4701; GFX90A-LABEL: global_atomic_usub_sat_i32_ret_av_av:4702; GFX90A: ; %bb.0:4703; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4704; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:404705; GFX90A-NEXT: s_mov_b64 s[4:5], 04706; GFX90A-NEXT: ;;#ASMSTART4707; GFX90A-NEXT: ; def v44708; GFX90A-NEXT: ;;#ASMEND4709; GFX90A-NEXT: .LBB88_1: ; %atomicrmw.start4710; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=14711; GFX90A-NEXT: s_waitcnt vmcnt(0)4712; GFX90A-NEXT: v_sub_u32_e64 v2, v3, v4 clamp4713; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc4714; GFX90A-NEXT: s_waitcnt vmcnt(0)4715; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v34716; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]4717; GFX90A-NEXT: v_mov_b32_e32 v3, v24718; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]4719; GFX90A-NEXT: s_cbranch_execnz .LBB88_14720; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end4721; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]4722; GFX90A-NEXT: ;;#ASMSTART4723; GFX90A-NEXT: ; use v24724; GFX90A-NEXT: ;;#ASMEND4725; GFX90A-NEXT: s_setpc_b64 s[30:31]4726;4727; GFX950-LABEL: global_atomic_usub_sat_i32_ret_av_av:4728; GFX950: ; %bb.0:4729; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4730; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:404731; GFX950-NEXT: s_mov_b64 s[0:1], 04732; GFX950-NEXT: ;;#ASMSTART4733; GFX950-NEXT: ; def v44734; GFX950-NEXT: ;;#ASMEND4735; GFX950-NEXT: .LBB88_1: ; %atomicrmw.start4736; GFX950-NEXT: ; =>This Inner Loop Header: Depth=14737; GFX950-NEXT: s_waitcnt vmcnt(0)4738; GFX950-NEXT: v_sub_u32_e64 v2, v3, v4 clamp4739; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc04740; GFX950-NEXT: s_waitcnt vmcnt(0)4741; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v34742; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]4743; GFX950-NEXT: v_mov_b32_e32 v3, v24744; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]4745; GFX950-NEXT: s_cbranch_execnz .LBB88_14746; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end4747; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]4748; GFX950-NEXT: ;;#ASMSTART4749; GFX950-NEXT: ; use v24750; GFX950-NEXT: ;;#ASMEND4751; GFX950-NEXT: s_setpc_b64 s[30:31]4752 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 104753 %data = call i32 asm "; def $0", "=^VA"()4754 %result = atomicrmw usub_sat ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04755 call void asm "; use $0", "^VA"(i32 %result)4756 ret void4757}4758 4759;---------------------------------------------------------------------4760; other atomics i64, with aa+av cases4761;---------------------------------------------------------------------4762 4763define void @global_atomic_add_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {4764; GFX90A-LABEL: global_atomic_add_i64_ret_a_a:4765; GFX90A: ; %bb.0:4766; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4767; GFX90A-NEXT: ;;#ASMSTART4768; GFX90A-NEXT: ; def a[0:1]4769; GFX90A-NEXT: ;;#ASMEND4770; GFX90A-NEXT: v_accvgpr_read_b32 v3, a14771; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04772; GFX90A-NEXT: global_atomic_add_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc4773; GFX90A-NEXT: s_waitcnt vmcnt(0)4774; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04775; GFX90A-NEXT: v_accvgpr_write_b32 a1, v14776; GFX90A-NEXT: ;;#ASMSTART4777; GFX90A-NEXT: ; use a[0:1]4778; GFX90A-NEXT: ;;#ASMEND4779; GFX90A-NEXT: s_setpc_b64 s[30:31]4780;4781; GFX950-LABEL: global_atomic_add_i64_ret_a_a:4782; GFX950: ; %bb.0:4783; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4784; GFX950-NEXT: ;;#ASMSTART4785; GFX950-NEXT: ; def a[0:1]4786; GFX950-NEXT: ;;#ASMEND4787; GFX950-NEXT: s_nop 04788; GFX950-NEXT: v_accvgpr_read_b32 v3, a14789; GFX950-NEXT: v_accvgpr_read_b32 v2, a04790; GFX950-NEXT: global_atomic_add_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc04791; GFX950-NEXT: s_waitcnt vmcnt(0)4792; GFX950-NEXT: v_accvgpr_write_b32 a0, v04793; GFX950-NEXT: v_accvgpr_write_b32 a1, v14794; GFX950-NEXT: ;;#ASMSTART4795; GFX950-NEXT: ; use a[0:1]4796; GFX950-NEXT: ;;#ASMEND4797; GFX950-NEXT: s_setpc_b64 s[30:31]4798 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 104799 %data = call i64 asm "; def $0", "=a"()4800 %result = atomicrmw add ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04801 call void asm "; use $0", "a"(i64 %result)4802 ret void4803}4804 4805define void @global_atomic_add_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {4806; GFX90A-LABEL: global_atomic_add_i64_ret_av_av:4807; GFX90A: ; %bb.0:4808; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4809; GFX90A-NEXT: ;;#ASMSTART4810; GFX90A-NEXT: ; def v[2:3]4811; GFX90A-NEXT: ;;#ASMEND4812; GFX90A-NEXT: global_atomic_add_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc4813; GFX90A-NEXT: s_waitcnt vmcnt(0)4814; GFX90A-NEXT: ;;#ASMSTART4815; GFX90A-NEXT: ; use v[0:1]4816; GFX90A-NEXT: ;;#ASMEND4817; GFX90A-NEXT: s_setpc_b64 s[30:31]4818;4819; GFX950-LABEL: global_atomic_add_i64_ret_av_av:4820; GFX950: ; %bb.0:4821; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4822; GFX950-NEXT: ;;#ASMSTART4823; GFX950-NEXT: ; def v[2:3]4824; GFX950-NEXT: ;;#ASMEND4825; GFX950-NEXT: global_atomic_add_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc04826; GFX950-NEXT: s_waitcnt vmcnt(0)4827; GFX950-NEXT: ;;#ASMSTART4828; GFX950-NEXT: ; use v[0:1]4829; GFX950-NEXT: ;;#ASMEND4830; GFX950-NEXT: s_setpc_b64 s[30:31]4831 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 104832 %data = call i64 asm "; def $0", "=^VA"()4833 %result = atomicrmw add ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04834 call void asm "; use $0", "^VA"(i64 %result)4835 ret void4836}4837 4838define void @global_atomic_sub_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {4839; GFX90A-LABEL: global_atomic_sub_i64_ret_a_a:4840; GFX90A: ; %bb.0:4841; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4842; GFX90A-NEXT: ;;#ASMSTART4843; GFX90A-NEXT: ; def a[0:1]4844; GFX90A-NEXT: ;;#ASMEND4845; GFX90A-NEXT: v_accvgpr_read_b32 v3, a14846; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04847; GFX90A-NEXT: global_atomic_sub_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc4848; GFX90A-NEXT: s_waitcnt vmcnt(0)4849; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04850; GFX90A-NEXT: v_accvgpr_write_b32 a1, v14851; GFX90A-NEXT: ;;#ASMSTART4852; GFX90A-NEXT: ; use a[0:1]4853; GFX90A-NEXT: ;;#ASMEND4854; GFX90A-NEXT: s_setpc_b64 s[30:31]4855;4856; GFX950-LABEL: global_atomic_sub_i64_ret_a_a:4857; GFX950: ; %bb.0:4858; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4859; GFX950-NEXT: ;;#ASMSTART4860; GFX950-NEXT: ; def a[0:1]4861; GFX950-NEXT: ;;#ASMEND4862; GFX950-NEXT: s_nop 04863; GFX950-NEXT: v_accvgpr_read_b32 v3, a14864; GFX950-NEXT: v_accvgpr_read_b32 v2, a04865; GFX950-NEXT: global_atomic_sub_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc04866; GFX950-NEXT: s_waitcnt vmcnt(0)4867; GFX950-NEXT: v_accvgpr_write_b32 a0, v04868; GFX950-NEXT: v_accvgpr_write_b32 a1, v14869; GFX950-NEXT: ;;#ASMSTART4870; GFX950-NEXT: ; use a[0:1]4871; GFX950-NEXT: ;;#ASMEND4872; GFX950-NEXT: s_setpc_b64 s[30:31]4873 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 104874 %data = call i64 asm "; def $0", "=a"()4875 %result = atomicrmw sub ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04876 call void asm "; use $0", "a"(i64 %result)4877 ret void4878}4879 4880define void @global_atomic_sub_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {4881; GFX90A-LABEL: global_atomic_sub_i64_ret_av_av:4882; GFX90A: ; %bb.0:4883; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4884; GFX90A-NEXT: ;;#ASMSTART4885; GFX90A-NEXT: ; def v[2:3]4886; GFX90A-NEXT: ;;#ASMEND4887; GFX90A-NEXT: global_atomic_sub_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc4888; GFX90A-NEXT: s_waitcnt vmcnt(0)4889; GFX90A-NEXT: ;;#ASMSTART4890; GFX90A-NEXT: ; use v[0:1]4891; GFX90A-NEXT: ;;#ASMEND4892; GFX90A-NEXT: s_setpc_b64 s[30:31]4893;4894; GFX950-LABEL: global_atomic_sub_i64_ret_av_av:4895; GFX950: ; %bb.0:4896; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4897; GFX950-NEXT: ;;#ASMSTART4898; GFX950-NEXT: ; def v[2:3]4899; GFX950-NEXT: ;;#ASMEND4900; GFX950-NEXT: global_atomic_sub_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc04901; GFX950-NEXT: s_waitcnt vmcnt(0)4902; GFX950-NEXT: ;;#ASMSTART4903; GFX950-NEXT: ; use v[0:1]4904; GFX950-NEXT: ;;#ASMEND4905; GFX950-NEXT: s_setpc_b64 s[30:31]4906 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 104907 %data = call i64 asm "; def $0", "=^VA"()4908 %result = atomicrmw sub ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04909 call void asm "; use $0", "^VA"(i64 %result)4910 ret void4911}4912 4913define void @global_atomic_and_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {4914; GFX90A-LABEL: global_atomic_and_i64_ret_a_a:4915; GFX90A: ; %bb.0:4916; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4917; GFX90A-NEXT: ;;#ASMSTART4918; GFX90A-NEXT: ; def a[0:1]4919; GFX90A-NEXT: ;;#ASMEND4920; GFX90A-NEXT: v_accvgpr_read_b32 v3, a14921; GFX90A-NEXT: v_accvgpr_read_b32 v2, a04922; GFX90A-NEXT: global_atomic_and_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc4923; GFX90A-NEXT: s_waitcnt vmcnt(0)4924; GFX90A-NEXT: v_accvgpr_write_b32 a0, v04925; GFX90A-NEXT: v_accvgpr_write_b32 a1, v14926; GFX90A-NEXT: ;;#ASMSTART4927; GFX90A-NEXT: ; use a[0:1]4928; GFX90A-NEXT: ;;#ASMEND4929; GFX90A-NEXT: s_setpc_b64 s[30:31]4930;4931; GFX950-LABEL: global_atomic_and_i64_ret_a_a:4932; GFX950: ; %bb.0:4933; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4934; GFX950-NEXT: ;;#ASMSTART4935; GFX950-NEXT: ; def a[0:1]4936; GFX950-NEXT: ;;#ASMEND4937; GFX950-NEXT: s_nop 04938; GFX950-NEXT: v_accvgpr_read_b32 v3, a14939; GFX950-NEXT: v_accvgpr_read_b32 v2, a04940; GFX950-NEXT: global_atomic_and_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc04941; GFX950-NEXT: s_waitcnt vmcnt(0)4942; GFX950-NEXT: v_accvgpr_write_b32 a0, v04943; GFX950-NEXT: v_accvgpr_write_b32 a1, v14944; GFX950-NEXT: ;;#ASMSTART4945; GFX950-NEXT: ; use a[0:1]4946; GFX950-NEXT: ;;#ASMEND4947; GFX950-NEXT: s_setpc_b64 s[30:31]4948 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 104949 %data = call i64 asm "; def $0", "=a"()4950 %result = atomicrmw and ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04951 call void asm "; use $0", "a"(i64 %result)4952 ret void4953}4954 4955define void @global_atomic_and_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {4956; GFX90A-LABEL: global_atomic_and_i64_ret_av_av:4957; GFX90A: ; %bb.0:4958; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4959; GFX90A-NEXT: ;;#ASMSTART4960; GFX90A-NEXT: ; def v[2:3]4961; GFX90A-NEXT: ;;#ASMEND4962; GFX90A-NEXT: global_atomic_and_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc4963; GFX90A-NEXT: s_waitcnt vmcnt(0)4964; GFX90A-NEXT: ;;#ASMSTART4965; GFX90A-NEXT: ; use v[0:1]4966; GFX90A-NEXT: ;;#ASMEND4967; GFX90A-NEXT: s_setpc_b64 s[30:31]4968;4969; GFX950-LABEL: global_atomic_and_i64_ret_av_av:4970; GFX950: ; %bb.0:4971; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4972; GFX950-NEXT: ;;#ASMSTART4973; GFX950-NEXT: ; def v[2:3]4974; GFX950-NEXT: ;;#ASMEND4975; GFX950-NEXT: global_atomic_and_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc04976; GFX950-NEXT: s_waitcnt vmcnt(0)4977; GFX950-NEXT: ;;#ASMSTART4978; GFX950-NEXT: ; use v[0:1]4979; GFX950-NEXT: ;;#ASMEND4980; GFX950-NEXT: s_setpc_b64 s[30:31]4981 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 104982 %data = call i64 asm "; def $0", "=^VA"()4983 %result = atomicrmw and ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !04984 call void asm "; use $0", "^VA"(i64 %result)4985 ret void4986}4987 4988define void @global_atomic_nand_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {4989; GFX90A-LABEL: global_atomic_nand_i64_ret_a_a:4990; GFX90A: ; %bb.0:4991; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4992; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:804993; GFX90A-NEXT: ;;#ASMSTART4994; GFX90A-NEXT: ; def a[0:1]4995; GFX90A-NEXT: ;;#ASMEND4996; GFX90A-NEXT: v_accvgpr_read_b32 v7, a14997; GFX90A-NEXT: v_accvgpr_read_b32 v6, a04998; GFX90A-NEXT: s_mov_b64 s[4:5], 04999; GFX90A-NEXT: .LBB95_1: ; %atomicrmw.start5000; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=15001; GFX90A-NEXT: s_waitcnt vmcnt(0)5002; GFX90A-NEXT: v_and_b32_e32 v2, v5, v75003; GFX90A-NEXT: v_and_b32_e32 v8, v4, v65004; GFX90A-NEXT: v_not_b32_e32 v3, v25005; GFX90A-NEXT: v_not_b32_e32 v2, v85006; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc5007; GFX90A-NEXT: s_waitcnt vmcnt(0)5008; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5009; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]5010; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]5011; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]5012; GFX90A-NEXT: s_cbranch_execnz .LBB95_15013; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end5014; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]5015; GFX90A-NEXT: v_accvgpr_write_b32 a0, v25016; GFX90A-NEXT: v_accvgpr_write_b32 a1, v35017; GFX90A-NEXT: ;;#ASMSTART5018; GFX90A-NEXT: ; use a[0:1]5019; GFX90A-NEXT: ;;#ASMEND5020; GFX90A-NEXT: s_setpc_b64 s[30:31]5021;5022; GFX950-LABEL: global_atomic_nand_i64_ret_a_a:5023; GFX950: ; %bb.0:5024; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5025; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805026; GFX950-NEXT: ;;#ASMSTART5027; GFX950-NEXT: ; def a[0:1]5028; GFX950-NEXT: ;;#ASMEND5029; GFX950-NEXT: s_mov_b64 s[0:1], 05030; GFX950-NEXT: v_accvgpr_read_b32 v7, a15031; GFX950-NEXT: v_accvgpr_read_b32 v6, a05032; GFX950-NEXT: .LBB95_1: ; %atomicrmw.start5033; GFX950-NEXT: ; =>This Inner Loop Header: Depth=15034; GFX950-NEXT: s_waitcnt vmcnt(0)5035; GFX950-NEXT: v_and_b32_e32 v2, v5, v75036; GFX950-NEXT: v_and_b32_e32 v8, v4, v65037; GFX950-NEXT: v_not_b32_e32 v3, v25038; GFX950-NEXT: v_not_b32_e32 v2, v85039; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc05040; GFX950-NEXT: s_waitcnt vmcnt(0)5041; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5042; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]5043; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]5044; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]5045; GFX950-NEXT: s_cbranch_execnz .LBB95_15046; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end5047; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]5048; GFX950-NEXT: v_accvgpr_write_b32 a0, v25049; GFX950-NEXT: v_accvgpr_write_b32 a1, v35050; GFX950-NEXT: ;;#ASMSTART5051; GFX950-NEXT: ; use a[0:1]5052; GFX950-NEXT: ;;#ASMEND5053; GFX950-NEXT: s_setpc_b64 s[30:31]5054 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105055 %data = call i64 asm "; def $0", "=a"()5056 %result = atomicrmw nand ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05057 call void asm "; use $0", "a"(i64 %result)5058 ret void5059}5060 5061define void @global_atomic_nand_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5062; GFX90A-LABEL: global_atomic_nand_i64_ret_av_av:5063; GFX90A: ; %bb.0:5064; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5065; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805066; GFX90A-NEXT: s_mov_b64 s[4:5], 05067; GFX90A-NEXT: ;;#ASMSTART5068; GFX90A-NEXT: ; def v[6:7]5069; GFX90A-NEXT: ;;#ASMEND5070; GFX90A-NEXT: .LBB96_1: ; %atomicrmw.start5071; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=15072; GFX90A-NEXT: s_waitcnt vmcnt(0)5073; GFX90A-NEXT: v_and_b32_e32 v2, v5, v75074; GFX90A-NEXT: v_and_b32_e32 v8, v4, v65075; GFX90A-NEXT: v_not_b32_e32 v3, v25076; GFX90A-NEXT: v_not_b32_e32 v2, v85077; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc5078; GFX90A-NEXT: s_waitcnt vmcnt(0)5079; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5080; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]5081; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]5082; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]5083; GFX90A-NEXT: s_cbranch_execnz .LBB96_15084; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end5085; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]5086; GFX90A-NEXT: ;;#ASMSTART5087; GFX90A-NEXT: ; use v[2:3]5088; GFX90A-NEXT: ;;#ASMEND5089; GFX90A-NEXT: s_setpc_b64 s[30:31]5090;5091; GFX950-LABEL: global_atomic_nand_i64_ret_av_av:5092; GFX950: ; %bb.0:5093; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5094; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805095; GFX950-NEXT: s_mov_b64 s[0:1], 05096; GFX950-NEXT: ;;#ASMSTART5097; GFX950-NEXT: ; def v[6:7]5098; GFX950-NEXT: ;;#ASMEND5099; GFX950-NEXT: .LBB96_1: ; %atomicrmw.start5100; GFX950-NEXT: ; =>This Inner Loop Header: Depth=15101; GFX950-NEXT: s_waitcnt vmcnt(0)5102; GFX950-NEXT: v_and_b32_e32 v2, v5, v75103; GFX950-NEXT: v_and_b32_e32 v8, v4, v65104; GFX950-NEXT: v_not_b32_e32 v3, v25105; GFX950-NEXT: v_not_b32_e32 v2, v85106; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc05107; GFX950-NEXT: s_waitcnt vmcnt(0)5108; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5109; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]5110; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]5111; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]5112; GFX950-NEXT: s_cbranch_execnz .LBB96_15113; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end5114; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]5115; GFX950-NEXT: ;;#ASMSTART5116; GFX950-NEXT: ; use v[2:3]5117; GFX950-NEXT: ;;#ASMEND5118; GFX950-NEXT: s_setpc_b64 s[30:31]5119 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105120 %data = call i64 asm "; def $0", "=^VA"()5121 %result = atomicrmw nand ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05122 call void asm "; use $0", "^VA"(i64 %result)5123 ret void5124}5125 5126define void @global_atomic_or_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5127; GFX90A-LABEL: global_atomic_or_i64_ret_a_a:5128; GFX90A: ; %bb.0:5129; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5130; GFX90A-NEXT: ;;#ASMSTART5131; GFX90A-NEXT: ; def a[0:1]5132; GFX90A-NEXT: ;;#ASMEND5133; GFX90A-NEXT: v_accvgpr_read_b32 v3, a15134; GFX90A-NEXT: v_accvgpr_read_b32 v2, a05135; GFX90A-NEXT: global_atomic_or_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5136; GFX90A-NEXT: s_waitcnt vmcnt(0)5137; GFX90A-NEXT: v_accvgpr_write_b32 a0, v05138; GFX90A-NEXT: v_accvgpr_write_b32 a1, v15139; GFX90A-NEXT: ;;#ASMSTART5140; GFX90A-NEXT: ; use a[0:1]5141; GFX90A-NEXT: ;;#ASMEND5142; GFX90A-NEXT: s_setpc_b64 s[30:31]5143;5144; GFX950-LABEL: global_atomic_or_i64_ret_a_a:5145; GFX950: ; %bb.0:5146; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5147; GFX950-NEXT: ;;#ASMSTART5148; GFX950-NEXT: ; def a[0:1]5149; GFX950-NEXT: ;;#ASMEND5150; GFX950-NEXT: s_nop 05151; GFX950-NEXT: v_accvgpr_read_b32 v3, a15152; GFX950-NEXT: v_accvgpr_read_b32 v2, a05153; GFX950-NEXT: global_atomic_or_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05154; GFX950-NEXT: s_waitcnt vmcnt(0)5155; GFX950-NEXT: v_accvgpr_write_b32 a0, v05156; GFX950-NEXT: v_accvgpr_write_b32 a1, v15157; GFX950-NEXT: ;;#ASMSTART5158; GFX950-NEXT: ; use a[0:1]5159; GFX950-NEXT: ;;#ASMEND5160; GFX950-NEXT: s_setpc_b64 s[30:31]5161 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105162 %data = call i64 asm "; def $0", "=a"()5163 %result = atomicrmw or ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05164 call void asm "; use $0", "a"(i64 %result)5165 ret void5166}5167 5168define void @global_atomic_or_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5169; GFX90A-LABEL: global_atomic_or_i64_ret_av_av:5170; GFX90A: ; %bb.0:5171; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5172; GFX90A-NEXT: ;;#ASMSTART5173; GFX90A-NEXT: ; def v[2:3]5174; GFX90A-NEXT: ;;#ASMEND5175; GFX90A-NEXT: global_atomic_or_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5176; GFX90A-NEXT: s_waitcnt vmcnt(0)5177; GFX90A-NEXT: ;;#ASMSTART5178; GFX90A-NEXT: ; use v[0:1]5179; GFX90A-NEXT: ;;#ASMEND5180; GFX90A-NEXT: s_setpc_b64 s[30:31]5181;5182; GFX950-LABEL: global_atomic_or_i64_ret_av_av:5183; GFX950: ; %bb.0:5184; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5185; GFX950-NEXT: ;;#ASMSTART5186; GFX950-NEXT: ; def v[2:3]5187; GFX950-NEXT: ;;#ASMEND5188; GFX950-NEXT: global_atomic_or_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05189; GFX950-NEXT: s_waitcnt vmcnt(0)5190; GFX950-NEXT: ;;#ASMSTART5191; GFX950-NEXT: ; use v[0:1]5192; GFX950-NEXT: ;;#ASMEND5193; GFX950-NEXT: s_setpc_b64 s[30:31]5194 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105195 %data = call i64 asm "; def $0", "=^VA"()5196 %result = atomicrmw or ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05197 call void asm "; use $0", "^VA"(i64 %result)5198 ret void5199}5200 5201define void @global_atomic_max_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5202; GFX90A-LABEL: global_atomic_max_i64_ret_a_a:5203; GFX90A: ; %bb.0:5204; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5205; GFX90A-NEXT: ;;#ASMSTART5206; GFX90A-NEXT: ; def a[0:1]5207; GFX90A-NEXT: ;;#ASMEND5208; GFX90A-NEXT: v_accvgpr_read_b32 v3, a15209; GFX90A-NEXT: v_accvgpr_read_b32 v2, a05210; GFX90A-NEXT: global_atomic_smax_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5211; GFX90A-NEXT: s_waitcnt vmcnt(0)5212; GFX90A-NEXT: v_accvgpr_write_b32 a0, v05213; GFX90A-NEXT: v_accvgpr_write_b32 a1, v15214; GFX90A-NEXT: ;;#ASMSTART5215; GFX90A-NEXT: ; use a[0:1]5216; GFX90A-NEXT: ;;#ASMEND5217; GFX90A-NEXT: s_setpc_b64 s[30:31]5218;5219; GFX950-LABEL: global_atomic_max_i64_ret_a_a:5220; GFX950: ; %bb.0:5221; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5222; GFX950-NEXT: ;;#ASMSTART5223; GFX950-NEXT: ; def a[0:1]5224; GFX950-NEXT: ;;#ASMEND5225; GFX950-NEXT: s_nop 05226; GFX950-NEXT: v_accvgpr_read_b32 v3, a15227; GFX950-NEXT: v_accvgpr_read_b32 v2, a05228; GFX950-NEXT: global_atomic_smax_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05229; GFX950-NEXT: s_waitcnt vmcnt(0)5230; GFX950-NEXT: v_accvgpr_write_b32 a0, v05231; GFX950-NEXT: v_accvgpr_write_b32 a1, v15232; GFX950-NEXT: ;;#ASMSTART5233; GFX950-NEXT: ; use a[0:1]5234; GFX950-NEXT: ;;#ASMEND5235; GFX950-NEXT: s_setpc_b64 s[30:31]5236 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105237 %data = call i64 asm "; def $0", "=a"()5238 %result = atomicrmw max ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05239 call void asm "; use $0", "a"(i64 %result)5240 ret void5241}5242 5243define void @global_atomic_max_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5244; GFX90A-LABEL: global_atomic_max_i64_ret_av_av:5245; GFX90A: ; %bb.0:5246; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5247; GFX90A-NEXT: ;;#ASMSTART5248; GFX90A-NEXT: ; def v[2:3]5249; GFX90A-NEXT: ;;#ASMEND5250; GFX90A-NEXT: global_atomic_smax_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5251; GFX90A-NEXT: s_waitcnt vmcnt(0)5252; GFX90A-NEXT: ;;#ASMSTART5253; GFX90A-NEXT: ; use v[0:1]5254; GFX90A-NEXT: ;;#ASMEND5255; GFX90A-NEXT: s_setpc_b64 s[30:31]5256;5257; GFX950-LABEL: global_atomic_max_i64_ret_av_av:5258; GFX950: ; %bb.0:5259; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5260; GFX950-NEXT: ;;#ASMSTART5261; GFX950-NEXT: ; def v[2:3]5262; GFX950-NEXT: ;;#ASMEND5263; GFX950-NEXT: global_atomic_smax_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05264; GFX950-NEXT: s_waitcnt vmcnt(0)5265; GFX950-NEXT: ;;#ASMSTART5266; GFX950-NEXT: ; use v[0:1]5267; GFX950-NEXT: ;;#ASMEND5268; GFX950-NEXT: s_setpc_b64 s[30:31]5269 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105270 %data = call i64 asm "; def $0", "=^VA"()5271 %result = atomicrmw max ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05272 call void asm "; use $0", "^VA"(i64 %result)5273 ret void5274}5275 5276define void @global_atomic_min_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5277; GFX90A-LABEL: global_atomic_min_i64_ret_a_a:5278; GFX90A: ; %bb.0:5279; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5280; GFX90A-NEXT: ;;#ASMSTART5281; GFX90A-NEXT: ; def a[0:1]5282; GFX90A-NEXT: ;;#ASMEND5283; GFX90A-NEXT: v_accvgpr_read_b32 v3, a15284; GFX90A-NEXT: v_accvgpr_read_b32 v2, a05285; GFX90A-NEXT: global_atomic_smin_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5286; GFX90A-NEXT: s_waitcnt vmcnt(0)5287; GFX90A-NEXT: v_accvgpr_write_b32 a0, v05288; GFX90A-NEXT: v_accvgpr_write_b32 a1, v15289; GFX90A-NEXT: ;;#ASMSTART5290; GFX90A-NEXT: ; use a[0:1]5291; GFX90A-NEXT: ;;#ASMEND5292; GFX90A-NEXT: s_setpc_b64 s[30:31]5293;5294; GFX950-LABEL: global_atomic_min_i64_ret_a_a:5295; GFX950: ; %bb.0:5296; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5297; GFX950-NEXT: ;;#ASMSTART5298; GFX950-NEXT: ; def a[0:1]5299; GFX950-NEXT: ;;#ASMEND5300; GFX950-NEXT: s_nop 05301; GFX950-NEXT: v_accvgpr_read_b32 v3, a15302; GFX950-NEXT: v_accvgpr_read_b32 v2, a05303; GFX950-NEXT: global_atomic_smin_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05304; GFX950-NEXT: s_waitcnt vmcnt(0)5305; GFX950-NEXT: v_accvgpr_write_b32 a0, v05306; GFX950-NEXT: v_accvgpr_write_b32 a1, v15307; GFX950-NEXT: ;;#ASMSTART5308; GFX950-NEXT: ; use a[0:1]5309; GFX950-NEXT: ;;#ASMEND5310; GFX950-NEXT: s_setpc_b64 s[30:31]5311 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105312 %data = call i64 asm "; def $0", "=a"()5313 %result = atomicrmw min ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05314 call void asm "; use $0", "a"(i64 %result)5315 ret void5316}5317 5318define void @global_atomic_min_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5319; GFX90A-LABEL: global_atomic_min_i64_ret_av_av:5320; GFX90A: ; %bb.0:5321; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5322; GFX90A-NEXT: ;;#ASMSTART5323; GFX90A-NEXT: ; def v[2:3]5324; GFX90A-NEXT: ;;#ASMEND5325; GFX90A-NEXT: global_atomic_smin_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5326; GFX90A-NEXT: s_waitcnt vmcnt(0)5327; GFX90A-NEXT: ;;#ASMSTART5328; GFX90A-NEXT: ; use v[0:1]5329; GFX90A-NEXT: ;;#ASMEND5330; GFX90A-NEXT: s_setpc_b64 s[30:31]5331;5332; GFX950-LABEL: global_atomic_min_i64_ret_av_av:5333; GFX950: ; %bb.0:5334; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5335; GFX950-NEXT: ;;#ASMSTART5336; GFX950-NEXT: ; def v[2:3]5337; GFX950-NEXT: ;;#ASMEND5338; GFX950-NEXT: global_atomic_smin_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05339; GFX950-NEXT: s_waitcnt vmcnt(0)5340; GFX950-NEXT: ;;#ASMSTART5341; GFX950-NEXT: ; use v[0:1]5342; GFX950-NEXT: ;;#ASMEND5343; GFX950-NEXT: s_setpc_b64 s[30:31]5344 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105345 %data = call i64 asm "; def $0", "=^VA"()5346 %result = atomicrmw min ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05347 call void asm "; use $0", "^VA"(i64 %result)5348 ret void5349}5350 5351define void @global_atomic_umax_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5352; GFX90A-LABEL: global_atomic_umax_i64_ret_a_a:5353; GFX90A: ; %bb.0:5354; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5355; GFX90A-NEXT: ;;#ASMSTART5356; GFX90A-NEXT: ; def a[0:1]5357; GFX90A-NEXT: ;;#ASMEND5358; GFX90A-NEXT: v_accvgpr_read_b32 v3, a15359; GFX90A-NEXT: v_accvgpr_read_b32 v2, a05360; GFX90A-NEXT: global_atomic_umax_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5361; GFX90A-NEXT: s_waitcnt vmcnt(0)5362; GFX90A-NEXT: v_accvgpr_write_b32 a0, v05363; GFX90A-NEXT: v_accvgpr_write_b32 a1, v15364; GFX90A-NEXT: ;;#ASMSTART5365; GFX90A-NEXT: ; use a[0:1]5366; GFX90A-NEXT: ;;#ASMEND5367; GFX90A-NEXT: s_setpc_b64 s[30:31]5368;5369; GFX950-LABEL: global_atomic_umax_i64_ret_a_a:5370; GFX950: ; %bb.0:5371; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5372; GFX950-NEXT: ;;#ASMSTART5373; GFX950-NEXT: ; def a[0:1]5374; GFX950-NEXT: ;;#ASMEND5375; GFX950-NEXT: s_nop 05376; GFX950-NEXT: v_accvgpr_read_b32 v3, a15377; GFX950-NEXT: v_accvgpr_read_b32 v2, a05378; GFX950-NEXT: global_atomic_umax_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05379; GFX950-NEXT: s_waitcnt vmcnt(0)5380; GFX950-NEXT: v_accvgpr_write_b32 a0, v05381; GFX950-NEXT: v_accvgpr_write_b32 a1, v15382; GFX950-NEXT: ;;#ASMSTART5383; GFX950-NEXT: ; use a[0:1]5384; GFX950-NEXT: ;;#ASMEND5385; GFX950-NEXT: s_setpc_b64 s[30:31]5386 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105387 %data = call i64 asm "; def $0", "=a"()5388 %result = atomicrmw umax ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05389 call void asm "; use $0", "a"(i64 %result)5390 ret void5391}5392 5393define void @global_atomic_umax_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5394; GFX90A-LABEL: global_atomic_umax_i64_ret_av_av:5395; GFX90A: ; %bb.0:5396; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5397; GFX90A-NEXT: ;;#ASMSTART5398; GFX90A-NEXT: ; def v[2:3]5399; GFX90A-NEXT: ;;#ASMEND5400; GFX90A-NEXT: global_atomic_umax_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5401; GFX90A-NEXT: s_waitcnt vmcnt(0)5402; GFX90A-NEXT: ;;#ASMSTART5403; GFX90A-NEXT: ; use v[0:1]5404; GFX90A-NEXT: ;;#ASMEND5405; GFX90A-NEXT: s_setpc_b64 s[30:31]5406;5407; GFX950-LABEL: global_atomic_umax_i64_ret_av_av:5408; GFX950: ; %bb.0:5409; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5410; GFX950-NEXT: ;;#ASMSTART5411; GFX950-NEXT: ; def v[2:3]5412; GFX950-NEXT: ;;#ASMEND5413; GFX950-NEXT: global_atomic_umax_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05414; GFX950-NEXT: s_waitcnt vmcnt(0)5415; GFX950-NEXT: ;;#ASMSTART5416; GFX950-NEXT: ; use v[0:1]5417; GFX950-NEXT: ;;#ASMEND5418; GFX950-NEXT: s_setpc_b64 s[30:31]5419 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105420 %data = call i64 asm "; def $0", "=^VA"()5421 %result = atomicrmw umax ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05422 call void asm "; use $0", "^VA"(i64 %result)5423 ret void5424}5425 5426define void @global_atomic_umin_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5427; GFX90A-LABEL: global_atomic_umin_i64_ret_a_a:5428; GFX90A: ; %bb.0:5429; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5430; GFX90A-NEXT: ;;#ASMSTART5431; GFX90A-NEXT: ; def a[0:1]5432; GFX90A-NEXT: ;;#ASMEND5433; GFX90A-NEXT: v_accvgpr_read_b32 v3, a15434; GFX90A-NEXT: v_accvgpr_read_b32 v2, a05435; GFX90A-NEXT: global_atomic_umin_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5436; GFX90A-NEXT: s_waitcnt vmcnt(0)5437; GFX90A-NEXT: v_accvgpr_write_b32 a0, v05438; GFX90A-NEXT: v_accvgpr_write_b32 a1, v15439; GFX90A-NEXT: ;;#ASMSTART5440; GFX90A-NEXT: ; use a[0:1]5441; GFX90A-NEXT: ;;#ASMEND5442; GFX90A-NEXT: s_setpc_b64 s[30:31]5443;5444; GFX950-LABEL: global_atomic_umin_i64_ret_a_a:5445; GFX950: ; %bb.0:5446; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5447; GFX950-NEXT: ;;#ASMSTART5448; GFX950-NEXT: ; def a[0:1]5449; GFX950-NEXT: ;;#ASMEND5450; GFX950-NEXT: s_nop 05451; GFX950-NEXT: v_accvgpr_read_b32 v3, a15452; GFX950-NEXT: v_accvgpr_read_b32 v2, a05453; GFX950-NEXT: global_atomic_umin_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05454; GFX950-NEXT: s_waitcnt vmcnt(0)5455; GFX950-NEXT: v_accvgpr_write_b32 a0, v05456; GFX950-NEXT: v_accvgpr_write_b32 a1, v15457; GFX950-NEXT: ;;#ASMSTART5458; GFX950-NEXT: ; use a[0:1]5459; GFX950-NEXT: ;;#ASMEND5460; GFX950-NEXT: s_setpc_b64 s[30:31]5461 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105462 %data = call i64 asm "; def $0", "=a"()5463 %result = atomicrmw umin ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05464 call void asm "; use $0", "a"(i64 %result)5465 ret void5466}5467 5468define void @global_atomic_umin_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5469; GFX90A-LABEL: global_atomic_umin_i64_ret_av_av:5470; GFX90A: ; %bb.0:5471; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5472; GFX90A-NEXT: ;;#ASMSTART5473; GFX90A-NEXT: ; def v[2:3]5474; GFX90A-NEXT: ;;#ASMEND5475; GFX90A-NEXT: global_atomic_umin_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5476; GFX90A-NEXT: s_waitcnt vmcnt(0)5477; GFX90A-NEXT: ;;#ASMSTART5478; GFX90A-NEXT: ; use v[0:1]5479; GFX90A-NEXT: ;;#ASMEND5480; GFX90A-NEXT: s_setpc_b64 s[30:31]5481;5482; GFX950-LABEL: global_atomic_umin_i64_ret_av_av:5483; GFX950: ; %bb.0:5484; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5485; GFX950-NEXT: ;;#ASMSTART5486; GFX950-NEXT: ; def v[2:3]5487; GFX950-NEXT: ;;#ASMEND5488; GFX950-NEXT: global_atomic_umin_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05489; GFX950-NEXT: s_waitcnt vmcnt(0)5490; GFX950-NEXT: ;;#ASMSTART5491; GFX950-NEXT: ; use v[0:1]5492; GFX950-NEXT: ;;#ASMEND5493; GFX950-NEXT: s_setpc_b64 s[30:31]5494 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105495 %data = call i64 asm "; def $0", "=^VA"()5496 %result = atomicrmw umin ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05497 call void asm "; use $0", "^VA"(i64 %result)5498 ret void5499}5500 5501define void @global_atomic_uinc_wrap_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5502; GFX90A-LABEL: global_atomic_uinc_wrap_i64_ret_a_a:5503; GFX90A: ; %bb.0:5504; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5505; GFX90A-NEXT: ;;#ASMSTART5506; GFX90A-NEXT: ; def a[0:1]5507; GFX90A-NEXT: ;;#ASMEND5508; GFX90A-NEXT: v_accvgpr_read_b32 v3, a15509; GFX90A-NEXT: v_accvgpr_read_b32 v2, a05510; GFX90A-NEXT: global_atomic_inc_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5511; GFX90A-NEXT: s_waitcnt vmcnt(0)5512; GFX90A-NEXT: v_accvgpr_write_b32 a0, v05513; GFX90A-NEXT: v_accvgpr_write_b32 a1, v15514; GFX90A-NEXT: ;;#ASMSTART5515; GFX90A-NEXT: ; use a[0:1]5516; GFX90A-NEXT: ;;#ASMEND5517; GFX90A-NEXT: s_setpc_b64 s[30:31]5518;5519; GFX950-LABEL: global_atomic_uinc_wrap_i64_ret_a_a:5520; GFX950: ; %bb.0:5521; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5522; GFX950-NEXT: ;;#ASMSTART5523; GFX950-NEXT: ; def a[0:1]5524; GFX950-NEXT: ;;#ASMEND5525; GFX950-NEXT: s_nop 05526; GFX950-NEXT: v_accvgpr_read_b32 v3, a15527; GFX950-NEXT: v_accvgpr_read_b32 v2, a05528; GFX950-NEXT: global_atomic_inc_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05529; GFX950-NEXT: s_waitcnt vmcnt(0)5530; GFX950-NEXT: v_accvgpr_write_b32 a0, v05531; GFX950-NEXT: v_accvgpr_write_b32 a1, v15532; GFX950-NEXT: ;;#ASMSTART5533; GFX950-NEXT: ; use a[0:1]5534; GFX950-NEXT: ;;#ASMEND5535; GFX950-NEXT: s_setpc_b64 s[30:31]5536 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105537 %data = call i64 asm "; def $0", "=a"()5538 %result = atomicrmw uinc_wrap ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05539 call void asm "; use $0", "a"(i64 %result)5540 ret void5541}5542 5543define void @global_atomic_uinc_wrap_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5544; GFX90A-LABEL: global_atomic_uinc_wrap_i64_ret_av_av:5545; GFX90A: ; %bb.0:5546; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5547; GFX90A-NEXT: ;;#ASMSTART5548; GFX90A-NEXT: ; def v[2:3]5549; GFX90A-NEXT: ;;#ASMEND5550; GFX90A-NEXT: global_atomic_inc_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5551; GFX90A-NEXT: s_waitcnt vmcnt(0)5552; GFX90A-NEXT: ;;#ASMSTART5553; GFX90A-NEXT: ; use v[0:1]5554; GFX90A-NEXT: ;;#ASMEND5555; GFX90A-NEXT: s_setpc_b64 s[30:31]5556;5557; GFX950-LABEL: global_atomic_uinc_wrap_i64_ret_av_av:5558; GFX950: ; %bb.0:5559; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5560; GFX950-NEXT: ;;#ASMSTART5561; GFX950-NEXT: ; def v[2:3]5562; GFX950-NEXT: ;;#ASMEND5563; GFX950-NEXT: global_atomic_inc_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05564; GFX950-NEXT: s_waitcnt vmcnt(0)5565; GFX950-NEXT: ;;#ASMSTART5566; GFX950-NEXT: ; use v[0:1]5567; GFX950-NEXT: ;;#ASMEND5568; GFX950-NEXT: s_setpc_b64 s[30:31]5569 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105570 %data = call i64 asm "; def $0", "=^VA"()5571 %result = atomicrmw uinc_wrap ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05572 call void asm "; use $0", "^VA"(i64 %result)5573 ret void5574}5575 5576define void @global_atomic_udec_wrap_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5577; GFX90A-LABEL: global_atomic_udec_wrap_i64_ret_a_a:5578; GFX90A: ; %bb.0:5579; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5580; GFX90A-NEXT: ;;#ASMSTART5581; GFX90A-NEXT: ; def a[0:1]5582; GFX90A-NEXT: ;;#ASMEND5583; GFX90A-NEXT: v_accvgpr_read_b32 v3, a15584; GFX90A-NEXT: v_accvgpr_read_b32 v2, a05585; GFX90A-NEXT: global_atomic_dec_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5586; GFX90A-NEXT: s_waitcnt vmcnt(0)5587; GFX90A-NEXT: v_accvgpr_write_b32 a0, v05588; GFX90A-NEXT: v_accvgpr_write_b32 a1, v15589; GFX90A-NEXT: ;;#ASMSTART5590; GFX90A-NEXT: ; use a[0:1]5591; GFX90A-NEXT: ;;#ASMEND5592; GFX90A-NEXT: s_setpc_b64 s[30:31]5593;5594; GFX950-LABEL: global_atomic_udec_wrap_i64_ret_a_a:5595; GFX950: ; %bb.0:5596; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5597; GFX950-NEXT: ;;#ASMSTART5598; GFX950-NEXT: ; def a[0:1]5599; GFX950-NEXT: ;;#ASMEND5600; GFX950-NEXT: s_nop 05601; GFX950-NEXT: v_accvgpr_read_b32 v3, a15602; GFX950-NEXT: v_accvgpr_read_b32 v2, a05603; GFX950-NEXT: global_atomic_dec_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05604; GFX950-NEXT: s_waitcnt vmcnt(0)5605; GFX950-NEXT: v_accvgpr_write_b32 a0, v05606; GFX950-NEXT: v_accvgpr_write_b32 a1, v15607; GFX950-NEXT: ;;#ASMSTART5608; GFX950-NEXT: ; use a[0:1]5609; GFX950-NEXT: ;;#ASMEND5610; GFX950-NEXT: s_setpc_b64 s[30:31]5611 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105612 %data = call i64 asm "; def $0", "=a"()5613 %result = atomicrmw udec_wrap ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05614 call void asm "; use $0", "a"(i64 %result)5615 ret void5616}5617 5618define void @global_atomic_udec_wrap_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5619; GFX90A-LABEL: global_atomic_udec_wrap_i64_ret_av_av:5620; GFX90A: ; %bb.0:5621; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5622; GFX90A-NEXT: ;;#ASMSTART5623; GFX90A-NEXT: ; def v[2:3]5624; GFX90A-NEXT: ;;#ASMEND5625; GFX90A-NEXT: global_atomic_dec_x2 v[0:1], v[0:1], v[2:3], off offset:80 glc5626; GFX90A-NEXT: s_waitcnt vmcnt(0)5627; GFX90A-NEXT: ;;#ASMSTART5628; GFX90A-NEXT: ; use v[0:1]5629; GFX90A-NEXT: ;;#ASMEND5630; GFX90A-NEXT: s_setpc_b64 s[30:31]5631;5632; GFX950-LABEL: global_atomic_udec_wrap_i64_ret_av_av:5633; GFX950: ; %bb.0:5634; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5635; GFX950-NEXT: ;;#ASMSTART5636; GFX950-NEXT: ; def v[2:3]5637; GFX950-NEXT: ;;#ASMEND5638; GFX950-NEXT: global_atomic_dec_x2 v[0:1], v[0:1], v[2:3], off offset:80 sc05639; GFX950-NEXT: s_waitcnt vmcnt(0)5640; GFX950-NEXT: ;;#ASMSTART5641; GFX950-NEXT: ; use v[0:1]5642; GFX950-NEXT: ;;#ASMEND5643; GFX950-NEXT: s_setpc_b64 s[30:31]5644 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105645 %data = call i64 asm "; def $0", "=^VA"()5646 %result = atomicrmw udec_wrap ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05647 call void asm "; use $0", "^VA"(i64 %result)5648 ret void5649}5650 5651define void @global_atomic_usub_cond_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5652; GFX90A-LABEL: global_atomic_usub_cond_i64_ret_a_a:5653; GFX90A: ; %bb.0:5654; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5655; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805656; GFX90A-NEXT: ;;#ASMSTART5657; GFX90A-NEXT: ; def a[0:1]5658; GFX90A-NEXT: ;;#ASMEND5659; GFX90A-NEXT: v_accvgpr_read_b32 v7, a15660; GFX90A-NEXT: v_accvgpr_read_b32 v6, a05661; GFX90A-NEXT: s_mov_b64 s[4:5], 05662; GFX90A-NEXT: .LBB111_1: ; %atomicrmw.start5663; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=15664; GFX90A-NEXT: s_waitcnt vmcnt(0)5665; GFX90A-NEXT: v_sub_co_u32_e32 v2, vcc, v4, v65666; GFX90A-NEXT: v_subb_co_u32_e32 v3, vcc, v5, v7, vcc5667; GFX90A-NEXT: v_cmp_ge_u64_e32 vcc, v[4:5], v[6:7]5668; GFX90A-NEXT: v_cndmask_b32_e32 v3, v5, v3, vcc5669; GFX90A-NEXT: v_cndmask_b32_e32 v2, v4, v2, vcc5670; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc5671; GFX90A-NEXT: s_waitcnt vmcnt(0)5672; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5673; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]5674; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]5675; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]5676; GFX90A-NEXT: s_cbranch_execnz .LBB111_15677; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end5678; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]5679; GFX90A-NEXT: v_accvgpr_write_b32 a0, v25680; GFX90A-NEXT: v_accvgpr_write_b32 a1, v35681; GFX90A-NEXT: ;;#ASMSTART5682; GFX90A-NEXT: ; use a[0:1]5683; GFX90A-NEXT: ;;#ASMEND5684; GFX90A-NEXT: s_setpc_b64 s[30:31]5685;5686; GFX950-LABEL: global_atomic_usub_cond_i64_ret_a_a:5687; GFX950: ; %bb.0:5688; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5689; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805690; GFX950-NEXT: ;;#ASMSTART5691; GFX950-NEXT: ; def a[0:1]5692; GFX950-NEXT: ;;#ASMEND5693; GFX950-NEXT: s_mov_b64 s[0:1], 05694; GFX950-NEXT: v_accvgpr_read_b32 v7, a15695; GFX950-NEXT: v_accvgpr_read_b32 v6, a05696; GFX950-NEXT: .LBB111_1: ; %atomicrmw.start5697; GFX950-NEXT: ; =>This Inner Loop Header: Depth=15698; GFX950-NEXT: s_waitcnt vmcnt(0)5699; GFX950-NEXT: v_sub_co_u32_e32 v2, vcc, v4, v65700; GFX950-NEXT: s_nop 15701; GFX950-NEXT: v_subb_co_u32_e32 v3, vcc, v5, v7, vcc5702; GFX950-NEXT: v_cmp_ge_u64_e32 vcc, v[4:5], v[6:7]5703; GFX950-NEXT: s_nop 15704; GFX950-NEXT: v_cndmask_b32_e32 v3, v5, v3, vcc5705; GFX950-NEXT: v_cndmask_b32_e32 v2, v4, v2, vcc5706; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc05707; GFX950-NEXT: s_waitcnt vmcnt(0)5708; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5709; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]5710; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]5711; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]5712; GFX950-NEXT: s_cbranch_execnz .LBB111_15713; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end5714; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]5715; GFX950-NEXT: v_accvgpr_write_b32 a0, v25716; GFX950-NEXT: v_accvgpr_write_b32 a1, v35717; GFX950-NEXT: ;;#ASMSTART5718; GFX950-NEXT: ; use a[0:1]5719; GFX950-NEXT: ;;#ASMEND5720; GFX950-NEXT: s_setpc_b64 s[30:31]5721 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105722 %data = call i64 asm "; def $0", "=a"()5723 %result = atomicrmw usub_cond ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05724 call void asm "; use $0", "a"(i64 %result)5725 ret void5726}5727 5728define void @global_atomic_usub_cond_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5729; GFX90A-LABEL: global_atomic_usub_cond_i64_ret_av_av:5730; GFX90A: ; %bb.0:5731; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5732; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805733; GFX90A-NEXT: s_mov_b64 s[4:5], 05734; GFX90A-NEXT: ;;#ASMSTART5735; GFX90A-NEXT: ; def v[6:7]5736; GFX90A-NEXT: ;;#ASMEND5737; GFX90A-NEXT: .LBB112_1: ; %atomicrmw.start5738; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=15739; GFX90A-NEXT: s_waitcnt vmcnt(0)5740; GFX90A-NEXT: v_sub_co_u32_e32 v2, vcc, v4, v65741; GFX90A-NEXT: v_subb_co_u32_e32 v3, vcc, v5, v7, vcc5742; GFX90A-NEXT: v_cmp_ge_u64_e32 vcc, v[4:5], v[6:7]5743; GFX90A-NEXT: v_cndmask_b32_e32 v3, v5, v3, vcc5744; GFX90A-NEXT: v_cndmask_b32_e32 v2, v4, v2, vcc5745; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc5746; GFX90A-NEXT: s_waitcnt vmcnt(0)5747; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5748; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]5749; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]5750; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]5751; GFX90A-NEXT: s_cbranch_execnz .LBB112_15752; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end5753; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]5754; GFX90A-NEXT: ;;#ASMSTART5755; GFX90A-NEXT: ; use v[2:3]5756; GFX90A-NEXT: ;;#ASMEND5757; GFX90A-NEXT: s_setpc_b64 s[30:31]5758;5759; GFX950-LABEL: global_atomic_usub_cond_i64_ret_av_av:5760; GFX950: ; %bb.0:5761; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5762; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805763; GFX950-NEXT: s_mov_b64 s[0:1], 05764; GFX950-NEXT: ;;#ASMSTART5765; GFX950-NEXT: ; def v[6:7]5766; GFX950-NEXT: ;;#ASMEND5767; GFX950-NEXT: .LBB112_1: ; %atomicrmw.start5768; GFX950-NEXT: ; =>This Inner Loop Header: Depth=15769; GFX950-NEXT: s_waitcnt vmcnt(0)5770; GFX950-NEXT: v_sub_co_u32_e32 v2, vcc, v4, v65771; GFX950-NEXT: s_nop 15772; GFX950-NEXT: v_subb_co_u32_e32 v3, vcc, v5, v7, vcc5773; GFX950-NEXT: v_cmp_ge_u64_e32 vcc, v[4:5], v[6:7]5774; GFX950-NEXT: s_nop 15775; GFX950-NEXT: v_cndmask_b32_e32 v3, v5, v3, vcc5776; GFX950-NEXT: v_cndmask_b32_e32 v2, v4, v2, vcc5777; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc05778; GFX950-NEXT: s_waitcnt vmcnt(0)5779; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5780; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]5781; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]5782; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]5783; GFX950-NEXT: s_cbranch_execnz .LBB112_15784; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end5785; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]5786; GFX950-NEXT: ;;#ASMSTART5787; GFX950-NEXT: ; use v[2:3]5788; GFX950-NEXT: ;;#ASMEND5789; GFX950-NEXT: s_setpc_b64 s[30:31]5790 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105791 %data = call i64 asm "; def $0", "=^VA"()5792 %result = atomicrmw usub_cond ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05793 call void asm "; use $0", "^VA"(i64 %result)5794 ret void5795}5796 5797define void @global_atomic_usub_sat_i64_ret_a_a(ptr addrspace(1) %ptr) #0 {5798; GFX90A-LABEL: global_atomic_usub_sat_i64_ret_a_a:5799; GFX90A: ; %bb.0:5800; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5801; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805802; GFX90A-NEXT: ;;#ASMSTART5803; GFX90A-NEXT: ; def a[0:1]5804; GFX90A-NEXT: ;;#ASMEND5805; GFX90A-NEXT: v_accvgpr_read_b32 v7, a15806; GFX90A-NEXT: v_accvgpr_read_b32 v6, a05807; GFX90A-NEXT: s_mov_b64 s[4:5], 05808; GFX90A-NEXT: .LBB113_1: ; %atomicrmw.start5809; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=15810; GFX90A-NEXT: s_waitcnt vmcnt(0)5811; GFX90A-NEXT: v_sub_co_u32_e32 v2, vcc, v4, v65812; GFX90A-NEXT: v_subb_co_u32_e32 v3, vcc, v5, v7, vcc5813; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc5814; GFX90A-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc5815; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc5816; GFX90A-NEXT: s_waitcnt vmcnt(0)5817; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5818; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]5819; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]5820; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]5821; GFX90A-NEXT: s_cbranch_execnz .LBB113_15822; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end5823; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]5824; GFX90A-NEXT: v_accvgpr_write_b32 a0, v25825; GFX90A-NEXT: v_accvgpr_write_b32 a1, v35826; GFX90A-NEXT: ;;#ASMSTART5827; GFX90A-NEXT: ; use a[0:1]5828; GFX90A-NEXT: ;;#ASMEND5829; GFX90A-NEXT: s_setpc_b64 s[30:31]5830;5831; GFX950-LABEL: global_atomic_usub_sat_i64_ret_a_a:5832; GFX950: ; %bb.0:5833; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5834; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805835; GFX950-NEXT: ;;#ASMSTART5836; GFX950-NEXT: ; def a[0:1]5837; GFX950-NEXT: ;;#ASMEND5838; GFX950-NEXT: s_mov_b64 s[0:1], 05839; GFX950-NEXT: v_accvgpr_read_b32 v7, a15840; GFX950-NEXT: v_accvgpr_read_b32 v6, a05841; GFX950-NEXT: .LBB113_1: ; %atomicrmw.start5842; GFX950-NEXT: ; =>This Inner Loop Header: Depth=15843; GFX950-NEXT: s_waitcnt vmcnt(0)5844; GFX950-NEXT: v_sub_co_u32_e32 v2, vcc, v4, v65845; GFX950-NEXT: s_nop 15846; GFX950-NEXT: v_subb_co_u32_e32 v3, vcc, v5, v7, vcc5847; GFX950-NEXT: s_nop 15848; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc5849; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc5850; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc05851; GFX950-NEXT: s_waitcnt vmcnt(0)5852; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5853; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]5854; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]5855; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]5856; GFX950-NEXT: s_cbranch_execnz .LBB113_15857; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end5858; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]5859; GFX950-NEXT: v_accvgpr_write_b32 a0, v25860; GFX950-NEXT: v_accvgpr_write_b32 a1, v35861; GFX950-NEXT: ;;#ASMSTART5862; GFX950-NEXT: ; use a[0:1]5863; GFX950-NEXT: ;;#ASMEND5864; GFX950-NEXT: s_setpc_b64 s[30:31]5865 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105866 %data = call i64 asm "; def $0", "=a"()5867 %result = atomicrmw usub_sat ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05868 call void asm "; use $0", "a"(i64 %result)5869 ret void5870}5871 5872define void @global_atomic_usub_sat_i64_ret_av_av(ptr addrspace(1) %ptr) #0 {5873; GFX90A-LABEL: global_atomic_usub_sat_i64_ret_av_av:5874; GFX90A: ; %bb.0:5875; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5876; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805877; GFX90A-NEXT: s_mov_b64 s[4:5], 05878; GFX90A-NEXT: ;;#ASMSTART5879; GFX90A-NEXT: ; def v[6:7]5880; GFX90A-NEXT: ;;#ASMEND5881; GFX90A-NEXT: .LBB114_1: ; %atomicrmw.start5882; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=15883; GFX90A-NEXT: s_waitcnt vmcnt(0)5884; GFX90A-NEXT: v_sub_co_u32_e32 v2, vcc, v4, v65885; GFX90A-NEXT: v_subb_co_u32_e32 v3, vcc, v5, v7, vcc5886; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc5887; GFX90A-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc5888; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc5889; GFX90A-NEXT: s_waitcnt vmcnt(0)5890; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5891; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]5892; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]5893; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]5894; GFX90A-NEXT: s_cbranch_execnz .LBB114_15895; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end5896; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]5897; GFX90A-NEXT: ;;#ASMSTART5898; GFX90A-NEXT: ; use v[2:3]5899; GFX90A-NEXT: ;;#ASMEND5900; GFX90A-NEXT: s_setpc_b64 s[30:31]5901;5902; GFX950-LABEL: global_atomic_usub_sat_i64_ret_av_av:5903; GFX950: ; %bb.0:5904; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5905; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:805906; GFX950-NEXT: s_mov_b64 s[0:1], 05907; GFX950-NEXT: ;;#ASMSTART5908; GFX950-NEXT: ; def v[6:7]5909; GFX950-NEXT: ;;#ASMEND5910; GFX950-NEXT: .LBB114_1: ; %atomicrmw.start5911; GFX950-NEXT: ; =>This Inner Loop Header: Depth=15912; GFX950-NEXT: s_waitcnt vmcnt(0)5913; GFX950-NEXT: v_sub_co_u32_e32 v2, vcc, v4, v65914; GFX950-NEXT: s_nop 15915; GFX950-NEXT: v_subb_co_u32_e32 v3, vcc, v5, v7, vcc5916; GFX950-NEXT: s_nop 15917; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc5918; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc5919; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc05920; GFX950-NEXT: s_waitcnt vmcnt(0)5921; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]5922; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]5923; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]5924; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]5925; GFX950-NEXT: s_cbranch_execnz .LBB114_15926; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end5927; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]5928; GFX950-NEXT: ;;#ASMSTART5929; GFX950-NEXT: ; use v[2:3]5930; GFX950-NEXT: ;;#ASMEND5931; GFX950-NEXT: s_setpc_b64 s[30:31]5932 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 105933 %data = call i64 asm "; def $0", "=^VA"()5934 %result = atomicrmw usub_sat ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !05935 call void asm "; use $0", "^VA"(i64 %result)5936 ret void5937}5938 5939;---------------------------------------------------------------------5940; other atomics f32, with aa+av cases5941;---------------------------------------------------------------------5942 5943define void @global_atomic_fadd_f32_ret_a_a(ptr addrspace(1) %ptr) #0 {5944; GFX90A-LABEL: global_atomic_fadd_f32_ret_a_a:5945; GFX90A: ; %bb.0:5946; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5947; GFX90A-NEXT: ;;#ASMSTART5948; GFX90A-NEXT: ; def a05949; GFX90A-NEXT: ;;#ASMEND5950; GFX90A-NEXT: v_accvgpr_read_b32 v2, a05951; GFX90A-NEXT: global_atomic_add_f32 v0, v[0:1], v2, off offset:40 glc5952; GFX90A-NEXT: s_waitcnt vmcnt(0)5953; GFX90A-NEXT: v_accvgpr_write_b32 a0, v05954; GFX90A-NEXT: ;;#ASMSTART5955; GFX90A-NEXT: ; use a05956; GFX90A-NEXT: ;;#ASMEND5957; GFX90A-NEXT: s_setpc_b64 s[30:31]5958;5959; GFX950-LABEL: global_atomic_fadd_f32_ret_a_a:5960; GFX950: ; %bb.0:5961; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5962; GFX950-NEXT: ;;#ASMSTART5963; GFX950-NEXT: ; def a05964; GFX950-NEXT: ;;#ASMEND5965; GFX950-NEXT: s_nop 05966; GFX950-NEXT: v_accvgpr_read_b32 v2, a05967; GFX950-NEXT: global_atomic_add_f32 v0, v[0:1], v2, off offset:40 sc05968; GFX950-NEXT: s_waitcnt vmcnt(0)5969; GFX950-NEXT: v_accvgpr_write_b32 a0, v05970; GFX950-NEXT: ;;#ASMSTART5971; GFX950-NEXT: ; use a05972; GFX950-NEXT: ;;#ASMEND5973; GFX950-NEXT: s_setpc_b64 s[30:31]5974 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 105975 %data = call float asm "; def $0", "=a"()5976 %result = atomicrmw fadd ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !05977 call void asm "; use $0", "a"(float %result)5978 ret void5979}5980 5981define void @global_atomic_fadd_f32_ret_av_av(ptr addrspace(1) %ptr) #0 {5982; GFX90A-LABEL: global_atomic_fadd_f32_ret_av_av:5983; GFX90A: ; %bb.0:5984; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5985; GFX90A-NEXT: ;;#ASMSTART5986; GFX90A-NEXT: ; def v25987; GFX90A-NEXT: ;;#ASMEND5988; GFX90A-NEXT: global_atomic_add_f32 v0, v[0:1], v2, off offset:40 glc5989; GFX90A-NEXT: s_waitcnt vmcnt(0)5990; GFX90A-NEXT: ;;#ASMSTART5991; GFX90A-NEXT: ; use v05992; GFX90A-NEXT: ;;#ASMEND5993; GFX90A-NEXT: s_setpc_b64 s[30:31]5994;5995; GFX950-LABEL: global_atomic_fadd_f32_ret_av_av:5996; GFX950: ; %bb.0:5997; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5998; GFX950-NEXT: ;;#ASMSTART5999; GFX950-NEXT: ; def v26000; GFX950-NEXT: ;;#ASMEND6001; GFX950-NEXT: global_atomic_add_f32 v0, v[0:1], v2, off offset:40 sc06002; GFX950-NEXT: s_waitcnt vmcnt(0)6003; GFX950-NEXT: ;;#ASMSTART6004; GFX950-NEXT: ; use v06005; GFX950-NEXT: ;;#ASMEND6006; GFX950-NEXT: s_setpc_b64 s[30:31]6007 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106008 %data = call float asm "; def $0", "=^VA"()6009 %result = atomicrmw fadd ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06010 call void asm "; use $0", "^VA"(float %result)6011 ret void6012}6013 6014define void @global_atomic_fsub_f32_ret_a_a(ptr addrspace(1) %ptr) #0 {6015; GFX90A-LABEL: global_atomic_fsub_f32_ret_a_a:6016; GFX90A: ; %bb.0:6017; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6018; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406019; GFX90A-NEXT: ;;#ASMSTART6020; GFX90A-NEXT: ; def a06021; GFX90A-NEXT: ;;#ASMEND6022; GFX90A-NEXT: v_accvgpr_read_b32 v4, a06023; GFX90A-NEXT: s_mov_b64 s[4:5], 06024; GFX90A-NEXT: .LBB117_1: ; %atomicrmw.start6025; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16026; GFX90A-NEXT: s_waitcnt vmcnt(0)6027; GFX90A-NEXT: v_sub_f32_e32 v2, v3, v46028; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6029; GFX90A-NEXT: s_waitcnt vmcnt(0)6030; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36031; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6032; GFX90A-NEXT: v_mov_b32_e32 v3, v26033; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6034; GFX90A-NEXT: s_cbranch_execnz .LBB117_16035; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6036; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6037; GFX90A-NEXT: v_accvgpr_write_b32 a0, v26038; GFX90A-NEXT: ;;#ASMSTART6039; GFX90A-NEXT: ; use a06040; GFX90A-NEXT: ;;#ASMEND6041; GFX90A-NEXT: s_setpc_b64 s[30:31]6042;6043; GFX950-LABEL: global_atomic_fsub_f32_ret_a_a:6044; GFX950: ; %bb.0:6045; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6046; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406047; GFX950-NEXT: ;;#ASMSTART6048; GFX950-NEXT: ; def a06049; GFX950-NEXT: ;;#ASMEND6050; GFX950-NEXT: s_mov_b64 s[0:1], 06051; GFX950-NEXT: v_accvgpr_read_b32 v4, a06052; GFX950-NEXT: .LBB117_1: ; %atomicrmw.start6053; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16054; GFX950-NEXT: s_waitcnt vmcnt(0)6055; GFX950-NEXT: v_sub_f32_e32 v2, v3, v46056; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06057; GFX950-NEXT: s_waitcnt vmcnt(0)6058; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36059; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6060; GFX950-NEXT: v_mov_b32_e32 v3, v26061; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6062; GFX950-NEXT: s_cbranch_execnz .LBB117_16063; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6064; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6065; GFX950-NEXT: v_accvgpr_write_b32 a0, v26066; GFX950-NEXT: ;;#ASMSTART6067; GFX950-NEXT: ; use a06068; GFX950-NEXT: ;;#ASMEND6069; GFX950-NEXT: s_setpc_b64 s[30:31]6070 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106071 %data = call float asm "; def $0", "=a"()6072 %result = atomicrmw fsub ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06073 call void asm "; use $0", "a"(float %result)6074 ret void6075}6076 6077define void @global_atomic_fsub_f32_ret_av_av(ptr addrspace(1) %ptr) #0 {6078; GFX90A-LABEL: global_atomic_fsub_f32_ret_av_av:6079; GFX90A: ; %bb.0:6080; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6081; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406082; GFX90A-NEXT: s_mov_b64 s[4:5], 06083; GFX90A-NEXT: ;;#ASMSTART6084; GFX90A-NEXT: ; def v46085; GFX90A-NEXT: ;;#ASMEND6086; GFX90A-NEXT: .LBB118_1: ; %atomicrmw.start6087; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16088; GFX90A-NEXT: s_waitcnt vmcnt(0)6089; GFX90A-NEXT: v_sub_f32_e32 v2, v3, v46090; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6091; GFX90A-NEXT: s_waitcnt vmcnt(0)6092; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36093; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6094; GFX90A-NEXT: v_mov_b32_e32 v3, v26095; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6096; GFX90A-NEXT: s_cbranch_execnz .LBB118_16097; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6098; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6099; GFX90A-NEXT: ;;#ASMSTART6100; GFX90A-NEXT: ; use v26101; GFX90A-NEXT: ;;#ASMEND6102; GFX90A-NEXT: s_setpc_b64 s[30:31]6103;6104; GFX950-LABEL: global_atomic_fsub_f32_ret_av_av:6105; GFX950: ; %bb.0:6106; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6107; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406108; GFX950-NEXT: s_mov_b64 s[0:1], 06109; GFX950-NEXT: ;;#ASMSTART6110; GFX950-NEXT: ; def v46111; GFX950-NEXT: ;;#ASMEND6112; GFX950-NEXT: .LBB118_1: ; %atomicrmw.start6113; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16114; GFX950-NEXT: s_waitcnt vmcnt(0)6115; GFX950-NEXT: v_sub_f32_e32 v2, v3, v46116; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06117; GFX950-NEXT: s_waitcnt vmcnt(0)6118; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36119; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6120; GFX950-NEXT: v_mov_b32_e32 v3, v26121; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6122; GFX950-NEXT: s_cbranch_execnz .LBB118_16123; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6124; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6125; GFX950-NEXT: ;;#ASMSTART6126; GFX950-NEXT: ; use v26127; GFX950-NEXT: ;;#ASMEND6128; GFX950-NEXT: s_setpc_b64 s[30:31]6129 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106130 %data = call float asm "; def $0", "=^VA"()6131 %result = atomicrmw fsub ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06132 call void asm "; use $0", "^VA"(float %result)6133 ret void6134}6135 6136define void @global_atomic_fmax_f32_ret_a_a(ptr addrspace(1) %ptr) #0 {6137; GFX90A-LABEL: global_atomic_fmax_f32_ret_a_a:6138; GFX90A: ; %bb.0:6139; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6140; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406141; GFX90A-NEXT: ;;#ASMSTART6142; GFX90A-NEXT: ; def a06143; GFX90A-NEXT: ;;#ASMEND6144; GFX90A-NEXT: v_accvgpr_read_b32 v2, a06145; GFX90A-NEXT: s_mov_b64 s[4:5], 06146; GFX90A-NEXT: v_max_f32_e32 v4, v2, v26147; GFX90A-NEXT: .LBB119_1: ; %atomicrmw.start6148; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16149; GFX90A-NEXT: s_waitcnt vmcnt(0)6150; GFX90A-NEXT: v_max_f32_e32 v2, v3, v36151; GFX90A-NEXT: v_max_f32_e32 v2, v2, v46152; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6153; GFX90A-NEXT: s_waitcnt vmcnt(0)6154; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36155; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6156; GFX90A-NEXT: v_mov_b32_e32 v3, v26157; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6158; GFX90A-NEXT: s_cbranch_execnz .LBB119_16159; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6160; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6161; GFX90A-NEXT: v_accvgpr_write_b32 a0, v26162; GFX90A-NEXT: ;;#ASMSTART6163; GFX90A-NEXT: ; use a06164; GFX90A-NEXT: ;;#ASMEND6165; GFX90A-NEXT: s_setpc_b64 s[30:31]6166;6167; GFX950-LABEL: global_atomic_fmax_f32_ret_a_a:6168; GFX950: ; %bb.0:6169; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6170; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406171; GFX950-NEXT: ;;#ASMSTART6172; GFX950-NEXT: ; def a06173; GFX950-NEXT: ;;#ASMEND6174; GFX950-NEXT: s_mov_b64 s[0:1], 06175; GFX950-NEXT: v_accvgpr_read_b32 v2, a06176; GFX950-NEXT: v_max_f32_e32 v4, v2, v26177; GFX950-NEXT: .LBB119_1: ; %atomicrmw.start6178; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16179; GFX950-NEXT: s_waitcnt vmcnt(0)6180; GFX950-NEXT: v_max_f32_e32 v2, v3, v36181; GFX950-NEXT: v_max_f32_e32 v2, v2, v46182; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06183; GFX950-NEXT: s_waitcnt vmcnt(0)6184; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36185; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6186; GFX950-NEXT: v_mov_b32_e32 v3, v26187; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6188; GFX950-NEXT: s_cbranch_execnz .LBB119_16189; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6190; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6191; GFX950-NEXT: v_accvgpr_write_b32 a0, v26192; GFX950-NEXT: ;;#ASMSTART6193; GFX950-NEXT: ; use a06194; GFX950-NEXT: ;;#ASMEND6195; GFX950-NEXT: s_setpc_b64 s[30:31]6196 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106197 %data = call float asm "; def $0", "=a"()6198 %result = atomicrmw fmax ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06199 call void asm "; use $0", "a"(float %result)6200 ret void6201}6202 6203define void @global_atomic_fmax_f32_ret_av_av(ptr addrspace(1) %ptr) #0 {6204; GFX90A-LABEL: global_atomic_fmax_f32_ret_av_av:6205; GFX90A: ; %bb.0:6206; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6207; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406208; GFX90A-NEXT: ;;#ASMSTART6209; GFX90A-NEXT: ; def v26210; GFX90A-NEXT: ;;#ASMEND6211; GFX90A-NEXT: s_mov_b64 s[4:5], 06212; GFX90A-NEXT: v_max_f32_e32 v4, v2, v26213; GFX90A-NEXT: .LBB120_1: ; %atomicrmw.start6214; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16215; GFX90A-NEXT: s_waitcnt vmcnt(0)6216; GFX90A-NEXT: v_max_f32_e32 v2, v3, v36217; GFX90A-NEXT: v_max_f32_e32 v2, v2, v46218; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6219; GFX90A-NEXT: s_waitcnt vmcnt(0)6220; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36221; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6222; GFX90A-NEXT: v_mov_b32_e32 v3, v26223; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6224; GFX90A-NEXT: s_cbranch_execnz .LBB120_16225; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6226; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6227; GFX90A-NEXT: ;;#ASMSTART6228; GFX90A-NEXT: ; use v26229; GFX90A-NEXT: ;;#ASMEND6230; GFX90A-NEXT: s_setpc_b64 s[30:31]6231;6232; GFX950-LABEL: global_atomic_fmax_f32_ret_av_av:6233; GFX950: ; %bb.0:6234; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6235; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406236; GFX950-NEXT: ;;#ASMSTART6237; GFX950-NEXT: ; def v26238; GFX950-NEXT: ;;#ASMEND6239; GFX950-NEXT: s_mov_b64 s[0:1], 06240; GFX950-NEXT: v_max_f32_e32 v4, v2, v26241; GFX950-NEXT: .LBB120_1: ; %atomicrmw.start6242; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16243; GFX950-NEXT: s_waitcnt vmcnt(0)6244; GFX950-NEXT: v_max_f32_e32 v2, v3, v36245; GFX950-NEXT: v_max_f32_e32 v2, v2, v46246; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06247; GFX950-NEXT: s_waitcnt vmcnt(0)6248; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36249; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6250; GFX950-NEXT: v_mov_b32_e32 v3, v26251; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6252; GFX950-NEXT: s_cbranch_execnz .LBB120_16253; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6254; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6255; GFX950-NEXT: ;;#ASMSTART6256; GFX950-NEXT: ; use v26257; GFX950-NEXT: ;;#ASMEND6258; GFX950-NEXT: s_setpc_b64 s[30:31]6259 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106260 %data = call float asm "; def $0", "=^VA"()6261 %result = atomicrmw fmax ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06262 call void asm "; use $0", "^VA"(float %result)6263 ret void6264}6265 6266define void @global_atomic_fmin_f32_ret_a_a(ptr addrspace(1) %ptr) #0 {6267; GFX90A-LABEL: global_atomic_fmin_f32_ret_a_a:6268; GFX90A: ; %bb.0:6269; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6270; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406271; GFX90A-NEXT: ;;#ASMSTART6272; GFX90A-NEXT: ; def a06273; GFX90A-NEXT: ;;#ASMEND6274; GFX90A-NEXT: v_accvgpr_read_b32 v2, a06275; GFX90A-NEXT: s_mov_b64 s[4:5], 06276; GFX90A-NEXT: v_max_f32_e32 v4, v2, v26277; GFX90A-NEXT: .LBB121_1: ; %atomicrmw.start6278; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16279; GFX90A-NEXT: s_waitcnt vmcnt(0)6280; GFX90A-NEXT: v_max_f32_e32 v2, v3, v36281; GFX90A-NEXT: v_min_f32_e32 v2, v2, v46282; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6283; GFX90A-NEXT: s_waitcnt vmcnt(0)6284; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36285; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6286; GFX90A-NEXT: v_mov_b32_e32 v3, v26287; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6288; GFX90A-NEXT: s_cbranch_execnz .LBB121_16289; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6290; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6291; GFX90A-NEXT: v_accvgpr_write_b32 a0, v26292; GFX90A-NEXT: ;;#ASMSTART6293; GFX90A-NEXT: ; use a06294; GFX90A-NEXT: ;;#ASMEND6295; GFX90A-NEXT: s_setpc_b64 s[30:31]6296;6297; GFX950-LABEL: global_atomic_fmin_f32_ret_a_a:6298; GFX950: ; %bb.0:6299; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6300; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406301; GFX950-NEXT: ;;#ASMSTART6302; GFX950-NEXT: ; def a06303; GFX950-NEXT: ;;#ASMEND6304; GFX950-NEXT: s_mov_b64 s[0:1], 06305; GFX950-NEXT: v_accvgpr_read_b32 v2, a06306; GFX950-NEXT: v_max_f32_e32 v4, v2, v26307; GFX950-NEXT: .LBB121_1: ; %atomicrmw.start6308; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16309; GFX950-NEXT: s_waitcnt vmcnt(0)6310; GFX950-NEXT: v_max_f32_e32 v2, v3, v36311; GFX950-NEXT: v_min_f32_e32 v2, v2, v46312; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06313; GFX950-NEXT: s_waitcnt vmcnt(0)6314; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36315; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6316; GFX950-NEXT: v_mov_b32_e32 v3, v26317; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6318; GFX950-NEXT: s_cbranch_execnz .LBB121_16319; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6320; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6321; GFX950-NEXT: v_accvgpr_write_b32 a0, v26322; GFX950-NEXT: ;;#ASMSTART6323; GFX950-NEXT: ; use a06324; GFX950-NEXT: ;;#ASMEND6325; GFX950-NEXT: s_setpc_b64 s[30:31]6326 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106327 %data = call float asm "; def $0", "=a"()6328 %result = atomicrmw fmin ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06329 call void asm "; use $0", "a"(float %result)6330 ret void6331}6332 6333define void @global_atomic_fmin_f32_ret_av_av(ptr addrspace(1) %ptr) #0 {6334; GFX90A-LABEL: global_atomic_fmin_f32_ret_av_av:6335; GFX90A: ; %bb.0:6336; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6337; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406338; GFX90A-NEXT: ;;#ASMSTART6339; GFX90A-NEXT: ; def v26340; GFX90A-NEXT: ;;#ASMEND6341; GFX90A-NEXT: s_mov_b64 s[4:5], 06342; GFX90A-NEXT: v_max_f32_e32 v4, v2, v26343; GFX90A-NEXT: .LBB122_1: ; %atomicrmw.start6344; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16345; GFX90A-NEXT: s_waitcnt vmcnt(0)6346; GFX90A-NEXT: v_max_f32_e32 v2, v3, v36347; GFX90A-NEXT: v_min_f32_e32 v2, v2, v46348; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6349; GFX90A-NEXT: s_waitcnt vmcnt(0)6350; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36351; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6352; GFX90A-NEXT: v_mov_b32_e32 v3, v26353; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6354; GFX90A-NEXT: s_cbranch_execnz .LBB122_16355; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6356; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6357; GFX90A-NEXT: ;;#ASMSTART6358; GFX90A-NEXT: ; use v26359; GFX90A-NEXT: ;;#ASMEND6360; GFX90A-NEXT: s_setpc_b64 s[30:31]6361;6362; GFX950-LABEL: global_atomic_fmin_f32_ret_av_av:6363; GFX950: ; %bb.0:6364; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6365; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406366; GFX950-NEXT: ;;#ASMSTART6367; GFX950-NEXT: ; def v26368; GFX950-NEXT: ;;#ASMEND6369; GFX950-NEXT: s_mov_b64 s[0:1], 06370; GFX950-NEXT: v_max_f32_e32 v4, v2, v26371; GFX950-NEXT: .LBB122_1: ; %atomicrmw.start6372; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16373; GFX950-NEXT: s_waitcnt vmcnt(0)6374; GFX950-NEXT: v_max_f32_e32 v2, v3, v36375; GFX950-NEXT: v_min_f32_e32 v2, v2, v46376; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06377; GFX950-NEXT: s_waitcnt vmcnt(0)6378; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36379; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6380; GFX950-NEXT: v_mov_b32_e32 v3, v26381; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6382; GFX950-NEXT: s_cbranch_execnz .LBB122_16383; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6384; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6385; GFX950-NEXT: ;;#ASMSTART6386; GFX950-NEXT: ; use v26387; GFX950-NEXT: ;;#ASMEND6388; GFX950-NEXT: s_setpc_b64 s[30:31]6389 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106390 %data = call float asm "; def $0", "=^VA"()6391 %result = atomicrmw fmin ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06392 call void asm "; use $0", "^VA"(float %result)6393 ret void6394}6395 6396define void @global_atomic_fmaximum_f32_ret_a_a(ptr addrspace(1) %ptr) #0 {6397; GFX90A-LABEL: global_atomic_fmaximum_f32_ret_a_a:6398; GFX90A: ; %bb.0:6399; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6400; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406401; GFX90A-NEXT: ;;#ASMSTART6402; GFX90A-NEXT: ; def a06403; GFX90A-NEXT: ;;#ASMEND6404; GFX90A-NEXT: v_accvgpr_read_b32 v4, a06405; GFX90A-NEXT: s_mov_b64 s[4:5], 06406; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7fc000006407; GFX90A-NEXT: .LBB123_1: ; %atomicrmw.start6408; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16409; GFX90A-NEXT: s_waitcnt vmcnt(0)6410; GFX90A-NEXT: v_max_f32_e32 v2, v3, v46411; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v3, v46412; GFX90A-NEXT: v_cndmask_b32_e32 v2, v5, v2, vcc6413; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6414; GFX90A-NEXT: s_waitcnt vmcnt(0)6415; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36416; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6417; GFX90A-NEXT: v_mov_b32_e32 v3, v26418; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6419; GFX90A-NEXT: s_cbranch_execnz .LBB123_16420; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6421; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6422; GFX90A-NEXT: v_accvgpr_write_b32 a0, v26423; GFX90A-NEXT: ;;#ASMSTART6424; GFX90A-NEXT: ; use a06425; GFX90A-NEXT: ;;#ASMEND6426; GFX90A-NEXT: s_setpc_b64 s[30:31]6427;6428; GFX950-LABEL: global_atomic_fmaximum_f32_ret_a_a:6429; GFX950: ; %bb.0:6430; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6431; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406432; GFX950-NEXT: ;;#ASMSTART6433; GFX950-NEXT: ; def a06434; GFX950-NEXT: ;;#ASMEND6435; GFX950-NEXT: s_mov_b64 s[0:1], 06436; GFX950-NEXT: v_accvgpr_read_b32 v4, a06437; GFX950-NEXT: .LBB123_1: ; %atomicrmw.start6438; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16439; GFX950-NEXT: s_waitcnt vmcnt(0)6440; GFX950-NEXT: v_maximum3_f32 v2, v3, v4, v46441; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06442; GFX950-NEXT: s_waitcnt vmcnt(0)6443; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36444; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6445; GFX950-NEXT: v_mov_b32_e32 v3, v26446; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6447; GFX950-NEXT: s_cbranch_execnz .LBB123_16448; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6449; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6450; GFX950-NEXT: v_accvgpr_write_b32 a0, v26451; GFX950-NEXT: ;;#ASMSTART6452; GFX950-NEXT: ; use a06453; GFX950-NEXT: ;;#ASMEND6454; GFX950-NEXT: s_setpc_b64 s[30:31]6455 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106456 %data = call float asm "; def $0", "=a"()6457 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06458 call void asm "; use $0", "a"(float %result)6459 ret void6460}6461 6462define void @global_atomic_fmaximum_f32_ret_av_av(ptr addrspace(1) %ptr) #0 {6463; GFX90A-LABEL: global_atomic_fmaximum_f32_ret_av_av:6464; GFX90A: ; %bb.0:6465; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6466; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406467; GFX90A-NEXT: s_mov_b64 s[4:5], 06468; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7fc000006469; GFX90A-NEXT: ;;#ASMSTART6470; GFX90A-NEXT: ; def v46471; GFX90A-NEXT: ;;#ASMEND6472; GFX90A-NEXT: .LBB124_1: ; %atomicrmw.start6473; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16474; GFX90A-NEXT: s_waitcnt vmcnt(0)6475; GFX90A-NEXT: v_max_f32_e32 v2, v3, v46476; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v3, v46477; GFX90A-NEXT: v_cndmask_b32_e32 v2, v5, v2, vcc6478; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6479; GFX90A-NEXT: s_waitcnt vmcnt(0)6480; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36481; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6482; GFX90A-NEXT: v_mov_b32_e32 v3, v26483; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6484; GFX90A-NEXT: s_cbranch_execnz .LBB124_16485; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6486; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6487; GFX90A-NEXT: ;;#ASMSTART6488; GFX90A-NEXT: ; use v26489; GFX90A-NEXT: ;;#ASMEND6490; GFX90A-NEXT: s_setpc_b64 s[30:31]6491;6492; GFX950-LABEL: global_atomic_fmaximum_f32_ret_av_av:6493; GFX950: ; %bb.0:6494; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6495; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406496; GFX950-NEXT: s_mov_b64 s[0:1], 06497; GFX950-NEXT: ;;#ASMSTART6498; GFX950-NEXT: ; def v46499; GFX950-NEXT: ;;#ASMEND6500; GFX950-NEXT: .LBB124_1: ; %atomicrmw.start6501; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16502; GFX950-NEXT: s_waitcnt vmcnt(0)6503; GFX950-NEXT: v_maximum3_f32 v2, v3, v4, v46504; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06505; GFX950-NEXT: s_waitcnt vmcnt(0)6506; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36507; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6508; GFX950-NEXT: v_mov_b32_e32 v3, v26509; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6510; GFX950-NEXT: s_cbranch_execnz .LBB124_16511; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6512; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6513; GFX950-NEXT: ;;#ASMSTART6514; GFX950-NEXT: ; use v26515; GFX950-NEXT: ;;#ASMEND6516; GFX950-NEXT: s_setpc_b64 s[30:31]6517 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106518 %data = call float asm "; def $0", "=^VA"()6519 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06520 call void asm "; use $0", "^VA"(float %result)6521 ret void6522}6523 6524define void @global_atomic_fminimum_f32_ret_a_a(ptr addrspace(1) %ptr) #0 {6525; GFX90A-LABEL: global_atomic_fminimum_f32_ret_a_a:6526; GFX90A: ; %bb.0:6527; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6528; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406529; GFX90A-NEXT: ;;#ASMSTART6530; GFX90A-NEXT: ; def a06531; GFX90A-NEXT: ;;#ASMEND6532; GFX90A-NEXT: v_accvgpr_read_b32 v4, a06533; GFX90A-NEXT: s_mov_b64 s[4:5], 06534; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7fc000006535; GFX90A-NEXT: .LBB125_1: ; %atomicrmw.start6536; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16537; GFX90A-NEXT: s_waitcnt vmcnt(0)6538; GFX90A-NEXT: v_min_f32_e32 v2, v3, v46539; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v3, v46540; GFX90A-NEXT: v_cndmask_b32_e32 v2, v5, v2, vcc6541; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6542; GFX90A-NEXT: s_waitcnt vmcnt(0)6543; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36544; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6545; GFX90A-NEXT: v_mov_b32_e32 v3, v26546; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6547; GFX90A-NEXT: s_cbranch_execnz .LBB125_16548; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6549; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6550; GFX90A-NEXT: v_accvgpr_write_b32 a0, v26551; GFX90A-NEXT: ;;#ASMSTART6552; GFX90A-NEXT: ; use a06553; GFX90A-NEXT: ;;#ASMEND6554; GFX90A-NEXT: s_setpc_b64 s[30:31]6555;6556; GFX950-LABEL: global_atomic_fminimum_f32_ret_a_a:6557; GFX950: ; %bb.0:6558; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6559; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406560; GFX950-NEXT: ;;#ASMSTART6561; GFX950-NEXT: ; def a06562; GFX950-NEXT: ;;#ASMEND6563; GFX950-NEXT: s_mov_b64 s[0:1], 06564; GFX950-NEXT: v_accvgpr_read_b32 v4, a06565; GFX950-NEXT: .LBB125_1: ; %atomicrmw.start6566; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16567; GFX950-NEXT: s_waitcnt vmcnt(0)6568; GFX950-NEXT: v_minimum3_f32 v2, v3, v4, v46569; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06570; GFX950-NEXT: s_waitcnt vmcnt(0)6571; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36572; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6573; GFX950-NEXT: v_mov_b32_e32 v3, v26574; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6575; GFX950-NEXT: s_cbranch_execnz .LBB125_16576; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6577; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6578; GFX950-NEXT: v_accvgpr_write_b32 a0, v26579; GFX950-NEXT: ;;#ASMSTART6580; GFX950-NEXT: ; use a06581; GFX950-NEXT: ;;#ASMEND6582; GFX950-NEXT: s_setpc_b64 s[30:31]6583 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106584 %data = call float asm "; def $0", "=a"()6585 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06586 call void asm "; use $0", "a"(float %result)6587 ret void6588}6589 6590define void @global_atomic_fminimum_f32_ret_av_av(ptr addrspace(1) %ptr) #0 {6591; GFX90A-LABEL: global_atomic_fminimum_f32_ret_av_av:6592; GFX90A: ; %bb.0:6593; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6594; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:406595; GFX90A-NEXT: s_mov_b64 s[4:5], 06596; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7fc000006597; GFX90A-NEXT: ;;#ASMSTART6598; GFX90A-NEXT: ; def v46599; GFX90A-NEXT: ;;#ASMEND6600; GFX90A-NEXT: .LBB126_1: ; %atomicrmw.start6601; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16602; GFX90A-NEXT: s_waitcnt vmcnt(0)6603; GFX90A-NEXT: v_min_f32_e32 v2, v3, v46604; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v3, v46605; GFX90A-NEXT: v_cndmask_b32_e32 v2, v5, v2, vcc6606; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc6607; GFX90A-NEXT: s_waitcnt vmcnt(0)6608; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36609; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6610; GFX90A-NEXT: v_mov_b32_e32 v3, v26611; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6612; GFX90A-NEXT: s_cbranch_execnz .LBB126_16613; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6614; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6615; GFX90A-NEXT: ;;#ASMSTART6616; GFX90A-NEXT: ; use v26617; GFX90A-NEXT: ;;#ASMEND6618; GFX90A-NEXT: s_setpc_b64 s[30:31]6619;6620; GFX950-LABEL: global_atomic_fminimum_f32_ret_av_av:6621; GFX950: ; %bb.0:6622; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6623; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:406624; GFX950-NEXT: s_mov_b64 s[0:1], 06625; GFX950-NEXT: ;;#ASMSTART6626; GFX950-NEXT: ; def v46627; GFX950-NEXT: ;;#ASMEND6628; GFX950-NEXT: .LBB126_1: ; %atomicrmw.start6629; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16630; GFX950-NEXT: s_waitcnt vmcnt(0)6631; GFX950-NEXT: v_minimum3_f32 v2, v3, v4, v46632; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc06633; GFX950-NEXT: s_waitcnt vmcnt(0)6634; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v36635; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6636; GFX950-NEXT: v_mov_b32_e32 v3, v26637; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6638; GFX950-NEXT: s_cbranch_execnz .LBB126_16639; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6640; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6641; GFX950-NEXT: ;;#ASMSTART6642; GFX950-NEXT: ; use v26643; GFX950-NEXT: ;;#ASMEND6644; GFX950-NEXT: s_setpc_b64 s[30:31]6645 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 106646 %data = call float asm "; def $0", "=^VA"()6647 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !06648 call void asm "; use $0", "^VA"(float %result)6649 ret void6650}6651 6652;---------------------------------------------------------------------6653; other atomics f64, with aa+av cases6654;---------------------------------------------------------------------6655 6656define void @global_atomic_fadd_f64_ret_a_a(ptr addrspace(1) %ptr) #0 {6657; GFX90A-LABEL: global_atomic_fadd_f64_ret_a_a:6658; GFX90A: ; %bb.0:6659; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6660; GFX90A-NEXT: ;;#ASMSTART6661; GFX90A-NEXT: ; def a[0:1]6662; GFX90A-NEXT: ;;#ASMEND6663; GFX90A-NEXT: v_accvgpr_read_b32 v3, a16664; GFX90A-NEXT: v_accvgpr_read_b32 v2, a06665; GFX90A-NEXT: global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off offset:80 glc6666; GFX90A-NEXT: s_waitcnt vmcnt(0)6667; GFX90A-NEXT: v_accvgpr_write_b32 a0, v06668; GFX90A-NEXT: v_accvgpr_write_b32 a1, v16669; GFX90A-NEXT: ;;#ASMSTART6670; GFX90A-NEXT: ; use a[0:1]6671; GFX90A-NEXT: ;;#ASMEND6672; GFX90A-NEXT: s_setpc_b64 s[30:31]6673;6674; GFX950-LABEL: global_atomic_fadd_f64_ret_a_a:6675; GFX950: ; %bb.0:6676; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6677; GFX950-NEXT: ;;#ASMSTART6678; GFX950-NEXT: ; def a[0:1]6679; GFX950-NEXT: ;;#ASMEND6680; GFX950-NEXT: s_nop 06681; GFX950-NEXT: v_accvgpr_read_b32 v3, a16682; GFX950-NEXT: v_accvgpr_read_b32 v2, a06683; GFX950-NEXT: global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off offset:80 sc06684; GFX950-NEXT: s_waitcnt vmcnt(0)6685; GFX950-NEXT: v_accvgpr_write_b32 a0, v06686; GFX950-NEXT: v_accvgpr_write_b32 a1, v16687; GFX950-NEXT: ;;#ASMSTART6688; GFX950-NEXT: ; use a[0:1]6689; GFX950-NEXT: ;;#ASMEND6690; GFX950-NEXT: s_setpc_b64 s[30:31]6691 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 106692 %data = call double asm "; def $0", "=a"()6693 %result = atomicrmw fadd ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !06694 call void asm "; use $0", "a"(double %result)6695 ret void6696}6697 6698define void @global_atomic_fadd_f64_ret_av_av(ptr addrspace(1) %ptr) #0 {6699; GFX90A-LABEL: global_atomic_fadd_f64_ret_av_av:6700; GFX90A: ; %bb.0:6701; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6702; GFX90A-NEXT: ;;#ASMSTART6703; GFX90A-NEXT: ; def v[2:3]6704; GFX90A-NEXT: ;;#ASMEND6705; GFX90A-NEXT: global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off offset:80 glc6706; GFX90A-NEXT: s_waitcnt vmcnt(0)6707; GFX90A-NEXT: ;;#ASMSTART6708; GFX90A-NEXT: ; use v[0:1]6709; GFX90A-NEXT: ;;#ASMEND6710; GFX90A-NEXT: s_setpc_b64 s[30:31]6711;6712; GFX950-LABEL: global_atomic_fadd_f64_ret_av_av:6713; GFX950: ; %bb.0:6714; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6715; GFX950-NEXT: ;;#ASMSTART6716; GFX950-NEXT: ; def v[2:3]6717; GFX950-NEXT: ;;#ASMEND6718; GFX950-NEXT: global_atomic_add_f64 v[0:1], v[0:1], v[2:3], off offset:80 sc06719; GFX950-NEXT: s_waitcnt vmcnt(0)6720; GFX950-NEXT: ;;#ASMSTART6721; GFX950-NEXT: ; use v[0:1]6722; GFX950-NEXT: ;;#ASMEND6723; GFX950-NEXT: s_setpc_b64 s[30:31]6724 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 106725 %data = call double asm "; def $0", "=^VA"()6726 %result = atomicrmw fadd ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !06727 call void asm "; use $0", "^VA"(double %result)6728 ret void6729}6730 6731define void @global_atomic_fsub_f64_ret_a_a(ptr addrspace(1) %ptr) #0 {6732; GFX90A-LABEL: global_atomic_fsub_f64_ret_a_a:6733; GFX90A: ; %bb.0:6734; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6735; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:806736; GFX90A-NEXT: ;;#ASMSTART6737; GFX90A-NEXT: ; def a[0:1]6738; GFX90A-NEXT: ;;#ASMEND6739; GFX90A-NEXT: v_accvgpr_read_b32 v7, a16740; GFX90A-NEXT: v_accvgpr_read_b32 v6, a06741; GFX90A-NEXT: s_mov_b64 s[4:5], 06742; GFX90A-NEXT: .LBB129_1: ; %atomicrmw.start6743; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16744; GFX90A-NEXT: s_waitcnt vmcnt(0)6745; GFX90A-NEXT: v_add_f64 v[2:3], v[4:5], -v[6:7]6746; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc6747; GFX90A-NEXT: s_waitcnt vmcnt(0)6748; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]6749; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6750; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]6751; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6752; GFX90A-NEXT: s_cbranch_execnz .LBB129_16753; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6754; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6755; GFX90A-NEXT: v_accvgpr_write_b32 a0, v26756; GFX90A-NEXT: v_accvgpr_write_b32 a1, v36757; GFX90A-NEXT: ;;#ASMSTART6758; GFX90A-NEXT: ; use a[0:1]6759; GFX90A-NEXT: ;;#ASMEND6760; GFX90A-NEXT: s_setpc_b64 s[30:31]6761;6762; GFX950-LABEL: global_atomic_fsub_f64_ret_a_a:6763; GFX950: ; %bb.0:6764; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6765; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:806766; GFX950-NEXT: ;;#ASMSTART6767; GFX950-NEXT: ; def a[0:1]6768; GFX950-NEXT: ;;#ASMEND6769; GFX950-NEXT: s_mov_b64 s[0:1], 06770; GFX950-NEXT: v_accvgpr_read_b32 v7, a16771; GFX950-NEXT: v_accvgpr_read_b32 v6, a06772; GFX950-NEXT: .LBB129_1: ; %atomicrmw.start6773; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16774; GFX950-NEXT: s_waitcnt vmcnt(0)6775; GFX950-NEXT: v_add_f64 v[2:3], v[4:5], -v[6:7]6776; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc06777; GFX950-NEXT: s_waitcnt vmcnt(0)6778; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]6779; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6780; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]6781; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6782; GFX950-NEXT: s_cbranch_execnz .LBB129_16783; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6784; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6785; GFX950-NEXT: v_accvgpr_write_b32 a0, v26786; GFX950-NEXT: v_accvgpr_write_b32 a1, v36787; GFX950-NEXT: ;;#ASMSTART6788; GFX950-NEXT: ; use a[0:1]6789; GFX950-NEXT: ;;#ASMEND6790; GFX950-NEXT: s_setpc_b64 s[30:31]6791 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 106792 %data = call double asm "; def $0", "=a"()6793 %result = atomicrmw fsub ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !06794 call void asm "; use $0", "a"(double %result)6795 ret void6796}6797 6798define void @global_atomic_fsub_f64_ret_av_av(ptr addrspace(1) %ptr) #0 {6799; GFX90A-LABEL: global_atomic_fsub_f64_ret_av_av:6800; GFX90A: ; %bb.0:6801; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6802; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:806803; GFX90A-NEXT: s_mov_b64 s[4:5], 06804; GFX90A-NEXT: ;;#ASMSTART6805; GFX90A-NEXT: ; def v[6:7]6806; GFX90A-NEXT: ;;#ASMEND6807; GFX90A-NEXT: .LBB130_1: ; %atomicrmw.start6808; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=16809; GFX90A-NEXT: s_waitcnt vmcnt(0)6810; GFX90A-NEXT: v_add_f64 v[2:3], v[4:5], -v[6:7]6811; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc6812; GFX90A-NEXT: s_waitcnt vmcnt(0)6813; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]6814; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]6815; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]6816; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]6817; GFX90A-NEXT: s_cbranch_execnz .LBB130_16818; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end6819; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]6820; GFX90A-NEXT: ;;#ASMSTART6821; GFX90A-NEXT: ; use v[2:3]6822; GFX90A-NEXT: ;;#ASMEND6823; GFX90A-NEXT: s_setpc_b64 s[30:31]6824;6825; GFX950-LABEL: global_atomic_fsub_f64_ret_av_av:6826; GFX950: ; %bb.0:6827; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6828; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:806829; GFX950-NEXT: s_mov_b64 s[0:1], 06830; GFX950-NEXT: ;;#ASMSTART6831; GFX950-NEXT: ; def v[6:7]6832; GFX950-NEXT: ;;#ASMEND6833; GFX950-NEXT: .LBB130_1: ; %atomicrmw.start6834; GFX950-NEXT: ; =>This Inner Loop Header: Depth=16835; GFX950-NEXT: s_waitcnt vmcnt(0)6836; GFX950-NEXT: v_add_f64 v[2:3], v[4:5], -v[6:7]6837; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc06838; GFX950-NEXT: s_waitcnt vmcnt(0)6839; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]6840; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]6841; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]6842; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]6843; GFX950-NEXT: s_cbranch_execnz .LBB130_16844; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end6845; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]6846; GFX950-NEXT: ;;#ASMSTART6847; GFX950-NEXT: ; use v[2:3]6848; GFX950-NEXT: ;;#ASMEND6849; GFX950-NEXT: s_setpc_b64 s[30:31]6850 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 106851 %data = call double asm "; def $0", "=^VA"()6852 %result = atomicrmw fsub ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !06853 call void asm "; use $0", "^VA"(double %result)6854 ret void6855}6856 6857define void @global_atomic_fmax_f64_ret_a_a(ptr addrspace(1) %ptr) #0 {6858; GFX90A-LABEL: global_atomic_fmax_f64_ret_a_a:6859; GFX90A: ; %bb.0:6860; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6861; GFX90A-NEXT: ;;#ASMSTART6862; GFX90A-NEXT: ; def a[0:1]6863; GFX90A-NEXT: ;;#ASMEND6864; GFX90A-NEXT: v_accvgpr_read_b32 v3, a16865; GFX90A-NEXT: v_accvgpr_read_b32 v2, a06866; GFX90A-NEXT: global_atomic_max_f64 v[0:1], v[0:1], v[2:3], off offset:80 glc6867; GFX90A-NEXT: s_waitcnt vmcnt(0)6868; GFX90A-NEXT: v_accvgpr_write_b32 a0, v06869; GFX90A-NEXT: v_accvgpr_write_b32 a1, v16870; GFX90A-NEXT: ;;#ASMSTART6871; GFX90A-NEXT: ; use a[0:1]6872; GFX90A-NEXT: ;;#ASMEND6873; GFX90A-NEXT: s_setpc_b64 s[30:31]6874;6875; GFX950-LABEL: global_atomic_fmax_f64_ret_a_a:6876; GFX950: ; %bb.0:6877; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6878; GFX950-NEXT: ;;#ASMSTART6879; GFX950-NEXT: ; def a[0:1]6880; GFX950-NEXT: ;;#ASMEND6881; GFX950-NEXT: s_nop 06882; GFX950-NEXT: v_accvgpr_read_b32 v3, a16883; GFX950-NEXT: v_accvgpr_read_b32 v2, a06884; GFX950-NEXT: global_atomic_max_f64 v[0:1], v[0:1], v[2:3], off offset:80 sc06885; GFX950-NEXT: s_waitcnt vmcnt(0)6886; GFX950-NEXT: v_accvgpr_write_b32 a0, v06887; GFX950-NEXT: v_accvgpr_write_b32 a1, v16888; GFX950-NEXT: ;;#ASMSTART6889; GFX950-NEXT: ; use a[0:1]6890; GFX950-NEXT: ;;#ASMEND6891; GFX950-NEXT: s_setpc_b64 s[30:31]6892 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 106893 %data = call double asm "; def $0", "=a"()6894 %result = atomicrmw fmax ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !06895 call void asm "; use $0", "a"(double %result)6896 ret void6897}6898 6899define void @global_atomic_fmax_f64_ret_av_av(ptr addrspace(1) %ptr) #0 {6900; GFX90A-LABEL: global_atomic_fmax_f64_ret_av_av:6901; GFX90A: ; %bb.0:6902; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6903; GFX90A-NEXT: ;;#ASMSTART6904; GFX90A-NEXT: ; def v[2:3]6905; GFX90A-NEXT: ;;#ASMEND6906; GFX90A-NEXT: global_atomic_max_f64 v[0:1], v[0:1], v[2:3], off offset:80 glc6907; GFX90A-NEXT: s_waitcnt vmcnt(0)6908; GFX90A-NEXT: ;;#ASMSTART6909; GFX90A-NEXT: ; use v[0:1]6910; GFX90A-NEXT: ;;#ASMEND6911; GFX90A-NEXT: s_setpc_b64 s[30:31]6912;6913; GFX950-LABEL: global_atomic_fmax_f64_ret_av_av:6914; GFX950: ; %bb.0:6915; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6916; GFX950-NEXT: ;;#ASMSTART6917; GFX950-NEXT: ; def v[2:3]6918; GFX950-NEXT: ;;#ASMEND6919; GFX950-NEXT: global_atomic_max_f64 v[0:1], v[0:1], v[2:3], off offset:80 sc06920; GFX950-NEXT: s_waitcnt vmcnt(0)6921; GFX950-NEXT: ;;#ASMSTART6922; GFX950-NEXT: ; use v[0:1]6923; GFX950-NEXT: ;;#ASMEND6924; GFX950-NEXT: s_setpc_b64 s[30:31]6925 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 106926 %data = call double asm "; def $0", "=^VA"()6927 %result = atomicrmw fmax ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !06928 call void asm "; use $0", "^VA"(double %result)6929 ret void6930}6931 6932define void @global_atomic_fmin_f64_ret_a_a(ptr addrspace(1) %ptr) #0 {6933; GFX90A-LABEL: global_atomic_fmin_f64_ret_a_a:6934; GFX90A: ; %bb.0:6935; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6936; GFX90A-NEXT: ;;#ASMSTART6937; GFX90A-NEXT: ; def a[0:1]6938; GFX90A-NEXT: ;;#ASMEND6939; GFX90A-NEXT: v_accvgpr_read_b32 v3, a16940; GFX90A-NEXT: v_accvgpr_read_b32 v2, a06941; GFX90A-NEXT: global_atomic_min_f64 v[0:1], v[0:1], v[2:3], off offset:80 glc6942; GFX90A-NEXT: s_waitcnt vmcnt(0)6943; GFX90A-NEXT: v_accvgpr_write_b32 a0, v06944; GFX90A-NEXT: v_accvgpr_write_b32 a1, v16945; GFX90A-NEXT: ;;#ASMSTART6946; GFX90A-NEXT: ; use a[0:1]6947; GFX90A-NEXT: ;;#ASMEND6948; GFX90A-NEXT: s_setpc_b64 s[30:31]6949;6950; GFX950-LABEL: global_atomic_fmin_f64_ret_a_a:6951; GFX950: ; %bb.0:6952; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6953; GFX950-NEXT: ;;#ASMSTART6954; GFX950-NEXT: ; def a[0:1]6955; GFX950-NEXT: ;;#ASMEND6956; GFX950-NEXT: s_nop 06957; GFX950-NEXT: v_accvgpr_read_b32 v3, a16958; GFX950-NEXT: v_accvgpr_read_b32 v2, a06959; GFX950-NEXT: global_atomic_min_f64 v[0:1], v[0:1], v[2:3], off offset:80 sc06960; GFX950-NEXT: s_waitcnt vmcnt(0)6961; GFX950-NEXT: v_accvgpr_write_b32 a0, v06962; GFX950-NEXT: v_accvgpr_write_b32 a1, v16963; GFX950-NEXT: ;;#ASMSTART6964; GFX950-NEXT: ; use a[0:1]6965; GFX950-NEXT: ;;#ASMEND6966; GFX950-NEXT: s_setpc_b64 s[30:31]6967 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 106968 %data = call double asm "; def $0", "=a"()6969 %result = atomicrmw fmin ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !06970 call void asm "; use $0", "a"(double %result)6971 ret void6972}6973 6974define void @global_atomic_fmin_f64_ret_av_av(ptr addrspace(1) %ptr) #0 {6975; GFX90A-LABEL: global_atomic_fmin_f64_ret_av_av:6976; GFX90A: ; %bb.0:6977; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6978; GFX90A-NEXT: ;;#ASMSTART6979; GFX90A-NEXT: ; def v[2:3]6980; GFX90A-NEXT: ;;#ASMEND6981; GFX90A-NEXT: global_atomic_min_f64 v[0:1], v[0:1], v[2:3], off offset:80 glc6982; GFX90A-NEXT: s_waitcnt vmcnt(0)6983; GFX90A-NEXT: ;;#ASMSTART6984; GFX90A-NEXT: ; use v[0:1]6985; GFX90A-NEXT: ;;#ASMEND6986; GFX90A-NEXT: s_setpc_b64 s[30:31]6987;6988; GFX950-LABEL: global_atomic_fmin_f64_ret_av_av:6989; GFX950: ; %bb.0:6990; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6991; GFX950-NEXT: ;;#ASMSTART6992; GFX950-NEXT: ; def v[2:3]6993; GFX950-NEXT: ;;#ASMEND6994; GFX950-NEXT: global_atomic_min_f64 v[0:1], v[0:1], v[2:3], off offset:80 sc06995; GFX950-NEXT: s_waitcnt vmcnt(0)6996; GFX950-NEXT: ;;#ASMSTART6997; GFX950-NEXT: ; use v[0:1]6998; GFX950-NEXT: ;;#ASMEND6999; GFX950-NEXT: s_setpc_b64 s[30:31]7000 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 107001 %data = call double asm "; def $0", "=^VA"()7002 %result = atomicrmw fmin ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07003 call void asm "; use $0", "^VA"(double %result)7004 ret void7005}7006 7007define void @global_atomic_fmaximum_f64_ret_a_a(ptr addrspace(1) %ptr) #0 {7008; GFX90A-LABEL: global_atomic_fmaximum_f64_ret_a_a:7009; GFX90A: ; %bb.0:7010; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7011; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:807012; GFX90A-NEXT: ;;#ASMSTART7013; GFX90A-NEXT: ; def a[0:1]7014; GFX90A-NEXT: ;;#ASMEND7015; GFX90A-NEXT: v_accvgpr_read_b32 v7, a17016; GFX90A-NEXT: v_accvgpr_read_b32 v6, a07017; GFX90A-NEXT: s_mov_b64 s[4:5], 07018; GFX90A-NEXT: v_mov_b32_e32 v8, 0x7ff800007019; GFX90A-NEXT: .LBB135_1: ; %atomicrmw.start7020; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17021; GFX90A-NEXT: s_waitcnt vmcnt(0)7022; GFX90A-NEXT: v_max_f64 v[2:3], v[4:5], v[6:7]7023; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[6:7]7024; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc7025; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc7026; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc7027; GFX90A-NEXT: s_waitcnt vmcnt(0)7028; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]7029; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7030; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]7031; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7032; GFX90A-NEXT: s_cbranch_execnz .LBB135_17033; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7034; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7035; GFX90A-NEXT: v_accvgpr_write_b32 a0, v27036; GFX90A-NEXT: v_accvgpr_write_b32 a1, v37037; GFX90A-NEXT: ;;#ASMSTART7038; GFX90A-NEXT: ; use a[0:1]7039; GFX90A-NEXT: ;;#ASMEND7040; GFX90A-NEXT: s_setpc_b64 s[30:31]7041;7042; GFX950-LABEL: global_atomic_fmaximum_f64_ret_a_a:7043; GFX950: ; %bb.0:7044; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7045; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:807046; GFX950-NEXT: ;;#ASMSTART7047; GFX950-NEXT: ; def a[0:1]7048; GFX950-NEXT: ;;#ASMEND7049; GFX950-NEXT: s_mov_b64 s[0:1], 07050; GFX950-NEXT: v_accvgpr_read_b32 v7, a17051; GFX950-NEXT: v_accvgpr_read_b32 v6, a07052; GFX950-NEXT: v_mov_b32_e32 v8, 0x7ff800007053; GFX950-NEXT: .LBB135_1: ; %atomicrmw.start7054; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17055; GFX950-NEXT: s_waitcnt vmcnt(0)7056; GFX950-NEXT: v_max_f64 v[2:3], v[4:5], v[6:7]7057; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[6:7]7058; GFX950-NEXT: s_nop 17059; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc7060; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc7061; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc07062; GFX950-NEXT: s_waitcnt vmcnt(0)7063; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]7064; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7065; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]7066; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7067; GFX950-NEXT: s_cbranch_execnz .LBB135_17068; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7069; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7070; GFX950-NEXT: v_accvgpr_write_b32 a0, v27071; GFX950-NEXT: v_accvgpr_write_b32 a1, v37072; GFX950-NEXT: ;;#ASMSTART7073; GFX950-NEXT: ; use a[0:1]7074; GFX950-NEXT: ;;#ASMEND7075; GFX950-NEXT: s_setpc_b64 s[30:31]7076 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 107077 %data = call double asm "; def $0", "=a"()7078 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07079 call void asm "; use $0", "a"(double %result)7080 ret void7081}7082 7083define void @global_atomic_fmaximum_f64_ret_av_av(ptr addrspace(1) %ptr) #0 {7084; GFX90A-LABEL: global_atomic_fmaximum_f64_ret_av_av:7085; GFX90A: ; %bb.0:7086; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7087; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:807088; GFX90A-NEXT: s_mov_b64 s[4:5], 07089; GFX90A-NEXT: v_mov_b32_e32 v8, 0x7ff800007090; GFX90A-NEXT: ;;#ASMSTART7091; GFX90A-NEXT: ; def v[6:7]7092; GFX90A-NEXT: ;;#ASMEND7093; GFX90A-NEXT: .LBB136_1: ; %atomicrmw.start7094; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17095; GFX90A-NEXT: s_waitcnt vmcnt(0)7096; GFX90A-NEXT: v_max_f64 v[2:3], v[4:5], v[6:7]7097; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[6:7]7098; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc7099; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc7100; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc7101; GFX90A-NEXT: s_waitcnt vmcnt(0)7102; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]7103; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7104; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]7105; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7106; GFX90A-NEXT: s_cbranch_execnz .LBB136_17107; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7108; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7109; GFX90A-NEXT: ;;#ASMSTART7110; GFX90A-NEXT: ; use v[2:3]7111; GFX90A-NEXT: ;;#ASMEND7112; GFX90A-NEXT: s_setpc_b64 s[30:31]7113;7114; GFX950-LABEL: global_atomic_fmaximum_f64_ret_av_av:7115; GFX950: ; %bb.0:7116; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7117; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:807118; GFX950-NEXT: s_mov_b64 s[0:1], 07119; GFX950-NEXT: v_mov_b32_e32 v8, 0x7ff800007120; GFX950-NEXT: ;;#ASMSTART7121; GFX950-NEXT: ; def v[6:7]7122; GFX950-NEXT: ;;#ASMEND7123; GFX950-NEXT: .LBB136_1: ; %atomicrmw.start7124; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17125; GFX950-NEXT: s_waitcnt vmcnt(0)7126; GFX950-NEXT: v_max_f64 v[2:3], v[4:5], v[6:7]7127; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[6:7]7128; GFX950-NEXT: s_nop 17129; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc7130; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc7131; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc07132; GFX950-NEXT: s_waitcnt vmcnt(0)7133; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]7134; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7135; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]7136; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7137; GFX950-NEXT: s_cbranch_execnz .LBB136_17138; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7139; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7140; GFX950-NEXT: ;;#ASMSTART7141; GFX950-NEXT: ; use v[2:3]7142; GFX950-NEXT: ;;#ASMEND7143; GFX950-NEXT: s_setpc_b64 s[30:31]7144 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 107145 %data = call double asm "; def $0", "=^VA"()7146 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07147 call void asm "; use $0", "^VA"(double %result)7148 ret void7149}7150 7151define void @global_atomic_fminimum_f64_ret_a_a(ptr addrspace(1) %ptr) #0 {7152; GFX90A-LABEL: global_atomic_fminimum_f64_ret_a_a:7153; GFX90A: ; %bb.0:7154; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7155; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:807156; GFX90A-NEXT: ;;#ASMSTART7157; GFX90A-NEXT: ; def a[0:1]7158; GFX90A-NEXT: ;;#ASMEND7159; GFX90A-NEXT: v_accvgpr_read_b32 v7, a17160; GFX90A-NEXT: v_accvgpr_read_b32 v6, a07161; GFX90A-NEXT: s_mov_b64 s[4:5], 07162; GFX90A-NEXT: v_mov_b32_e32 v8, 0x7ff800007163; GFX90A-NEXT: .LBB137_1: ; %atomicrmw.start7164; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17165; GFX90A-NEXT: s_waitcnt vmcnt(0)7166; GFX90A-NEXT: v_min_f64 v[2:3], v[4:5], v[6:7]7167; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[6:7]7168; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc7169; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc7170; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc7171; GFX90A-NEXT: s_waitcnt vmcnt(0)7172; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]7173; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7174; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]7175; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7176; GFX90A-NEXT: s_cbranch_execnz .LBB137_17177; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7178; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7179; GFX90A-NEXT: v_accvgpr_write_b32 a0, v27180; GFX90A-NEXT: v_accvgpr_write_b32 a1, v37181; GFX90A-NEXT: ;;#ASMSTART7182; GFX90A-NEXT: ; use a[0:1]7183; GFX90A-NEXT: ;;#ASMEND7184; GFX90A-NEXT: s_setpc_b64 s[30:31]7185;7186; GFX950-LABEL: global_atomic_fminimum_f64_ret_a_a:7187; GFX950: ; %bb.0:7188; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7189; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:807190; GFX950-NEXT: ;;#ASMSTART7191; GFX950-NEXT: ; def a[0:1]7192; GFX950-NEXT: ;;#ASMEND7193; GFX950-NEXT: s_mov_b64 s[0:1], 07194; GFX950-NEXT: v_accvgpr_read_b32 v7, a17195; GFX950-NEXT: v_accvgpr_read_b32 v6, a07196; GFX950-NEXT: v_mov_b32_e32 v8, 0x7ff800007197; GFX950-NEXT: .LBB137_1: ; %atomicrmw.start7198; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17199; GFX950-NEXT: s_waitcnt vmcnt(0)7200; GFX950-NEXT: v_min_f64 v[2:3], v[4:5], v[6:7]7201; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[6:7]7202; GFX950-NEXT: s_nop 17203; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc7204; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc7205; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc07206; GFX950-NEXT: s_waitcnt vmcnt(0)7207; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]7208; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7209; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]7210; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7211; GFX950-NEXT: s_cbranch_execnz .LBB137_17212; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7213; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7214; GFX950-NEXT: v_accvgpr_write_b32 a0, v27215; GFX950-NEXT: v_accvgpr_write_b32 a1, v37216; GFX950-NEXT: ;;#ASMSTART7217; GFX950-NEXT: ; use a[0:1]7218; GFX950-NEXT: ;;#ASMEND7219; GFX950-NEXT: s_setpc_b64 s[30:31]7220 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 107221 %data = call double asm "; def $0", "=a"()7222 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07223 call void asm "; use $0", "a"(double %result)7224 ret void7225}7226 7227define void @global_atomic_fminimum_f64_ret_av_av(ptr addrspace(1) %ptr) #0 {7228; GFX90A-LABEL: global_atomic_fminimum_f64_ret_av_av:7229; GFX90A: ; %bb.0:7230; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7231; GFX90A-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:807232; GFX90A-NEXT: s_mov_b64 s[4:5], 07233; GFX90A-NEXT: v_mov_b32_e32 v8, 0x7ff800007234; GFX90A-NEXT: ;;#ASMSTART7235; GFX90A-NEXT: ; def v[6:7]7236; GFX90A-NEXT: ;;#ASMEND7237; GFX90A-NEXT: .LBB138_1: ; %atomicrmw.start7238; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17239; GFX90A-NEXT: s_waitcnt vmcnt(0)7240; GFX90A-NEXT: v_min_f64 v[2:3], v[4:5], v[6:7]7241; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[6:7]7242; GFX90A-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc7243; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc7244; GFX90A-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 glc7245; GFX90A-NEXT: s_waitcnt vmcnt(0)7246; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]7247; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7248; GFX90A-NEXT: v_pk_mov_b32 v[4:5], v[2:3], v[2:3] op_sel:[0,1]7249; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7250; GFX90A-NEXT: s_cbranch_execnz .LBB138_17251; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7252; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7253; GFX90A-NEXT: ;;#ASMSTART7254; GFX90A-NEXT: ; use v[2:3]7255; GFX90A-NEXT: ;;#ASMEND7256; GFX90A-NEXT: s_setpc_b64 s[30:31]7257;7258; GFX950-LABEL: global_atomic_fminimum_f64_ret_av_av:7259; GFX950: ; %bb.0:7260; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7261; GFX950-NEXT: global_load_dwordx2 v[4:5], v[0:1], off offset:807262; GFX950-NEXT: s_mov_b64 s[0:1], 07263; GFX950-NEXT: v_mov_b32_e32 v8, 0x7ff800007264; GFX950-NEXT: ;;#ASMSTART7265; GFX950-NEXT: ; def v[6:7]7266; GFX950-NEXT: ;;#ASMEND7267; GFX950-NEXT: .LBB138_1: ; %atomicrmw.start7268; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17269; GFX950-NEXT: s_waitcnt vmcnt(0)7270; GFX950-NEXT: v_min_f64 v[2:3], v[4:5], v[6:7]7271; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[6:7]7272; GFX950-NEXT: s_nop 17273; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc7274; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc7275; GFX950-NEXT: global_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5], off offset:80 sc07276; GFX950-NEXT: s_waitcnt vmcnt(0)7277; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]7278; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7279; GFX950-NEXT: v_mov_b64_e32 v[4:5], v[2:3]7280; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7281; GFX950-NEXT: s_cbranch_execnz .LBB138_17282; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7283; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7284; GFX950-NEXT: ;;#ASMSTART7285; GFX950-NEXT: ; use v[2:3]7286; GFX950-NEXT: ;;#ASMEND7287; GFX950-NEXT: s_setpc_b64 s[30:31]7288 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 107289 %data = call double asm "; def $0", "=^VA"()7290 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07291 call void asm "; use $0", "^VA"(double %result)7292 ret void7293}7294 7295;---------------------------------------------------------------------7296; other atomics v2f16, with aa+av cases7297;---------------------------------------------------------------------7298 7299define void @global_atomic_fadd_v2f16_ret_a_a(ptr addrspace(1) %ptr) #0 {7300; GFX90A-LABEL: global_atomic_fadd_v2f16_ret_a_a:7301; GFX90A: ; %bb.0:7302; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7303; GFX90A-NEXT: ;;#ASMSTART7304; GFX90A-NEXT: ; def a07305; GFX90A-NEXT: ;;#ASMEND7306; GFX90A-NEXT: v_accvgpr_read_b32 v2, a07307; GFX90A-NEXT: global_atomic_pk_add_f16 v0, v[0:1], v2, off offset:40 glc7308; GFX90A-NEXT: s_waitcnt vmcnt(0)7309; GFX90A-NEXT: v_accvgpr_write_b32 a0, v07310; GFX90A-NEXT: ;;#ASMSTART7311; GFX90A-NEXT: ; use a07312; GFX90A-NEXT: ;;#ASMEND7313; GFX90A-NEXT: s_setpc_b64 s[30:31]7314;7315; GFX950-LABEL: global_atomic_fadd_v2f16_ret_a_a:7316; GFX950: ; %bb.0:7317; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7318; GFX950-NEXT: ;;#ASMSTART7319; GFX950-NEXT: ; def a07320; GFX950-NEXT: ;;#ASMEND7321; GFX950-NEXT: s_nop 07322; GFX950-NEXT: v_accvgpr_read_b32 v2, a07323; GFX950-NEXT: global_atomic_pk_add_f16 v0, v[0:1], v2, off offset:40 sc07324; GFX950-NEXT: s_waitcnt vmcnt(0)7325; GFX950-NEXT: v_accvgpr_write_b32 a0, v07326; GFX950-NEXT: ;;#ASMSTART7327; GFX950-NEXT: ; use a07328; GFX950-NEXT: ;;#ASMEND7329; GFX950-NEXT: s_setpc_b64 s[30:31]7330 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107331 %data = call <2 x half> asm "; def $0", "=a"()7332 %result = atomicrmw fadd ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07333 call void asm "; use $0", "a"(<2 x half> %result)7334 ret void7335}7336 7337define void @global_atomic_fadd_v2f16_ret_av_av(ptr addrspace(1) %ptr) #0 {7338; GFX90A-LABEL: global_atomic_fadd_v2f16_ret_av_av:7339; GFX90A: ; %bb.0:7340; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7341; GFX90A-NEXT: ;;#ASMSTART7342; GFX90A-NEXT: ; def v27343; GFX90A-NEXT: ;;#ASMEND7344; GFX90A-NEXT: global_atomic_pk_add_f16 v0, v[0:1], v2, off offset:40 glc7345; GFX90A-NEXT: s_waitcnt vmcnt(0)7346; GFX90A-NEXT: ;;#ASMSTART7347; GFX90A-NEXT: ; use v07348; GFX90A-NEXT: ;;#ASMEND7349; GFX90A-NEXT: s_setpc_b64 s[30:31]7350;7351; GFX950-LABEL: global_atomic_fadd_v2f16_ret_av_av:7352; GFX950: ; %bb.0:7353; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7354; GFX950-NEXT: ;;#ASMSTART7355; GFX950-NEXT: ; def v27356; GFX950-NEXT: ;;#ASMEND7357; GFX950-NEXT: global_atomic_pk_add_f16 v0, v[0:1], v2, off offset:40 sc07358; GFX950-NEXT: s_waitcnt vmcnt(0)7359; GFX950-NEXT: ;;#ASMSTART7360; GFX950-NEXT: ; use v07361; GFX950-NEXT: ;;#ASMEND7362; GFX950-NEXT: s_setpc_b64 s[30:31]7363 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107364 %data = call <2 x half> asm "; def $0", "=^VA"()7365 %result = atomicrmw fadd ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07366 call void asm "; use $0", "^VA"(<2 x half> %result)7367 ret void7368}7369 7370define void @global_atomic_fsub_v2f16_ret_a_a(ptr addrspace(1) %ptr) #0 {7371; GFX90A-LABEL: global_atomic_fsub_v2f16_ret_a_a:7372; GFX90A: ; %bb.0:7373; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7374; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407375; GFX90A-NEXT: ;;#ASMSTART7376; GFX90A-NEXT: ; def a07377; GFX90A-NEXT: ;;#ASMEND7378; GFX90A-NEXT: v_accvgpr_read_b32 v4, a07379; GFX90A-NEXT: s_mov_b64 s[4:5], 07380; GFX90A-NEXT: .LBB141_1: ; %atomicrmw.start7381; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17382; GFX90A-NEXT: s_waitcnt vmcnt(0)7383; GFX90A-NEXT: v_pk_add_f16 v2, v3, v4 neg_lo:[0,1] neg_hi:[0,1]7384; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7385; GFX90A-NEXT: s_waitcnt vmcnt(0)7386; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37387; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7388; GFX90A-NEXT: v_mov_b32_e32 v3, v27389; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7390; GFX90A-NEXT: s_cbranch_execnz .LBB141_17391; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7392; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7393; GFX90A-NEXT: v_accvgpr_write_b32 a0, v27394; GFX90A-NEXT: ;;#ASMSTART7395; GFX90A-NEXT: ; use a07396; GFX90A-NEXT: ;;#ASMEND7397; GFX90A-NEXT: s_setpc_b64 s[30:31]7398;7399; GFX950-LABEL: global_atomic_fsub_v2f16_ret_a_a:7400; GFX950: ; %bb.0:7401; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7402; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407403; GFX950-NEXT: ;;#ASMSTART7404; GFX950-NEXT: ; def a07405; GFX950-NEXT: ;;#ASMEND7406; GFX950-NEXT: s_mov_b64 s[0:1], 07407; GFX950-NEXT: v_accvgpr_read_b32 v4, a07408; GFX950-NEXT: .LBB141_1: ; %atomicrmw.start7409; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17410; GFX950-NEXT: s_waitcnt vmcnt(0)7411; GFX950-NEXT: v_pk_add_f16 v2, v3, v4 neg_lo:[0,1] neg_hi:[0,1]7412; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07413; GFX950-NEXT: s_waitcnt vmcnt(0)7414; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37415; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7416; GFX950-NEXT: v_mov_b32_e32 v3, v27417; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7418; GFX950-NEXT: s_cbranch_execnz .LBB141_17419; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7420; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7421; GFX950-NEXT: v_accvgpr_write_b32 a0, v27422; GFX950-NEXT: ;;#ASMSTART7423; GFX950-NEXT: ; use a07424; GFX950-NEXT: ;;#ASMEND7425; GFX950-NEXT: s_setpc_b64 s[30:31]7426 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107427 %data = call <2 x half> asm "; def $0", "=a"()7428 %result = atomicrmw fsub ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07429 call void asm "; use $0", "a"(<2 x half> %result)7430 ret void7431}7432 7433define void @global_atomic_fsub_v2f16_ret_av_av(ptr addrspace(1) %ptr) #0 {7434; GFX90A-LABEL: global_atomic_fsub_v2f16_ret_av_av:7435; GFX90A: ; %bb.0:7436; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7437; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407438; GFX90A-NEXT: s_mov_b64 s[4:5], 07439; GFX90A-NEXT: ;;#ASMSTART7440; GFX90A-NEXT: ; def v47441; GFX90A-NEXT: ;;#ASMEND7442; GFX90A-NEXT: .LBB142_1: ; %atomicrmw.start7443; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17444; GFX90A-NEXT: s_waitcnt vmcnt(0)7445; GFX90A-NEXT: v_pk_add_f16 v2, v3, v4 neg_lo:[0,1] neg_hi:[0,1]7446; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7447; GFX90A-NEXT: s_waitcnt vmcnt(0)7448; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37449; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7450; GFX90A-NEXT: v_mov_b32_e32 v3, v27451; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7452; GFX90A-NEXT: s_cbranch_execnz .LBB142_17453; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7454; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7455; GFX90A-NEXT: ;;#ASMSTART7456; GFX90A-NEXT: ; use v27457; GFX90A-NEXT: ;;#ASMEND7458; GFX90A-NEXT: s_setpc_b64 s[30:31]7459;7460; GFX950-LABEL: global_atomic_fsub_v2f16_ret_av_av:7461; GFX950: ; %bb.0:7462; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7463; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407464; GFX950-NEXT: s_mov_b64 s[0:1], 07465; GFX950-NEXT: ;;#ASMSTART7466; GFX950-NEXT: ; def v47467; GFX950-NEXT: ;;#ASMEND7468; GFX950-NEXT: .LBB142_1: ; %atomicrmw.start7469; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17470; GFX950-NEXT: s_waitcnt vmcnt(0)7471; GFX950-NEXT: v_pk_add_f16 v2, v3, v4 neg_lo:[0,1] neg_hi:[0,1]7472; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07473; GFX950-NEXT: s_waitcnt vmcnt(0)7474; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37475; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7476; GFX950-NEXT: v_mov_b32_e32 v3, v27477; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7478; GFX950-NEXT: s_cbranch_execnz .LBB142_17479; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7480; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7481; GFX950-NEXT: ;;#ASMSTART7482; GFX950-NEXT: ; use v27483; GFX950-NEXT: ;;#ASMEND7484; GFX950-NEXT: s_setpc_b64 s[30:31]7485 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107486 %data = call <2 x half> asm "; def $0", "=^VA"()7487 %result = atomicrmw fsub ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07488 call void asm "; use $0", "^VA"(<2 x half> %result)7489 ret void7490}7491 7492define void @global_atomic_fmax_v2f16_ret_a_a(ptr addrspace(1) %ptr) #0 {7493; GFX90A-LABEL: global_atomic_fmax_v2f16_ret_a_a:7494; GFX90A: ; %bb.0:7495; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7496; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407497; GFX90A-NEXT: ;;#ASMSTART7498; GFX90A-NEXT: ; def a07499; GFX90A-NEXT: ;;#ASMEND7500; GFX90A-NEXT: v_accvgpr_read_b32 v2, a07501; GFX90A-NEXT: s_mov_b64 s[4:5], 07502; GFX90A-NEXT: v_pk_max_f16 v4, v2, v27503; GFX90A-NEXT: .LBB143_1: ; %atomicrmw.start7504; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17505; GFX90A-NEXT: s_waitcnt vmcnt(0)7506; GFX90A-NEXT: v_pk_max_f16 v2, v3, v37507; GFX90A-NEXT: v_pk_max_f16 v2, v2, v47508; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7509; GFX90A-NEXT: s_waitcnt vmcnt(0)7510; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37511; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7512; GFX90A-NEXT: v_mov_b32_e32 v3, v27513; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7514; GFX90A-NEXT: s_cbranch_execnz .LBB143_17515; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7516; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7517; GFX90A-NEXT: v_accvgpr_write_b32 a0, v27518; GFX90A-NEXT: ;;#ASMSTART7519; GFX90A-NEXT: ; use a07520; GFX90A-NEXT: ;;#ASMEND7521; GFX90A-NEXT: s_setpc_b64 s[30:31]7522;7523; GFX950-LABEL: global_atomic_fmax_v2f16_ret_a_a:7524; GFX950: ; %bb.0:7525; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7526; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407527; GFX950-NEXT: ;;#ASMSTART7528; GFX950-NEXT: ; def a07529; GFX950-NEXT: ;;#ASMEND7530; GFX950-NEXT: s_mov_b64 s[0:1], 07531; GFX950-NEXT: v_accvgpr_read_b32 v2, a07532; GFX950-NEXT: v_pk_max_f16 v4, v2, v27533; GFX950-NEXT: .LBB143_1: ; %atomicrmw.start7534; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17535; GFX950-NEXT: s_waitcnt vmcnt(0)7536; GFX950-NEXT: v_pk_max_f16 v2, v3, v37537; GFX950-NEXT: s_nop 07538; GFX950-NEXT: v_pk_max_f16 v2, v2, v47539; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07540; GFX950-NEXT: s_waitcnt vmcnt(0)7541; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37542; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7543; GFX950-NEXT: v_mov_b32_e32 v3, v27544; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7545; GFX950-NEXT: s_cbranch_execnz .LBB143_17546; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7547; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7548; GFX950-NEXT: v_accvgpr_write_b32 a0, v27549; GFX950-NEXT: ;;#ASMSTART7550; GFX950-NEXT: ; use a07551; GFX950-NEXT: ;;#ASMEND7552; GFX950-NEXT: s_setpc_b64 s[30:31]7553 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107554 %data = call <2 x half> asm "; def $0", "=a"()7555 %result = atomicrmw fmax ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07556 call void asm "; use $0", "a"(<2 x half> %result)7557 ret void7558}7559 7560define void @global_atomic_fmax_v2f16_ret_av_av(ptr addrspace(1) %ptr) #0 {7561; GFX90A-LABEL: global_atomic_fmax_v2f16_ret_av_av:7562; GFX90A: ; %bb.0:7563; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7564; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407565; GFX90A-NEXT: ;;#ASMSTART7566; GFX90A-NEXT: ; def v27567; GFX90A-NEXT: ;;#ASMEND7568; GFX90A-NEXT: s_mov_b64 s[4:5], 07569; GFX90A-NEXT: v_pk_max_f16 v4, v2, v27570; GFX90A-NEXT: .LBB144_1: ; %atomicrmw.start7571; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17572; GFX90A-NEXT: s_waitcnt vmcnt(0)7573; GFX90A-NEXT: v_pk_max_f16 v2, v3, v37574; GFX90A-NEXT: v_pk_max_f16 v2, v2, v47575; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7576; GFX90A-NEXT: s_waitcnt vmcnt(0)7577; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37578; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7579; GFX90A-NEXT: v_mov_b32_e32 v3, v27580; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7581; GFX90A-NEXT: s_cbranch_execnz .LBB144_17582; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7583; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7584; GFX90A-NEXT: ;;#ASMSTART7585; GFX90A-NEXT: ; use v27586; GFX90A-NEXT: ;;#ASMEND7587; GFX90A-NEXT: s_setpc_b64 s[30:31]7588;7589; GFX950-LABEL: global_atomic_fmax_v2f16_ret_av_av:7590; GFX950: ; %bb.0:7591; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7592; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407593; GFX950-NEXT: ;;#ASMSTART7594; GFX950-NEXT: ; def v27595; GFX950-NEXT: ;;#ASMEND7596; GFX950-NEXT: s_mov_b64 s[0:1], 07597; GFX950-NEXT: v_pk_max_f16 v4, v2, v27598; GFX950-NEXT: .LBB144_1: ; %atomicrmw.start7599; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17600; GFX950-NEXT: s_waitcnt vmcnt(0)7601; GFX950-NEXT: v_pk_max_f16 v2, v3, v37602; GFX950-NEXT: s_nop 07603; GFX950-NEXT: v_pk_max_f16 v2, v2, v47604; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07605; GFX950-NEXT: s_waitcnt vmcnt(0)7606; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37607; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7608; GFX950-NEXT: v_mov_b32_e32 v3, v27609; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7610; GFX950-NEXT: s_cbranch_execnz .LBB144_17611; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7612; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7613; GFX950-NEXT: ;;#ASMSTART7614; GFX950-NEXT: ; use v27615; GFX950-NEXT: ;;#ASMEND7616; GFX950-NEXT: s_setpc_b64 s[30:31]7617 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107618 %data = call <2 x half> asm "; def $0", "=^VA"()7619 %result = atomicrmw fmax ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07620 call void asm "; use $0", "^VA"(<2 x half> %result)7621 ret void7622}7623 7624define void @global_atomic_fmin_v2f16_ret_a_a(ptr addrspace(1) %ptr) #0 {7625; GFX90A-LABEL: global_atomic_fmin_v2f16_ret_a_a:7626; GFX90A: ; %bb.0:7627; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7628; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407629; GFX90A-NEXT: ;;#ASMSTART7630; GFX90A-NEXT: ; def a07631; GFX90A-NEXT: ;;#ASMEND7632; GFX90A-NEXT: v_accvgpr_read_b32 v2, a07633; GFX90A-NEXT: s_mov_b64 s[4:5], 07634; GFX90A-NEXT: v_pk_max_f16 v4, v2, v27635; GFX90A-NEXT: .LBB145_1: ; %atomicrmw.start7636; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17637; GFX90A-NEXT: s_waitcnt vmcnt(0)7638; GFX90A-NEXT: v_pk_max_f16 v2, v3, v37639; GFX90A-NEXT: v_pk_min_f16 v2, v2, v47640; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7641; GFX90A-NEXT: s_waitcnt vmcnt(0)7642; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37643; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7644; GFX90A-NEXT: v_mov_b32_e32 v3, v27645; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7646; GFX90A-NEXT: s_cbranch_execnz .LBB145_17647; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7648; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7649; GFX90A-NEXT: v_accvgpr_write_b32 a0, v27650; GFX90A-NEXT: ;;#ASMSTART7651; GFX90A-NEXT: ; use a07652; GFX90A-NEXT: ;;#ASMEND7653; GFX90A-NEXT: s_setpc_b64 s[30:31]7654;7655; GFX950-LABEL: global_atomic_fmin_v2f16_ret_a_a:7656; GFX950: ; %bb.0:7657; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7658; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407659; GFX950-NEXT: ;;#ASMSTART7660; GFX950-NEXT: ; def a07661; GFX950-NEXT: ;;#ASMEND7662; GFX950-NEXT: s_mov_b64 s[0:1], 07663; GFX950-NEXT: v_accvgpr_read_b32 v2, a07664; GFX950-NEXT: v_pk_max_f16 v4, v2, v27665; GFX950-NEXT: .LBB145_1: ; %atomicrmw.start7666; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17667; GFX950-NEXT: s_waitcnt vmcnt(0)7668; GFX950-NEXT: v_pk_max_f16 v2, v3, v37669; GFX950-NEXT: s_nop 07670; GFX950-NEXT: v_pk_min_f16 v2, v2, v47671; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07672; GFX950-NEXT: s_waitcnt vmcnt(0)7673; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37674; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7675; GFX950-NEXT: v_mov_b32_e32 v3, v27676; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7677; GFX950-NEXT: s_cbranch_execnz .LBB145_17678; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7679; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7680; GFX950-NEXT: v_accvgpr_write_b32 a0, v27681; GFX950-NEXT: ;;#ASMSTART7682; GFX950-NEXT: ; use a07683; GFX950-NEXT: ;;#ASMEND7684; GFX950-NEXT: s_setpc_b64 s[30:31]7685 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107686 %data = call <2 x half> asm "; def $0", "=a"()7687 %result = atomicrmw fmin ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07688 call void asm "; use $0", "a"(<2 x half> %result)7689 ret void7690}7691 7692define void @global_atomic_fmin_v2f16_ret_av_av(ptr addrspace(1) %ptr) #0 {7693; GFX90A-LABEL: global_atomic_fmin_v2f16_ret_av_av:7694; GFX90A: ; %bb.0:7695; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7696; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407697; GFX90A-NEXT: ;;#ASMSTART7698; GFX90A-NEXT: ; def v27699; GFX90A-NEXT: ;;#ASMEND7700; GFX90A-NEXT: s_mov_b64 s[4:5], 07701; GFX90A-NEXT: v_pk_max_f16 v4, v2, v27702; GFX90A-NEXT: .LBB146_1: ; %atomicrmw.start7703; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17704; GFX90A-NEXT: s_waitcnt vmcnt(0)7705; GFX90A-NEXT: v_pk_max_f16 v2, v3, v37706; GFX90A-NEXT: v_pk_min_f16 v2, v2, v47707; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7708; GFX90A-NEXT: s_waitcnt vmcnt(0)7709; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37710; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]7711; GFX90A-NEXT: v_mov_b32_e32 v3, v27712; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]7713; GFX90A-NEXT: s_cbranch_execnz .LBB146_17714; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7715; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]7716; GFX90A-NEXT: ;;#ASMSTART7717; GFX90A-NEXT: ; use v27718; GFX90A-NEXT: ;;#ASMEND7719; GFX90A-NEXT: s_setpc_b64 s[30:31]7720;7721; GFX950-LABEL: global_atomic_fmin_v2f16_ret_av_av:7722; GFX950: ; %bb.0:7723; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7724; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407725; GFX950-NEXT: ;;#ASMSTART7726; GFX950-NEXT: ; def v27727; GFX950-NEXT: ;;#ASMEND7728; GFX950-NEXT: s_mov_b64 s[0:1], 07729; GFX950-NEXT: v_pk_max_f16 v4, v2, v27730; GFX950-NEXT: .LBB146_1: ; %atomicrmw.start7731; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17732; GFX950-NEXT: s_waitcnt vmcnt(0)7733; GFX950-NEXT: v_pk_max_f16 v2, v3, v37734; GFX950-NEXT: s_nop 07735; GFX950-NEXT: v_pk_min_f16 v2, v2, v47736; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07737; GFX950-NEXT: s_waitcnt vmcnt(0)7738; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37739; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7740; GFX950-NEXT: v_mov_b32_e32 v3, v27741; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7742; GFX950-NEXT: s_cbranch_execnz .LBB146_17743; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7744; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7745; GFX950-NEXT: ;;#ASMSTART7746; GFX950-NEXT: ; use v27747; GFX950-NEXT: ;;#ASMEND7748; GFX950-NEXT: s_setpc_b64 s[30:31]7749 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107750 %data = call <2 x half> asm "; def $0", "=^VA"()7751 %result = atomicrmw fmin ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07752 call void asm "; use $0", "^VA"(<2 x half> %result)7753 ret void7754}7755 7756define void @global_atomic_fmaximum_v2f16_ret_a_a(ptr addrspace(1) %ptr) #0 {7757; GFX90A-LABEL: global_atomic_fmaximum_v2f16_ret_a_a:7758; GFX90A: ; %bb.0:7759; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7760; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407761; GFX90A-NEXT: ;;#ASMSTART7762; GFX90A-NEXT: ; def a07763; GFX90A-NEXT: ;;#ASMEND7764; GFX90A-NEXT: v_accvgpr_read_b32 v4, a07765; GFX90A-NEXT: s_mov_b64 s[6:7], 07766; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7e007767; GFX90A-NEXT: s_mov_b32 s8, 0x50401007768; GFX90A-NEXT: .LBB147_1: ; %atomicrmw.start7769; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17770; GFX90A-NEXT: s_waitcnt vmcnt(0)7771; GFX90A-NEXT: v_pk_max_f16 v2, v3, v47772; GFX90A-NEXT: v_cmp_o_f16_sdwa vcc, v3, v4 src0_sel:WORD_1 src1_sel:WORD_17773; GFX90A-NEXT: v_cmp_o_f16_e64 s[4:5], v3, v47774; GFX90A-NEXT: v_cndmask_b32_e64 v6, v5, v2, s[4:5]7775; GFX90A-NEXT: v_cndmask_b32_sdwa v2, v5, v2, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_17776; GFX90A-NEXT: v_perm_b32 v2, v2, v6, s87777; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7778; GFX90A-NEXT: s_waitcnt vmcnt(0)7779; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37780; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]7781; GFX90A-NEXT: v_mov_b32_e32 v3, v27782; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]7783; GFX90A-NEXT: s_cbranch_execnz .LBB147_17784; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7785; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]7786; GFX90A-NEXT: v_accvgpr_write_b32 a0, v27787; GFX90A-NEXT: ;;#ASMSTART7788; GFX90A-NEXT: ; use a07789; GFX90A-NEXT: ;;#ASMEND7790; GFX90A-NEXT: s_setpc_b64 s[30:31]7791;7792; GFX950-LABEL: global_atomic_fmaximum_v2f16_ret_a_a:7793; GFX950: ; %bb.0:7794; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7795; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407796; GFX950-NEXT: ;;#ASMSTART7797; GFX950-NEXT: ; def a07798; GFX950-NEXT: ;;#ASMEND7799; GFX950-NEXT: s_mov_b64 s[0:1], 07800; GFX950-NEXT: v_accvgpr_read_b32 v4, a07801; GFX950-NEXT: .LBB147_1: ; %atomicrmw.start7802; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17803; GFX950-NEXT: s_waitcnt vmcnt(0)7804; GFX950-NEXT: v_pk_maximum3_f16 v2, v3, v4, v47805; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07806; GFX950-NEXT: s_waitcnt vmcnt(0)7807; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37808; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7809; GFX950-NEXT: v_mov_b32_e32 v3, v27810; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7811; GFX950-NEXT: s_cbranch_execnz .LBB147_17812; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7813; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7814; GFX950-NEXT: v_accvgpr_write_b32 a0, v27815; GFX950-NEXT: ;;#ASMSTART7816; GFX950-NEXT: ; use a07817; GFX950-NEXT: ;;#ASMEND7818; GFX950-NEXT: s_setpc_b64 s[30:31]7819 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107820 %data = call <2 x half> asm "; def $0", "=a"()7821 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07822 call void asm "; use $0", "a"(<2 x half> %result)7823 ret void7824}7825 7826define void @global_atomic_fmaximum_v2f16_ret_av_av(ptr addrspace(1) %ptr) #0 {7827; GFX90A-LABEL: global_atomic_fmaximum_v2f16_ret_av_av:7828; GFX90A: ; %bb.0:7829; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7830; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407831; GFX90A-NEXT: s_mov_b64 s[6:7], 07832; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7e007833; GFX90A-NEXT: s_mov_b32 s8, 0x50401007834; GFX90A-NEXT: ;;#ASMSTART7835; GFX90A-NEXT: ; def v47836; GFX90A-NEXT: ;;#ASMEND7837; GFX90A-NEXT: .LBB148_1: ; %atomicrmw.start7838; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17839; GFX90A-NEXT: s_waitcnt vmcnt(0)7840; GFX90A-NEXT: v_pk_max_f16 v2, v3, v47841; GFX90A-NEXT: v_cmp_o_f16_sdwa vcc, v3, v4 src0_sel:WORD_1 src1_sel:WORD_17842; GFX90A-NEXT: v_cmp_o_f16_e64 s[4:5], v3, v47843; GFX90A-NEXT: v_cndmask_b32_e64 v6, v5, v2, s[4:5]7844; GFX90A-NEXT: v_cndmask_b32_sdwa v2, v5, v2, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_17845; GFX90A-NEXT: v_perm_b32 v2, v2, v6, s87846; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7847; GFX90A-NEXT: s_waitcnt vmcnt(0)7848; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37849; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]7850; GFX90A-NEXT: v_mov_b32_e32 v3, v27851; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]7852; GFX90A-NEXT: s_cbranch_execnz .LBB148_17853; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7854; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]7855; GFX90A-NEXT: ;;#ASMSTART7856; GFX90A-NEXT: ; use v27857; GFX90A-NEXT: ;;#ASMEND7858; GFX90A-NEXT: s_setpc_b64 s[30:31]7859;7860; GFX950-LABEL: global_atomic_fmaximum_v2f16_ret_av_av:7861; GFX950: ; %bb.0:7862; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7863; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407864; GFX950-NEXT: s_mov_b64 s[0:1], 07865; GFX950-NEXT: ;;#ASMSTART7866; GFX950-NEXT: ; def v47867; GFX950-NEXT: ;;#ASMEND7868; GFX950-NEXT: .LBB148_1: ; %atomicrmw.start7869; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17870; GFX950-NEXT: s_waitcnt vmcnt(0)7871; GFX950-NEXT: v_pk_maximum3_f16 v2, v3, v4, v47872; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07873; GFX950-NEXT: s_waitcnt vmcnt(0)7874; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37875; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7876; GFX950-NEXT: v_mov_b32_e32 v3, v27877; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7878; GFX950-NEXT: s_cbranch_execnz .LBB148_17879; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7880; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7881; GFX950-NEXT: ;;#ASMSTART7882; GFX950-NEXT: ; use v27883; GFX950-NEXT: ;;#ASMEND7884; GFX950-NEXT: s_setpc_b64 s[30:31]7885 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107886 %data = call <2 x half> asm "; def $0", "=^VA"()7887 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07888 call void asm "; use $0", "^VA"(<2 x half> %result)7889 ret void7890}7891 7892define void @global_atomic_fminimum_v2f16_ret_a_a(ptr addrspace(1) %ptr) #0 {7893; GFX90A-LABEL: global_atomic_fminimum_v2f16_ret_a_a:7894; GFX90A: ; %bb.0:7895; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7896; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407897; GFX90A-NEXT: ;;#ASMSTART7898; GFX90A-NEXT: ; def a07899; GFX90A-NEXT: ;;#ASMEND7900; GFX90A-NEXT: v_accvgpr_read_b32 v4, a07901; GFX90A-NEXT: s_mov_b64 s[6:7], 07902; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7e007903; GFX90A-NEXT: s_mov_b32 s8, 0x50401007904; GFX90A-NEXT: .LBB149_1: ; %atomicrmw.start7905; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17906; GFX90A-NEXT: s_waitcnt vmcnt(0)7907; GFX90A-NEXT: v_pk_min_f16 v2, v3, v47908; GFX90A-NEXT: v_cmp_o_f16_sdwa vcc, v3, v4 src0_sel:WORD_1 src1_sel:WORD_17909; GFX90A-NEXT: v_cmp_o_f16_e64 s[4:5], v3, v47910; GFX90A-NEXT: v_cndmask_b32_e64 v6, v5, v2, s[4:5]7911; GFX90A-NEXT: v_cndmask_b32_sdwa v2, v5, v2, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_17912; GFX90A-NEXT: v_perm_b32 v2, v2, v6, s87913; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7914; GFX90A-NEXT: s_waitcnt vmcnt(0)7915; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37916; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]7917; GFX90A-NEXT: v_mov_b32_e32 v3, v27918; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]7919; GFX90A-NEXT: s_cbranch_execnz .LBB149_17920; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7921; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]7922; GFX90A-NEXT: v_accvgpr_write_b32 a0, v27923; GFX90A-NEXT: ;;#ASMSTART7924; GFX90A-NEXT: ; use a07925; GFX90A-NEXT: ;;#ASMEND7926; GFX90A-NEXT: s_setpc_b64 s[30:31]7927;7928; GFX950-LABEL: global_atomic_fminimum_v2f16_ret_a_a:7929; GFX950: ; %bb.0:7930; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7931; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:407932; GFX950-NEXT: ;;#ASMSTART7933; GFX950-NEXT: ; def a07934; GFX950-NEXT: ;;#ASMEND7935; GFX950-NEXT: s_mov_b64 s[0:1], 07936; GFX950-NEXT: v_accvgpr_read_b32 v4, a07937; GFX950-NEXT: .LBB149_1: ; %atomicrmw.start7938; GFX950-NEXT: ; =>This Inner Loop Header: Depth=17939; GFX950-NEXT: s_waitcnt vmcnt(0)7940; GFX950-NEXT: v_pk_minimum3_f16 v2, v3, v4, v47941; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc07942; GFX950-NEXT: s_waitcnt vmcnt(0)7943; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37944; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]7945; GFX950-NEXT: v_mov_b32_e32 v3, v27946; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]7947; GFX950-NEXT: s_cbranch_execnz .LBB149_17948; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end7949; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]7950; GFX950-NEXT: v_accvgpr_write_b32 a0, v27951; GFX950-NEXT: ;;#ASMSTART7952; GFX950-NEXT: ; use a07953; GFX950-NEXT: ;;#ASMEND7954; GFX950-NEXT: s_setpc_b64 s[30:31]7955 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 107956 %data = call <2 x half> asm "; def $0", "=a"()7957 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !07958 call void asm "; use $0", "a"(<2 x half> %result)7959 ret void7960}7961 7962define void @global_atomic_fminimum_v2f16_ret_av_av(ptr addrspace(1) %ptr) #0 {7963; GFX90A-LABEL: global_atomic_fminimum_v2f16_ret_av_av:7964; GFX90A: ; %bb.0:7965; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7966; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:407967; GFX90A-NEXT: s_mov_b64 s[6:7], 07968; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7e007969; GFX90A-NEXT: s_mov_b32 s8, 0x50401007970; GFX90A-NEXT: ;;#ASMSTART7971; GFX90A-NEXT: ; def v47972; GFX90A-NEXT: ;;#ASMEND7973; GFX90A-NEXT: .LBB150_1: ; %atomicrmw.start7974; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=17975; GFX90A-NEXT: s_waitcnt vmcnt(0)7976; GFX90A-NEXT: v_pk_min_f16 v2, v3, v47977; GFX90A-NEXT: v_cmp_o_f16_sdwa vcc, v3, v4 src0_sel:WORD_1 src1_sel:WORD_17978; GFX90A-NEXT: v_cmp_o_f16_e64 s[4:5], v3, v47979; GFX90A-NEXT: v_cndmask_b32_e64 v6, v5, v2, s[4:5]7980; GFX90A-NEXT: v_cndmask_b32_sdwa v2, v5, v2, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_17981; GFX90A-NEXT: v_perm_b32 v2, v2, v6, s87982; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc7983; GFX90A-NEXT: s_waitcnt vmcnt(0)7984; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v37985; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]7986; GFX90A-NEXT: v_mov_b32_e32 v3, v27987; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]7988; GFX90A-NEXT: s_cbranch_execnz .LBB150_17989; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end7990; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]7991; GFX90A-NEXT: ;;#ASMSTART7992; GFX90A-NEXT: ; use v27993; GFX90A-NEXT: ;;#ASMEND7994; GFX90A-NEXT: s_setpc_b64 s[30:31]7995;7996; GFX950-LABEL: global_atomic_fminimum_v2f16_ret_av_av:7997; GFX950: ; %bb.0:7998; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7999; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408000; GFX950-NEXT: s_mov_b64 s[0:1], 08001; GFX950-NEXT: ;;#ASMSTART8002; GFX950-NEXT: ; def v48003; GFX950-NEXT: ;;#ASMEND8004; GFX950-NEXT: .LBB150_1: ; %atomicrmw.start8005; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18006; GFX950-NEXT: s_waitcnt vmcnt(0)8007; GFX950-NEXT: v_pk_minimum3_f16 v2, v3, v4, v48008; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08009; GFX950-NEXT: s_waitcnt vmcnt(0)8010; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38011; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8012; GFX950-NEXT: v_mov_b32_e32 v3, v28013; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8014; GFX950-NEXT: s_cbranch_execnz .LBB150_18015; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8016; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8017; GFX950-NEXT: ;;#ASMSTART8018; GFX950-NEXT: ; use v28019; GFX950-NEXT: ;;#ASMEND8020; GFX950-NEXT: s_setpc_b64 s[30:31]8021 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 108022 %data = call <2 x half> asm "; def $0", "=^VA"()8023 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08024 call void asm "; use $0", "^VA"(<2 x half> %result)8025 ret void8026}8027 8028;---------------------------------------------------------------------8029; other atomics v2bf16, with aa+av cases8030;---------------------------------------------------------------------8031 8032define void @global_atomic_fadd_v2bf16_ret_a_a(ptr addrspace(1) %ptr) #0 {8033; GFX90A-LABEL: global_atomic_fadd_v2bf16_ret_a_a:8034; GFX90A: ; %bb.0:8035; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8036; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408037; GFX90A-NEXT: ;;#ASMSTART8038; GFX90A-NEXT: ; def a08039; GFX90A-NEXT: ;;#ASMEND8040; GFX90A-NEXT: v_accvgpr_read_b32 v2, a08041; GFX90A-NEXT: s_mov_b64 s[6:7], 08042; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28043; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8044; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v28045; GFX90A-NEXT: s_mov_b32 s9, 0x70603028046; GFX90A-NEXT: .LBB151_1: ; %atomicrmw.start8047; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18048; GFX90A-NEXT: s_waitcnt vmcnt(0)8049; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38050; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v38051; GFX90A-NEXT: v_add_f32_e32 v2, v2, v48052; GFX90A-NEXT: v_add_f32_e32 v6, v6, v58053; GFX90A-NEXT: v_bfe_u32 v7, v2, 16, 18054; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 18055; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v28056; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v68057; GFX90A-NEXT: v_add3_u32 v7, v7, v2, s88058; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s88059; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v68060; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28061; GFX90A-NEXT: v_cndmask_b32_e64 v2, v7, v8, s[4:5]8062; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc8063; GFX90A-NEXT: v_perm_b32 v2, v6, v2, s98064; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8065; GFX90A-NEXT: s_waitcnt vmcnt(0)8066; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38067; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8068; GFX90A-NEXT: v_mov_b32_e32 v3, v28069; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8070; GFX90A-NEXT: s_cbranch_execnz .LBB151_18071; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8072; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8073; GFX90A-NEXT: v_accvgpr_write_b32 a0, v28074; GFX90A-NEXT: ;;#ASMSTART8075; GFX90A-NEXT: ; use a08076; GFX90A-NEXT: ;;#ASMEND8077; GFX90A-NEXT: s_setpc_b64 s[30:31]8078;8079; GFX950-LABEL: global_atomic_fadd_v2bf16_ret_a_a:8080; GFX950: ; %bb.0:8081; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8082; GFX950-NEXT: ;;#ASMSTART8083; GFX950-NEXT: ; def a08084; GFX950-NEXT: ;;#ASMEND8085; GFX950-NEXT: s_nop 08086; GFX950-NEXT: v_accvgpr_read_b32 v2, a08087; GFX950-NEXT: global_atomic_pk_add_bf16 v0, v[0:1], v2, off offset:40 sc08088; GFX950-NEXT: s_waitcnt vmcnt(0)8089; GFX950-NEXT: v_accvgpr_write_b32 a0, v08090; GFX950-NEXT: ;;#ASMSTART8091; GFX950-NEXT: ; use a08092; GFX950-NEXT: ;;#ASMEND8093; GFX950-NEXT: s_setpc_b64 s[30:31]8094 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108095 %data = call <2 x bfloat> asm "; def $0", "=a"()8096 %result = atomicrmw fadd ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08097 call void asm "; use $0", "a"(<2 x bfloat> %result)8098 ret void8099}8100 8101define void @global_atomic_fadd_v2bf16_ret_av_av(ptr addrspace(1) %ptr) #0 {8102; GFX90A-LABEL: global_atomic_fadd_v2bf16_ret_av_av:8103; GFX90A: ; %bb.0:8104; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8105; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408106; GFX90A-NEXT: ;;#ASMSTART8107; GFX90A-NEXT: ; def v28108; GFX90A-NEXT: ;;#ASMEND8109; GFX90A-NEXT: s_mov_b64 s[6:7], 08110; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28111; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8112; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v28113; GFX90A-NEXT: s_mov_b32 s9, 0x70603028114; GFX90A-NEXT: .LBB152_1: ; %atomicrmw.start8115; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18116; GFX90A-NEXT: s_waitcnt vmcnt(0)8117; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38118; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v38119; GFX90A-NEXT: v_add_f32_e32 v2, v2, v48120; GFX90A-NEXT: v_add_f32_e32 v6, v6, v58121; GFX90A-NEXT: v_bfe_u32 v7, v2, 16, 18122; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 18123; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v28124; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v68125; GFX90A-NEXT: v_add3_u32 v7, v7, v2, s88126; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s88127; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v68128; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28129; GFX90A-NEXT: v_cndmask_b32_e64 v2, v7, v8, s[4:5]8130; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc8131; GFX90A-NEXT: v_perm_b32 v2, v6, v2, s98132; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8133; GFX90A-NEXT: s_waitcnt vmcnt(0)8134; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38135; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8136; GFX90A-NEXT: v_mov_b32_e32 v3, v28137; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8138; GFX90A-NEXT: s_cbranch_execnz .LBB152_18139; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8140; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8141; GFX90A-NEXT: ;;#ASMSTART8142; GFX90A-NEXT: ; use v28143; GFX90A-NEXT: ;;#ASMEND8144; GFX90A-NEXT: s_setpc_b64 s[30:31]8145;8146; GFX950-LABEL: global_atomic_fadd_v2bf16_ret_av_av:8147; GFX950: ; %bb.0:8148; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8149; GFX950-NEXT: ;;#ASMSTART8150; GFX950-NEXT: ; def v28151; GFX950-NEXT: ;;#ASMEND8152; GFX950-NEXT: global_atomic_pk_add_bf16 v0, v[0:1], v2, off offset:40 sc08153; GFX950-NEXT: s_waitcnt vmcnt(0)8154; GFX950-NEXT: ;;#ASMSTART8155; GFX950-NEXT: ; use v08156; GFX950-NEXT: ;;#ASMEND8157; GFX950-NEXT: s_setpc_b64 s[30:31]8158 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108159 %data = call <2 x bfloat> asm "; def $0", "=^VA"()8160 %result = atomicrmw fadd ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08161 call void asm "; use $0", "^VA"(<2 x bfloat> %result)8162 ret void8163}8164 8165define void @global_atomic_fsub_v2bf16_ret_a_a(ptr addrspace(1) %ptr) #0 {8166; GFX90A-LABEL: global_atomic_fsub_v2bf16_ret_a_a:8167; GFX90A: ; %bb.0:8168; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8169; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408170; GFX90A-NEXT: ;;#ASMSTART8171; GFX90A-NEXT: ; def a08172; GFX90A-NEXT: ;;#ASMEND8173; GFX90A-NEXT: v_accvgpr_read_b32 v2, a08174; GFX90A-NEXT: s_mov_b64 s[6:7], 08175; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28176; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8177; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v28178; GFX90A-NEXT: s_mov_b32 s9, 0x70603028179; GFX90A-NEXT: .LBB153_1: ; %atomicrmw.start8180; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18181; GFX90A-NEXT: s_waitcnt vmcnt(0)8182; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38183; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v38184; GFX90A-NEXT: v_sub_f32_e32 v2, v2, v48185; GFX90A-NEXT: v_sub_f32_e32 v6, v6, v58186; GFX90A-NEXT: v_bfe_u32 v7, v2, 16, 18187; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 18188; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v28189; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v68190; GFX90A-NEXT: v_add3_u32 v7, v7, v2, s88191; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s88192; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v68193; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28194; GFX90A-NEXT: v_cndmask_b32_e64 v2, v7, v8, s[4:5]8195; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc8196; GFX90A-NEXT: v_perm_b32 v2, v6, v2, s98197; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8198; GFX90A-NEXT: s_waitcnt vmcnt(0)8199; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38200; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8201; GFX90A-NEXT: v_mov_b32_e32 v3, v28202; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8203; GFX90A-NEXT: s_cbranch_execnz .LBB153_18204; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8205; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8206; GFX90A-NEXT: v_accvgpr_write_b32 a0, v28207; GFX90A-NEXT: ;;#ASMSTART8208; GFX90A-NEXT: ; use a08209; GFX90A-NEXT: ;;#ASMEND8210; GFX90A-NEXT: s_setpc_b64 s[30:31]8211;8212; GFX950-LABEL: global_atomic_fsub_v2bf16_ret_a_a:8213; GFX950: ; %bb.0:8214; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8215; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408216; GFX950-NEXT: ;;#ASMSTART8217; GFX950-NEXT: ; def a08218; GFX950-NEXT: ;;#ASMEND8219; GFX950-NEXT: s_mov_b64 s[0:1], 08220; GFX950-NEXT: v_accvgpr_read_b32 v2, a08221; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28222; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28223; GFX950-NEXT: .LBB153_1: ; %atomicrmw.start8224; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18225; GFX950-NEXT: s_waitcnt vmcnt(0)8226; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38227; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38228; GFX950-NEXT: v_sub_f32_e32 v2, v2, v48229; GFX950-NEXT: v_sub_f32_e32 v6, v6, v58230; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28231; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08232; GFX950-NEXT: s_waitcnt vmcnt(0)8233; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38234; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8235; GFX950-NEXT: v_mov_b32_e32 v3, v28236; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8237; GFX950-NEXT: s_cbranch_execnz .LBB153_18238; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8239; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8240; GFX950-NEXT: v_accvgpr_write_b32 a0, v28241; GFX950-NEXT: ;;#ASMSTART8242; GFX950-NEXT: ; use a08243; GFX950-NEXT: ;;#ASMEND8244; GFX950-NEXT: s_setpc_b64 s[30:31]8245 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108246 %data = call <2 x bfloat> asm "; def $0", "=a"()8247 %result = atomicrmw fsub ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08248 call void asm "; use $0", "a"(<2 x bfloat> %result)8249 ret void8250}8251 8252define void @global_atomic_fsub_v2bf16_ret_av_av(ptr addrspace(1) %ptr) #0 {8253; GFX90A-LABEL: global_atomic_fsub_v2bf16_ret_av_av:8254; GFX90A: ; %bb.0:8255; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8256; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408257; GFX90A-NEXT: ;;#ASMSTART8258; GFX90A-NEXT: ; def v28259; GFX90A-NEXT: ;;#ASMEND8260; GFX90A-NEXT: s_mov_b64 s[6:7], 08261; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28262; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8263; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v28264; GFX90A-NEXT: s_mov_b32 s9, 0x70603028265; GFX90A-NEXT: .LBB154_1: ; %atomicrmw.start8266; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18267; GFX90A-NEXT: s_waitcnt vmcnt(0)8268; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38269; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v38270; GFX90A-NEXT: v_sub_f32_e32 v2, v2, v48271; GFX90A-NEXT: v_sub_f32_e32 v6, v6, v58272; GFX90A-NEXT: v_bfe_u32 v7, v2, 16, 18273; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 18274; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v28275; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v68276; GFX90A-NEXT: v_add3_u32 v7, v7, v2, s88277; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s88278; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v68279; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28280; GFX90A-NEXT: v_cndmask_b32_e64 v2, v7, v8, s[4:5]8281; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc8282; GFX90A-NEXT: v_perm_b32 v2, v6, v2, s98283; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8284; GFX90A-NEXT: s_waitcnt vmcnt(0)8285; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38286; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8287; GFX90A-NEXT: v_mov_b32_e32 v3, v28288; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8289; GFX90A-NEXT: s_cbranch_execnz .LBB154_18290; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8291; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8292; GFX90A-NEXT: ;;#ASMSTART8293; GFX90A-NEXT: ; use v28294; GFX90A-NEXT: ;;#ASMEND8295; GFX90A-NEXT: s_setpc_b64 s[30:31]8296;8297; GFX950-LABEL: global_atomic_fsub_v2bf16_ret_av_av:8298; GFX950: ; %bb.0:8299; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8300; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408301; GFX950-NEXT: ;;#ASMSTART8302; GFX950-NEXT: ; def v28303; GFX950-NEXT: ;;#ASMEND8304; GFX950-NEXT: s_mov_b64 s[0:1], 08305; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28306; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28307; GFX950-NEXT: .LBB154_1: ; %atomicrmw.start8308; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18309; GFX950-NEXT: s_waitcnt vmcnt(0)8310; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38311; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38312; GFX950-NEXT: v_sub_f32_e32 v2, v2, v48313; GFX950-NEXT: v_sub_f32_e32 v6, v6, v58314; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28315; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08316; GFX950-NEXT: s_waitcnt vmcnt(0)8317; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38318; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8319; GFX950-NEXT: v_mov_b32_e32 v3, v28320; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8321; GFX950-NEXT: s_cbranch_execnz .LBB154_18322; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8323; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8324; GFX950-NEXT: ;;#ASMSTART8325; GFX950-NEXT: ; use v28326; GFX950-NEXT: ;;#ASMEND8327; GFX950-NEXT: s_setpc_b64 s[30:31]8328 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108329 %data = call <2 x bfloat> asm "; def $0", "=^VA"()8330 %result = atomicrmw fsub ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08331 call void asm "; use $0", "^VA"(<2 x bfloat> %result)8332 ret void8333}8334 8335define void @global_atomic_fmax_v2bf16_ret_a_a(ptr addrspace(1) %ptr) #0 {8336; GFX90A-LABEL: global_atomic_fmax_v2bf16_ret_a_a:8337; GFX90A: ; %bb.0:8338; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8339; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408340; GFX90A-NEXT: ;;#ASMSTART8341; GFX90A-NEXT: ; def a08342; GFX90A-NEXT: ;;#ASMEND8343; GFX90A-NEXT: v_accvgpr_read_b32 v2, a08344; GFX90A-NEXT: s_mov_b64 s[6:7], 08345; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28346; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8347; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v28348; GFX90A-NEXT: s_mov_b32 s9, 0x70603028349; GFX90A-NEXT: .LBB155_1: ; %atomicrmw.start8350; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18351; GFX90A-NEXT: s_waitcnt vmcnt(0)8352; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38353; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v38354; GFX90A-NEXT: v_max_f32_e32 v2, v2, v48355; GFX90A-NEXT: v_max_f32_e32 v6, v6, v58356; GFX90A-NEXT: v_bfe_u32 v7, v2, 16, 18357; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 18358; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v28359; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v68360; GFX90A-NEXT: v_add3_u32 v7, v7, v2, s88361; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s88362; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v68363; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28364; GFX90A-NEXT: v_cndmask_b32_e64 v2, v7, v8, s[4:5]8365; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc8366; GFX90A-NEXT: v_perm_b32 v2, v6, v2, s98367; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8368; GFX90A-NEXT: s_waitcnt vmcnt(0)8369; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38370; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8371; GFX90A-NEXT: v_mov_b32_e32 v3, v28372; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8373; GFX90A-NEXT: s_cbranch_execnz .LBB155_18374; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8375; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8376; GFX90A-NEXT: v_accvgpr_write_b32 a0, v28377; GFX90A-NEXT: ;;#ASMSTART8378; GFX90A-NEXT: ; use a08379; GFX90A-NEXT: ;;#ASMEND8380; GFX90A-NEXT: s_setpc_b64 s[30:31]8381;8382; GFX950-LABEL: global_atomic_fmax_v2bf16_ret_a_a:8383; GFX950: ; %bb.0:8384; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8385; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408386; GFX950-NEXT: ;;#ASMSTART8387; GFX950-NEXT: ; def a08388; GFX950-NEXT: ;;#ASMEND8389; GFX950-NEXT: s_mov_b64 s[0:1], 08390; GFX950-NEXT: v_accvgpr_read_b32 v2, a08391; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28392; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28393; GFX950-NEXT: .LBB155_1: ; %atomicrmw.start8394; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18395; GFX950-NEXT: s_waitcnt vmcnt(0)8396; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38397; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38398; GFX950-NEXT: v_max_f32_e32 v2, v2, v48399; GFX950-NEXT: v_max_f32_e32 v6, v6, v58400; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28401; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08402; GFX950-NEXT: s_waitcnt vmcnt(0)8403; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38404; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8405; GFX950-NEXT: v_mov_b32_e32 v3, v28406; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8407; GFX950-NEXT: s_cbranch_execnz .LBB155_18408; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8409; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8410; GFX950-NEXT: v_accvgpr_write_b32 a0, v28411; GFX950-NEXT: ;;#ASMSTART8412; GFX950-NEXT: ; use a08413; GFX950-NEXT: ;;#ASMEND8414; GFX950-NEXT: s_setpc_b64 s[30:31]8415 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108416 %data = call <2 x bfloat> asm "; def $0", "=a"()8417 %result = atomicrmw fmax ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08418 call void asm "; use $0", "a"(<2 x bfloat> %result)8419 ret void8420}8421 8422define void @global_atomic_fmax_v2bf16_ret_av_av(ptr addrspace(1) %ptr) #0 {8423; GFX90A-LABEL: global_atomic_fmax_v2bf16_ret_av_av:8424; GFX90A: ; %bb.0:8425; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8426; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408427; GFX90A-NEXT: ;;#ASMSTART8428; GFX90A-NEXT: ; def v28429; GFX90A-NEXT: ;;#ASMEND8430; GFX90A-NEXT: s_mov_b64 s[6:7], 08431; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28432; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8433; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v28434; GFX90A-NEXT: s_mov_b32 s9, 0x70603028435; GFX90A-NEXT: .LBB156_1: ; %atomicrmw.start8436; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18437; GFX90A-NEXT: s_waitcnt vmcnt(0)8438; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38439; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v38440; GFX90A-NEXT: v_max_f32_e32 v2, v2, v48441; GFX90A-NEXT: v_max_f32_e32 v6, v6, v58442; GFX90A-NEXT: v_bfe_u32 v7, v2, 16, 18443; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 18444; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v28445; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v68446; GFX90A-NEXT: v_add3_u32 v7, v7, v2, s88447; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s88448; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v68449; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28450; GFX90A-NEXT: v_cndmask_b32_e64 v2, v7, v8, s[4:5]8451; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc8452; GFX90A-NEXT: v_perm_b32 v2, v6, v2, s98453; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8454; GFX90A-NEXT: s_waitcnt vmcnt(0)8455; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38456; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8457; GFX90A-NEXT: v_mov_b32_e32 v3, v28458; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8459; GFX90A-NEXT: s_cbranch_execnz .LBB156_18460; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8461; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8462; GFX90A-NEXT: ;;#ASMSTART8463; GFX90A-NEXT: ; use v28464; GFX90A-NEXT: ;;#ASMEND8465; GFX90A-NEXT: s_setpc_b64 s[30:31]8466;8467; GFX950-LABEL: global_atomic_fmax_v2bf16_ret_av_av:8468; GFX950: ; %bb.0:8469; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8470; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408471; GFX950-NEXT: ;;#ASMSTART8472; GFX950-NEXT: ; def v28473; GFX950-NEXT: ;;#ASMEND8474; GFX950-NEXT: s_mov_b64 s[0:1], 08475; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28476; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28477; GFX950-NEXT: .LBB156_1: ; %atomicrmw.start8478; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18479; GFX950-NEXT: s_waitcnt vmcnt(0)8480; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38481; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38482; GFX950-NEXT: v_max_f32_e32 v2, v2, v48483; GFX950-NEXT: v_max_f32_e32 v6, v6, v58484; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28485; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08486; GFX950-NEXT: s_waitcnt vmcnt(0)8487; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38488; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8489; GFX950-NEXT: v_mov_b32_e32 v3, v28490; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8491; GFX950-NEXT: s_cbranch_execnz .LBB156_18492; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8493; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8494; GFX950-NEXT: ;;#ASMSTART8495; GFX950-NEXT: ; use v28496; GFX950-NEXT: ;;#ASMEND8497; GFX950-NEXT: s_setpc_b64 s[30:31]8498 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108499 %data = call <2 x bfloat> asm "; def $0", "=^VA"()8500 %result = atomicrmw fmax ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08501 call void asm "; use $0", "^VA"(<2 x bfloat> %result)8502 ret void8503}8504 8505define void @global_atomic_fmin_v2bf16_ret_a_a(ptr addrspace(1) %ptr) #0 {8506; GFX90A-LABEL: global_atomic_fmin_v2bf16_ret_a_a:8507; GFX90A: ; %bb.0:8508; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8509; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408510; GFX90A-NEXT: ;;#ASMSTART8511; GFX90A-NEXT: ; def a08512; GFX90A-NEXT: ;;#ASMEND8513; GFX90A-NEXT: v_accvgpr_read_b32 v2, a08514; GFX90A-NEXT: s_mov_b64 s[6:7], 08515; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28516; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8517; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v28518; GFX90A-NEXT: s_mov_b32 s9, 0x70603028519; GFX90A-NEXT: .LBB157_1: ; %atomicrmw.start8520; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18521; GFX90A-NEXT: s_waitcnt vmcnt(0)8522; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38523; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v38524; GFX90A-NEXT: v_min_f32_e32 v2, v2, v48525; GFX90A-NEXT: v_min_f32_e32 v6, v6, v58526; GFX90A-NEXT: v_bfe_u32 v7, v2, 16, 18527; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 18528; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v28529; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v68530; GFX90A-NEXT: v_add3_u32 v7, v7, v2, s88531; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s88532; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v68533; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28534; GFX90A-NEXT: v_cndmask_b32_e64 v2, v7, v8, s[4:5]8535; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc8536; GFX90A-NEXT: v_perm_b32 v2, v6, v2, s98537; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8538; GFX90A-NEXT: s_waitcnt vmcnt(0)8539; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38540; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8541; GFX90A-NEXT: v_mov_b32_e32 v3, v28542; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8543; GFX90A-NEXT: s_cbranch_execnz .LBB157_18544; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8545; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8546; GFX90A-NEXT: v_accvgpr_write_b32 a0, v28547; GFX90A-NEXT: ;;#ASMSTART8548; GFX90A-NEXT: ; use a08549; GFX90A-NEXT: ;;#ASMEND8550; GFX90A-NEXT: s_setpc_b64 s[30:31]8551;8552; GFX950-LABEL: global_atomic_fmin_v2bf16_ret_a_a:8553; GFX950: ; %bb.0:8554; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8555; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408556; GFX950-NEXT: ;;#ASMSTART8557; GFX950-NEXT: ; def a08558; GFX950-NEXT: ;;#ASMEND8559; GFX950-NEXT: s_mov_b64 s[0:1], 08560; GFX950-NEXT: v_accvgpr_read_b32 v2, a08561; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28562; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28563; GFX950-NEXT: .LBB157_1: ; %atomicrmw.start8564; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18565; GFX950-NEXT: s_waitcnt vmcnt(0)8566; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38567; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38568; GFX950-NEXT: v_min_f32_e32 v2, v2, v48569; GFX950-NEXT: v_min_f32_e32 v6, v6, v58570; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28571; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08572; GFX950-NEXT: s_waitcnt vmcnt(0)8573; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38574; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8575; GFX950-NEXT: v_mov_b32_e32 v3, v28576; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8577; GFX950-NEXT: s_cbranch_execnz .LBB157_18578; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8579; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8580; GFX950-NEXT: v_accvgpr_write_b32 a0, v28581; GFX950-NEXT: ;;#ASMSTART8582; GFX950-NEXT: ; use a08583; GFX950-NEXT: ;;#ASMEND8584; GFX950-NEXT: s_setpc_b64 s[30:31]8585 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108586 %data = call <2 x bfloat> asm "; def $0", "=a"()8587 %result = atomicrmw fmin ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08588 call void asm "; use $0", "a"(<2 x bfloat> %result)8589 ret void8590}8591 8592define void @global_atomic_fmin_v2bf16_ret_av_av(ptr addrspace(1) %ptr) #0 {8593; GFX90A-LABEL: global_atomic_fmin_v2bf16_ret_av_av:8594; GFX90A: ; %bb.0:8595; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8596; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408597; GFX90A-NEXT: ;;#ASMSTART8598; GFX90A-NEXT: ; def v28599; GFX90A-NEXT: ;;#ASMEND8600; GFX90A-NEXT: s_mov_b64 s[6:7], 08601; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28602; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8603; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v28604; GFX90A-NEXT: s_mov_b32 s9, 0x70603028605; GFX90A-NEXT: .LBB158_1: ; %atomicrmw.start8606; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18607; GFX90A-NEXT: s_waitcnt vmcnt(0)8608; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38609; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v38610; GFX90A-NEXT: v_min_f32_e32 v2, v2, v48611; GFX90A-NEXT: v_min_f32_e32 v6, v6, v58612; GFX90A-NEXT: v_bfe_u32 v7, v2, 16, 18613; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 18614; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v28615; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v68616; GFX90A-NEXT: v_add3_u32 v7, v7, v2, s88617; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s88618; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v68619; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28620; GFX90A-NEXT: v_cndmask_b32_e64 v2, v7, v8, s[4:5]8621; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc8622; GFX90A-NEXT: v_perm_b32 v2, v6, v2, s98623; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8624; GFX90A-NEXT: s_waitcnt vmcnt(0)8625; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38626; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8627; GFX90A-NEXT: v_mov_b32_e32 v3, v28628; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8629; GFX90A-NEXT: s_cbranch_execnz .LBB158_18630; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8631; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8632; GFX90A-NEXT: ;;#ASMSTART8633; GFX90A-NEXT: ; use v28634; GFX90A-NEXT: ;;#ASMEND8635; GFX90A-NEXT: s_setpc_b64 s[30:31]8636;8637; GFX950-LABEL: global_atomic_fmin_v2bf16_ret_av_av:8638; GFX950: ; %bb.0:8639; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8640; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408641; GFX950-NEXT: ;;#ASMSTART8642; GFX950-NEXT: ; def v28643; GFX950-NEXT: ;;#ASMEND8644; GFX950-NEXT: s_mov_b64 s[0:1], 08645; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28646; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28647; GFX950-NEXT: .LBB158_1: ; %atomicrmw.start8648; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18649; GFX950-NEXT: s_waitcnt vmcnt(0)8650; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38651; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38652; GFX950-NEXT: v_min_f32_e32 v2, v2, v48653; GFX950-NEXT: v_min_f32_e32 v6, v6, v58654; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28655; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08656; GFX950-NEXT: s_waitcnt vmcnt(0)8657; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38658; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8659; GFX950-NEXT: v_mov_b32_e32 v3, v28660; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8661; GFX950-NEXT: s_cbranch_execnz .LBB158_18662; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8663; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8664; GFX950-NEXT: ;;#ASMSTART8665; GFX950-NEXT: ; use v28666; GFX950-NEXT: ;;#ASMEND8667; GFX950-NEXT: s_setpc_b64 s[30:31]8668 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108669 %data = call <2 x bfloat> asm "; def $0", "=^VA"()8670 %result = atomicrmw fmin ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08671 call void asm "; use $0", "^VA"(<2 x bfloat> %result)8672 ret void8673}8674 8675define void @global_atomic_fmaximum_v2bf16_ret_a_a(ptr addrspace(1) %ptr) #0 {8676; GFX90A-LABEL: global_atomic_fmaximum_v2bf16_ret_a_a:8677; GFX90A: ; %bb.0:8678; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8679; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408680; GFX90A-NEXT: ;;#ASMSTART8681; GFX90A-NEXT: ; def a08682; GFX90A-NEXT: ;;#ASMEND8683; GFX90A-NEXT: v_accvgpr_read_b32 v2, a08684; GFX90A-NEXT: s_mov_b64 s[6:7], 08685; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28686; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7fc000008687; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8688; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v28689; GFX90A-NEXT: s_mov_b32 s9, 0x70603028690; GFX90A-NEXT: .LBB159_1: ; %atomicrmw.start8691; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18692; GFX90A-NEXT: s_waitcnt vmcnt(0)8693; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38694; GFX90A-NEXT: v_and_b32_e32 v7, 0xffff0000, v38695; GFX90A-NEXT: v_max_f32_e32 v8, v2, v48696; GFX90A-NEXT: v_max_f32_e32 v9, v7, v68697; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v7, v68698; GFX90A-NEXT: v_cmp_o_f32_e64 s[4:5], v2, v48699; GFX90A-NEXT: v_cndmask_b32_e64 v2, v5, v8, s[4:5]8700; GFX90A-NEXT: v_cndmask_b32_e32 v7, v5, v9, vcc8701; GFX90A-NEXT: v_bfe_u32 v8, v2, 16, 18702; GFX90A-NEXT: v_bfe_u32 v10, v7, 16, 18703; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v28704; GFX90A-NEXT: v_or_b32_e32 v11, 0x400000, v78705; GFX90A-NEXT: v_add3_u32 v8, v8, v2, s88706; GFX90A-NEXT: v_add3_u32 v10, v10, v7, s88707; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v7, v78708; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28709; GFX90A-NEXT: v_cndmask_b32_e64 v2, v8, v9, s[4:5]8710; GFX90A-NEXT: v_cndmask_b32_e32 v7, v10, v11, vcc8711; GFX90A-NEXT: v_perm_b32 v2, v7, v2, s98712; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8713; GFX90A-NEXT: s_waitcnt vmcnt(0)8714; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38715; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8716; GFX90A-NEXT: v_mov_b32_e32 v3, v28717; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8718; GFX90A-NEXT: s_cbranch_execnz .LBB159_18719; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8720; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8721; GFX90A-NEXT: v_accvgpr_write_b32 a0, v28722; GFX90A-NEXT: ;;#ASMSTART8723; GFX90A-NEXT: ; use a08724; GFX90A-NEXT: ;;#ASMEND8725; GFX90A-NEXT: s_setpc_b64 s[30:31]8726;8727; GFX950-LABEL: global_atomic_fmaximum_v2bf16_ret_a_a:8728; GFX950: ; %bb.0:8729; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8730; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408731; GFX950-NEXT: ;;#ASMSTART8732; GFX950-NEXT: ; def a08733; GFX950-NEXT: ;;#ASMEND8734; GFX950-NEXT: s_mov_b64 s[0:1], 08735; GFX950-NEXT: v_accvgpr_read_b32 v2, a08736; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28737; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28738; GFX950-NEXT: .LBB159_1: ; %atomicrmw.start8739; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18740; GFX950-NEXT: s_waitcnt vmcnt(0)8741; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38742; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38743; GFX950-NEXT: v_maximum3_f32 v2, v2, v4, v48744; GFX950-NEXT: v_maximum3_f32 v6, v6, v5, v58745; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28746; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08747; GFX950-NEXT: s_waitcnt vmcnt(0)8748; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38749; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8750; GFX950-NEXT: v_mov_b32_e32 v3, v28751; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8752; GFX950-NEXT: s_cbranch_execnz .LBB159_18753; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8754; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8755; GFX950-NEXT: v_accvgpr_write_b32 a0, v28756; GFX950-NEXT: ;;#ASMSTART8757; GFX950-NEXT: ; use a08758; GFX950-NEXT: ;;#ASMEND8759; GFX950-NEXT: s_setpc_b64 s[30:31]8760 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108761 %data = call <2 x bfloat> asm "; def $0", "=a"()8762 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08763 call void asm "; use $0", "a"(<2 x bfloat> %result)8764 ret void8765}8766 8767define void @global_atomic_fmaximum_v2bf16_ret_av_av(ptr addrspace(1) %ptr) #0 {8768; GFX90A-LABEL: global_atomic_fmaximum_v2bf16_ret_av_av:8769; GFX90A: ; %bb.0:8770; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8771; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408772; GFX90A-NEXT: ;;#ASMSTART8773; GFX90A-NEXT: ; def v28774; GFX90A-NEXT: ;;#ASMEND8775; GFX90A-NEXT: s_mov_b64 s[6:7], 08776; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28777; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7fc000008778; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8779; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v28780; GFX90A-NEXT: s_mov_b32 s9, 0x70603028781; GFX90A-NEXT: .LBB160_1: ; %atomicrmw.start8782; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18783; GFX90A-NEXT: s_waitcnt vmcnt(0)8784; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38785; GFX90A-NEXT: v_and_b32_e32 v7, 0xffff0000, v38786; GFX90A-NEXT: v_max_f32_e32 v8, v2, v48787; GFX90A-NEXT: v_max_f32_e32 v9, v7, v68788; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v7, v68789; GFX90A-NEXT: v_cmp_o_f32_e64 s[4:5], v2, v48790; GFX90A-NEXT: v_cndmask_b32_e64 v2, v5, v8, s[4:5]8791; GFX90A-NEXT: v_cndmask_b32_e32 v7, v5, v9, vcc8792; GFX90A-NEXT: v_bfe_u32 v8, v2, 16, 18793; GFX90A-NEXT: v_bfe_u32 v10, v7, 16, 18794; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v28795; GFX90A-NEXT: v_or_b32_e32 v11, 0x400000, v78796; GFX90A-NEXT: v_add3_u32 v8, v8, v2, s88797; GFX90A-NEXT: v_add3_u32 v10, v10, v7, s88798; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v7, v78799; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28800; GFX90A-NEXT: v_cndmask_b32_e64 v2, v8, v9, s[4:5]8801; GFX90A-NEXT: v_cndmask_b32_e32 v7, v10, v11, vcc8802; GFX90A-NEXT: v_perm_b32 v2, v7, v2, s98803; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8804; GFX90A-NEXT: s_waitcnt vmcnt(0)8805; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38806; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8807; GFX90A-NEXT: v_mov_b32_e32 v3, v28808; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8809; GFX90A-NEXT: s_cbranch_execnz .LBB160_18810; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8811; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8812; GFX90A-NEXT: ;;#ASMSTART8813; GFX90A-NEXT: ; use v28814; GFX90A-NEXT: ;;#ASMEND8815; GFX90A-NEXT: s_setpc_b64 s[30:31]8816;8817; GFX950-LABEL: global_atomic_fmaximum_v2bf16_ret_av_av:8818; GFX950: ; %bb.0:8819; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8820; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408821; GFX950-NEXT: ;;#ASMSTART8822; GFX950-NEXT: ; def v28823; GFX950-NEXT: ;;#ASMEND8824; GFX950-NEXT: s_mov_b64 s[0:1], 08825; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28826; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28827; GFX950-NEXT: .LBB160_1: ; %atomicrmw.start8828; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18829; GFX950-NEXT: s_waitcnt vmcnt(0)8830; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38831; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38832; GFX950-NEXT: v_maximum3_f32 v2, v2, v4, v48833; GFX950-NEXT: v_maximum3_f32 v6, v6, v5, v58834; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28835; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08836; GFX950-NEXT: s_waitcnt vmcnt(0)8837; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38838; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8839; GFX950-NEXT: v_mov_b32_e32 v3, v28840; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8841; GFX950-NEXT: s_cbranch_execnz .LBB160_18842; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8843; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8844; GFX950-NEXT: ;;#ASMSTART8845; GFX950-NEXT: ; use v28846; GFX950-NEXT: ;;#ASMEND8847; GFX950-NEXT: s_setpc_b64 s[30:31]8848 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108849 %data = call <2 x bfloat> asm "; def $0", "=^VA"()8850 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08851 call void asm "; use $0", "^VA"(<2 x bfloat> %result)8852 ret void8853}8854 8855define void @global_atomic_fminimum_v2bf16_ret_a_a(ptr addrspace(1) %ptr) #0 {8856; GFX90A-LABEL: global_atomic_fminimum_v2bf16_ret_a_a:8857; GFX90A: ; %bb.0:8858; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8859; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408860; GFX90A-NEXT: ;;#ASMSTART8861; GFX90A-NEXT: ; def a08862; GFX90A-NEXT: ;;#ASMEND8863; GFX90A-NEXT: v_accvgpr_read_b32 v2, a08864; GFX90A-NEXT: s_mov_b64 s[6:7], 08865; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28866; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7fc000008867; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8868; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v28869; GFX90A-NEXT: s_mov_b32 s9, 0x70603028870; GFX90A-NEXT: .LBB161_1: ; %atomicrmw.start8871; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18872; GFX90A-NEXT: s_waitcnt vmcnt(0)8873; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38874; GFX90A-NEXT: v_and_b32_e32 v7, 0xffff0000, v38875; GFX90A-NEXT: v_min_f32_e32 v8, v2, v48876; GFX90A-NEXT: v_min_f32_e32 v9, v7, v68877; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v7, v68878; GFX90A-NEXT: v_cmp_o_f32_e64 s[4:5], v2, v48879; GFX90A-NEXT: v_cndmask_b32_e64 v2, v5, v8, s[4:5]8880; GFX90A-NEXT: v_cndmask_b32_e32 v7, v5, v9, vcc8881; GFX90A-NEXT: v_bfe_u32 v8, v2, 16, 18882; GFX90A-NEXT: v_bfe_u32 v10, v7, 16, 18883; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v28884; GFX90A-NEXT: v_or_b32_e32 v11, 0x400000, v78885; GFX90A-NEXT: v_add3_u32 v8, v8, v2, s88886; GFX90A-NEXT: v_add3_u32 v10, v10, v7, s88887; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v7, v78888; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28889; GFX90A-NEXT: v_cndmask_b32_e64 v2, v8, v9, s[4:5]8890; GFX90A-NEXT: v_cndmask_b32_e32 v7, v10, v11, vcc8891; GFX90A-NEXT: v_perm_b32 v2, v7, v2, s98892; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8893; GFX90A-NEXT: s_waitcnt vmcnt(0)8894; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38895; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8896; GFX90A-NEXT: v_mov_b32_e32 v3, v28897; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8898; GFX90A-NEXT: s_cbranch_execnz .LBB161_18899; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8900; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8901; GFX90A-NEXT: v_accvgpr_write_b32 a0, v28902; GFX90A-NEXT: ;;#ASMSTART8903; GFX90A-NEXT: ; use a08904; GFX90A-NEXT: ;;#ASMEND8905; GFX90A-NEXT: s_setpc_b64 s[30:31]8906;8907; GFX950-LABEL: global_atomic_fminimum_v2bf16_ret_a_a:8908; GFX950: ; %bb.0:8909; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8910; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:408911; GFX950-NEXT: ;;#ASMSTART8912; GFX950-NEXT: ; def a08913; GFX950-NEXT: ;;#ASMEND8914; GFX950-NEXT: s_mov_b64 s[0:1], 08915; GFX950-NEXT: v_accvgpr_read_b32 v2, a08916; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v28917; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v28918; GFX950-NEXT: .LBB161_1: ; %atomicrmw.start8919; GFX950-NEXT: ; =>This Inner Loop Header: Depth=18920; GFX950-NEXT: s_waitcnt vmcnt(0)8921; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v38922; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v38923; GFX950-NEXT: v_minimum3_f32 v2, v2, v4, v48924; GFX950-NEXT: v_minimum3_f32 v6, v6, v5, v58925; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v28926; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc08927; GFX950-NEXT: s_waitcnt vmcnt(0)8928; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38929; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]8930; GFX950-NEXT: v_mov_b32_e32 v3, v28931; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]8932; GFX950-NEXT: s_cbranch_execnz .LBB161_18933; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end8934; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]8935; GFX950-NEXT: v_accvgpr_write_b32 a0, v28936; GFX950-NEXT: ;;#ASMSTART8937; GFX950-NEXT: ; use a08938; GFX950-NEXT: ;;#ASMEND8939; GFX950-NEXT: s_setpc_b64 s[30:31]8940 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 108941 %data = call <2 x bfloat> asm "; def $0", "=a"()8942 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !08943 call void asm "; use $0", "a"(<2 x bfloat> %result)8944 ret void8945}8946 8947define void @global_atomic_fminimum_v2bf16_ret_av_av(ptr addrspace(1) %ptr) #0 {8948; GFX90A-LABEL: global_atomic_fminimum_v2bf16_ret_av_av:8949; GFX90A: ; %bb.0:8950; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8951; GFX90A-NEXT: global_load_dword v3, v[0:1], off offset:408952; GFX90A-NEXT: ;;#ASMSTART8953; GFX90A-NEXT: ; def v28954; GFX90A-NEXT: ;;#ASMEND8955; GFX90A-NEXT: s_mov_b64 s[6:7], 08956; GFX90A-NEXT: v_lshlrev_b32_e32 v4, 16, v28957; GFX90A-NEXT: v_mov_b32_e32 v5, 0x7fc000008958; GFX90A-NEXT: s_movk_i32 s8, 0x7fff8959; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v28960; GFX90A-NEXT: s_mov_b32 s9, 0x70603028961; GFX90A-NEXT: .LBB162_1: ; %atomicrmw.start8962; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=18963; GFX90A-NEXT: s_waitcnt vmcnt(0)8964; GFX90A-NEXT: v_lshlrev_b32_e32 v2, 16, v38965; GFX90A-NEXT: v_and_b32_e32 v7, 0xffff0000, v38966; GFX90A-NEXT: v_min_f32_e32 v8, v2, v48967; GFX90A-NEXT: v_min_f32_e32 v9, v7, v68968; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v7, v68969; GFX90A-NEXT: v_cmp_o_f32_e64 s[4:5], v2, v48970; GFX90A-NEXT: v_cndmask_b32_e64 v2, v5, v8, s[4:5]8971; GFX90A-NEXT: v_cndmask_b32_e32 v7, v5, v9, vcc8972; GFX90A-NEXT: v_bfe_u32 v8, v2, 16, 18973; GFX90A-NEXT: v_bfe_u32 v10, v7, 16, 18974; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v28975; GFX90A-NEXT: v_or_b32_e32 v11, 0x400000, v78976; GFX90A-NEXT: v_add3_u32 v8, v8, v2, s88977; GFX90A-NEXT: v_add3_u32 v10, v10, v7, s88978; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v7, v78979; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v2, v28980; GFX90A-NEXT: v_cndmask_b32_e64 v2, v8, v9, s[4:5]8981; GFX90A-NEXT: v_cndmask_b32_e32 v7, v10, v11, vcc8982; GFX90A-NEXT: v_perm_b32 v2, v7, v2, s98983; GFX90A-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 glc8984; GFX90A-NEXT: s_waitcnt vmcnt(0)8985; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v2, v38986; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]8987; GFX90A-NEXT: v_mov_b32_e32 v3, v28988; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]8989; GFX90A-NEXT: s_cbranch_execnz .LBB162_18990; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end8991; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]8992; GFX90A-NEXT: ;;#ASMSTART8993; GFX90A-NEXT: ; use v28994; GFX90A-NEXT: ;;#ASMEND8995; GFX90A-NEXT: s_setpc_b64 s[30:31]8996;8997; GFX950-LABEL: global_atomic_fminimum_v2bf16_ret_av_av:8998; GFX950: ; %bb.0:8999; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9000; GFX950-NEXT: global_load_dword v3, v[0:1], off offset:409001; GFX950-NEXT: ;;#ASMSTART9002; GFX950-NEXT: ; def v29003; GFX950-NEXT: ;;#ASMEND9004; GFX950-NEXT: s_mov_b64 s[0:1], 09005; GFX950-NEXT: v_and_b32_e32 v4, 0xffff0000, v29006; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v29007; GFX950-NEXT: .LBB162_1: ; %atomicrmw.start9008; GFX950-NEXT: ; =>This Inner Loop Header: Depth=19009; GFX950-NEXT: s_waitcnt vmcnt(0)9010; GFX950-NEXT: v_and_b32_e32 v2, 0xffff0000, v39011; GFX950-NEXT: v_lshlrev_b32_e32 v6, 16, v39012; GFX950-NEXT: v_minimum3_f32 v2, v2, v4, v49013; GFX950-NEXT: v_minimum3_f32 v6, v6, v5, v59014; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v6, v29015; GFX950-NEXT: global_atomic_cmpswap v2, v[0:1], v[2:3], off offset:40 sc09016; GFX950-NEXT: s_waitcnt vmcnt(0)9017; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v2, v39018; GFX950-NEXT: s_or_b64 s[0:1], vcc, s[0:1]9019; GFX950-NEXT: v_mov_b32_e32 v3, v29020; GFX950-NEXT: s_andn2_b64 exec, exec, s[0:1]9021; GFX950-NEXT: s_cbranch_execnz .LBB162_19022; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end9023; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]9024; GFX950-NEXT: ;;#ASMSTART9025; GFX950-NEXT: ; use v29026; GFX950-NEXT: ;;#ASMEND9027; GFX950-NEXT: s_setpc_b64 s[30:31]9028 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 109029 %data = call <2 x bfloat> asm "; def $0", "=^VA"()9030 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09031 call void asm "; use $0", "^VA"(<2 x bfloat> %result)9032 ret void9033}9034 9035;---------------------------------------------------------------------9036; other atomics i32, with aa+av cases using saddr9037;---------------------------------------------------------------------9038 9039define void @global_atomic_xchg_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9040; GFX90A-LABEL: global_atomic_xchg_i32_saddr_ret_a_a:9041; GFX90A: ; %bb.0:9042; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9043; GFX90A-NEXT: v_mov_b32_e32 v0, 09044; GFX90A-NEXT: ;;#ASMSTART9045; GFX90A-NEXT: ; def a09046; GFX90A-NEXT: ;;#ASMEND9047; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09048; GFX90A-NEXT: global_atomic_swap v0, v0, v1, s[16:17] offset:40 glc9049; GFX90A-NEXT: s_waitcnt vmcnt(0)9050; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09051; GFX90A-NEXT: ;;#ASMSTART9052; GFX90A-NEXT: ; use a09053; GFX90A-NEXT: ;;#ASMEND9054; GFX90A-NEXT: s_setpc_b64 s[30:31]9055;9056; GFX950-LABEL: global_atomic_xchg_i32_saddr_ret_a_a:9057; GFX950: ; %bb.0:9058; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9059; GFX950-NEXT: v_mov_b32_e32 v0, 09060; GFX950-NEXT: ;;#ASMSTART9061; GFX950-NEXT: ; def a09062; GFX950-NEXT: ;;#ASMEND9063; GFX950-NEXT: s_nop 09064; GFX950-NEXT: v_accvgpr_read_b32 v1, a09065; GFX950-NEXT: global_atomic_swap v0, v0, v1, s[0:1] offset:40 sc09066; GFX950-NEXT: s_waitcnt vmcnt(0)9067; GFX950-NEXT: v_accvgpr_write_b32 a0, v09068; GFX950-NEXT: ;;#ASMSTART9069; GFX950-NEXT: ; use a09070; GFX950-NEXT: ;;#ASMEND9071; GFX950-NEXT: s_setpc_b64 s[30:31]9072 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109073 %data = call i32 asm "; def $0", "=a"()9074 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09075 call void asm "; use $0", "a"(i32 %result)9076 ret void9077}9078 9079define void @global_atomic_xchg_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9080; GFX90A-LABEL: global_atomic_xchg_i32_saddr_ret_av_av:9081; GFX90A: ; %bb.0:9082; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9083; GFX90A-NEXT: v_mov_b32_e32 v0, 09084; GFX90A-NEXT: ;;#ASMSTART9085; GFX90A-NEXT: ; def v19086; GFX90A-NEXT: ;;#ASMEND9087; GFX90A-NEXT: global_atomic_swap v0, v0, v1, s[16:17] offset:40 glc9088; GFX90A-NEXT: s_waitcnt vmcnt(0)9089; GFX90A-NEXT: ;;#ASMSTART9090; GFX90A-NEXT: ; use v09091; GFX90A-NEXT: ;;#ASMEND9092; GFX90A-NEXT: s_setpc_b64 s[30:31]9093;9094; GFX950-LABEL: global_atomic_xchg_i32_saddr_ret_av_av:9095; GFX950: ; %bb.0:9096; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9097; GFX950-NEXT: v_mov_b32_e32 v0, 09098; GFX950-NEXT: ;;#ASMSTART9099; GFX950-NEXT: ; def v19100; GFX950-NEXT: ;;#ASMEND9101; GFX950-NEXT: global_atomic_swap v0, v0, v1, s[0:1] offset:40 sc09102; GFX950-NEXT: s_waitcnt vmcnt(0)9103; GFX950-NEXT: ;;#ASMSTART9104; GFX950-NEXT: ; use v09105; GFX950-NEXT: ;;#ASMEND9106; GFX950-NEXT: s_setpc_b64 s[30:31]9107 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109108 %data = call i32 asm "; def $0", "=^VA"()9109 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09110 call void asm "; use $0", "^VA"(i32 %result)9111 ret void9112}9113 9114define void @global_atomic_add_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9115; GFX90A-LABEL: global_atomic_add_i32_saddr_ret_a_a:9116; GFX90A: ; %bb.0:9117; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9118; GFX90A-NEXT: v_mov_b32_e32 v0, 09119; GFX90A-NEXT: ;;#ASMSTART9120; GFX90A-NEXT: ; def a09121; GFX90A-NEXT: ;;#ASMEND9122; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09123; GFX90A-NEXT: global_atomic_add v0, v0, v1, s[16:17] offset:40 glc9124; GFX90A-NEXT: s_waitcnt vmcnt(0)9125; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09126; GFX90A-NEXT: ;;#ASMSTART9127; GFX90A-NEXT: ; use a09128; GFX90A-NEXT: ;;#ASMEND9129; GFX90A-NEXT: s_setpc_b64 s[30:31]9130;9131; GFX950-LABEL: global_atomic_add_i32_saddr_ret_a_a:9132; GFX950: ; %bb.0:9133; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9134; GFX950-NEXT: v_mov_b32_e32 v0, 09135; GFX950-NEXT: ;;#ASMSTART9136; GFX950-NEXT: ; def a09137; GFX950-NEXT: ;;#ASMEND9138; GFX950-NEXT: s_nop 09139; GFX950-NEXT: v_accvgpr_read_b32 v1, a09140; GFX950-NEXT: global_atomic_add v0, v0, v1, s[0:1] offset:40 sc09141; GFX950-NEXT: s_waitcnt vmcnt(0)9142; GFX950-NEXT: v_accvgpr_write_b32 a0, v09143; GFX950-NEXT: ;;#ASMSTART9144; GFX950-NEXT: ; use a09145; GFX950-NEXT: ;;#ASMEND9146; GFX950-NEXT: s_setpc_b64 s[30:31]9147 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109148 %data = call i32 asm "; def $0", "=a"()9149 %result = atomicrmw add ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09150 call void asm "; use $0", "a"(i32 %result)9151 ret void9152}9153 9154define void @global_atomic_add_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9155; GFX90A-LABEL: global_atomic_add_i32_saddr_ret_av_av:9156; GFX90A: ; %bb.0:9157; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9158; GFX90A-NEXT: v_mov_b32_e32 v0, 09159; GFX90A-NEXT: ;;#ASMSTART9160; GFX90A-NEXT: ; def v19161; GFX90A-NEXT: ;;#ASMEND9162; GFX90A-NEXT: global_atomic_add v0, v0, v1, s[16:17] offset:40 glc9163; GFX90A-NEXT: s_waitcnt vmcnt(0)9164; GFX90A-NEXT: ;;#ASMSTART9165; GFX90A-NEXT: ; use v09166; GFX90A-NEXT: ;;#ASMEND9167; GFX90A-NEXT: s_setpc_b64 s[30:31]9168;9169; GFX950-LABEL: global_atomic_add_i32_saddr_ret_av_av:9170; GFX950: ; %bb.0:9171; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9172; GFX950-NEXT: v_mov_b32_e32 v0, 09173; GFX950-NEXT: ;;#ASMSTART9174; GFX950-NEXT: ; def v19175; GFX950-NEXT: ;;#ASMEND9176; GFX950-NEXT: global_atomic_add v0, v0, v1, s[0:1] offset:40 sc09177; GFX950-NEXT: s_waitcnt vmcnt(0)9178; GFX950-NEXT: ;;#ASMSTART9179; GFX950-NEXT: ; use v09180; GFX950-NEXT: ;;#ASMEND9181; GFX950-NEXT: s_setpc_b64 s[30:31]9182 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109183 %data = call i32 asm "; def $0", "=^VA"()9184 %result = atomicrmw add ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09185 call void asm "; use $0", "^VA"(i32 %result)9186 ret void9187}9188 9189define void @global_atomic_sub_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9190; GFX90A-LABEL: global_atomic_sub_i32_saddr_ret_a_a:9191; GFX90A: ; %bb.0:9192; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9193; GFX90A-NEXT: v_mov_b32_e32 v0, 09194; GFX90A-NEXT: ;;#ASMSTART9195; GFX90A-NEXT: ; def a09196; GFX90A-NEXT: ;;#ASMEND9197; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09198; GFX90A-NEXT: global_atomic_sub v0, v0, v1, s[16:17] offset:40 glc9199; GFX90A-NEXT: s_waitcnt vmcnt(0)9200; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09201; GFX90A-NEXT: ;;#ASMSTART9202; GFX90A-NEXT: ; use a09203; GFX90A-NEXT: ;;#ASMEND9204; GFX90A-NEXT: s_setpc_b64 s[30:31]9205;9206; GFX950-LABEL: global_atomic_sub_i32_saddr_ret_a_a:9207; GFX950: ; %bb.0:9208; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9209; GFX950-NEXT: v_mov_b32_e32 v0, 09210; GFX950-NEXT: ;;#ASMSTART9211; GFX950-NEXT: ; def a09212; GFX950-NEXT: ;;#ASMEND9213; GFX950-NEXT: s_nop 09214; GFX950-NEXT: v_accvgpr_read_b32 v1, a09215; GFX950-NEXT: global_atomic_sub v0, v0, v1, s[0:1] offset:40 sc09216; GFX950-NEXT: s_waitcnt vmcnt(0)9217; GFX950-NEXT: v_accvgpr_write_b32 a0, v09218; GFX950-NEXT: ;;#ASMSTART9219; GFX950-NEXT: ; use a09220; GFX950-NEXT: ;;#ASMEND9221; GFX950-NEXT: s_setpc_b64 s[30:31]9222 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109223 %data = call i32 asm "; def $0", "=a"()9224 %result = atomicrmw sub ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09225 call void asm "; use $0", "a"(i32 %result)9226 ret void9227}9228 9229define void @global_atomic_sub_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9230; GFX90A-LABEL: global_atomic_sub_i32_saddr_ret_av_av:9231; GFX90A: ; %bb.0:9232; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9233; GFX90A-NEXT: v_mov_b32_e32 v0, 09234; GFX90A-NEXT: ;;#ASMSTART9235; GFX90A-NEXT: ; def v19236; GFX90A-NEXT: ;;#ASMEND9237; GFX90A-NEXT: global_atomic_sub v0, v0, v1, s[16:17] offset:40 glc9238; GFX90A-NEXT: s_waitcnt vmcnt(0)9239; GFX90A-NEXT: ;;#ASMSTART9240; GFX90A-NEXT: ; use v09241; GFX90A-NEXT: ;;#ASMEND9242; GFX90A-NEXT: s_setpc_b64 s[30:31]9243;9244; GFX950-LABEL: global_atomic_sub_i32_saddr_ret_av_av:9245; GFX950: ; %bb.0:9246; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9247; GFX950-NEXT: v_mov_b32_e32 v0, 09248; GFX950-NEXT: ;;#ASMSTART9249; GFX950-NEXT: ; def v19250; GFX950-NEXT: ;;#ASMEND9251; GFX950-NEXT: global_atomic_sub v0, v0, v1, s[0:1] offset:40 sc09252; GFX950-NEXT: s_waitcnt vmcnt(0)9253; GFX950-NEXT: ;;#ASMSTART9254; GFX950-NEXT: ; use v09255; GFX950-NEXT: ;;#ASMEND9256; GFX950-NEXT: s_setpc_b64 s[30:31]9257 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109258 %data = call i32 asm "; def $0", "=^VA"()9259 %result = atomicrmw sub ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09260 call void asm "; use $0", "^VA"(i32 %result)9261 ret void9262}9263 9264define void @global_atomic_and_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9265; GFX90A-LABEL: global_atomic_and_i32_saddr_ret_a_a:9266; GFX90A: ; %bb.0:9267; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9268; GFX90A-NEXT: v_mov_b32_e32 v0, 09269; GFX90A-NEXT: ;;#ASMSTART9270; GFX90A-NEXT: ; def a09271; GFX90A-NEXT: ;;#ASMEND9272; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09273; GFX90A-NEXT: global_atomic_and v0, v0, v1, s[16:17] offset:40 glc9274; GFX90A-NEXT: s_waitcnt vmcnt(0)9275; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09276; GFX90A-NEXT: ;;#ASMSTART9277; GFX90A-NEXT: ; use a09278; GFX90A-NEXT: ;;#ASMEND9279; GFX90A-NEXT: s_setpc_b64 s[30:31]9280;9281; GFX950-LABEL: global_atomic_and_i32_saddr_ret_a_a:9282; GFX950: ; %bb.0:9283; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9284; GFX950-NEXT: v_mov_b32_e32 v0, 09285; GFX950-NEXT: ;;#ASMSTART9286; GFX950-NEXT: ; def a09287; GFX950-NEXT: ;;#ASMEND9288; GFX950-NEXT: s_nop 09289; GFX950-NEXT: v_accvgpr_read_b32 v1, a09290; GFX950-NEXT: global_atomic_and v0, v0, v1, s[0:1] offset:40 sc09291; GFX950-NEXT: s_waitcnt vmcnt(0)9292; GFX950-NEXT: v_accvgpr_write_b32 a0, v09293; GFX950-NEXT: ;;#ASMSTART9294; GFX950-NEXT: ; use a09295; GFX950-NEXT: ;;#ASMEND9296; GFX950-NEXT: s_setpc_b64 s[30:31]9297 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109298 %data = call i32 asm "; def $0", "=a"()9299 %result = atomicrmw and ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09300 call void asm "; use $0", "a"(i32 %result)9301 ret void9302}9303 9304define void @global_atomic_and_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9305; GFX90A-LABEL: global_atomic_and_i32_saddr_ret_av_av:9306; GFX90A: ; %bb.0:9307; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9308; GFX90A-NEXT: v_mov_b32_e32 v0, 09309; GFX90A-NEXT: ;;#ASMSTART9310; GFX90A-NEXT: ; def v19311; GFX90A-NEXT: ;;#ASMEND9312; GFX90A-NEXT: global_atomic_and v0, v0, v1, s[16:17] offset:40 glc9313; GFX90A-NEXT: s_waitcnt vmcnt(0)9314; GFX90A-NEXT: ;;#ASMSTART9315; GFX90A-NEXT: ; use v09316; GFX90A-NEXT: ;;#ASMEND9317; GFX90A-NEXT: s_setpc_b64 s[30:31]9318;9319; GFX950-LABEL: global_atomic_and_i32_saddr_ret_av_av:9320; GFX950: ; %bb.0:9321; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9322; GFX950-NEXT: v_mov_b32_e32 v0, 09323; GFX950-NEXT: ;;#ASMSTART9324; GFX950-NEXT: ; def v19325; GFX950-NEXT: ;;#ASMEND9326; GFX950-NEXT: global_atomic_and v0, v0, v1, s[0:1] offset:40 sc09327; GFX950-NEXT: s_waitcnt vmcnt(0)9328; GFX950-NEXT: ;;#ASMSTART9329; GFX950-NEXT: ; use v09330; GFX950-NEXT: ;;#ASMEND9331; GFX950-NEXT: s_setpc_b64 s[30:31]9332 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109333 %data = call i32 asm "; def $0", "=^VA"()9334 %result = atomicrmw and ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09335 call void asm "; use $0", "^VA"(i32 %result)9336 ret void9337}9338 9339define void @global_atomic_nand_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9340; GFX90A-LABEL: global_atomic_nand_i32_saddr_ret_a_a:9341; GFX90A: ; %bb.0:9342; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9343; GFX90A-NEXT: v_mov_b32_e32 v2, 09344; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:409345; GFX90A-NEXT: ;;#ASMSTART9346; GFX90A-NEXT: ; def a09347; GFX90A-NEXT: ;;#ASMEND9348; GFX90A-NEXT: v_accvgpr_read_b32 v3, a09349; GFX90A-NEXT: s_mov_b64 s[4:5], 09350; GFX90A-NEXT: .LBB171_1: ; %atomicrmw.start9351; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=19352; GFX90A-NEXT: s_waitcnt vmcnt(0)9353; GFX90A-NEXT: v_and_b32_e32 v0, v1, v39354; GFX90A-NEXT: v_not_b32_e32 v0, v09355; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc9356; GFX90A-NEXT: s_waitcnt vmcnt(0)9357; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v19358; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]9359; GFX90A-NEXT: v_mov_b32_e32 v1, v09360; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]9361; GFX90A-NEXT: s_cbranch_execnz .LBB171_19362; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end9363; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]9364; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09365; GFX90A-NEXT: ;;#ASMSTART9366; GFX90A-NEXT: ; use a09367; GFX90A-NEXT: ;;#ASMEND9368; GFX90A-NEXT: s_setpc_b64 s[30:31]9369;9370; GFX950-LABEL: global_atomic_nand_i32_saddr_ret_a_a:9371; GFX950: ; %bb.0:9372; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9373; GFX950-NEXT: v_mov_b32_e32 v2, 09374; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:409375; GFX950-NEXT: ;;#ASMSTART9376; GFX950-NEXT: ; def a09377; GFX950-NEXT: ;;#ASMEND9378; GFX950-NEXT: s_mov_b64 s[2:3], 09379; GFX950-NEXT: v_accvgpr_read_b32 v3, a09380; GFX950-NEXT: .LBB171_1: ; %atomicrmw.start9381; GFX950-NEXT: ; =>This Inner Loop Header: Depth=19382; GFX950-NEXT: s_waitcnt vmcnt(0)9383; GFX950-NEXT: v_bitop3_b32 v0, v1, v3, v1 bitop3:0x3f9384; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc09385; GFX950-NEXT: s_waitcnt vmcnt(0)9386; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v19387; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]9388; GFX950-NEXT: v_mov_b32_e32 v1, v09389; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]9390; GFX950-NEXT: s_cbranch_execnz .LBB171_19391; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end9392; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]9393; GFX950-NEXT: v_accvgpr_write_b32 a0, v09394; GFX950-NEXT: ;;#ASMSTART9395; GFX950-NEXT: ; use a09396; GFX950-NEXT: ;;#ASMEND9397; GFX950-NEXT: s_setpc_b64 s[30:31]9398 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109399 %data = call i32 asm "; def $0", "=a"()9400 %result = atomicrmw nand ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09401 call void asm "; use $0", "a"(i32 %result)9402 ret void9403}9404 9405define void @global_atomic_nand_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9406; GFX90A-LABEL: global_atomic_nand_i32_saddr_ret_av_av:9407; GFX90A: ; %bb.0:9408; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9409; GFX90A-NEXT: v_mov_b32_e32 v2, 09410; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:409411; GFX90A-NEXT: s_mov_b64 s[4:5], 09412; GFX90A-NEXT: ;;#ASMSTART9413; GFX90A-NEXT: ; def v39414; GFX90A-NEXT: ;;#ASMEND9415; GFX90A-NEXT: .LBB172_1: ; %atomicrmw.start9416; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=19417; GFX90A-NEXT: s_waitcnt vmcnt(0)9418; GFX90A-NEXT: v_and_b32_e32 v0, v1, v39419; GFX90A-NEXT: v_not_b32_e32 v0, v09420; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc9421; GFX90A-NEXT: s_waitcnt vmcnt(0)9422; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v19423; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]9424; GFX90A-NEXT: v_mov_b32_e32 v1, v09425; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]9426; GFX90A-NEXT: s_cbranch_execnz .LBB172_19427; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end9428; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]9429; GFX90A-NEXT: ;;#ASMSTART9430; GFX90A-NEXT: ; use v09431; GFX90A-NEXT: ;;#ASMEND9432; GFX90A-NEXT: s_setpc_b64 s[30:31]9433;9434; GFX950-LABEL: global_atomic_nand_i32_saddr_ret_av_av:9435; GFX950: ; %bb.0:9436; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9437; GFX950-NEXT: v_mov_b32_e32 v2, 09438; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:409439; GFX950-NEXT: s_mov_b64 s[2:3], 09440; GFX950-NEXT: ;;#ASMSTART9441; GFX950-NEXT: ; def v39442; GFX950-NEXT: ;;#ASMEND9443; GFX950-NEXT: .LBB172_1: ; %atomicrmw.start9444; GFX950-NEXT: ; =>This Inner Loop Header: Depth=19445; GFX950-NEXT: s_waitcnt vmcnt(0)9446; GFX950-NEXT: v_bitop3_b32 v0, v1, v3, v1 bitop3:0x3f9447; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc09448; GFX950-NEXT: s_waitcnt vmcnt(0)9449; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v19450; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]9451; GFX950-NEXT: v_mov_b32_e32 v1, v09452; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]9453; GFX950-NEXT: s_cbranch_execnz .LBB172_19454; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end9455; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]9456; GFX950-NEXT: ;;#ASMSTART9457; GFX950-NEXT: ; use v09458; GFX950-NEXT: ;;#ASMEND9459; GFX950-NEXT: s_setpc_b64 s[30:31]9460 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109461 %data = call i32 asm "; def $0", "=^VA"()9462 %result = atomicrmw nand ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09463 call void asm "; use $0", "^VA"(i32 %result)9464 ret void9465}9466 9467define void @global_atomic_or_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9468; GFX90A-LABEL: global_atomic_or_i32_saddr_ret_a_a:9469; GFX90A: ; %bb.0:9470; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9471; GFX90A-NEXT: v_mov_b32_e32 v0, 09472; GFX90A-NEXT: ;;#ASMSTART9473; GFX90A-NEXT: ; def a09474; GFX90A-NEXT: ;;#ASMEND9475; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09476; GFX90A-NEXT: global_atomic_or v0, v0, v1, s[16:17] offset:40 glc9477; GFX90A-NEXT: s_waitcnt vmcnt(0)9478; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09479; GFX90A-NEXT: ;;#ASMSTART9480; GFX90A-NEXT: ; use a09481; GFX90A-NEXT: ;;#ASMEND9482; GFX90A-NEXT: s_setpc_b64 s[30:31]9483;9484; GFX950-LABEL: global_atomic_or_i32_saddr_ret_a_a:9485; GFX950: ; %bb.0:9486; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9487; GFX950-NEXT: v_mov_b32_e32 v0, 09488; GFX950-NEXT: ;;#ASMSTART9489; GFX950-NEXT: ; def a09490; GFX950-NEXT: ;;#ASMEND9491; GFX950-NEXT: s_nop 09492; GFX950-NEXT: v_accvgpr_read_b32 v1, a09493; GFX950-NEXT: global_atomic_or v0, v0, v1, s[0:1] offset:40 sc09494; GFX950-NEXT: s_waitcnt vmcnt(0)9495; GFX950-NEXT: v_accvgpr_write_b32 a0, v09496; GFX950-NEXT: ;;#ASMSTART9497; GFX950-NEXT: ; use a09498; GFX950-NEXT: ;;#ASMEND9499; GFX950-NEXT: s_setpc_b64 s[30:31]9500 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109501 %data = call i32 asm "; def $0", "=a"()9502 %result = atomicrmw or ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09503 call void asm "; use $0", "a"(i32 %result)9504 ret void9505}9506 9507define void @global_atomic_or_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9508; GFX90A-LABEL: global_atomic_or_i32_saddr_ret_av_av:9509; GFX90A: ; %bb.0:9510; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9511; GFX90A-NEXT: v_mov_b32_e32 v0, 09512; GFX90A-NEXT: ;;#ASMSTART9513; GFX90A-NEXT: ; def v19514; GFX90A-NEXT: ;;#ASMEND9515; GFX90A-NEXT: global_atomic_or v0, v0, v1, s[16:17] offset:40 glc9516; GFX90A-NEXT: s_waitcnt vmcnt(0)9517; GFX90A-NEXT: ;;#ASMSTART9518; GFX90A-NEXT: ; use v09519; GFX90A-NEXT: ;;#ASMEND9520; GFX90A-NEXT: s_setpc_b64 s[30:31]9521;9522; GFX950-LABEL: global_atomic_or_i32_saddr_ret_av_av:9523; GFX950: ; %bb.0:9524; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9525; GFX950-NEXT: v_mov_b32_e32 v0, 09526; GFX950-NEXT: ;;#ASMSTART9527; GFX950-NEXT: ; def v19528; GFX950-NEXT: ;;#ASMEND9529; GFX950-NEXT: global_atomic_or v0, v0, v1, s[0:1] offset:40 sc09530; GFX950-NEXT: s_waitcnt vmcnt(0)9531; GFX950-NEXT: ;;#ASMSTART9532; GFX950-NEXT: ; use v09533; GFX950-NEXT: ;;#ASMEND9534; GFX950-NEXT: s_setpc_b64 s[30:31]9535 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109536 %data = call i32 asm "; def $0", "=^VA"()9537 %result = atomicrmw or ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09538 call void asm "; use $0", "^VA"(i32 %result)9539 ret void9540}9541 9542define void @global_atomic_xor_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9543; GFX90A-LABEL: global_atomic_xor_i32_saddr_ret_a_a:9544; GFX90A: ; %bb.0:9545; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9546; GFX90A-NEXT: v_mov_b32_e32 v0, 09547; GFX90A-NEXT: ;;#ASMSTART9548; GFX90A-NEXT: ; def a09549; GFX90A-NEXT: ;;#ASMEND9550; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09551; GFX90A-NEXT: global_atomic_xor v0, v0, v1, s[16:17] offset:40 glc9552; GFX90A-NEXT: s_waitcnt vmcnt(0)9553; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09554; GFX90A-NEXT: ;;#ASMSTART9555; GFX90A-NEXT: ; use a09556; GFX90A-NEXT: ;;#ASMEND9557; GFX90A-NEXT: s_setpc_b64 s[30:31]9558;9559; GFX950-LABEL: global_atomic_xor_i32_saddr_ret_a_a:9560; GFX950: ; %bb.0:9561; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9562; GFX950-NEXT: v_mov_b32_e32 v0, 09563; GFX950-NEXT: ;;#ASMSTART9564; GFX950-NEXT: ; def a09565; GFX950-NEXT: ;;#ASMEND9566; GFX950-NEXT: s_nop 09567; GFX950-NEXT: v_accvgpr_read_b32 v1, a09568; GFX950-NEXT: global_atomic_xor v0, v0, v1, s[0:1] offset:40 sc09569; GFX950-NEXT: s_waitcnt vmcnt(0)9570; GFX950-NEXT: v_accvgpr_write_b32 a0, v09571; GFX950-NEXT: ;;#ASMSTART9572; GFX950-NEXT: ; use a09573; GFX950-NEXT: ;;#ASMEND9574; GFX950-NEXT: s_setpc_b64 s[30:31]9575 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109576 %data = call i32 asm "; def $0", "=a"()9577 %result = atomicrmw xor ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09578 call void asm "; use $0", "a"(i32 %result)9579 ret void9580}9581 9582define void @global_atomic_xor_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9583; GFX90A-LABEL: global_atomic_xor_i32_saddr_ret_av_av:9584; GFX90A: ; %bb.0:9585; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9586; GFX90A-NEXT: v_mov_b32_e32 v0, 09587; GFX90A-NEXT: ;;#ASMSTART9588; GFX90A-NEXT: ; def v19589; GFX90A-NEXT: ;;#ASMEND9590; GFX90A-NEXT: global_atomic_xor v0, v0, v1, s[16:17] offset:40 glc9591; GFX90A-NEXT: s_waitcnt vmcnt(0)9592; GFX90A-NEXT: ;;#ASMSTART9593; GFX90A-NEXT: ; use v09594; GFX90A-NEXT: ;;#ASMEND9595; GFX90A-NEXT: s_setpc_b64 s[30:31]9596;9597; GFX950-LABEL: global_atomic_xor_i32_saddr_ret_av_av:9598; GFX950: ; %bb.0:9599; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9600; GFX950-NEXT: v_mov_b32_e32 v0, 09601; GFX950-NEXT: ;;#ASMSTART9602; GFX950-NEXT: ; def v19603; GFX950-NEXT: ;;#ASMEND9604; GFX950-NEXT: global_atomic_xor v0, v0, v1, s[0:1] offset:40 sc09605; GFX950-NEXT: s_waitcnt vmcnt(0)9606; GFX950-NEXT: ;;#ASMSTART9607; GFX950-NEXT: ; use v09608; GFX950-NEXT: ;;#ASMEND9609; GFX950-NEXT: s_setpc_b64 s[30:31]9610 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109611 %data = call i32 asm "; def $0", "=^VA"()9612 %result = atomicrmw xor ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09613 call void asm "; use $0", "^VA"(i32 %result)9614 ret void9615}9616 9617define void @global_atomic_max_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9618; GFX90A-LABEL: global_atomic_max_i32_saddr_ret_a_a:9619; GFX90A: ; %bb.0:9620; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9621; GFX90A-NEXT: v_mov_b32_e32 v0, 09622; GFX90A-NEXT: ;;#ASMSTART9623; GFX90A-NEXT: ; def a09624; GFX90A-NEXT: ;;#ASMEND9625; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09626; GFX90A-NEXT: global_atomic_smax v0, v0, v1, s[16:17] offset:40 glc9627; GFX90A-NEXT: s_waitcnt vmcnt(0)9628; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09629; GFX90A-NEXT: ;;#ASMSTART9630; GFX90A-NEXT: ; use a09631; GFX90A-NEXT: ;;#ASMEND9632; GFX90A-NEXT: s_setpc_b64 s[30:31]9633;9634; GFX950-LABEL: global_atomic_max_i32_saddr_ret_a_a:9635; GFX950: ; %bb.0:9636; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9637; GFX950-NEXT: v_mov_b32_e32 v0, 09638; GFX950-NEXT: ;;#ASMSTART9639; GFX950-NEXT: ; def a09640; GFX950-NEXT: ;;#ASMEND9641; GFX950-NEXT: s_nop 09642; GFX950-NEXT: v_accvgpr_read_b32 v1, a09643; GFX950-NEXT: global_atomic_smax v0, v0, v1, s[0:1] offset:40 sc09644; GFX950-NEXT: s_waitcnt vmcnt(0)9645; GFX950-NEXT: v_accvgpr_write_b32 a0, v09646; GFX950-NEXT: ;;#ASMSTART9647; GFX950-NEXT: ; use a09648; GFX950-NEXT: ;;#ASMEND9649; GFX950-NEXT: s_setpc_b64 s[30:31]9650 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109651 %data = call i32 asm "; def $0", "=a"()9652 %result = atomicrmw max ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09653 call void asm "; use $0", "a"(i32 %result)9654 ret void9655}9656 9657define void @global_atomic_max_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9658; GFX90A-LABEL: global_atomic_max_i32_saddr_ret_av_av:9659; GFX90A: ; %bb.0:9660; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9661; GFX90A-NEXT: v_mov_b32_e32 v0, 09662; GFX90A-NEXT: ;;#ASMSTART9663; GFX90A-NEXT: ; def v19664; GFX90A-NEXT: ;;#ASMEND9665; GFX90A-NEXT: global_atomic_smax v0, v0, v1, s[16:17] offset:40 glc9666; GFX90A-NEXT: s_waitcnt vmcnt(0)9667; GFX90A-NEXT: ;;#ASMSTART9668; GFX90A-NEXT: ; use v09669; GFX90A-NEXT: ;;#ASMEND9670; GFX90A-NEXT: s_setpc_b64 s[30:31]9671;9672; GFX950-LABEL: global_atomic_max_i32_saddr_ret_av_av:9673; GFX950: ; %bb.0:9674; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9675; GFX950-NEXT: v_mov_b32_e32 v0, 09676; GFX950-NEXT: ;;#ASMSTART9677; GFX950-NEXT: ; def v19678; GFX950-NEXT: ;;#ASMEND9679; GFX950-NEXT: global_atomic_smax v0, v0, v1, s[0:1] offset:40 sc09680; GFX950-NEXT: s_waitcnt vmcnt(0)9681; GFX950-NEXT: ;;#ASMSTART9682; GFX950-NEXT: ; use v09683; GFX950-NEXT: ;;#ASMEND9684; GFX950-NEXT: s_setpc_b64 s[30:31]9685 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109686 %data = call i32 asm "; def $0", "=^VA"()9687 %result = atomicrmw max ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09688 call void asm "; use $0", "^VA"(i32 %result)9689 ret void9690}9691 9692define void @global_atomic_min_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9693; GFX90A-LABEL: global_atomic_min_i32_saddr_ret_a_a:9694; GFX90A: ; %bb.0:9695; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9696; GFX90A-NEXT: v_mov_b32_e32 v0, 09697; GFX90A-NEXT: ;;#ASMSTART9698; GFX90A-NEXT: ; def a09699; GFX90A-NEXT: ;;#ASMEND9700; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09701; GFX90A-NEXT: global_atomic_smin v0, v0, v1, s[16:17] offset:40 glc9702; GFX90A-NEXT: s_waitcnt vmcnt(0)9703; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09704; GFX90A-NEXT: ;;#ASMSTART9705; GFX90A-NEXT: ; use a09706; GFX90A-NEXT: ;;#ASMEND9707; GFX90A-NEXT: s_setpc_b64 s[30:31]9708;9709; GFX950-LABEL: global_atomic_min_i32_saddr_ret_a_a:9710; GFX950: ; %bb.0:9711; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9712; GFX950-NEXT: v_mov_b32_e32 v0, 09713; GFX950-NEXT: ;;#ASMSTART9714; GFX950-NEXT: ; def a09715; GFX950-NEXT: ;;#ASMEND9716; GFX950-NEXT: s_nop 09717; GFX950-NEXT: v_accvgpr_read_b32 v1, a09718; GFX950-NEXT: global_atomic_smin v0, v0, v1, s[0:1] offset:40 sc09719; GFX950-NEXT: s_waitcnt vmcnt(0)9720; GFX950-NEXT: v_accvgpr_write_b32 a0, v09721; GFX950-NEXT: ;;#ASMSTART9722; GFX950-NEXT: ; use a09723; GFX950-NEXT: ;;#ASMEND9724; GFX950-NEXT: s_setpc_b64 s[30:31]9725 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109726 %data = call i32 asm "; def $0", "=a"()9727 %result = atomicrmw min ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09728 call void asm "; use $0", "a"(i32 %result)9729 ret void9730}9731 9732define void @global_atomic_min_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9733; GFX90A-LABEL: global_atomic_min_i32_saddr_ret_av_av:9734; GFX90A: ; %bb.0:9735; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9736; GFX90A-NEXT: v_mov_b32_e32 v0, 09737; GFX90A-NEXT: ;;#ASMSTART9738; GFX90A-NEXT: ; def v19739; GFX90A-NEXT: ;;#ASMEND9740; GFX90A-NEXT: global_atomic_smin v0, v0, v1, s[16:17] offset:40 glc9741; GFX90A-NEXT: s_waitcnt vmcnt(0)9742; GFX90A-NEXT: ;;#ASMSTART9743; GFX90A-NEXT: ; use v09744; GFX90A-NEXT: ;;#ASMEND9745; GFX90A-NEXT: s_setpc_b64 s[30:31]9746;9747; GFX950-LABEL: global_atomic_min_i32_saddr_ret_av_av:9748; GFX950: ; %bb.0:9749; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9750; GFX950-NEXT: v_mov_b32_e32 v0, 09751; GFX950-NEXT: ;;#ASMSTART9752; GFX950-NEXT: ; def v19753; GFX950-NEXT: ;;#ASMEND9754; GFX950-NEXT: global_atomic_smin v0, v0, v1, s[0:1] offset:40 sc09755; GFX950-NEXT: s_waitcnt vmcnt(0)9756; GFX950-NEXT: ;;#ASMSTART9757; GFX950-NEXT: ; use v09758; GFX950-NEXT: ;;#ASMEND9759; GFX950-NEXT: s_setpc_b64 s[30:31]9760 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109761 %data = call i32 asm "; def $0", "=^VA"()9762 %result = atomicrmw min ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09763 call void asm "; use $0", "^VA"(i32 %result)9764 ret void9765}9766 9767define void @global_atomic_umax_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9768; GFX90A-LABEL: global_atomic_umax_i32_saddr_ret_a_a:9769; GFX90A: ; %bb.0:9770; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9771; GFX90A-NEXT: v_mov_b32_e32 v0, 09772; GFX90A-NEXT: ;;#ASMSTART9773; GFX90A-NEXT: ; def a09774; GFX90A-NEXT: ;;#ASMEND9775; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09776; GFX90A-NEXT: global_atomic_umax v0, v0, v1, s[16:17] offset:40 glc9777; GFX90A-NEXT: s_waitcnt vmcnt(0)9778; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09779; GFX90A-NEXT: ;;#ASMSTART9780; GFX90A-NEXT: ; use a09781; GFX90A-NEXT: ;;#ASMEND9782; GFX90A-NEXT: s_setpc_b64 s[30:31]9783;9784; GFX950-LABEL: global_atomic_umax_i32_saddr_ret_a_a:9785; GFX950: ; %bb.0:9786; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9787; GFX950-NEXT: v_mov_b32_e32 v0, 09788; GFX950-NEXT: ;;#ASMSTART9789; GFX950-NEXT: ; def a09790; GFX950-NEXT: ;;#ASMEND9791; GFX950-NEXT: s_nop 09792; GFX950-NEXT: v_accvgpr_read_b32 v1, a09793; GFX950-NEXT: global_atomic_umax v0, v0, v1, s[0:1] offset:40 sc09794; GFX950-NEXT: s_waitcnt vmcnt(0)9795; GFX950-NEXT: v_accvgpr_write_b32 a0, v09796; GFX950-NEXT: ;;#ASMSTART9797; GFX950-NEXT: ; use a09798; GFX950-NEXT: ;;#ASMEND9799; GFX950-NEXT: s_setpc_b64 s[30:31]9800 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109801 %data = call i32 asm "; def $0", "=a"()9802 %result = atomicrmw umax ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09803 call void asm "; use $0", "a"(i32 %result)9804 ret void9805}9806 9807define void @global_atomic_umax_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9808; GFX90A-LABEL: global_atomic_umax_i32_saddr_ret_av_av:9809; GFX90A: ; %bb.0:9810; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9811; GFX90A-NEXT: v_mov_b32_e32 v0, 09812; GFX90A-NEXT: ;;#ASMSTART9813; GFX90A-NEXT: ; def v19814; GFX90A-NEXT: ;;#ASMEND9815; GFX90A-NEXT: global_atomic_umax v0, v0, v1, s[16:17] offset:40 glc9816; GFX90A-NEXT: s_waitcnt vmcnt(0)9817; GFX90A-NEXT: ;;#ASMSTART9818; GFX90A-NEXT: ; use v09819; GFX90A-NEXT: ;;#ASMEND9820; GFX90A-NEXT: s_setpc_b64 s[30:31]9821;9822; GFX950-LABEL: global_atomic_umax_i32_saddr_ret_av_av:9823; GFX950: ; %bb.0:9824; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9825; GFX950-NEXT: v_mov_b32_e32 v0, 09826; GFX950-NEXT: ;;#ASMSTART9827; GFX950-NEXT: ; def v19828; GFX950-NEXT: ;;#ASMEND9829; GFX950-NEXT: global_atomic_umax v0, v0, v1, s[0:1] offset:40 sc09830; GFX950-NEXT: s_waitcnt vmcnt(0)9831; GFX950-NEXT: ;;#ASMSTART9832; GFX950-NEXT: ; use v09833; GFX950-NEXT: ;;#ASMEND9834; GFX950-NEXT: s_setpc_b64 s[30:31]9835 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109836 %data = call i32 asm "; def $0", "=^VA"()9837 %result = atomicrmw umax ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09838 call void asm "; use $0", "^VA"(i32 %result)9839 ret void9840}9841 9842define void @global_atomic_umin_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9843; GFX90A-LABEL: global_atomic_umin_i32_saddr_ret_a_a:9844; GFX90A: ; %bb.0:9845; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9846; GFX90A-NEXT: v_mov_b32_e32 v0, 09847; GFX90A-NEXT: ;;#ASMSTART9848; GFX90A-NEXT: ; def a09849; GFX90A-NEXT: ;;#ASMEND9850; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09851; GFX90A-NEXT: global_atomic_umin v0, v0, v1, s[16:17] offset:40 glc9852; GFX90A-NEXT: s_waitcnt vmcnt(0)9853; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09854; GFX90A-NEXT: ;;#ASMSTART9855; GFX90A-NEXT: ; use a09856; GFX90A-NEXT: ;;#ASMEND9857; GFX90A-NEXT: s_setpc_b64 s[30:31]9858;9859; GFX950-LABEL: global_atomic_umin_i32_saddr_ret_a_a:9860; GFX950: ; %bb.0:9861; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9862; GFX950-NEXT: v_mov_b32_e32 v0, 09863; GFX950-NEXT: ;;#ASMSTART9864; GFX950-NEXT: ; def a09865; GFX950-NEXT: ;;#ASMEND9866; GFX950-NEXT: s_nop 09867; GFX950-NEXT: v_accvgpr_read_b32 v1, a09868; GFX950-NEXT: global_atomic_umin v0, v0, v1, s[0:1] offset:40 sc09869; GFX950-NEXT: s_waitcnt vmcnt(0)9870; GFX950-NEXT: v_accvgpr_write_b32 a0, v09871; GFX950-NEXT: ;;#ASMSTART9872; GFX950-NEXT: ; use a09873; GFX950-NEXT: ;;#ASMEND9874; GFX950-NEXT: s_setpc_b64 s[30:31]9875 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109876 %data = call i32 asm "; def $0", "=a"()9877 %result = atomicrmw umin ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09878 call void asm "; use $0", "a"(i32 %result)9879 ret void9880}9881 9882define void @global_atomic_umin_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9883; GFX90A-LABEL: global_atomic_umin_i32_saddr_ret_av_av:9884; GFX90A: ; %bb.0:9885; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9886; GFX90A-NEXT: v_mov_b32_e32 v0, 09887; GFX90A-NEXT: ;;#ASMSTART9888; GFX90A-NEXT: ; def v19889; GFX90A-NEXT: ;;#ASMEND9890; GFX90A-NEXT: global_atomic_umin v0, v0, v1, s[16:17] offset:40 glc9891; GFX90A-NEXT: s_waitcnt vmcnt(0)9892; GFX90A-NEXT: ;;#ASMSTART9893; GFX90A-NEXT: ; use v09894; GFX90A-NEXT: ;;#ASMEND9895; GFX90A-NEXT: s_setpc_b64 s[30:31]9896;9897; GFX950-LABEL: global_atomic_umin_i32_saddr_ret_av_av:9898; GFX950: ; %bb.0:9899; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9900; GFX950-NEXT: v_mov_b32_e32 v0, 09901; GFX950-NEXT: ;;#ASMSTART9902; GFX950-NEXT: ; def v19903; GFX950-NEXT: ;;#ASMEND9904; GFX950-NEXT: global_atomic_umin v0, v0, v1, s[0:1] offset:40 sc09905; GFX950-NEXT: s_waitcnt vmcnt(0)9906; GFX950-NEXT: ;;#ASMSTART9907; GFX950-NEXT: ; use v09908; GFX950-NEXT: ;;#ASMEND9909; GFX950-NEXT: s_setpc_b64 s[30:31]9910 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109911 %data = call i32 asm "; def $0", "=^VA"()9912 %result = atomicrmw umin ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09913 call void asm "; use $0", "^VA"(i32 %result)9914 ret void9915}9916 9917define void @global_atomic_uinc_wrap_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9918; GFX90A-LABEL: global_atomic_uinc_wrap_i32_saddr_ret_a_a:9919; GFX90A: ; %bb.0:9920; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9921; GFX90A-NEXT: v_mov_b32_e32 v0, 09922; GFX90A-NEXT: ;;#ASMSTART9923; GFX90A-NEXT: ; def a09924; GFX90A-NEXT: ;;#ASMEND9925; GFX90A-NEXT: v_accvgpr_read_b32 v1, a09926; GFX90A-NEXT: global_atomic_inc v0, v0, v1, s[16:17] offset:40 glc9927; GFX90A-NEXT: s_waitcnt vmcnt(0)9928; GFX90A-NEXT: v_accvgpr_write_b32 a0, v09929; GFX90A-NEXT: ;;#ASMSTART9930; GFX90A-NEXT: ; use a09931; GFX90A-NEXT: ;;#ASMEND9932; GFX90A-NEXT: s_setpc_b64 s[30:31]9933;9934; GFX950-LABEL: global_atomic_uinc_wrap_i32_saddr_ret_a_a:9935; GFX950: ; %bb.0:9936; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9937; GFX950-NEXT: v_mov_b32_e32 v0, 09938; GFX950-NEXT: ;;#ASMSTART9939; GFX950-NEXT: ; def a09940; GFX950-NEXT: ;;#ASMEND9941; GFX950-NEXT: s_nop 09942; GFX950-NEXT: v_accvgpr_read_b32 v1, a09943; GFX950-NEXT: global_atomic_inc v0, v0, v1, s[0:1] offset:40 sc09944; GFX950-NEXT: s_waitcnt vmcnt(0)9945; GFX950-NEXT: v_accvgpr_write_b32 a0, v09946; GFX950-NEXT: ;;#ASMSTART9947; GFX950-NEXT: ; use a09948; GFX950-NEXT: ;;#ASMEND9949; GFX950-NEXT: s_setpc_b64 s[30:31]9950 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109951 %data = call i32 asm "; def $0", "=a"()9952 %result = atomicrmw uinc_wrap ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09953 call void asm "; use $0", "a"(i32 %result)9954 ret void9955}9956 9957define void @global_atomic_uinc_wrap_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {9958; GFX90A-LABEL: global_atomic_uinc_wrap_i32_saddr_ret_av_av:9959; GFX90A: ; %bb.0:9960; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9961; GFX90A-NEXT: v_mov_b32_e32 v0, 09962; GFX90A-NEXT: ;;#ASMSTART9963; GFX90A-NEXT: ; def v19964; GFX90A-NEXT: ;;#ASMEND9965; GFX90A-NEXT: global_atomic_inc v0, v0, v1, s[16:17] offset:40 glc9966; GFX90A-NEXT: s_waitcnt vmcnt(0)9967; GFX90A-NEXT: ;;#ASMSTART9968; GFX90A-NEXT: ; use v09969; GFX90A-NEXT: ;;#ASMEND9970; GFX90A-NEXT: s_setpc_b64 s[30:31]9971;9972; GFX950-LABEL: global_atomic_uinc_wrap_i32_saddr_ret_av_av:9973; GFX950: ; %bb.0:9974; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9975; GFX950-NEXT: v_mov_b32_e32 v0, 09976; GFX950-NEXT: ;;#ASMSTART9977; GFX950-NEXT: ; def v19978; GFX950-NEXT: ;;#ASMEND9979; GFX950-NEXT: global_atomic_inc v0, v0, v1, s[0:1] offset:40 sc09980; GFX950-NEXT: s_waitcnt vmcnt(0)9981; GFX950-NEXT: ;;#ASMSTART9982; GFX950-NEXT: ; use v09983; GFX950-NEXT: ;;#ASMEND9984; GFX950-NEXT: s_setpc_b64 s[30:31]9985 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 109986 %data = call i32 asm "; def $0", "=^VA"()9987 %result = atomicrmw uinc_wrap ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !09988 call void asm "; use $0", "^VA"(i32 %result)9989 ret void9990}9991 9992define void @global_atomic_udec_wrap_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {9993; GFX90A-LABEL: global_atomic_udec_wrap_i32_saddr_ret_a_a:9994; GFX90A: ; %bb.0:9995; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9996; GFX90A-NEXT: v_mov_b32_e32 v0, 09997; GFX90A-NEXT: ;;#ASMSTART9998; GFX90A-NEXT: ; def a09999; GFX90A-NEXT: ;;#ASMEND10000; GFX90A-NEXT: v_accvgpr_read_b32 v1, a010001; GFX90A-NEXT: global_atomic_dec v0, v0, v1, s[16:17] offset:40 glc10002; GFX90A-NEXT: s_waitcnt vmcnt(0)10003; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010004; GFX90A-NEXT: ;;#ASMSTART10005; GFX90A-NEXT: ; use a010006; GFX90A-NEXT: ;;#ASMEND10007; GFX90A-NEXT: s_setpc_b64 s[30:31]10008;10009; GFX950-LABEL: global_atomic_udec_wrap_i32_saddr_ret_a_a:10010; GFX950: ; %bb.0:10011; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10012; GFX950-NEXT: v_mov_b32_e32 v0, 010013; GFX950-NEXT: ;;#ASMSTART10014; GFX950-NEXT: ; def a010015; GFX950-NEXT: ;;#ASMEND10016; GFX950-NEXT: s_nop 010017; GFX950-NEXT: v_accvgpr_read_b32 v1, a010018; GFX950-NEXT: global_atomic_dec v0, v0, v1, s[0:1] offset:40 sc010019; GFX950-NEXT: s_waitcnt vmcnt(0)10020; GFX950-NEXT: v_accvgpr_write_b32 a0, v010021; GFX950-NEXT: ;;#ASMSTART10022; GFX950-NEXT: ; use a010023; GFX950-NEXT: ;;#ASMEND10024; GFX950-NEXT: s_setpc_b64 s[30:31]10025 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1010026 %data = call i32 asm "; def $0", "=a"()10027 %result = atomicrmw udec_wrap ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010028 call void asm "; use $0", "a"(i32 %result)10029 ret void10030}10031 10032define void @global_atomic_udec_wrap_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10033; GFX90A-LABEL: global_atomic_udec_wrap_i32_saddr_ret_av_av:10034; GFX90A: ; %bb.0:10035; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10036; GFX90A-NEXT: v_mov_b32_e32 v0, 010037; GFX90A-NEXT: ;;#ASMSTART10038; GFX90A-NEXT: ; def v110039; GFX90A-NEXT: ;;#ASMEND10040; GFX90A-NEXT: global_atomic_dec v0, v0, v1, s[16:17] offset:40 glc10041; GFX90A-NEXT: s_waitcnt vmcnt(0)10042; GFX90A-NEXT: ;;#ASMSTART10043; GFX90A-NEXT: ; use v010044; GFX90A-NEXT: ;;#ASMEND10045; GFX90A-NEXT: s_setpc_b64 s[30:31]10046;10047; GFX950-LABEL: global_atomic_udec_wrap_i32_saddr_ret_av_av:10048; GFX950: ; %bb.0:10049; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10050; GFX950-NEXT: v_mov_b32_e32 v0, 010051; GFX950-NEXT: ;;#ASMSTART10052; GFX950-NEXT: ; def v110053; GFX950-NEXT: ;;#ASMEND10054; GFX950-NEXT: global_atomic_dec v0, v0, v1, s[0:1] offset:40 sc010055; GFX950-NEXT: s_waitcnt vmcnt(0)10056; GFX950-NEXT: ;;#ASMSTART10057; GFX950-NEXT: ; use v010058; GFX950-NEXT: ;;#ASMEND10059; GFX950-NEXT: s_setpc_b64 s[30:31]10060 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1010061 %data = call i32 asm "; def $0", "=^VA"()10062 %result = atomicrmw udec_wrap ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010063 call void asm "; use $0", "^VA"(i32 %result)10064 ret void10065}10066 10067define void @global_atomic_usub_cond_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10068; GFX90A-LABEL: global_atomic_usub_cond_i32_saddr_ret_a_a:10069; GFX90A: ; %bb.0:10070; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10071; GFX90A-NEXT: v_mov_b32_e32 v2, 010072; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4010073; GFX90A-NEXT: ;;#ASMSTART10074; GFX90A-NEXT: ; def a010075; GFX90A-NEXT: ;;#ASMEND10076; GFX90A-NEXT: v_accvgpr_read_b32 v3, a010077; GFX90A-NEXT: s_mov_b64 s[4:5], 010078; GFX90A-NEXT: .LBB189_1: ; %atomicrmw.start10079; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=110080; GFX90A-NEXT: s_waitcnt vmcnt(0)10081; GFX90A-NEXT: v_sub_u32_e32 v0, v1, v310082; GFX90A-NEXT: v_cmp_ge_u32_e32 vcc, v1, v310083; GFX90A-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc10084; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc10085; GFX90A-NEXT: s_waitcnt vmcnt(0)10086; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v110087; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]10088; GFX90A-NEXT: v_mov_b32_e32 v1, v010089; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]10090; GFX90A-NEXT: s_cbranch_execnz .LBB189_110091; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end10092; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]10093; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010094; GFX90A-NEXT: ;;#ASMSTART10095; GFX90A-NEXT: ; use a010096; GFX90A-NEXT: ;;#ASMEND10097; GFX90A-NEXT: s_setpc_b64 s[30:31]10098;10099; GFX950-LABEL: global_atomic_usub_cond_i32_saddr_ret_a_a:10100; GFX950: ; %bb.0:10101; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10102; GFX950-NEXT: v_mov_b32_e32 v2, 010103; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4010104; GFX950-NEXT: ;;#ASMSTART10105; GFX950-NEXT: ; def a010106; GFX950-NEXT: ;;#ASMEND10107; GFX950-NEXT: s_mov_b64 s[2:3], 010108; GFX950-NEXT: v_accvgpr_read_b32 v3, a010109; GFX950-NEXT: .LBB189_1: ; %atomicrmw.start10110; GFX950-NEXT: ; =>This Inner Loop Header: Depth=110111; GFX950-NEXT: s_waitcnt vmcnt(0)10112; GFX950-NEXT: v_sub_u32_e32 v0, v1, v310113; GFX950-NEXT: v_cmp_ge_u32_e32 vcc, v1, v310114; GFX950-NEXT: s_nop 110115; GFX950-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc10116; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc010117; GFX950-NEXT: s_waitcnt vmcnt(0)10118; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v110119; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]10120; GFX950-NEXT: v_mov_b32_e32 v1, v010121; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]10122; GFX950-NEXT: s_cbranch_execnz .LBB189_110123; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end10124; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]10125; GFX950-NEXT: v_accvgpr_write_b32 a0, v010126; GFX950-NEXT: ;;#ASMSTART10127; GFX950-NEXT: ; use a010128; GFX950-NEXT: ;;#ASMEND10129; GFX950-NEXT: s_setpc_b64 s[30:31]10130 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1010131 %data = call i32 asm "; def $0", "=a"()10132 %result = atomicrmw usub_cond ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010133 call void asm "; use $0", "a"(i32 %result)10134 ret void10135}10136 10137define void @global_atomic_usub_cond_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10138; GFX90A-LABEL: global_atomic_usub_cond_i32_saddr_ret_av_av:10139; GFX90A: ; %bb.0:10140; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10141; GFX90A-NEXT: v_mov_b32_e32 v2, 010142; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4010143; GFX90A-NEXT: s_mov_b64 s[4:5], 010144; GFX90A-NEXT: ;;#ASMSTART10145; GFX90A-NEXT: ; def v310146; GFX90A-NEXT: ;;#ASMEND10147; GFX90A-NEXT: .LBB190_1: ; %atomicrmw.start10148; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=110149; GFX90A-NEXT: s_waitcnt vmcnt(0)10150; GFX90A-NEXT: v_sub_u32_e32 v0, v1, v310151; GFX90A-NEXT: v_cmp_ge_u32_e32 vcc, v1, v310152; GFX90A-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc10153; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc10154; GFX90A-NEXT: s_waitcnt vmcnt(0)10155; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v110156; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]10157; GFX90A-NEXT: v_mov_b32_e32 v1, v010158; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]10159; GFX90A-NEXT: s_cbranch_execnz .LBB190_110160; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end10161; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]10162; GFX90A-NEXT: ;;#ASMSTART10163; GFX90A-NEXT: ; use v010164; GFX90A-NEXT: ;;#ASMEND10165; GFX90A-NEXT: s_setpc_b64 s[30:31]10166;10167; GFX950-LABEL: global_atomic_usub_cond_i32_saddr_ret_av_av:10168; GFX950: ; %bb.0:10169; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10170; GFX950-NEXT: v_mov_b32_e32 v2, 010171; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4010172; GFX950-NEXT: s_mov_b64 s[2:3], 010173; GFX950-NEXT: ;;#ASMSTART10174; GFX950-NEXT: ; def v310175; GFX950-NEXT: ;;#ASMEND10176; GFX950-NEXT: .LBB190_1: ; %atomicrmw.start10177; GFX950-NEXT: ; =>This Inner Loop Header: Depth=110178; GFX950-NEXT: s_waitcnt vmcnt(0)10179; GFX950-NEXT: v_sub_u32_e32 v0, v1, v310180; GFX950-NEXT: v_cmp_ge_u32_e32 vcc, v1, v310181; GFX950-NEXT: s_nop 110182; GFX950-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc10183; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc010184; GFX950-NEXT: s_waitcnt vmcnt(0)10185; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v110186; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]10187; GFX950-NEXT: v_mov_b32_e32 v1, v010188; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]10189; GFX950-NEXT: s_cbranch_execnz .LBB190_110190; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end10191; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]10192; GFX950-NEXT: ;;#ASMSTART10193; GFX950-NEXT: ; use v010194; GFX950-NEXT: ;;#ASMEND10195; GFX950-NEXT: s_setpc_b64 s[30:31]10196 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1010197 %data = call i32 asm "; def $0", "=^VA"()10198 %result = atomicrmw usub_cond ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010199 call void asm "; use $0", "^VA"(i32 %result)10200 ret void10201}10202 10203define void @global_atomic_usub_sat_i32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10204; GFX90A-LABEL: global_atomic_usub_sat_i32_saddr_ret_a_a:10205; GFX90A: ; %bb.0:10206; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10207; GFX90A-NEXT: v_mov_b32_e32 v2, 010208; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4010209; GFX90A-NEXT: ;;#ASMSTART10210; GFX90A-NEXT: ; def a010211; GFX90A-NEXT: ;;#ASMEND10212; GFX90A-NEXT: v_accvgpr_read_b32 v3, a010213; GFX90A-NEXT: s_mov_b64 s[4:5], 010214; GFX90A-NEXT: .LBB191_1: ; %atomicrmw.start10215; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=110216; GFX90A-NEXT: s_waitcnt vmcnt(0)10217; GFX90A-NEXT: v_sub_u32_e64 v0, v1, v3 clamp10218; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc10219; GFX90A-NEXT: s_waitcnt vmcnt(0)10220; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v110221; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]10222; GFX90A-NEXT: v_mov_b32_e32 v1, v010223; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]10224; GFX90A-NEXT: s_cbranch_execnz .LBB191_110225; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end10226; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]10227; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010228; GFX90A-NEXT: ;;#ASMSTART10229; GFX90A-NEXT: ; use a010230; GFX90A-NEXT: ;;#ASMEND10231; GFX90A-NEXT: s_setpc_b64 s[30:31]10232;10233; GFX950-LABEL: global_atomic_usub_sat_i32_saddr_ret_a_a:10234; GFX950: ; %bb.0:10235; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10236; GFX950-NEXT: v_mov_b32_e32 v2, 010237; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4010238; GFX950-NEXT: ;;#ASMSTART10239; GFX950-NEXT: ; def a010240; GFX950-NEXT: ;;#ASMEND10241; GFX950-NEXT: s_mov_b64 s[2:3], 010242; GFX950-NEXT: v_accvgpr_read_b32 v3, a010243; GFX950-NEXT: .LBB191_1: ; %atomicrmw.start10244; GFX950-NEXT: ; =>This Inner Loop Header: Depth=110245; GFX950-NEXT: s_waitcnt vmcnt(0)10246; GFX950-NEXT: v_sub_u32_e64 v0, v1, v3 clamp10247; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc010248; GFX950-NEXT: s_waitcnt vmcnt(0)10249; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v110250; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]10251; GFX950-NEXT: v_mov_b32_e32 v1, v010252; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]10253; GFX950-NEXT: s_cbranch_execnz .LBB191_110254; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end10255; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]10256; GFX950-NEXT: v_accvgpr_write_b32 a0, v010257; GFX950-NEXT: ;;#ASMSTART10258; GFX950-NEXT: ; use a010259; GFX950-NEXT: ;;#ASMEND10260; GFX950-NEXT: s_setpc_b64 s[30:31]10261 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1010262 %data = call i32 asm "; def $0", "=a"()10263 %result = atomicrmw usub_sat ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010264 call void asm "; use $0", "a"(i32 %result)10265 ret void10266}10267 10268define void @global_atomic_usub_sat_i32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10269; GFX90A-LABEL: global_atomic_usub_sat_i32_saddr_ret_av_av:10270; GFX90A: ; %bb.0:10271; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10272; GFX90A-NEXT: v_mov_b32_e32 v2, 010273; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4010274; GFX90A-NEXT: s_mov_b64 s[4:5], 010275; GFX90A-NEXT: ;;#ASMSTART10276; GFX90A-NEXT: ; def v310277; GFX90A-NEXT: ;;#ASMEND10278; GFX90A-NEXT: .LBB192_1: ; %atomicrmw.start10279; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=110280; GFX90A-NEXT: s_waitcnt vmcnt(0)10281; GFX90A-NEXT: v_sub_u32_e64 v0, v1, v3 clamp10282; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc10283; GFX90A-NEXT: s_waitcnt vmcnt(0)10284; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v110285; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]10286; GFX90A-NEXT: v_mov_b32_e32 v1, v010287; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]10288; GFX90A-NEXT: s_cbranch_execnz .LBB192_110289; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end10290; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]10291; GFX90A-NEXT: ;;#ASMSTART10292; GFX90A-NEXT: ; use v010293; GFX90A-NEXT: ;;#ASMEND10294; GFX90A-NEXT: s_setpc_b64 s[30:31]10295;10296; GFX950-LABEL: global_atomic_usub_sat_i32_saddr_ret_av_av:10297; GFX950: ; %bb.0:10298; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10299; GFX950-NEXT: v_mov_b32_e32 v2, 010300; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4010301; GFX950-NEXT: s_mov_b64 s[2:3], 010302; GFX950-NEXT: ;;#ASMSTART10303; GFX950-NEXT: ; def v310304; GFX950-NEXT: ;;#ASMEND10305; GFX950-NEXT: .LBB192_1: ; %atomicrmw.start10306; GFX950-NEXT: ; =>This Inner Loop Header: Depth=110307; GFX950-NEXT: s_waitcnt vmcnt(0)10308; GFX950-NEXT: v_sub_u32_e64 v0, v1, v3 clamp10309; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc010310; GFX950-NEXT: s_waitcnt vmcnt(0)10311; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v110312; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]10313; GFX950-NEXT: v_mov_b32_e32 v1, v010314; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]10315; GFX950-NEXT: s_cbranch_execnz .LBB192_110316; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end10317; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]10318; GFX950-NEXT: ;;#ASMSTART10319; GFX950-NEXT: ; use v010320; GFX950-NEXT: ;;#ASMEND10321; GFX950-NEXT: s_setpc_b64 s[30:31]10322 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1010323 %data = call i32 asm "; def $0", "=^VA"()10324 %result = atomicrmw usub_sat ptr addrspace(1) %gep.0, i32 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010325 call void asm "; use $0", "^VA"(i32 %result)10326 ret void10327}10328 10329;---------------------------------------------------------------------10330; other atomics i64, with aa+av cases using saddr10331;---------------------------------------------------------------------10332 10333define void @global_atomic_xchg_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10334; GFX90A-LABEL: global_atomic_xchg_i64_saddr_ret_a_a:10335; GFX90A: ; %bb.0:10336; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10337; GFX90A-NEXT: ;;#ASMSTART10338; GFX90A-NEXT: ; def a[0:1]10339; GFX90A-NEXT: ;;#ASMEND10340; GFX90A-NEXT: v_accvgpr_read_b32 v0, a010341; GFX90A-NEXT: v_mov_b32_e32 v2, 010342; GFX90A-NEXT: v_accvgpr_read_b32 v1, a110343; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10344; GFX90A-NEXT: s_waitcnt vmcnt(0)10345; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010346; GFX90A-NEXT: v_accvgpr_write_b32 a1, v110347; GFX90A-NEXT: ;;#ASMSTART10348; GFX90A-NEXT: ; use a[0:1]10349; GFX90A-NEXT: ;;#ASMEND10350; GFX90A-NEXT: s_setpc_b64 s[30:31]10351;10352; GFX950-LABEL: global_atomic_xchg_i64_saddr_ret_a_a:10353; GFX950: ; %bb.0:10354; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10355; GFX950-NEXT: ;;#ASMSTART10356; GFX950-NEXT: ; def a[0:1]10357; GFX950-NEXT: ;;#ASMEND10358; GFX950-NEXT: v_mov_b32_e32 v2, 010359; GFX950-NEXT: v_accvgpr_read_b32 v0, a010360; GFX950-NEXT: v_accvgpr_read_b32 v1, a110361; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010362; GFX950-NEXT: s_waitcnt vmcnt(0)10363; GFX950-NEXT: v_accvgpr_write_b32 a0, v010364; GFX950-NEXT: v_accvgpr_write_b32 a1, v110365; GFX950-NEXT: ;;#ASMSTART10366; GFX950-NEXT: ; use a[0:1]10367; GFX950-NEXT: ;;#ASMEND10368; GFX950-NEXT: s_setpc_b64 s[30:31]10369 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010370 %data = call i64 asm "; def $0", "=a"()10371 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010372 call void asm "; use $0", "a"(i64 %result)10373 ret void10374}10375 10376define void @global_atomic_xchg_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10377; GFX90A-LABEL: global_atomic_xchg_i64_saddr_ret_av_av:10378; GFX90A: ; %bb.0:10379; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10380; GFX90A-NEXT: v_mov_b32_e32 v2, 010381; GFX90A-NEXT: ;;#ASMSTART10382; GFX90A-NEXT: ; def v[0:1]10383; GFX90A-NEXT: ;;#ASMEND10384; GFX90A-NEXT: global_atomic_swap_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10385; GFX90A-NEXT: s_waitcnt vmcnt(0)10386; GFX90A-NEXT: ;;#ASMSTART10387; GFX90A-NEXT: ; use v[0:1]10388; GFX90A-NEXT: ;;#ASMEND10389; GFX90A-NEXT: s_setpc_b64 s[30:31]10390;10391; GFX950-LABEL: global_atomic_xchg_i64_saddr_ret_av_av:10392; GFX950: ; %bb.0:10393; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10394; GFX950-NEXT: v_mov_b32_e32 v2, 010395; GFX950-NEXT: ;;#ASMSTART10396; GFX950-NEXT: ; def v[0:1]10397; GFX950-NEXT: ;;#ASMEND10398; GFX950-NEXT: global_atomic_swap_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010399; GFX950-NEXT: s_waitcnt vmcnt(0)10400; GFX950-NEXT: ;;#ASMSTART10401; GFX950-NEXT: ; use v[0:1]10402; GFX950-NEXT: ;;#ASMEND10403; GFX950-NEXT: s_setpc_b64 s[30:31]10404 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010405 %data = call i64 asm "; def $0", "=^VA"()10406 %result = atomicrmw xchg ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010407 call void asm "; use $0", "^VA"(i64 %result)10408 ret void10409}10410 10411define void @global_atomic_add_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10412; GFX90A-LABEL: global_atomic_add_i64_saddr_ret_a_a:10413; GFX90A: ; %bb.0:10414; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10415; GFX90A-NEXT: ;;#ASMSTART10416; GFX90A-NEXT: ; def a[0:1]10417; GFX90A-NEXT: ;;#ASMEND10418; GFX90A-NEXT: v_accvgpr_read_b32 v0, a010419; GFX90A-NEXT: v_mov_b32_e32 v2, 010420; GFX90A-NEXT: v_accvgpr_read_b32 v1, a110421; GFX90A-NEXT: global_atomic_add_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10422; GFX90A-NEXT: s_waitcnt vmcnt(0)10423; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010424; GFX90A-NEXT: v_accvgpr_write_b32 a1, v110425; GFX90A-NEXT: ;;#ASMSTART10426; GFX90A-NEXT: ; use a[0:1]10427; GFX90A-NEXT: ;;#ASMEND10428; GFX90A-NEXT: s_setpc_b64 s[30:31]10429;10430; GFX950-LABEL: global_atomic_add_i64_saddr_ret_a_a:10431; GFX950: ; %bb.0:10432; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10433; GFX950-NEXT: ;;#ASMSTART10434; GFX950-NEXT: ; def a[0:1]10435; GFX950-NEXT: ;;#ASMEND10436; GFX950-NEXT: v_mov_b32_e32 v2, 010437; GFX950-NEXT: v_accvgpr_read_b32 v0, a010438; GFX950-NEXT: v_accvgpr_read_b32 v1, a110439; GFX950-NEXT: global_atomic_add_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010440; GFX950-NEXT: s_waitcnt vmcnt(0)10441; GFX950-NEXT: v_accvgpr_write_b32 a0, v010442; GFX950-NEXT: v_accvgpr_write_b32 a1, v110443; GFX950-NEXT: ;;#ASMSTART10444; GFX950-NEXT: ; use a[0:1]10445; GFX950-NEXT: ;;#ASMEND10446; GFX950-NEXT: s_setpc_b64 s[30:31]10447 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010448 %data = call i64 asm "; def $0", "=a"()10449 %result = atomicrmw add ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010450 call void asm "; use $0", "a"(i64 %result)10451 ret void10452}10453 10454define void @global_atomic_add_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10455; GFX90A-LABEL: global_atomic_add_i64_saddr_ret_av_av:10456; GFX90A: ; %bb.0:10457; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10458; GFX90A-NEXT: v_mov_b32_e32 v2, 010459; GFX90A-NEXT: ;;#ASMSTART10460; GFX90A-NEXT: ; def v[0:1]10461; GFX90A-NEXT: ;;#ASMEND10462; GFX90A-NEXT: global_atomic_add_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10463; GFX90A-NEXT: s_waitcnt vmcnt(0)10464; GFX90A-NEXT: ;;#ASMSTART10465; GFX90A-NEXT: ; use v[0:1]10466; GFX90A-NEXT: ;;#ASMEND10467; GFX90A-NEXT: s_setpc_b64 s[30:31]10468;10469; GFX950-LABEL: global_atomic_add_i64_saddr_ret_av_av:10470; GFX950: ; %bb.0:10471; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10472; GFX950-NEXT: v_mov_b32_e32 v2, 010473; GFX950-NEXT: ;;#ASMSTART10474; GFX950-NEXT: ; def v[0:1]10475; GFX950-NEXT: ;;#ASMEND10476; GFX950-NEXT: global_atomic_add_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010477; GFX950-NEXT: s_waitcnt vmcnt(0)10478; GFX950-NEXT: ;;#ASMSTART10479; GFX950-NEXT: ; use v[0:1]10480; GFX950-NEXT: ;;#ASMEND10481; GFX950-NEXT: s_setpc_b64 s[30:31]10482 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010483 %data = call i64 asm "; def $0", "=^VA"()10484 %result = atomicrmw add ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010485 call void asm "; use $0", "^VA"(i64 %result)10486 ret void10487}10488 10489define void @global_atomic_sub_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10490; GFX90A-LABEL: global_atomic_sub_i64_saddr_ret_a_a:10491; GFX90A: ; %bb.0:10492; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10493; GFX90A-NEXT: ;;#ASMSTART10494; GFX90A-NEXT: ; def a[0:1]10495; GFX90A-NEXT: ;;#ASMEND10496; GFX90A-NEXT: v_accvgpr_read_b32 v0, a010497; GFX90A-NEXT: v_mov_b32_e32 v2, 010498; GFX90A-NEXT: v_accvgpr_read_b32 v1, a110499; GFX90A-NEXT: global_atomic_sub_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10500; GFX90A-NEXT: s_waitcnt vmcnt(0)10501; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010502; GFX90A-NEXT: v_accvgpr_write_b32 a1, v110503; GFX90A-NEXT: ;;#ASMSTART10504; GFX90A-NEXT: ; use a[0:1]10505; GFX90A-NEXT: ;;#ASMEND10506; GFX90A-NEXT: s_setpc_b64 s[30:31]10507;10508; GFX950-LABEL: global_atomic_sub_i64_saddr_ret_a_a:10509; GFX950: ; %bb.0:10510; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10511; GFX950-NEXT: ;;#ASMSTART10512; GFX950-NEXT: ; def a[0:1]10513; GFX950-NEXT: ;;#ASMEND10514; GFX950-NEXT: v_mov_b32_e32 v2, 010515; GFX950-NEXT: v_accvgpr_read_b32 v0, a010516; GFX950-NEXT: v_accvgpr_read_b32 v1, a110517; GFX950-NEXT: global_atomic_sub_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010518; GFX950-NEXT: s_waitcnt vmcnt(0)10519; GFX950-NEXT: v_accvgpr_write_b32 a0, v010520; GFX950-NEXT: v_accvgpr_write_b32 a1, v110521; GFX950-NEXT: ;;#ASMSTART10522; GFX950-NEXT: ; use a[0:1]10523; GFX950-NEXT: ;;#ASMEND10524; GFX950-NEXT: s_setpc_b64 s[30:31]10525 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010526 %data = call i64 asm "; def $0", "=a"()10527 %result = atomicrmw sub ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010528 call void asm "; use $0", "a"(i64 %result)10529 ret void10530}10531 10532define void @global_atomic_sub_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10533; GFX90A-LABEL: global_atomic_sub_i64_saddr_ret_av_av:10534; GFX90A: ; %bb.0:10535; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10536; GFX90A-NEXT: v_mov_b32_e32 v2, 010537; GFX90A-NEXT: ;;#ASMSTART10538; GFX90A-NEXT: ; def v[0:1]10539; GFX90A-NEXT: ;;#ASMEND10540; GFX90A-NEXT: global_atomic_sub_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10541; GFX90A-NEXT: s_waitcnt vmcnt(0)10542; GFX90A-NEXT: ;;#ASMSTART10543; GFX90A-NEXT: ; use v[0:1]10544; GFX90A-NEXT: ;;#ASMEND10545; GFX90A-NEXT: s_setpc_b64 s[30:31]10546;10547; GFX950-LABEL: global_atomic_sub_i64_saddr_ret_av_av:10548; GFX950: ; %bb.0:10549; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10550; GFX950-NEXT: v_mov_b32_e32 v2, 010551; GFX950-NEXT: ;;#ASMSTART10552; GFX950-NEXT: ; def v[0:1]10553; GFX950-NEXT: ;;#ASMEND10554; GFX950-NEXT: global_atomic_sub_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010555; GFX950-NEXT: s_waitcnt vmcnt(0)10556; GFX950-NEXT: ;;#ASMSTART10557; GFX950-NEXT: ; use v[0:1]10558; GFX950-NEXT: ;;#ASMEND10559; GFX950-NEXT: s_setpc_b64 s[30:31]10560 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010561 %data = call i64 asm "; def $0", "=^VA"()10562 %result = atomicrmw sub ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010563 call void asm "; use $0", "^VA"(i64 %result)10564 ret void10565}10566 10567define void @global_atomic_and_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10568; GFX90A-LABEL: global_atomic_and_i64_saddr_ret_a_a:10569; GFX90A: ; %bb.0:10570; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10571; GFX90A-NEXT: ;;#ASMSTART10572; GFX90A-NEXT: ; def a[0:1]10573; GFX90A-NEXT: ;;#ASMEND10574; GFX90A-NEXT: v_accvgpr_read_b32 v0, a010575; GFX90A-NEXT: v_mov_b32_e32 v2, 010576; GFX90A-NEXT: v_accvgpr_read_b32 v1, a110577; GFX90A-NEXT: global_atomic_and_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10578; GFX90A-NEXT: s_waitcnt vmcnt(0)10579; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010580; GFX90A-NEXT: v_accvgpr_write_b32 a1, v110581; GFX90A-NEXT: ;;#ASMSTART10582; GFX90A-NEXT: ; use a[0:1]10583; GFX90A-NEXT: ;;#ASMEND10584; GFX90A-NEXT: s_setpc_b64 s[30:31]10585;10586; GFX950-LABEL: global_atomic_and_i64_saddr_ret_a_a:10587; GFX950: ; %bb.0:10588; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10589; GFX950-NEXT: ;;#ASMSTART10590; GFX950-NEXT: ; def a[0:1]10591; GFX950-NEXT: ;;#ASMEND10592; GFX950-NEXT: v_mov_b32_e32 v2, 010593; GFX950-NEXT: v_accvgpr_read_b32 v0, a010594; GFX950-NEXT: v_accvgpr_read_b32 v1, a110595; GFX950-NEXT: global_atomic_and_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010596; GFX950-NEXT: s_waitcnt vmcnt(0)10597; GFX950-NEXT: v_accvgpr_write_b32 a0, v010598; GFX950-NEXT: v_accvgpr_write_b32 a1, v110599; GFX950-NEXT: ;;#ASMSTART10600; GFX950-NEXT: ; use a[0:1]10601; GFX950-NEXT: ;;#ASMEND10602; GFX950-NEXT: s_setpc_b64 s[30:31]10603 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010604 %data = call i64 asm "; def $0", "=a"()10605 %result = atomicrmw and ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010606 call void asm "; use $0", "a"(i64 %result)10607 ret void10608}10609 10610define void @global_atomic_and_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10611; GFX90A-LABEL: global_atomic_and_i64_saddr_ret_av_av:10612; GFX90A: ; %bb.0:10613; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10614; GFX90A-NEXT: v_mov_b32_e32 v2, 010615; GFX90A-NEXT: ;;#ASMSTART10616; GFX90A-NEXT: ; def v[0:1]10617; GFX90A-NEXT: ;;#ASMEND10618; GFX90A-NEXT: global_atomic_and_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10619; GFX90A-NEXT: s_waitcnt vmcnt(0)10620; GFX90A-NEXT: ;;#ASMSTART10621; GFX90A-NEXT: ; use v[0:1]10622; GFX90A-NEXT: ;;#ASMEND10623; GFX90A-NEXT: s_setpc_b64 s[30:31]10624;10625; GFX950-LABEL: global_atomic_and_i64_saddr_ret_av_av:10626; GFX950: ; %bb.0:10627; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10628; GFX950-NEXT: v_mov_b32_e32 v2, 010629; GFX950-NEXT: ;;#ASMSTART10630; GFX950-NEXT: ; def v[0:1]10631; GFX950-NEXT: ;;#ASMEND10632; GFX950-NEXT: global_atomic_and_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010633; GFX950-NEXT: s_waitcnt vmcnt(0)10634; GFX950-NEXT: ;;#ASMSTART10635; GFX950-NEXT: ; use v[0:1]10636; GFX950-NEXT: ;;#ASMEND10637; GFX950-NEXT: s_setpc_b64 s[30:31]10638 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010639 %data = call i64 asm "; def $0", "=^VA"()10640 %result = atomicrmw and ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010641 call void asm "; use $0", "^VA"(i64 %result)10642 ret void10643}10644 10645define void @global_atomic_nand_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10646; GFX90A-LABEL: global_atomic_nand_i64_saddr_ret_a_a:10647; GFX90A: ; %bb.0:10648; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10649; GFX90A-NEXT: v_mov_b32_e32 v6, 010650; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8010651; GFX90A-NEXT: ;;#ASMSTART10652; GFX90A-NEXT: ; def a[0:1]10653; GFX90A-NEXT: ;;#ASMEND10654; GFX90A-NEXT: v_accvgpr_read_b32 v5, a110655; GFX90A-NEXT: v_accvgpr_read_b32 v4, a010656; GFX90A-NEXT: s_mov_b64 s[4:5], 010657; GFX90A-NEXT: .LBB201_1: ; %atomicrmw.start10658; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=110659; GFX90A-NEXT: s_waitcnt vmcnt(0)10660; GFX90A-NEXT: v_and_b32_e32 v0, v3, v510661; GFX90A-NEXT: v_and_b32_e32 v7, v2, v410662; GFX90A-NEXT: v_not_b32_e32 v1, v010663; GFX90A-NEXT: v_not_b32_e32 v0, v710664; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc10665; GFX90A-NEXT: s_waitcnt vmcnt(0)10666; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]10667; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]10668; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]10669; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]10670; GFX90A-NEXT: s_cbranch_execnz .LBB201_110671; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end10672; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]10673; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010674; GFX90A-NEXT: v_accvgpr_write_b32 a1, v110675; GFX90A-NEXT: ;;#ASMSTART10676; GFX90A-NEXT: ; use a[0:1]10677; GFX90A-NEXT: ;;#ASMEND10678; GFX90A-NEXT: s_setpc_b64 s[30:31]10679;10680; GFX950-LABEL: global_atomic_nand_i64_saddr_ret_a_a:10681; GFX950: ; %bb.0:10682; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10683; GFX950-NEXT: v_mov_b32_e32 v6, 010684; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8010685; GFX950-NEXT: ;;#ASMSTART10686; GFX950-NEXT: ; def a[0:1]10687; GFX950-NEXT: ;;#ASMEND10688; GFX950-NEXT: s_mov_b64 s[2:3], 010689; GFX950-NEXT: v_accvgpr_read_b32 v5, a110690; GFX950-NEXT: v_accvgpr_read_b32 v4, a010691; GFX950-NEXT: .LBB201_1: ; %atomicrmw.start10692; GFX950-NEXT: ; =>This Inner Loop Header: Depth=110693; GFX950-NEXT: s_waitcnt vmcnt(0)10694; GFX950-NEXT: v_and_b32_e32 v0, v3, v510695; GFX950-NEXT: v_and_b32_e32 v7, v2, v410696; GFX950-NEXT: v_not_b32_e32 v1, v010697; GFX950-NEXT: v_not_b32_e32 v0, v710698; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc010699; GFX950-NEXT: s_waitcnt vmcnt(0)10700; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]10701; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]10702; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]10703; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]10704; GFX950-NEXT: s_cbranch_execnz .LBB201_110705; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end10706; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]10707; GFX950-NEXT: v_accvgpr_write_b32 a0, v010708; GFX950-NEXT: v_accvgpr_write_b32 a1, v110709; GFX950-NEXT: ;;#ASMSTART10710; GFX950-NEXT: ; use a[0:1]10711; GFX950-NEXT: ;;#ASMEND10712; GFX950-NEXT: s_setpc_b64 s[30:31]10713 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010714 %data = call i64 asm "; def $0", "=a"()10715 %result = atomicrmw nand ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010716 call void asm "; use $0", "a"(i64 %result)10717 ret void10718}10719 10720define void @global_atomic_nand_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10721; GFX90A-LABEL: global_atomic_nand_i64_saddr_ret_av_av:10722; GFX90A: ; %bb.0:10723; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10724; GFX90A-NEXT: v_mov_b32_e32 v6, 010725; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8010726; GFX90A-NEXT: s_mov_b64 s[4:5], 010727; GFX90A-NEXT: ;;#ASMSTART10728; GFX90A-NEXT: ; def v[4:5]10729; GFX90A-NEXT: ;;#ASMEND10730; GFX90A-NEXT: .LBB202_1: ; %atomicrmw.start10731; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=110732; GFX90A-NEXT: s_waitcnt vmcnt(0)10733; GFX90A-NEXT: v_and_b32_e32 v0, v3, v510734; GFX90A-NEXT: v_and_b32_e32 v7, v2, v410735; GFX90A-NEXT: v_not_b32_e32 v1, v010736; GFX90A-NEXT: v_not_b32_e32 v0, v710737; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc10738; GFX90A-NEXT: s_waitcnt vmcnt(0)10739; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]10740; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]10741; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]10742; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]10743; GFX90A-NEXT: s_cbranch_execnz .LBB202_110744; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end10745; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]10746; GFX90A-NEXT: ;;#ASMSTART10747; GFX90A-NEXT: ; use v[0:1]10748; GFX90A-NEXT: ;;#ASMEND10749; GFX90A-NEXT: s_setpc_b64 s[30:31]10750;10751; GFX950-LABEL: global_atomic_nand_i64_saddr_ret_av_av:10752; GFX950: ; %bb.0:10753; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10754; GFX950-NEXT: v_mov_b32_e32 v6, 010755; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8010756; GFX950-NEXT: s_mov_b64 s[2:3], 010757; GFX950-NEXT: ;;#ASMSTART10758; GFX950-NEXT: ; def v[4:5]10759; GFX950-NEXT: ;;#ASMEND10760; GFX950-NEXT: .LBB202_1: ; %atomicrmw.start10761; GFX950-NEXT: ; =>This Inner Loop Header: Depth=110762; GFX950-NEXT: s_waitcnt vmcnt(0)10763; GFX950-NEXT: v_and_b32_e32 v0, v3, v510764; GFX950-NEXT: v_and_b32_e32 v7, v2, v410765; GFX950-NEXT: v_not_b32_e32 v1, v010766; GFX950-NEXT: v_not_b32_e32 v0, v710767; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc010768; GFX950-NEXT: s_waitcnt vmcnt(0)10769; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]10770; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]10771; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]10772; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]10773; GFX950-NEXT: s_cbranch_execnz .LBB202_110774; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end10775; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]10776; GFX950-NEXT: ;;#ASMSTART10777; GFX950-NEXT: ; use v[0:1]10778; GFX950-NEXT: ;;#ASMEND10779; GFX950-NEXT: s_setpc_b64 s[30:31]10780 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010781 %data = call i64 asm "; def $0", "=^VA"()10782 %result = atomicrmw nand ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010783 call void asm "; use $0", "^VA"(i64 %result)10784 ret void10785}10786 10787define void @global_atomic_or_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10788; GFX90A-LABEL: global_atomic_or_i64_saddr_ret_a_a:10789; GFX90A: ; %bb.0:10790; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10791; GFX90A-NEXT: ;;#ASMSTART10792; GFX90A-NEXT: ; def a[0:1]10793; GFX90A-NEXT: ;;#ASMEND10794; GFX90A-NEXT: v_accvgpr_read_b32 v0, a010795; GFX90A-NEXT: v_mov_b32_e32 v2, 010796; GFX90A-NEXT: v_accvgpr_read_b32 v1, a110797; GFX90A-NEXT: global_atomic_or_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10798; GFX90A-NEXT: s_waitcnt vmcnt(0)10799; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010800; GFX90A-NEXT: v_accvgpr_write_b32 a1, v110801; GFX90A-NEXT: ;;#ASMSTART10802; GFX90A-NEXT: ; use a[0:1]10803; GFX90A-NEXT: ;;#ASMEND10804; GFX90A-NEXT: s_setpc_b64 s[30:31]10805;10806; GFX950-LABEL: global_atomic_or_i64_saddr_ret_a_a:10807; GFX950: ; %bb.0:10808; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10809; GFX950-NEXT: ;;#ASMSTART10810; GFX950-NEXT: ; def a[0:1]10811; GFX950-NEXT: ;;#ASMEND10812; GFX950-NEXT: v_mov_b32_e32 v2, 010813; GFX950-NEXT: v_accvgpr_read_b32 v0, a010814; GFX950-NEXT: v_accvgpr_read_b32 v1, a110815; GFX950-NEXT: global_atomic_or_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010816; GFX950-NEXT: s_waitcnt vmcnt(0)10817; GFX950-NEXT: v_accvgpr_write_b32 a0, v010818; GFX950-NEXT: v_accvgpr_write_b32 a1, v110819; GFX950-NEXT: ;;#ASMSTART10820; GFX950-NEXT: ; use a[0:1]10821; GFX950-NEXT: ;;#ASMEND10822; GFX950-NEXT: s_setpc_b64 s[30:31]10823 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010824 %data = call i64 asm "; def $0", "=a"()10825 %result = atomicrmw or ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010826 call void asm "; use $0", "a"(i64 %result)10827 ret void10828}10829 10830define void @global_atomic_or_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10831; GFX90A-LABEL: global_atomic_or_i64_saddr_ret_av_av:10832; GFX90A: ; %bb.0:10833; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10834; GFX90A-NEXT: v_mov_b32_e32 v2, 010835; GFX90A-NEXT: ;;#ASMSTART10836; GFX90A-NEXT: ; def v[0:1]10837; GFX90A-NEXT: ;;#ASMEND10838; GFX90A-NEXT: global_atomic_or_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10839; GFX90A-NEXT: s_waitcnt vmcnt(0)10840; GFX90A-NEXT: ;;#ASMSTART10841; GFX90A-NEXT: ; use v[0:1]10842; GFX90A-NEXT: ;;#ASMEND10843; GFX90A-NEXT: s_setpc_b64 s[30:31]10844;10845; GFX950-LABEL: global_atomic_or_i64_saddr_ret_av_av:10846; GFX950: ; %bb.0:10847; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10848; GFX950-NEXT: v_mov_b32_e32 v2, 010849; GFX950-NEXT: ;;#ASMSTART10850; GFX950-NEXT: ; def v[0:1]10851; GFX950-NEXT: ;;#ASMEND10852; GFX950-NEXT: global_atomic_or_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010853; GFX950-NEXT: s_waitcnt vmcnt(0)10854; GFX950-NEXT: ;;#ASMSTART10855; GFX950-NEXT: ; use v[0:1]10856; GFX950-NEXT: ;;#ASMEND10857; GFX950-NEXT: s_setpc_b64 s[30:31]10858 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010859 %data = call i64 asm "; def $0", "=^VA"()10860 %result = atomicrmw or ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010861 call void asm "; use $0", "^VA"(i64 %result)10862 ret void10863}10864 10865define void @global_atomic_xor_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10866; GFX90A-LABEL: global_atomic_xor_i64_saddr_ret_a_a:10867; GFX90A: ; %bb.0:10868; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10869; GFX90A-NEXT: ;;#ASMSTART10870; GFX90A-NEXT: ; def a[0:1]10871; GFX90A-NEXT: ;;#ASMEND10872; GFX90A-NEXT: v_accvgpr_read_b32 v0, a010873; GFX90A-NEXT: v_mov_b32_e32 v2, 010874; GFX90A-NEXT: v_accvgpr_read_b32 v1, a110875; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10876; GFX90A-NEXT: s_waitcnt vmcnt(0)10877; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010878; GFX90A-NEXT: v_accvgpr_write_b32 a1, v110879; GFX90A-NEXT: ;;#ASMSTART10880; GFX90A-NEXT: ; use a[0:1]10881; GFX90A-NEXT: ;;#ASMEND10882; GFX90A-NEXT: s_setpc_b64 s[30:31]10883;10884; GFX950-LABEL: global_atomic_xor_i64_saddr_ret_a_a:10885; GFX950: ; %bb.0:10886; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10887; GFX950-NEXT: ;;#ASMSTART10888; GFX950-NEXT: ; def a[0:1]10889; GFX950-NEXT: ;;#ASMEND10890; GFX950-NEXT: v_mov_b32_e32 v2, 010891; GFX950-NEXT: v_accvgpr_read_b32 v0, a010892; GFX950-NEXT: v_accvgpr_read_b32 v1, a110893; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010894; GFX950-NEXT: s_waitcnt vmcnt(0)10895; GFX950-NEXT: v_accvgpr_write_b32 a0, v010896; GFX950-NEXT: v_accvgpr_write_b32 a1, v110897; GFX950-NEXT: ;;#ASMSTART10898; GFX950-NEXT: ; use a[0:1]10899; GFX950-NEXT: ;;#ASMEND10900; GFX950-NEXT: s_setpc_b64 s[30:31]10901 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010902 %data = call i64 asm "; def $0", "=a"()10903 %result = atomicrmw xor ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010904 call void asm "; use $0", "a"(i64 %result)10905 ret void10906}10907 10908define void @global_atomic_xor_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10909; GFX90A-LABEL: global_atomic_xor_i64_saddr_ret_av_av:10910; GFX90A: ; %bb.0:10911; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10912; GFX90A-NEXT: v_mov_b32_e32 v2, 010913; GFX90A-NEXT: ;;#ASMSTART10914; GFX90A-NEXT: ; def v[0:1]10915; GFX90A-NEXT: ;;#ASMEND10916; GFX90A-NEXT: global_atomic_xor_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10917; GFX90A-NEXT: s_waitcnt vmcnt(0)10918; GFX90A-NEXT: ;;#ASMSTART10919; GFX90A-NEXT: ; use v[0:1]10920; GFX90A-NEXT: ;;#ASMEND10921; GFX90A-NEXT: s_setpc_b64 s[30:31]10922;10923; GFX950-LABEL: global_atomic_xor_i64_saddr_ret_av_av:10924; GFX950: ; %bb.0:10925; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10926; GFX950-NEXT: v_mov_b32_e32 v2, 010927; GFX950-NEXT: ;;#ASMSTART10928; GFX950-NEXT: ; def v[0:1]10929; GFX950-NEXT: ;;#ASMEND10930; GFX950-NEXT: global_atomic_xor_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010931; GFX950-NEXT: s_waitcnt vmcnt(0)10932; GFX950-NEXT: ;;#ASMSTART10933; GFX950-NEXT: ; use v[0:1]10934; GFX950-NEXT: ;;#ASMEND10935; GFX950-NEXT: s_setpc_b64 s[30:31]10936 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010937 %data = call i64 asm "; def $0", "=^VA"()10938 %result = atomicrmw xor ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010939 call void asm "; use $0", "^VA"(i64 %result)10940 ret void10941}10942 10943define void @global_atomic_max_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {10944; GFX90A-LABEL: global_atomic_max_i64_saddr_ret_a_a:10945; GFX90A: ; %bb.0:10946; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10947; GFX90A-NEXT: ;;#ASMSTART10948; GFX90A-NEXT: ; def a[0:1]10949; GFX90A-NEXT: ;;#ASMEND10950; GFX90A-NEXT: v_accvgpr_read_b32 v0, a010951; GFX90A-NEXT: v_mov_b32_e32 v2, 010952; GFX90A-NEXT: v_accvgpr_read_b32 v1, a110953; GFX90A-NEXT: global_atomic_smax_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10954; GFX90A-NEXT: s_waitcnt vmcnt(0)10955; GFX90A-NEXT: v_accvgpr_write_b32 a0, v010956; GFX90A-NEXT: v_accvgpr_write_b32 a1, v110957; GFX90A-NEXT: ;;#ASMSTART10958; GFX90A-NEXT: ; use a[0:1]10959; GFX90A-NEXT: ;;#ASMEND10960; GFX90A-NEXT: s_setpc_b64 s[30:31]10961;10962; GFX950-LABEL: global_atomic_max_i64_saddr_ret_a_a:10963; GFX950: ; %bb.0:10964; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10965; GFX950-NEXT: ;;#ASMSTART10966; GFX950-NEXT: ; def a[0:1]10967; GFX950-NEXT: ;;#ASMEND10968; GFX950-NEXT: v_mov_b32_e32 v2, 010969; GFX950-NEXT: v_accvgpr_read_b32 v0, a010970; GFX950-NEXT: v_accvgpr_read_b32 v1, a110971; GFX950-NEXT: global_atomic_smax_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc010972; GFX950-NEXT: s_waitcnt vmcnt(0)10973; GFX950-NEXT: v_accvgpr_write_b32 a0, v010974; GFX950-NEXT: v_accvgpr_write_b32 a1, v110975; GFX950-NEXT: ;;#ASMSTART10976; GFX950-NEXT: ; use a[0:1]10977; GFX950-NEXT: ;;#ASMEND10978; GFX950-NEXT: s_setpc_b64 s[30:31]10979 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1010980 %data = call i64 asm "; def $0", "=a"()10981 %result = atomicrmw max ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !010982 call void asm "; use $0", "a"(i64 %result)10983 ret void10984}10985 10986define void @global_atomic_max_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {10987; GFX90A-LABEL: global_atomic_max_i64_saddr_ret_av_av:10988; GFX90A: ; %bb.0:10989; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10990; GFX90A-NEXT: v_mov_b32_e32 v2, 010991; GFX90A-NEXT: ;;#ASMSTART10992; GFX90A-NEXT: ; def v[0:1]10993; GFX90A-NEXT: ;;#ASMEND10994; GFX90A-NEXT: global_atomic_smax_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc10995; GFX90A-NEXT: s_waitcnt vmcnt(0)10996; GFX90A-NEXT: ;;#ASMSTART10997; GFX90A-NEXT: ; use v[0:1]10998; GFX90A-NEXT: ;;#ASMEND10999; GFX90A-NEXT: s_setpc_b64 s[30:31]11000;11001; GFX950-LABEL: global_atomic_max_i64_saddr_ret_av_av:11002; GFX950: ; %bb.0:11003; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11004; GFX950-NEXT: v_mov_b32_e32 v2, 011005; GFX950-NEXT: ;;#ASMSTART11006; GFX950-NEXT: ; def v[0:1]11007; GFX950-NEXT: ;;#ASMEND11008; GFX950-NEXT: global_atomic_smax_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011009; GFX950-NEXT: s_waitcnt vmcnt(0)11010; GFX950-NEXT: ;;#ASMSTART11011; GFX950-NEXT: ; use v[0:1]11012; GFX950-NEXT: ;;#ASMEND11013; GFX950-NEXT: s_setpc_b64 s[30:31]11014 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011015 %data = call i64 asm "; def $0", "=^VA"()11016 %result = atomicrmw max ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011017 call void asm "; use $0", "^VA"(i64 %result)11018 ret void11019}11020 11021define void @global_atomic_min_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11022; GFX90A-LABEL: global_atomic_min_i64_saddr_ret_a_a:11023; GFX90A: ; %bb.0:11024; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11025; GFX90A-NEXT: ;;#ASMSTART11026; GFX90A-NEXT: ; def a[0:1]11027; GFX90A-NEXT: ;;#ASMEND11028; GFX90A-NEXT: v_accvgpr_read_b32 v0, a011029; GFX90A-NEXT: v_mov_b32_e32 v2, 011030; GFX90A-NEXT: v_accvgpr_read_b32 v1, a111031; GFX90A-NEXT: global_atomic_smin_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11032; GFX90A-NEXT: s_waitcnt vmcnt(0)11033; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011034; GFX90A-NEXT: v_accvgpr_write_b32 a1, v111035; GFX90A-NEXT: ;;#ASMSTART11036; GFX90A-NEXT: ; use a[0:1]11037; GFX90A-NEXT: ;;#ASMEND11038; GFX90A-NEXT: s_setpc_b64 s[30:31]11039;11040; GFX950-LABEL: global_atomic_min_i64_saddr_ret_a_a:11041; GFX950: ; %bb.0:11042; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11043; GFX950-NEXT: ;;#ASMSTART11044; GFX950-NEXT: ; def a[0:1]11045; GFX950-NEXT: ;;#ASMEND11046; GFX950-NEXT: v_mov_b32_e32 v2, 011047; GFX950-NEXT: v_accvgpr_read_b32 v0, a011048; GFX950-NEXT: v_accvgpr_read_b32 v1, a111049; GFX950-NEXT: global_atomic_smin_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011050; GFX950-NEXT: s_waitcnt vmcnt(0)11051; GFX950-NEXT: v_accvgpr_write_b32 a0, v011052; GFX950-NEXT: v_accvgpr_write_b32 a1, v111053; GFX950-NEXT: ;;#ASMSTART11054; GFX950-NEXT: ; use a[0:1]11055; GFX950-NEXT: ;;#ASMEND11056; GFX950-NEXT: s_setpc_b64 s[30:31]11057 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011058 %data = call i64 asm "; def $0", "=a"()11059 %result = atomicrmw min ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011060 call void asm "; use $0", "a"(i64 %result)11061 ret void11062}11063 11064define void @global_atomic_min_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11065; GFX90A-LABEL: global_atomic_min_i64_saddr_ret_av_av:11066; GFX90A: ; %bb.0:11067; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11068; GFX90A-NEXT: v_mov_b32_e32 v2, 011069; GFX90A-NEXT: ;;#ASMSTART11070; GFX90A-NEXT: ; def v[0:1]11071; GFX90A-NEXT: ;;#ASMEND11072; GFX90A-NEXT: global_atomic_smin_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11073; GFX90A-NEXT: s_waitcnt vmcnt(0)11074; GFX90A-NEXT: ;;#ASMSTART11075; GFX90A-NEXT: ; use v[0:1]11076; GFX90A-NEXT: ;;#ASMEND11077; GFX90A-NEXT: s_setpc_b64 s[30:31]11078;11079; GFX950-LABEL: global_atomic_min_i64_saddr_ret_av_av:11080; GFX950: ; %bb.0:11081; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11082; GFX950-NEXT: v_mov_b32_e32 v2, 011083; GFX950-NEXT: ;;#ASMSTART11084; GFX950-NEXT: ; def v[0:1]11085; GFX950-NEXT: ;;#ASMEND11086; GFX950-NEXT: global_atomic_smin_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011087; GFX950-NEXT: s_waitcnt vmcnt(0)11088; GFX950-NEXT: ;;#ASMSTART11089; GFX950-NEXT: ; use v[0:1]11090; GFX950-NEXT: ;;#ASMEND11091; GFX950-NEXT: s_setpc_b64 s[30:31]11092 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011093 %data = call i64 asm "; def $0", "=^VA"()11094 %result = atomicrmw min ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011095 call void asm "; use $0", "^VA"(i64 %result)11096 ret void11097}11098 11099define void @global_atomic_umax_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11100; GFX90A-LABEL: global_atomic_umax_i64_saddr_ret_a_a:11101; GFX90A: ; %bb.0:11102; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11103; GFX90A-NEXT: ;;#ASMSTART11104; GFX90A-NEXT: ; def a[0:1]11105; GFX90A-NEXT: ;;#ASMEND11106; GFX90A-NEXT: v_accvgpr_read_b32 v0, a011107; GFX90A-NEXT: v_mov_b32_e32 v2, 011108; GFX90A-NEXT: v_accvgpr_read_b32 v1, a111109; GFX90A-NEXT: global_atomic_umax_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11110; GFX90A-NEXT: s_waitcnt vmcnt(0)11111; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011112; GFX90A-NEXT: v_accvgpr_write_b32 a1, v111113; GFX90A-NEXT: ;;#ASMSTART11114; GFX90A-NEXT: ; use a[0:1]11115; GFX90A-NEXT: ;;#ASMEND11116; GFX90A-NEXT: s_setpc_b64 s[30:31]11117;11118; GFX950-LABEL: global_atomic_umax_i64_saddr_ret_a_a:11119; GFX950: ; %bb.0:11120; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11121; GFX950-NEXT: ;;#ASMSTART11122; GFX950-NEXT: ; def a[0:1]11123; GFX950-NEXT: ;;#ASMEND11124; GFX950-NEXT: v_mov_b32_e32 v2, 011125; GFX950-NEXT: v_accvgpr_read_b32 v0, a011126; GFX950-NEXT: v_accvgpr_read_b32 v1, a111127; GFX950-NEXT: global_atomic_umax_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011128; GFX950-NEXT: s_waitcnt vmcnt(0)11129; GFX950-NEXT: v_accvgpr_write_b32 a0, v011130; GFX950-NEXT: v_accvgpr_write_b32 a1, v111131; GFX950-NEXT: ;;#ASMSTART11132; GFX950-NEXT: ; use a[0:1]11133; GFX950-NEXT: ;;#ASMEND11134; GFX950-NEXT: s_setpc_b64 s[30:31]11135 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011136 %data = call i64 asm "; def $0", "=a"()11137 %result = atomicrmw umax ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011138 call void asm "; use $0", "a"(i64 %result)11139 ret void11140}11141 11142define void @global_atomic_umax_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11143; GFX90A-LABEL: global_atomic_umax_i64_saddr_ret_av_av:11144; GFX90A: ; %bb.0:11145; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11146; GFX90A-NEXT: v_mov_b32_e32 v2, 011147; GFX90A-NEXT: ;;#ASMSTART11148; GFX90A-NEXT: ; def v[0:1]11149; GFX90A-NEXT: ;;#ASMEND11150; GFX90A-NEXT: global_atomic_umax_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11151; GFX90A-NEXT: s_waitcnt vmcnt(0)11152; GFX90A-NEXT: ;;#ASMSTART11153; GFX90A-NEXT: ; use v[0:1]11154; GFX90A-NEXT: ;;#ASMEND11155; GFX90A-NEXT: s_setpc_b64 s[30:31]11156;11157; GFX950-LABEL: global_atomic_umax_i64_saddr_ret_av_av:11158; GFX950: ; %bb.0:11159; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11160; GFX950-NEXT: v_mov_b32_e32 v2, 011161; GFX950-NEXT: ;;#ASMSTART11162; GFX950-NEXT: ; def v[0:1]11163; GFX950-NEXT: ;;#ASMEND11164; GFX950-NEXT: global_atomic_umax_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011165; GFX950-NEXT: s_waitcnt vmcnt(0)11166; GFX950-NEXT: ;;#ASMSTART11167; GFX950-NEXT: ; use v[0:1]11168; GFX950-NEXT: ;;#ASMEND11169; GFX950-NEXT: s_setpc_b64 s[30:31]11170 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011171 %data = call i64 asm "; def $0", "=^VA"()11172 %result = atomicrmw umax ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011173 call void asm "; use $0", "^VA"(i64 %result)11174 ret void11175}11176 11177define void @global_atomic_umin_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11178; GFX90A-LABEL: global_atomic_umin_i64_saddr_ret_a_a:11179; GFX90A: ; %bb.0:11180; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11181; GFX90A-NEXT: ;;#ASMSTART11182; GFX90A-NEXT: ; def a[0:1]11183; GFX90A-NEXT: ;;#ASMEND11184; GFX90A-NEXT: v_accvgpr_read_b32 v0, a011185; GFX90A-NEXT: v_mov_b32_e32 v2, 011186; GFX90A-NEXT: v_accvgpr_read_b32 v1, a111187; GFX90A-NEXT: global_atomic_umin_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11188; GFX90A-NEXT: s_waitcnt vmcnt(0)11189; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011190; GFX90A-NEXT: v_accvgpr_write_b32 a1, v111191; GFX90A-NEXT: ;;#ASMSTART11192; GFX90A-NEXT: ; use a[0:1]11193; GFX90A-NEXT: ;;#ASMEND11194; GFX90A-NEXT: s_setpc_b64 s[30:31]11195;11196; GFX950-LABEL: global_atomic_umin_i64_saddr_ret_a_a:11197; GFX950: ; %bb.0:11198; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11199; GFX950-NEXT: ;;#ASMSTART11200; GFX950-NEXT: ; def a[0:1]11201; GFX950-NEXT: ;;#ASMEND11202; GFX950-NEXT: v_mov_b32_e32 v2, 011203; GFX950-NEXT: v_accvgpr_read_b32 v0, a011204; GFX950-NEXT: v_accvgpr_read_b32 v1, a111205; GFX950-NEXT: global_atomic_umin_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011206; GFX950-NEXT: s_waitcnt vmcnt(0)11207; GFX950-NEXT: v_accvgpr_write_b32 a0, v011208; GFX950-NEXT: v_accvgpr_write_b32 a1, v111209; GFX950-NEXT: ;;#ASMSTART11210; GFX950-NEXT: ; use a[0:1]11211; GFX950-NEXT: ;;#ASMEND11212; GFX950-NEXT: s_setpc_b64 s[30:31]11213 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011214 %data = call i64 asm "; def $0", "=a"()11215 %result = atomicrmw umin ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011216 call void asm "; use $0", "a"(i64 %result)11217 ret void11218}11219 11220define void @global_atomic_umin_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11221; GFX90A-LABEL: global_atomic_umin_i64_saddr_ret_av_av:11222; GFX90A: ; %bb.0:11223; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11224; GFX90A-NEXT: v_mov_b32_e32 v2, 011225; GFX90A-NEXT: ;;#ASMSTART11226; GFX90A-NEXT: ; def v[0:1]11227; GFX90A-NEXT: ;;#ASMEND11228; GFX90A-NEXT: global_atomic_umin_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11229; GFX90A-NEXT: s_waitcnt vmcnt(0)11230; GFX90A-NEXT: ;;#ASMSTART11231; GFX90A-NEXT: ; use v[0:1]11232; GFX90A-NEXT: ;;#ASMEND11233; GFX90A-NEXT: s_setpc_b64 s[30:31]11234;11235; GFX950-LABEL: global_atomic_umin_i64_saddr_ret_av_av:11236; GFX950: ; %bb.0:11237; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11238; GFX950-NEXT: v_mov_b32_e32 v2, 011239; GFX950-NEXT: ;;#ASMSTART11240; GFX950-NEXT: ; def v[0:1]11241; GFX950-NEXT: ;;#ASMEND11242; GFX950-NEXT: global_atomic_umin_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011243; GFX950-NEXT: s_waitcnt vmcnt(0)11244; GFX950-NEXT: ;;#ASMSTART11245; GFX950-NEXT: ; use v[0:1]11246; GFX950-NEXT: ;;#ASMEND11247; GFX950-NEXT: s_setpc_b64 s[30:31]11248 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011249 %data = call i64 asm "; def $0", "=^VA"()11250 %result = atomicrmw umin ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011251 call void asm "; use $0", "^VA"(i64 %result)11252 ret void11253}11254 11255define void @global_atomic_uinc_wrap_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11256; GFX90A-LABEL: global_atomic_uinc_wrap_i64_saddr_ret_a_a:11257; GFX90A: ; %bb.0:11258; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11259; GFX90A-NEXT: ;;#ASMSTART11260; GFX90A-NEXT: ; def a[0:1]11261; GFX90A-NEXT: ;;#ASMEND11262; GFX90A-NEXT: v_accvgpr_read_b32 v0, a011263; GFX90A-NEXT: v_mov_b32_e32 v2, 011264; GFX90A-NEXT: v_accvgpr_read_b32 v1, a111265; GFX90A-NEXT: global_atomic_inc_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11266; GFX90A-NEXT: s_waitcnt vmcnt(0)11267; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011268; GFX90A-NEXT: v_accvgpr_write_b32 a1, v111269; GFX90A-NEXT: ;;#ASMSTART11270; GFX90A-NEXT: ; use a[0:1]11271; GFX90A-NEXT: ;;#ASMEND11272; GFX90A-NEXT: s_setpc_b64 s[30:31]11273;11274; GFX950-LABEL: global_atomic_uinc_wrap_i64_saddr_ret_a_a:11275; GFX950: ; %bb.0:11276; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11277; GFX950-NEXT: ;;#ASMSTART11278; GFX950-NEXT: ; def a[0:1]11279; GFX950-NEXT: ;;#ASMEND11280; GFX950-NEXT: v_mov_b32_e32 v2, 011281; GFX950-NEXT: v_accvgpr_read_b32 v0, a011282; GFX950-NEXT: v_accvgpr_read_b32 v1, a111283; GFX950-NEXT: global_atomic_inc_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011284; GFX950-NEXT: s_waitcnt vmcnt(0)11285; GFX950-NEXT: v_accvgpr_write_b32 a0, v011286; GFX950-NEXT: v_accvgpr_write_b32 a1, v111287; GFX950-NEXT: ;;#ASMSTART11288; GFX950-NEXT: ; use a[0:1]11289; GFX950-NEXT: ;;#ASMEND11290; GFX950-NEXT: s_setpc_b64 s[30:31]11291 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011292 %data = call i64 asm "; def $0", "=a"()11293 %result = atomicrmw uinc_wrap ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011294 call void asm "; use $0", "a"(i64 %result)11295 ret void11296}11297 11298define void @global_atomic_uinc_wrap_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11299; GFX90A-LABEL: global_atomic_uinc_wrap_i64_saddr_ret_av_av:11300; GFX90A: ; %bb.0:11301; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11302; GFX90A-NEXT: v_mov_b32_e32 v2, 011303; GFX90A-NEXT: ;;#ASMSTART11304; GFX90A-NEXT: ; def v[0:1]11305; GFX90A-NEXT: ;;#ASMEND11306; GFX90A-NEXT: global_atomic_inc_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11307; GFX90A-NEXT: s_waitcnt vmcnt(0)11308; GFX90A-NEXT: ;;#ASMSTART11309; GFX90A-NEXT: ; use v[0:1]11310; GFX90A-NEXT: ;;#ASMEND11311; GFX90A-NEXT: s_setpc_b64 s[30:31]11312;11313; GFX950-LABEL: global_atomic_uinc_wrap_i64_saddr_ret_av_av:11314; GFX950: ; %bb.0:11315; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11316; GFX950-NEXT: v_mov_b32_e32 v2, 011317; GFX950-NEXT: ;;#ASMSTART11318; GFX950-NEXT: ; def v[0:1]11319; GFX950-NEXT: ;;#ASMEND11320; GFX950-NEXT: global_atomic_inc_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011321; GFX950-NEXT: s_waitcnt vmcnt(0)11322; GFX950-NEXT: ;;#ASMSTART11323; GFX950-NEXT: ; use v[0:1]11324; GFX950-NEXT: ;;#ASMEND11325; GFX950-NEXT: s_setpc_b64 s[30:31]11326 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011327 %data = call i64 asm "; def $0", "=^VA"()11328 %result = atomicrmw uinc_wrap ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011329 call void asm "; use $0", "^VA"(i64 %result)11330 ret void11331}11332 11333define void @global_atomic_udec_wrap_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11334; GFX90A-LABEL: global_atomic_udec_wrap_i64_saddr_ret_a_a:11335; GFX90A: ; %bb.0:11336; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11337; GFX90A-NEXT: ;;#ASMSTART11338; GFX90A-NEXT: ; def a[0:1]11339; GFX90A-NEXT: ;;#ASMEND11340; GFX90A-NEXT: v_accvgpr_read_b32 v0, a011341; GFX90A-NEXT: v_mov_b32_e32 v2, 011342; GFX90A-NEXT: v_accvgpr_read_b32 v1, a111343; GFX90A-NEXT: global_atomic_dec_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11344; GFX90A-NEXT: s_waitcnt vmcnt(0)11345; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011346; GFX90A-NEXT: v_accvgpr_write_b32 a1, v111347; GFX90A-NEXT: ;;#ASMSTART11348; GFX90A-NEXT: ; use a[0:1]11349; GFX90A-NEXT: ;;#ASMEND11350; GFX90A-NEXT: s_setpc_b64 s[30:31]11351;11352; GFX950-LABEL: global_atomic_udec_wrap_i64_saddr_ret_a_a:11353; GFX950: ; %bb.0:11354; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11355; GFX950-NEXT: ;;#ASMSTART11356; GFX950-NEXT: ; def a[0:1]11357; GFX950-NEXT: ;;#ASMEND11358; GFX950-NEXT: v_mov_b32_e32 v2, 011359; GFX950-NEXT: v_accvgpr_read_b32 v0, a011360; GFX950-NEXT: v_accvgpr_read_b32 v1, a111361; GFX950-NEXT: global_atomic_dec_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011362; GFX950-NEXT: s_waitcnt vmcnt(0)11363; GFX950-NEXT: v_accvgpr_write_b32 a0, v011364; GFX950-NEXT: v_accvgpr_write_b32 a1, v111365; GFX950-NEXT: ;;#ASMSTART11366; GFX950-NEXT: ; use a[0:1]11367; GFX950-NEXT: ;;#ASMEND11368; GFX950-NEXT: s_setpc_b64 s[30:31]11369 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011370 %data = call i64 asm "; def $0", "=a"()11371 %result = atomicrmw udec_wrap ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011372 call void asm "; use $0", "a"(i64 %result)11373 ret void11374}11375 11376define void @global_atomic_udec_wrap_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11377; GFX90A-LABEL: global_atomic_udec_wrap_i64_saddr_ret_av_av:11378; GFX90A: ; %bb.0:11379; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11380; GFX90A-NEXT: v_mov_b32_e32 v2, 011381; GFX90A-NEXT: ;;#ASMSTART11382; GFX90A-NEXT: ; def v[0:1]11383; GFX90A-NEXT: ;;#ASMEND11384; GFX90A-NEXT: global_atomic_dec_x2 v[0:1], v2, v[0:1], s[16:17] offset:80 glc11385; GFX90A-NEXT: s_waitcnt vmcnt(0)11386; GFX90A-NEXT: ;;#ASMSTART11387; GFX90A-NEXT: ; use v[0:1]11388; GFX90A-NEXT: ;;#ASMEND11389; GFX90A-NEXT: s_setpc_b64 s[30:31]11390;11391; GFX950-LABEL: global_atomic_udec_wrap_i64_saddr_ret_av_av:11392; GFX950: ; %bb.0:11393; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11394; GFX950-NEXT: v_mov_b32_e32 v2, 011395; GFX950-NEXT: ;;#ASMSTART11396; GFX950-NEXT: ; def v[0:1]11397; GFX950-NEXT: ;;#ASMEND11398; GFX950-NEXT: global_atomic_dec_x2 v[0:1], v2, v[0:1], s[0:1] offset:80 sc011399; GFX950-NEXT: s_waitcnt vmcnt(0)11400; GFX950-NEXT: ;;#ASMSTART11401; GFX950-NEXT: ; use v[0:1]11402; GFX950-NEXT: ;;#ASMEND11403; GFX950-NEXT: s_setpc_b64 s[30:31]11404 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011405 %data = call i64 asm "; def $0", "=^VA"()11406 %result = atomicrmw udec_wrap ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011407 call void asm "; use $0", "^VA"(i64 %result)11408 ret void11409}11410 11411define void @global_atomic_usub_cond_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11412; GFX90A-LABEL: global_atomic_usub_cond_i64_saddr_ret_a_a:11413; GFX90A: ; %bb.0:11414; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11415; GFX90A-NEXT: v_mov_b32_e32 v6, 011416; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8011417; GFX90A-NEXT: ;;#ASMSTART11418; GFX90A-NEXT: ; def a[0:1]11419; GFX90A-NEXT: ;;#ASMEND11420; GFX90A-NEXT: v_accvgpr_read_b32 v5, a111421; GFX90A-NEXT: v_accvgpr_read_b32 v4, a011422; GFX90A-NEXT: s_mov_b64 s[4:5], 011423; GFX90A-NEXT: .LBB219_1: ; %atomicrmw.start11424; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=111425; GFX90A-NEXT: s_waitcnt vmcnt(0)11426; GFX90A-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v411427; GFX90A-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc11428; GFX90A-NEXT: v_cmp_ge_u64_e32 vcc, v[2:3], v[4:5]11429; GFX90A-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc11430; GFX90A-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc11431; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc11432; GFX90A-NEXT: s_waitcnt vmcnt(0)11433; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]11434; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]11435; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]11436; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]11437; GFX90A-NEXT: s_cbranch_execnz .LBB219_111438; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end11439; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]11440; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011441; GFX90A-NEXT: v_accvgpr_write_b32 a1, v111442; GFX90A-NEXT: ;;#ASMSTART11443; GFX90A-NEXT: ; use a[0:1]11444; GFX90A-NEXT: ;;#ASMEND11445; GFX90A-NEXT: s_setpc_b64 s[30:31]11446;11447; GFX950-LABEL: global_atomic_usub_cond_i64_saddr_ret_a_a:11448; GFX950: ; %bb.0:11449; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11450; GFX950-NEXT: v_mov_b32_e32 v6, 011451; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8011452; GFX950-NEXT: ;;#ASMSTART11453; GFX950-NEXT: ; def a[0:1]11454; GFX950-NEXT: ;;#ASMEND11455; GFX950-NEXT: s_mov_b64 s[2:3], 011456; GFX950-NEXT: v_accvgpr_read_b32 v5, a111457; GFX950-NEXT: v_accvgpr_read_b32 v4, a011458; GFX950-NEXT: .LBB219_1: ; %atomicrmw.start11459; GFX950-NEXT: ; =>This Inner Loop Header: Depth=111460; GFX950-NEXT: s_waitcnt vmcnt(0)11461; GFX950-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v411462; GFX950-NEXT: s_nop 111463; GFX950-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc11464; GFX950-NEXT: v_cmp_ge_u64_e32 vcc, v[2:3], v[4:5]11465; GFX950-NEXT: s_nop 111466; GFX950-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc11467; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc11468; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc011469; GFX950-NEXT: s_waitcnt vmcnt(0)11470; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]11471; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]11472; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]11473; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]11474; GFX950-NEXT: s_cbranch_execnz .LBB219_111475; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end11476; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]11477; GFX950-NEXT: v_accvgpr_write_b32 a0, v011478; GFX950-NEXT: v_accvgpr_write_b32 a1, v111479; GFX950-NEXT: ;;#ASMSTART11480; GFX950-NEXT: ; use a[0:1]11481; GFX950-NEXT: ;;#ASMEND11482; GFX950-NEXT: s_setpc_b64 s[30:31]11483 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011484 %data = call i64 asm "; def $0", "=a"()11485 %result = atomicrmw usub_cond ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011486 call void asm "; use $0", "a"(i64 %result)11487 ret void11488}11489 11490define void @global_atomic_usub_cond_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11491; GFX90A-LABEL: global_atomic_usub_cond_i64_saddr_ret_av_av:11492; GFX90A: ; %bb.0:11493; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11494; GFX90A-NEXT: v_mov_b32_e32 v6, 011495; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8011496; GFX90A-NEXT: s_mov_b64 s[4:5], 011497; GFX90A-NEXT: ;;#ASMSTART11498; GFX90A-NEXT: ; def v[4:5]11499; GFX90A-NEXT: ;;#ASMEND11500; GFX90A-NEXT: .LBB220_1: ; %atomicrmw.start11501; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=111502; GFX90A-NEXT: s_waitcnt vmcnt(0)11503; GFX90A-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v411504; GFX90A-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc11505; GFX90A-NEXT: v_cmp_ge_u64_e32 vcc, v[2:3], v[4:5]11506; GFX90A-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc11507; GFX90A-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc11508; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc11509; GFX90A-NEXT: s_waitcnt vmcnt(0)11510; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]11511; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]11512; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]11513; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]11514; GFX90A-NEXT: s_cbranch_execnz .LBB220_111515; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end11516; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]11517; GFX90A-NEXT: ;;#ASMSTART11518; GFX90A-NEXT: ; use v[0:1]11519; GFX90A-NEXT: ;;#ASMEND11520; GFX90A-NEXT: s_setpc_b64 s[30:31]11521;11522; GFX950-LABEL: global_atomic_usub_cond_i64_saddr_ret_av_av:11523; GFX950: ; %bb.0:11524; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11525; GFX950-NEXT: v_mov_b32_e32 v6, 011526; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8011527; GFX950-NEXT: s_mov_b64 s[2:3], 011528; GFX950-NEXT: ;;#ASMSTART11529; GFX950-NEXT: ; def v[4:5]11530; GFX950-NEXT: ;;#ASMEND11531; GFX950-NEXT: .LBB220_1: ; %atomicrmw.start11532; GFX950-NEXT: ; =>This Inner Loop Header: Depth=111533; GFX950-NEXT: s_waitcnt vmcnt(0)11534; GFX950-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v411535; GFX950-NEXT: s_nop 111536; GFX950-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc11537; GFX950-NEXT: v_cmp_ge_u64_e32 vcc, v[2:3], v[4:5]11538; GFX950-NEXT: s_nop 111539; GFX950-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc11540; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc11541; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc011542; GFX950-NEXT: s_waitcnt vmcnt(0)11543; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]11544; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]11545; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]11546; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]11547; GFX950-NEXT: s_cbranch_execnz .LBB220_111548; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end11549; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]11550; GFX950-NEXT: ;;#ASMSTART11551; GFX950-NEXT: ; use v[0:1]11552; GFX950-NEXT: ;;#ASMEND11553; GFX950-NEXT: s_setpc_b64 s[30:31]11554 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011555 %data = call i64 asm "; def $0", "=^VA"()11556 %result = atomicrmw usub_cond ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011557 call void asm "; use $0", "^VA"(i64 %result)11558 ret void11559}11560 11561define void @global_atomic_usub_sat_i64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11562; GFX90A-LABEL: global_atomic_usub_sat_i64_saddr_ret_a_a:11563; GFX90A: ; %bb.0:11564; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11565; GFX90A-NEXT: v_mov_b32_e32 v6, 011566; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8011567; GFX90A-NEXT: ;;#ASMSTART11568; GFX90A-NEXT: ; def a[0:1]11569; GFX90A-NEXT: ;;#ASMEND11570; GFX90A-NEXT: v_accvgpr_read_b32 v5, a111571; GFX90A-NEXT: v_accvgpr_read_b32 v4, a011572; GFX90A-NEXT: s_mov_b64 s[4:5], 011573; GFX90A-NEXT: .LBB221_1: ; %atomicrmw.start11574; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=111575; GFX90A-NEXT: s_waitcnt vmcnt(0)11576; GFX90A-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v411577; GFX90A-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc11578; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc11579; GFX90A-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc11580; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc11581; GFX90A-NEXT: s_waitcnt vmcnt(0)11582; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]11583; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]11584; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]11585; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]11586; GFX90A-NEXT: s_cbranch_execnz .LBB221_111587; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end11588; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]11589; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011590; GFX90A-NEXT: v_accvgpr_write_b32 a1, v111591; GFX90A-NEXT: ;;#ASMSTART11592; GFX90A-NEXT: ; use a[0:1]11593; GFX90A-NEXT: ;;#ASMEND11594; GFX90A-NEXT: s_setpc_b64 s[30:31]11595;11596; GFX950-LABEL: global_atomic_usub_sat_i64_saddr_ret_a_a:11597; GFX950: ; %bb.0:11598; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11599; GFX950-NEXT: v_mov_b32_e32 v6, 011600; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8011601; GFX950-NEXT: ;;#ASMSTART11602; GFX950-NEXT: ; def a[0:1]11603; GFX950-NEXT: ;;#ASMEND11604; GFX950-NEXT: s_mov_b64 s[2:3], 011605; GFX950-NEXT: v_accvgpr_read_b32 v5, a111606; GFX950-NEXT: v_accvgpr_read_b32 v4, a011607; GFX950-NEXT: .LBB221_1: ; %atomicrmw.start11608; GFX950-NEXT: ; =>This Inner Loop Header: Depth=111609; GFX950-NEXT: s_waitcnt vmcnt(0)11610; GFX950-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v411611; GFX950-NEXT: s_nop 111612; GFX950-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc11613; GFX950-NEXT: s_nop 111614; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc11615; GFX950-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc11616; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc011617; GFX950-NEXT: s_waitcnt vmcnt(0)11618; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]11619; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]11620; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]11621; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]11622; GFX950-NEXT: s_cbranch_execnz .LBB221_111623; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end11624; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]11625; GFX950-NEXT: v_accvgpr_write_b32 a0, v011626; GFX950-NEXT: v_accvgpr_write_b32 a1, v111627; GFX950-NEXT: ;;#ASMSTART11628; GFX950-NEXT: ; use a[0:1]11629; GFX950-NEXT: ;;#ASMEND11630; GFX950-NEXT: s_setpc_b64 s[30:31]11631 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011632 %data = call i64 asm "; def $0", "=a"()11633 %result = atomicrmw usub_sat ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011634 call void asm "; use $0", "a"(i64 %result)11635 ret void11636}11637 11638define void @global_atomic_usub_sat_i64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11639; GFX90A-LABEL: global_atomic_usub_sat_i64_saddr_ret_av_av:11640; GFX90A: ; %bb.0:11641; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11642; GFX90A-NEXT: v_mov_b32_e32 v6, 011643; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8011644; GFX90A-NEXT: s_mov_b64 s[4:5], 011645; GFX90A-NEXT: ;;#ASMSTART11646; GFX90A-NEXT: ; def v[4:5]11647; GFX90A-NEXT: ;;#ASMEND11648; GFX90A-NEXT: .LBB222_1: ; %atomicrmw.start11649; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=111650; GFX90A-NEXT: s_waitcnt vmcnt(0)11651; GFX90A-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v411652; GFX90A-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc11653; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc11654; GFX90A-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc11655; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc11656; GFX90A-NEXT: s_waitcnt vmcnt(0)11657; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]11658; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]11659; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]11660; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]11661; GFX90A-NEXT: s_cbranch_execnz .LBB222_111662; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end11663; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]11664; GFX90A-NEXT: ;;#ASMSTART11665; GFX90A-NEXT: ; use v[0:1]11666; GFX90A-NEXT: ;;#ASMEND11667; GFX90A-NEXT: s_setpc_b64 s[30:31]11668;11669; GFX950-LABEL: global_atomic_usub_sat_i64_saddr_ret_av_av:11670; GFX950: ; %bb.0:11671; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11672; GFX950-NEXT: v_mov_b32_e32 v6, 011673; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8011674; GFX950-NEXT: s_mov_b64 s[2:3], 011675; GFX950-NEXT: ;;#ASMSTART11676; GFX950-NEXT: ; def v[4:5]11677; GFX950-NEXT: ;;#ASMEND11678; GFX950-NEXT: .LBB222_1: ; %atomicrmw.start11679; GFX950-NEXT: ; =>This Inner Loop Header: Depth=111680; GFX950-NEXT: s_waitcnt vmcnt(0)11681; GFX950-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v411682; GFX950-NEXT: s_nop 111683; GFX950-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc11684; GFX950-NEXT: s_nop 111685; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc11686; GFX950-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc11687; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc011688; GFX950-NEXT: s_waitcnt vmcnt(0)11689; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]11690; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]11691; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]11692; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]11693; GFX950-NEXT: s_cbranch_execnz .LBB222_111694; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end11695; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]11696; GFX950-NEXT: ;;#ASMSTART11697; GFX950-NEXT: ; use v[0:1]11698; GFX950-NEXT: ;;#ASMEND11699; GFX950-NEXT: s_setpc_b64 s[30:31]11700 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 1011701 %data = call i64 asm "; def $0", "=^VA"()11702 %result = atomicrmw usub_sat ptr addrspace(1) %gep.0, i64 %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !011703 call void asm "; use $0", "^VA"(i64 %result)11704 ret void11705}11706 11707;---------------------------------------------------------------------11708; other atomics f32, with aa+av cases using saddr11709;---------------------------------------------------------------------11710 11711define void @global_atomic_fadd_f32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11712; GFX90A-LABEL: global_atomic_fadd_f32_saddr_ret_a_a:11713; GFX90A: ; %bb.0:11714; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11715; GFX90A-NEXT: v_mov_b32_e32 v0, 011716; GFX90A-NEXT: ;;#ASMSTART11717; GFX90A-NEXT: ; def a011718; GFX90A-NEXT: ;;#ASMEND11719; GFX90A-NEXT: v_accvgpr_read_b32 v1, a011720; GFX90A-NEXT: global_atomic_add_f32 v0, v0, v1, s[16:17] offset:40 glc11721; GFX90A-NEXT: s_waitcnt vmcnt(0)11722; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011723; GFX90A-NEXT: ;;#ASMSTART11724; GFX90A-NEXT: ; use a011725; GFX90A-NEXT: ;;#ASMEND11726; GFX90A-NEXT: s_setpc_b64 s[30:31]11727;11728; GFX950-LABEL: global_atomic_fadd_f32_saddr_ret_a_a:11729; GFX950: ; %bb.0:11730; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11731; GFX950-NEXT: v_mov_b32_e32 v0, 011732; GFX950-NEXT: ;;#ASMSTART11733; GFX950-NEXT: ; def a011734; GFX950-NEXT: ;;#ASMEND11735; GFX950-NEXT: s_nop 011736; GFX950-NEXT: v_accvgpr_read_b32 v1, a011737; GFX950-NEXT: global_atomic_add_f32 v0, v0, v1, s[0:1] offset:40 sc011738; GFX950-NEXT: s_waitcnt vmcnt(0)11739; GFX950-NEXT: v_accvgpr_write_b32 a0, v011740; GFX950-NEXT: ;;#ASMSTART11741; GFX950-NEXT: ; use a011742; GFX950-NEXT: ;;#ASMEND11743; GFX950-NEXT: s_setpc_b64 s[30:31]11744 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1011745 %data = call float asm "; def $0", "=a"()11746 %result = atomicrmw fadd ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !011747 call void asm "; use $0", "a"(float %result)11748 ret void11749}11750 11751define void @global_atomic_fadd_f32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11752; GFX90A-LABEL: global_atomic_fadd_f32_saddr_ret_av_av:11753; GFX90A: ; %bb.0:11754; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11755; GFX90A-NEXT: v_mov_b32_e32 v0, 011756; GFX90A-NEXT: ;;#ASMSTART11757; GFX90A-NEXT: ; def v111758; GFX90A-NEXT: ;;#ASMEND11759; GFX90A-NEXT: global_atomic_add_f32 v0, v0, v1, s[16:17] offset:40 glc11760; GFX90A-NEXT: s_waitcnt vmcnt(0)11761; GFX90A-NEXT: ;;#ASMSTART11762; GFX90A-NEXT: ; use v011763; GFX90A-NEXT: ;;#ASMEND11764; GFX90A-NEXT: s_setpc_b64 s[30:31]11765;11766; GFX950-LABEL: global_atomic_fadd_f32_saddr_ret_av_av:11767; GFX950: ; %bb.0:11768; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11769; GFX950-NEXT: v_mov_b32_e32 v0, 011770; GFX950-NEXT: ;;#ASMSTART11771; GFX950-NEXT: ; def v111772; GFX950-NEXT: ;;#ASMEND11773; GFX950-NEXT: global_atomic_add_f32 v0, v0, v1, s[0:1] offset:40 sc011774; GFX950-NEXT: s_waitcnt vmcnt(0)11775; GFX950-NEXT: ;;#ASMSTART11776; GFX950-NEXT: ; use v011777; GFX950-NEXT: ;;#ASMEND11778; GFX950-NEXT: s_setpc_b64 s[30:31]11779 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1011780 %data = call float asm "; def $0", "=^VA"()11781 %result = atomicrmw fadd ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !011782 call void asm "; use $0", "^VA"(float %result)11783 ret void11784}11785 11786define void @global_atomic_fsub_f32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11787; GFX90A-LABEL: global_atomic_fsub_f32_saddr_ret_a_a:11788; GFX90A: ; %bb.0:11789; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11790; GFX90A-NEXT: v_mov_b32_e32 v2, 011791; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4011792; GFX90A-NEXT: ;;#ASMSTART11793; GFX90A-NEXT: ; def a011794; GFX90A-NEXT: ;;#ASMEND11795; GFX90A-NEXT: v_accvgpr_read_b32 v3, a011796; GFX90A-NEXT: s_mov_b64 s[4:5], 011797; GFX90A-NEXT: .LBB225_1: ; %atomicrmw.start11798; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=111799; GFX90A-NEXT: s_waitcnt vmcnt(0)11800; GFX90A-NEXT: v_sub_f32_e32 v0, v1, v311801; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc11802; GFX90A-NEXT: s_waitcnt vmcnt(0)11803; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v111804; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]11805; GFX90A-NEXT: v_mov_b32_e32 v1, v011806; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]11807; GFX90A-NEXT: s_cbranch_execnz .LBB225_111808; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end11809; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]11810; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011811; GFX90A-NEXT: ;;#ASMSTART11812; GFX90A-NEXT: ; use a011813; GFX90A-NEXT: ;;#ASMEND11814; GFX90A-NEXT: s_setpc_b64 s[30:31]11815;11816; GFX950-LABEL: global_atomic_fsub_f32_saddr_ret_a_a:11817; GFX950: ; %bb.0:11818; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11819; GFX950-NEXT: v_mov_b32_e32 v2, 011820; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4011821; GFX950-NEXT: ;;#ASMSTART11822; GFX950-NEXT: ; def a011823; GFX950-NEXT: ;;#ASMEND11824; GFX950-NEXT: s_mov_b64 s[2:3], 011825; GFX950-NEXT: v_accvgpr_read_b32 v3, a011826; GFX950-NEXT: .LBB225_1: ; %atomicrmw.start11827; GFX950-NEXT: ; =>This Inner Loop Header: Depth=111828; GFX950-NEXT: s_waitcnt vmcnt(0)11829; GFX950-NEXT: v_sub_f32_e32 v0, v1, v311830; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc011831; GFX950-NEXT: s_waitcnt vmcnt(0)11832; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v111833; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]11834; GFX950-NEXT: v_mov_b32_e32 v1, v011835; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]11836; GFX950-NEXT: s_cbranch_execnz .LBB225_111837; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end11838; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]11839; GFX950-NEXT: v_accvgpr_write_b32 a0, v011840; GFX950-NEXT: ;;#ASMSTART11841; GFX950-NEXT: ; use a011842; GFX950-NEXT: ;;#ASMEND11843; GFX950-NEXT: s_setpc_b64 s[30:31]11844 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1011845 %data = call float asm "; def $0", "=a"()11846 %result = atomicrmw fsub ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !011847 call void asm "; use $0", "a"(float %result)11848 ret void11849}11850 11851define void @global_atomic_fsub_f32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11852; GFX90A-LABEL: global_atomic_fsub_f32_saddr_ret_av_av:11853; GFX90A: ; %bb.0:11854; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11855; GFX90A-NEXT: v_mov_b32_e32 v2, 011856; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4011857; GFX90A-NEXT: s_mov_b64 s[4:5], 011858; GFX90A-NEXT: ;;#ASMSTART11859; GFX90A-NEXT: ; def v311860; GFX90A-NEXT: ;;#ASMEND11861; GFX90A-NEXT: .LBB226_1: ; %atomicrmw.start11862; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=111863; GFX90A-NEXT: s_waitcnt vmcnt(0)11864; GFX90A-NEXT: v_sub_f32_e32 v0, v1, v311865; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc11866; GFX90A-NEXT: s_waitcnt vmcnt(0)11867; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v111868; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]11869; GFX90A-NEXT: v_mov_b32_e32 v1, v011870; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]11871; GFX90A-NEXT: s_cbranch_execnz .LBB226_111872; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end11873; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]11874; GFX90A-NEXT: ;;#ASMSTART11875; GFX90A-NEXT: ; use v011876; GFX90A-NEXT: ;;#ASMEND11877; GFX90A-NEXT: s_setpc_b64 s[30:31]11878;11879; GFX950-LABEL: global_atomic_fsub_f32_saddr_ret_av_av:11880; GFX950: ; %bb.0:11881; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11882; GFX950-NEXT: v_mov_b32_e32 v2, 011883; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4011884; GFX950-NEXT: s_mov_b64 s[2:3], 011885; GFX950-NEXT: ;;#ASMSTART11886; GFX950-NEXT: ; def v311887; GFX950-NEXT: ;;#ASMEND11888; GFX950-NEXT: .LBB226_1: ; %atomicrmw.start11889; GFX950-NEXT: ; =>This Inner Loop Header: Depth=111890; GFX950-NEXT: s_waitcnt vmcnt(0)11891; GFX950-NEXT: v_sub_f32_e32 v0, v1, v311892; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc011893; GFX950-NEXT: s_waitcnt vmcnt(0)11894; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v111895; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]11896; GFX950-NEXT: v_mov_b32_e32 v1, v011897; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]11898; GFX950-NEXT: s_cbranch_execnz .LBB226_111899; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end11900; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]11901; GFX950-NEXT: ;;#ASMSTART11902; GFX950-NEXT: ; use v011903; GFX950-NEXT: ;;#ASMEND11904; GFX950-NEXT: s_setpc_b64 s[30:31]11905 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1011906 %data = call float asm "; def $0", "=^VA"()11907 %result = atomicrmw fsub ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !011908 call void asm "; use $0", "^VA"(float %result)11909 ret void11910}11911 11912define void @global_atomic_fmax_f32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {11913; GFX90A-LABEL: global_atomic_fmax_f32_saddr_ret_a_a:11914; GFX90A: ; %bb.0:11915; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11916; GFX90A-NEXT: v_mov_b32_e32 v2, 011917; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4011918; GFX90A-NEXT: ;;#ASMSTART11919; GFX90A-NEXT: ; def a011920; GFX90A-NEXT: ;;#ASMEND11921; GFX90A-NEXT: v_accvgpr_read_b32 v0, a011922; GFX90A-NEXT: s_mov_b64 s[4:5], 011923; GFX90A-NEXT: v_max_f32_e32 v3, v0, v011924; GFX90A-NEXT: .LBB227_1: ; %atomicrmw.start11925; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=111926; GFX90A-NEXT: s_waitcnt vmcnt(0)11927; GFX90A-NEXT: v_max_f32_e32 v0, v1, v111928; GFX90A-NEXT: v_max_f32_e32 v0, v0, v311929; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc11930; GFX90A-NEXT: s_waitcnt vmcnt(0)11931; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v111932; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]11933; GFX90A-NEXT: v_mov_b32_e32 v1, v011934; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]11935; GFX90A-NEXT: s_cbranch_execnz .LBB227_111936; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end11937; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]11938; GFX90A-NEXT: v_accvgpr_write_b32 a0, v011939; GFX90A-NEXT: ;;#ASMSTART11940; GFX90A-NEXT: ; use a011941; GFX90A-NEXT: ;;#ASMEND11942; GFX90A-NEXT: s_setpc_b64 s[30:31]11943;11944; GFX950-LABEL: global_atomic_fmax_f32_saddr_ret_a_a:11945; GFX950: ; %bb.0:11946; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11947; GFX950-NEXT: v_mov_b32_e32 v2, 011948; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4011949; GFX950-NEXT: ;;#ASMSTART11950; GFX950-NEXT: ; def a011951; GFX950-NEXT: ;;#ASMEND11952; GFX950-NEXT: s_mov_b64 s[2:3], 011953; GFX950-NEXT: v_accvgpr_read_b32 v0, a011954; GFX950-NEXT: v_max_f32_e32 v3, v0, v011955; GFX950-NEXT: .LBB227_1: ; %atomicrmw.start11956; GFX950-NEXT: ; =>This Inner Loop Header: Depth=111957; GFX950-NEXT: s_waitcnt vmcnt(0)11958; GFX950-NEXT: v_max_f32_e32 v0, v1, v111959; GFX950-NEXT: v_max_f32_e32 v0, v0, v311960; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc011961; GFX950-NEXT: s_waitcnt vmcnt(0)11962; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v111963; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]11964; GFX950-NEXT: v_mov_b32_e32 v1, v011965; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]11966; GFX950-NEXT: s_cbranch_execnz .LBB227_111967; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end11968; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]11969; GFX950-NEXT: v_accvgpr_write_b32 a0, v011970; GFX950-NEXT: ;;#ASMSTART11971; GFX950-NEXT: ; use a011972; GFX950-NEXT: ;;#ASMEND11973; GFX950-NEXT: s_setpc_b64 s[30:31]11974 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1011975 %data = call float asm "; def $0", "=a"()11976 %result = atomicrmw fmax ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !011977 call void asm "; use $0", "a"(float %result)11978 ret void11979}11980 11981define void @global_atomic_fmax_f32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {11982; GFX90A-LABEL: global_atomic_fmax_f32_saddr_ret_av_av:11983; GFX90A: ; %bb.0:11984; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11985; GFX90A-NEXT: v_mov_b32_e32 v2, 011986; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4011987; GFX90A-NEXT: ;;#ASMSTART11988; GFX90A-NEXT: ; def v011989; GFX90A-NEXT: ;;#ASMEND11990; GFX90A-NEXT: s_mov_b64 s[4:5], 011991; GFX90A-NEXT: v_max_f32_e32 v3, v0, v011992; GFX90A-NEXT: .LBB228_1: ; %atomicrmw.start11993; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=111994; GFX90A-NEXT: s_waitcnt vmcnt(0)11995; GFX90A-NEXT: v_max_f32_e32 v0, v1, v111996; GFX90A-NEXT: v_max_f32_e32 v0, v0, v311997; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc11998; GFX90A-NEXT: s_waitcnt vmcnt(0)11999; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112000; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12001; GFX90A-NEXT: v_mov_b32_e32 v1, v012002; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12003; GFX90A-NEXT: s_cbranch_execnz .LBB228_112004; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12005; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12006; GFX90A-NEXT: ;;#ASMSTART12007; GFX90A-NEXT: ; use v012008; GFX90A-NEXT: ;;#ASMEND12009; GFX90A-NEXT: s_setpc_b64 s[30:31]12010;12011; GFX950-LABEL: global_atomic_fmax_f32_saddr_ret_av_av:12012; GFX950: ; %bb.0:12013; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12014; GFX950-NEXT: v_mov_b32_e32 v2, 012015; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4012016; GFX950-NEXT: ;;#ASMSTART12017; GFX950-NEXT: ; def v012018; GFX950-NEXT: ;;#ASMEND12019; GFX950-NEXT: s_mov_b64 s[2:3], 012020; GFX950-NEXT: v_max_f32_e32 v3, v0, v012021; GFX950-NEXT: .LBB228_1: ; %atomicrmw.start12022; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112023; GFX950-NEXT: s_waitcnt vmcnt(0)12024; GFX950-NEXT: v_max_f32_e32 v0, v1, v112025; GFX950-NEXT: v_max_f32_e32 v0, v0, v312026; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc012027; GFX950-NEXT: s_waitcnt vmcnt(0)12028; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112029; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12030; GFX950-NEXT: v_mov_b32_e32 v1, v012031; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12032; GFX950-NEXT: s_cbranch_execnz .LBB228_112033; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12034; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12035; GFX950-NEXT: ;;#ASMSTART12036; GFX950-NEXT: ; use v012037; GFX950-NEXT: ;;#ASMEND12038; GFX950-NEXT: s_setpc_b64 s[30:31]12039 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1012040 %data = call float asm "; def $0", "=^VA"()12041 %result = atomicrmw fmax ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !012042 call void asm "; use $0", "^VA"(float %result)12043 ret void12044}12045 12046define void @global_atomic_fmin_f32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12047; GFX90A-LABEL: global_atomic_fmin_f32_saddr_ret_a_a:12048; GFX90A: ; %bb.0:12049; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12050; GFX90A-NEXT: v_mov_b32_e32 v2, 012051; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4012052; GFX90A-NEXT: ;;#ASMSTART12053; GFX90A-NEXT: ; def a012054; GFX90A-NEXT: ;;#ASMEND12055; GFX90A-NEXT: v_accvgpr_read_b32 v0, a012056; GFX90A-NEXT: s_mov_b64 s[4:5], 012057; GFX90A-NEXT: v_max_f32_e32 v3, v0, v012058; GFX90A-NEXT: .LBB229_1: ; %atomicrmw.start12059; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112060; GFX90A-NEXT: s_waitcnt vmcnt(0)12061; GFX90A-NEXT: v_max_f32_e32 v0, v1, v112062; GFX90A-NEXT: v_min_f32_e32 v0, v0, v312063; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc12064; GFX90A-NEXT: s_waitcnt vmcnt(0)12065; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112066; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12067; GFX90A-NEXT: v_mov_b32_e32 v1, v012068; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12069; GFX90A-NEXT: s_cbranch_execnz .LBB229_112070; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12071; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12072; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012073; GFX90A-NEXT: ;;#ASMSTART12074; GFX90A-NEXT: ; use a012075; GFX90A-NEXT: ;;#ASMEND12076; GFX90A-NEXT: s_setpc_b64 s[30:31]12077;12078; GFX950-LABEL: global_atomic_fmin_f32_saddr_ret_a_a:12079; GFX950: ; %bb.0:12080; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12081; GFX950-NEXT: v_mov_b32_e32 v2, 012082; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4012083; GFX950-NEXT: ;;#ASMSTART12084; GFX950-NEXT: ; def a012085; GFX950-NEXT: ;;#ASMEND12086; GFX950-NEXT: s_mov_b64 s[2:3], 012087; GFX950-NEXT: v_accvgpr_read_b32 v0, a012088; GFX950-NEXT: v_max_f32_e32 v3, v0, v012089; GFX950-NEXT: .LBB229_1: ; %atomicrmw.start12090; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112091; GFX950-NEXT: s_waitcnt vmcnt(0)12092; GFX950-NEXT: v_max_f32_e32 v0, v1, v112093; GFX950-NEXT: v_min_f32_e32 v0, v0, v312094; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc012095; GFX950-NEXT: s_waitcnt vmcnt(0)12096; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112097; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12098; GFX950-NEXT: v_mov_b32_e32 v1, v012099; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12100; GFX950-NEXT: s_cbranch_execnz .LBB229_112101; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12102; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12103; GFX950-NEXT: v_accvgpr_write_b32 a0, v012104; GFX950-NEXT: ;;#ASMSTART12105; GFX950-NEXT: ; use a012106; GFX950-NEXT: ;;#ASMEND12107; GFX950-NEXT: s_setpc_b64 s[30:31]12108 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1012109 %data = call float asm "; def $0", "=a"()12110 %result = atomicrmw fmin ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !012111 call void asm "; use $0", "a"(float %result)12112 ret void12113}12114 12115define void @global_atomic_fmin_f32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {12116; GFX90A-LABEL: global_atomic_fmin_f32_saddr_ret_av_av:12117; GFX90A: ; %bb.0:12118; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12119; GFX90A-NEXT: v_mov_b32_e32 v2, 012120; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4012121; GFX90A-NEXT: ;;#ASMSTART12122; GFX90A-NEXT: ; def v012123; GFX90A-NEXT: ;;#ASMEND12124; GFX90A-NEXT: s_mov_b64 s[4:5], 012125; GFX90A-NEXT: v_max_f32_e32 v3, v0, v012126; GFX90A-NEXT: .LBB230_1: ; %atomicrmw.start12127; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112128; GFX90A-NEXT: s_waitcnt vmcnt(0)12129; GFX90A-NEXT: v_max_f32_e32 v0, v1, v112130; GFX90A-NEXT: v_min_f32_e32 v0, v0, v312131; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc12132; GFX90A-NEXT: s_waitcnt vmcnt(0)12133; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112134; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12135; GFX90A-NEXT: v_mov_b32_e32 v1, v012136; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12137; GFX90A-NEXT: s_cbranch_execnz .LBB230_112138; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12139; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12140; GFX90A-NEXT: ;;#ASMSTART12141; GFX90A-NEXT: ; use v012142; GFX90A-NEXT: ;;#ASMEND12143; GFX90A-NEXT: s_setpc_b64 s[30:31]12144;12145; GFX950-LABEL: global_atomic_fmin_f32_saddr_ret_av_av:12146; GFX950: ; %bb.0:12147; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12148; GFX950-NEXT: v_mov_b32_e32 v2, 012149; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4012150; GFX950-NEXT: ;;#ASMSTART12151; GFX950-NEXT: ; def v012152; GFX950-NEXT: ;;#ASMEND12153; GFX950-NEXT: s_mov_b64 s[2:3], 012154; GFX950-NEXT: v_max_f32_e32 v3, v0, v012155; GFX950-NEXT: .LBB230_1: ; %atomicrmw.start12156; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112157; GFX950-NEXT: s_waitcnt vmcnt(0)12158; GFX950-NEXT: v_max_f32_e32 v0, v1, v112159; GFX950-NEXT: v_min_f32_e32 v0, v0, v312160; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc012161; GFX950-NEXT: s_waitcnt vmcnt(0)12162; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112163; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12164; GFX950-NEXT: v_mov_b32_e32 v1, v012165; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12166; GFX950-NEXT: s_cbranch_execnz .LBB230_112167; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12168; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12169; GFX950-NEXT: ;;#ASMSTART12170; GFX950-NEXT: ; use v012171; GFX950-NEXT: ;;#ASMEND12172; GFX950-NEXT: s_setpc_b64 s[30:31]12173 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1012174 %data = call float asm "; def $0", "=^VA"()12175 %result = atomicrmw fmin ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !012176 call void asm "; use $0", "^VA"(float %result)12177 ret void12178}12179 12180define void @global_atomic_fmaximum_f32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12181; GFX90A-LABEL: global_atomic_fmaximum_f32_saddr_ret_a_a:12182; GFX90A: ; %bb.0:12183; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12184; GFX90A-NEXT: v_mov_b32_e32 v2, 012185; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4012186; GFX90A-NEXT: ;;#ASMSTART12187; GFX90A-NEXT: ; def a012188; GFX90A-NEXT: ;;#ASMEND12189; GFX90A-NEXT: v_accvgpr_read_b32 v3, a012190; GFX90A-NEXT: s_mov_b64 s[4:5], 012191; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7fc0000012192; GFX90A-NEXT: .LBB231_1: ; %atomicrmw.start12193; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112194; GFX90A-NEXT: s_waitcnt vmcnt(0)12195; GFX90A-NEXT: v_max_f32_e32 v0, v1, v312196; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v1, v312197; GFX90A-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc12198; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc12199; GFX90A-NEXT: s_waitcnt vmcnt(0)12200; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112201; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12202; GFX90A-NEXT: v_mov_b32_e32 v1, v012203; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12204; GFX90A-NEXT: s_cbranch_execnz .LBB231_112205; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12206; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12207; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012208; GFX90A-NEXT: ;;#ASMSTART12209; GFX90A-NEXT: ; use a012210; GFX90A-NEXT: ;;#ASMEND12211; GFX90A-NEXT: s_setpc_b64 s[30:31]12212;12213; GFX950-LABEL: global_atomic_fmaximum_f32_saddr_ret_a_a:12214; GFX950: ; %bb.0:12215; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12216; GFX950-NEXT: v_mov_b32_e32 v2, 012217; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4012218; GFX950-NEXT: ;;#ASMSTART12219; GFX950-NEXT: ; def a012220; GFX950-NEXT: ;;#ASMEND12221; GFX950-NEXT: s_mov_b64 s[2:3], 012222; GFX950-NEXT: v_accvgpr_read_b32 v3, a012223; GFX950-NEXT: .LBB231_1: ; %atomicrmw.start12224; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112225; GFX950-NEXT: s_waitcnt vmcnt(0)12226; GFX950-NEXT: v_maximum3_f32 v0, v1, v3, v312227; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc012228; GFX950-NEXT: s_waitcnt vmcnt(0)12229; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112230; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12231; GFX950-NEXT: v_mov_b32_e32 v1, v012232; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12233; GFX950-NEXT: s_cbranch_execnz .LBB231_112234; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12235; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12236; GFX950-NEXT: v_accvgpr_write_b32 a0, v012237; GFX950-NEXT: ;;#ASMSTART12238; GFX950-NEXT: ; use a012239; GFX950-NEXT: ;;#ASMEND12240; GFX950-NEXT: s_setpc_b64 s[30:31]12241 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1012242 %data = call float asm "; def $0", "=a"()12243 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !012244 call void asm "; use $0", "a"(float %result)12245 ret void12246}12247 12248define void @global_atomic_fmaximum_f32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {12249; GFX90A-LABEL: global_atomic_fmaximum_f32_saddr_ret_av_av:12250; GFX90A: ; %bb.0:12251; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12252; GFX90A-NEXT: v_mov_b32_e32 v2, 012253; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4012254; GFX90A-NEXT: s_mov_b64 s[4:5], 012255; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7fc0000012256; GFX90A-NEXT: ;;#ASMSTART12257; GFX90A-NEXT: ; def v312258; GFX90A-NEXT: ;;#ASMEND12259; GFX90A-NEXT: .LBB232_1: ; %atomicrmw.start12260; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112261; GFX90A-NEXT: s_waitcnt vmcnt(0)12262; GFX90A-NEXT: v_max_f32_e32 v0, v1, v312263; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v1, v312264; GFX90A-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc12265; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc12266; GFX90A-NEXT: s_waitcnt vmcnt(0)12267; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112268; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12269; GFX90A-NEXT: v_mov_b32_e32 v1, v012270; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12271; GFX90A-NEXT: s_cbranch_execnz .LBB232_112272; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12273; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12274; GFX90A-NEXT: ;;#ASMSTART12275; GFX90A-NEXT: ; use v012276; GFX90A-NEXT: ;;#ASMEND12277; GFX90A-NEXT: s_setpc_b64 s[30:31]12278;12279; GFX950-LABEL: global_atomic_fmaximum_f32_saddr_ret_av_av:12280; GFX950: ; %bb.0:12281; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12282; GFX950-NEXT: v_mov_b32_e32 v2, 012283; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4012284; GFX950-NEXT: s_mov_b64 s[2:3], 012285; GFX950-NEXT: ;;#ASMSTART12286; GFX950-NEXT: ; def v312287; GFX950-NEXT: ;;#ASMEND12288; GFX950-NEXT: .LBB232_1: ; %atomicrmw.start12289; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112290; GFX950-NEXT: s_waitcnt vmcnt(0)12291; GFX950-NEXT: v_maximum3_f32 v0, v1, v3, v312292; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc012293; GFX950-NEXT: s_waitcnt vmcnt(0)12294; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112295; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12296; GFX950-NEXT: v_mov_b32_e32 v1, v012297; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12298; GFX950-NEXT: s_cbranch_execnz .LBB232_112299; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12300; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12301; GFX950-NEXT: ;;#ASMSTART12302; GFX950-NEXT: ; use v012303; GFX950-NEXT: ;;#ASMEND12304; GFX950-NEXT: s_setpc_b64 s[30:31]12305 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1012306 %data = call float asm "; def $0", "=^VA"()12307 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !012308 call void asm "; use $0", "^VA"(float %result)12309 ret void12310}12311 12312define void @global_atomic_fminimum_f32_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12313; GFX90A-LABEL: global_atomic_fminimum_f32_saddr_ret_a_a:12314; GFX90A: ; %bb.0:12315; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12316; GFX90A-NEXT: v_mov_b32_e32 v2, 012317; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4012318; GFX90A-NEXT: ;;#ASMSTART12319; GFX90A-NEXT: ; def a012320; GFX90A-NEXT: ;;#ASMEND12321; GFX90A-NEXT: v_accvgpr_read_b32 v3, a012322; GFX90A-NEXT: s_mov_b64 s[4:5], 012323; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7fc0000012324; GFX90A-NEXT: .LBB233_1: ; %atomicrmw.start12325; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112326; GFX90A-NEXT: s_waitcnt vmcnt(0)12327; GFX90A-NEXT: v_min_f32_e32 v0, v1, v312328; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v1, v312329; GFX90A-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc12330; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc12331; GFX90A-NEXT: s_waitcnt vmcnt(0)12332; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112333; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12334; GFX90A-NEXT: v_mov_b32_e32 v1, v012335; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12336; GFX90A-NEXT: s_cbranch_execnz .LBB233_112337; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12338; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12339; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012340; GFX90A-NEXT: ;;#ASMSTART12341; GFX90A-NEXT: ; use a012342; GFX90A-NEXT: ;;#ASMEND12343; GFX90A-NEXT: s_setpc_b64 s[30:31]12344;12345; GFX950-LABEL: global_atomic_fminimum_f32_saddr_ret_a_a:12346; GFX950: ; %bb.0:12347; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12348; GFX950-NEXT: v_mov_b32_e32 v2, 012349; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4012350; GFX950-NEXT: ;;#ASMSTART12351; GFX950-NEXT: ; def a012352; GFX950-NEXT: ;;#ASMEND12353; GFX950-NEXT: s_mov_b64 s[2:3], 012354; GFX950-NEXT: v_accvgpr_read_b32 v3, a012355; GFX950-NEXT: .LBB233_1: ; %atomicrmw.start12356; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112357; GFX950-NEXT: s_waitcnt vmcnt(0)12358; GFX950-NEXT: v_minimum3_f32 v0, v1, v3, v312359; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc012360; GFX950-NEXT: s_waitcnt vmcnt(0)12361; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112362; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12363; GFX950-NEXT: v_mov_b32_e32 v1, v012364; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12365; GFX950-NEXT: s_cbranch_execnz .LBB233_112366; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12367; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12368; GFX950-NEXT: v_accvgpr_write_b32 a0, v012369; GFX950-NEXT: ;;#ASMSTART12370; GFX950-NEXT: ; use a012371; GFX950-NEXT: ;;#ASMEND12372; GFX950-NEXT: s_setpc_b64 s[30:31]12373 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1012374 %data = call float asm "; def $0", "=a"()12375 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !012376 call void asm "; use $0", "a"(float %result)12377 ret void12378}12379 12380define void @global_atomic_fminimum_f32_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {12381; GFX90A-LABEL: global_atomic_fminimum_f32_saddr_ret_av_av:12382; GFX90A: ; %bb.0:12383; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12384; GFX90A-NEXT: v_mov_b32_e32 v2, 012385; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4012386; GFX90A-NEXT: s_mov_b64 s[4:5], 012387; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7fc0000012388; GFX90A-NEXT: ;;#ASMSTART12389; GFX90A-NEXT: ; def v312390; GFX90A-NEXT: ;;#ASMEND12391; GFX90A-NEXT: .LBB234_1: ; %atomicrmw.start12392; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112393; GFX90A-NEXT: s_waitcnt vmcnt(0)12394; GFX90A-NEXT: v_min_f32_e32 v0, v1, v312395; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v1, v312396; GFX90A-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc12397; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc12398; GFX90A-NEXT: s_waitcnt vmcnt(0)12399; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112400; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12401; GFX90A-NEXT: v_mov_b32_e32 v1, v012402; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12403; GFX90A-NEXT: s_cbranch_execnz .LBB234_112404; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12405; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12406; GFX90A-NEXT: ;;#ASMSTART12407; GFX90A-NEXT: ; use v012408; GFX90A-NEXT: ;;#ASMEND12409; GFX90A-NEXT: s_setpc_b64 s[30:31]12410;12411; GFX950-LABEL: global_atomic_fminimum_f32_saddr_ret_av_av:12412; GFX950: ; %bb.0:12413; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12414; GFX950-NEXT: v_mov_b32_e32 v2, 012415; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4012416; GFX950-NEXT: s_mov_b64 s[2:3], 012417; GFX950-NEXT: ;;#ASMSTART12418; GFX950-NEXT: ; def v312419; GFX950-NEXT: ;;#ASMEND12420; GFX950-NEXT: .LBB234_1: ; %atomicrmw.start12421; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112422; GFX950-NEXT: s_waitcnt vmcnt(0)12423; GFX950-NEXT: v_minimum3_f32 v0, v1, v3, v312424; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc012425; GFX950-NEXT: s_waitcnt vmcnt(0)12426; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v112427; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12428; GFX950-NEXT: v_mov_b32_e32 v1, v012429; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12430; GFX950-NEXT: s_cbranch_execnz .LBB234_112431; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12432; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12433; GFX950-NEXT: ;;#ASMSTART12434; GFX950-NEXT: ; use v012435; GFX950-NEXT: ;;#ASMEND12436; GFX950-NEXT: s_setpc_b64 s[30:31]12437 %gep.0 = getelementptr inbounds [512 x float], ptr addrspace(1) %ptr, i64 0, i64 1012438 %data = call float asm "; def $0", "=^VA"()12439 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, float %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.ignore.denormal.mode !012440 call void asm "; use $0", "^VA"(float %result)12441 ret void12442}12443 12444;---------------------------------------------------------------------12445; other atomics f64, with aa+av cases using saddr12446;---------------------------------------------------------------------12447 12448define void @global_atomic_fadd_f64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12449; GFX90A-LABEL: global_atomic_fadd_f64_saddr_ret_a_a:12450; GFX90A: ; %bb.0:12451; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12452; GFX90A-NEXT: ;;#ASMSTART12453; GFX90A-NEXT: ; def a[0:1]12454; GFX90A-NEXT: ;;#ASMEND12455; GFX90A-NEXT: v_accvgpr_read_b32 v0, a012456; GFX90A-NEXT: v_mov_b32_e32 v2, 012457; GFX90A-NEXT: v_accvgpr_read_b32 v1, a112458; GFX90A-NEXT: global_atomic_add_f64 v[0:1], v2, v[0:1], s[16:17] offset:80 glc12459; GFX90A-NEXT: s_waitcnt vmcnt(0)12460; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012461; GFX90A-NEXT: v_accvgpr_write_b32 a1, v112462; GFX90A-NEXT: ;;#ASMSTART12463; GFX90A-NEXT: ; use a[0:1]12464; GFX90A-NEXT: ;;#ASMEND12465; GFX90A-NEXT: s_setpc_b64 s[30:31]12466;12467; GFX950-LABEL: global_atomic_fadd_f64_saddr_ret_a_a:12468; GFX950: ; %bb.0:12469; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12470; GFX950-NEXT: ;;#ASMSTART12471; GFX950-NEXT: ; def a[0:1]12472; GFX950-NEXT: ;;#ASMEND12473; GFX950-NEXT: v_mov_b32_e32 v2, 012474; GFX950-NEXT: v_accvgpr_read_b32 v0, a012475; GFX950-NEXT: v_accvgpr_read_b32 v1, a112476; GFX950-NEXT: global_atomic_add_f64 v[0:1], v2, v[0:1], s[0:1] offset:80 sc012477; GFX950-NEXT: s_waitcnt vmcnt(0)12478; GFX950-NEXT: v_accvgpr_write_b32 a0, v012479; GFX950-NEXT: v_accvgpr_write_b32 a1, v112480; GFX950-NEXT: ;;#ASMSTART12481; GFX950-NEXT: ; use a[0:1]12482; GFX950-NEXT: ;;#ASMEND12483; GFX950-NEXT: s_setpc_b64 s[30:31]12484 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012485 %data = call double asm "; def $0", "=a"()12486 %result = atomicrmw fadd ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012487 call void asm "; use $0", "a"(double %result)12488 ret void12489}12490 12491define void @global_atomic_fadd_f64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {12492; GFX90A-LABEL: global_atomic_fadd_f64_saddr_ret_av_av:12493; GFX90A: ; %bb.0:12494; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12495; GFX90A-NEXT: v_mov_b32_e32 v2, 012496; GFX90A-NEXT: ;;#ASMSTART12497; GFX90A-NEXT: ; def v[0:1]12498; GFX90A-NEXT: ;;#ASMEND12499; GFX90A-NEXT: global_atomic_add_f64 v[0:1], v2, v[0:1], s[16:17] offset:80 glc12500; GFX90A-NEXT: s_waitcnt vmcnt(0)12501; GFX90A-NEXT: ;;#ASMSTART12502; GFX90A-NEXT: ; use v[0:1]12503; GFX90A-NEXT: ;;#ASMEND12504; GFX90A-NEXT: s_setpc_b64 s[30:31]12505;12506; GFX950-LABEL: global_atomic_fadd_f64_saddr_ret_av_av:12507; GFX950: ; %bb.0:12508; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12509; GFX950-NEXT: v_mov_b32_e32 v2, 012510; GFX950-NEXT: ;;#ASMSTART12511; GFX950-NEXT: ; def v[0:1]12512; GFX950-NEXT: ;;#ASMEND12513; GFX950-NEXT: global_atomic_add_f64 v[0:1], v2, v[0:1], s[0:1] offset:80 sc012514; GFX950-NEXT: s_waitcnt vmcnt(0)12515; GFX950-NEXT: ;;#ASMSTART12516; GFX950-NEXT: ; use v[0:1]12517; GFX950-NEXT: ;;#ASMEND12518; GFX950-NEXT: s_setpc_b64 s[30:31]12519 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012520 %data = call double asm "; def $0", "=^VA"()12521 %result = atomicrmw fadd ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012522 call void asm "; use $0", "^VA"(double %result)12523 ret void12524}12525 12526define void @global_atomic_fsub_f64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12527; GFX90A-LABEL: global_atomic_fsub_f64_saddr_ret_a_a:12528; GFX90A: ; %bb.0:12529; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12530; GFX90A-NEXT: v_mov_b32_e32 v6, 012531; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8012532; GFX90A-NEXT: ;;#ASMSTART12533; GFX90A-NEXT: ; def a[0:1]12534; GFX90A-NEXT: ;;#ASMEND12535; GFX90A-NEXT: v_accvgpr_read_b32 v5, a112536; GFX90A-NEXT: v_accvgpr_read_b32 v4, a012537; GFX90A-NEXT: s_mov_b64 s[4:5], 012538; GFX90A-NEXT: .LBB237_1: ; %atomicrmw.start12539; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112540; GFX90A-NEXT: s_waitcnt vmcnt(0)12541; GFX90A-NEXT: v_add_f64 v[0:1], v[2:3], -v[4:5]12542; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc12543; GFX90A-NEXT: s_waitcnt vmcnt(0)12544; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12545; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12546; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]12547; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12548; GFX90A-NEXT: s_cbranch_execnz .LBB237_112549; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12550; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12551; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012552; GFX90A-NEXT: v_accvgpr_write_b32 a1, v112553; GFX90A-NEXT: ;;#ASMSTART12554; GFX90A-NEXT: ; use a[0:1]12555; GFX90A-NEXT: ;;#ASMEND12556; GFX90A-NEXT: s_setpc_b64 s[30:31]12557;12558; GFX950-LABEL: global_atomic_fsub_f64_saddr_ret_a_a:12559; GFX950: ; %bb.0:12560; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12561; GFX950-NEXT: v_mov_b32_e32 v6, 012562; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8012563; GFX950-NEXT: ;;#ASMSTART12564; GFX950-NEXT: ; def a[0:1]12565; GFX950-NEXT: ;;#ASMEND12566; GFX950-NEXT: s_mov_b64 s[2:3], 012567; GFX950-NEXT: v_accvgpr_read_b32 v5, a112568; GFX950-NEXT: v_accvgpr_read_b32 v4, a012569; GFX950-NEXT: .LBB237_1: ; %atomicrmw.start12570; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112571; GFX950-NEXT: s_waitcnt vmcnt(0)12572; GFX950-NEXT: v_add_f64 v[0:1], v[2:3], -v[4:5]12573; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc012574; GFX950-NEXT: s_waitcnt vmcnt(0)12575; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12576; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12577; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]12578; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12579; GFX950-NEXT: s_cbranch_execnz .LBB237_112580; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12581; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12582; GFX950-NEXT: v_accvgpr_write_b32 a0, v012583; GFX950-NEXT: v_accvgpr_write_b32 a1, v112584; GFX950-NEXT: ;;#ASMSTART12585; GFX950-NEXT: ; use a[0:1]12586; GFX950-NEXT: ;;#ASMEND12587; GFX950-NEXT: s_setpc_b64 s[30:31]12588 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012589 %data = call double asm "; def $0", "=a"()12590 %result = atomicrmw fsub ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012591 call void asm "; use $0", "a"(double %result)12592 ret void12593}12594 12595define void @global_atomic_fsub_f64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {12596; GFX90A-LABEL: global_atomic_fsub_f64_saddr_ret_av_av:12597; GFX90A: ; %bb.0:12598; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12599; GFX90A-NEXT: v_mov_b32_e32 v6, 012600; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8012601; GFX90A-NEXT: s_mov_b64 s[4:5], 012602; GFX90A-NEXT: ;;#ASMSTART12603; GFX90A-NEXT: ; def v[4:5]12604; GFX90A-NEXT: ;;#ASMEND12605; GFX90A-NEXT: .LBB238_1: ; %atomicrmw.start12606; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112607; GFX90A-NEXT: s_waitcnt vmcnt(0)12608; GFX90A-NEXT: v_add_f64 v[0:1], v[2:3], -v[4:5]12609; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc12610; GFX90A-NEXT: s_waitcnt vmcnt(0)12611; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12612; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12613; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]12614; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12615; GFX90A-NEXT: s_cbranch_execnz .LBB238_112616; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12617; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12618; GFX90A-NEXT: ;;#ASMSTART12619; GFX90A-NEXT: ; use v[0:1]12620; GFX90A-NEXT: ;;#ASMEND12621; GFX90A-NEXT: s_setpc_b64 s[30:31]12622;12623; GFX950-LABEL: global_atomic_fsub_f64_saddr_ret_av_av:12624; GFX950: ; %bb.0:12625; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12626; GFX950-NEXT: v_mov_b32_e32 v6, 012627; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8012628; GFX950-NEXT: s_mov_b64 s[2:3], 012629; GFX950-NEXT: ;;#ASMSTART12630; GFX950-NEXT: ; def v[4:5]12631; GFX950-NEXT: ;;#ASMEND12632; GFX950-NEXT: .LBB238_1: ; %atomicrmw.start12633; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112634; GFX950-NEXT: s_waitcnt vmcnt(0)12635; GFX950-NEXT: v_add_f64 v[0:1], v[2:3], -v[4:5]12636; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc012637; GFX950-NEXT: s_waitcnt vmcnt(0)12638; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12639; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12640; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]12641; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12642; GFX950-NEXT: s_cbranch_execnz .LBB238_112643; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12644; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12645; GFX950-NEXT: ;;#ASMSTART12646; GFX950-NEXT: ; use v[0:1]12647; GFX950-NEXT: ;;#ASMEND12648; GFX950-NEXT: s_setpc_b64 s[30:31]12649 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012650 %data = call double asm "; def $0", "=^VA"()12651 %result = atomicrmw fsub ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012652 call void asm "; use $0", "^VA"(double %result)12653 ret void12654}12655 12656define void @global_atomic_fmax_f64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12657; GFX90A-LABEL: global_atomic_fmax_f64_saddr_ret_a_a:12658; GFX90A: ; %bb.0:12659; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12660; GFX90A-NEXT: ;;#ASMSTART12661; GFX90A-NEXT: ; def a[0:1]12662; GFX90A-NEXT: ;;#ASMEND12663; GFX90A-NEXT: v_accvgpr_read_b32 v0, a012664; GFX90A-NEXT: v_mov_b32_e32 v2, 012665; GFX90A-NEXT: v_accvgpr_read_b32 v1, a112666; GFX90A-NEXT: global_atomic_max_f64 v[0:1], v2, v[0:1], s[16:17] offset:80 glc12667; GFX90A-NEXT: s_waitcnt vmcnt(0)12668; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012669; GFX90A-NEXT: v_accvgpr_write_b32 a1, v112670; GFX90A-NEXT: ;;#ASMSTART12671; GFX90A-NEXT: ; use a[0:1]12672; GFX90A-NEXT: ;;#ASMEND12673; GFX90A-NEXT: s_setpc_b64 s[30:31]12674;12675; GFX950-LABEL: global_atomic_fmax_f64_saddr_ret_a_a:12676; GFX950: ; %bb.0:12677; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12678; GFX950-NEXT: ;;#ASMSTART12679; GFX950-NEXT: ; def a[0:1]12680; GFX950-NEXT: ;;#ASMEND12681; GFX950-NEXT: v_mov_b32_e32 v2, 012682; GFX950-NEXT: v_accvgpr_read_b32 v0, a012683; GFX950-NEXT: v_accvgpr_read_b32 v1, a112684; GFX950-NEXT: global_atomic_max_f64 v[0:1], v2, v[0:1], s[0:1] offset:80 sc012685; GFX950-NEXT: s_waitcnt vmcnt(0)12686; GFX950-NEXT: v_accvgpr_write_b32 a0, v012687; GFX950-NEXT: v_accvgpr_write_b32 a1, v112688; GFX950-NEXT: ;;#ASMSTART12689; GFX950-NEXT: ; use a[0:1]12690; GFX950-NEXT: ;;#ASMEND12691; GFX950-NEXT: s_setpc_b64 s[30:31]12692 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012693 %data = call double asm "; def $0", "=a"()12694 %result = atomicrmw fmax ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012695 call void asm "; use $0", "a"(double %result)12696 ret void12697}12698 12699define void @global_atomic_fmax_f64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {12700; GFX90A-LABEL: global_atomic_fmax_f64_saddr_ret_av_av:12701; GFX90A: ; %bb.0:12702; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12703; GFX90A-NEXT: v_mov_b32_e32 v2, 012704; GFX90A-NEXT: ;;#ASMSTART12705; GFX90A-NEXT: ; def v[0:1]12706; GFX90A-NEXT: ;;#ASMEND12707; GFX90A-NEXT: global_atomic_max_f64 v[0:1], v2, v[0:1], s[16:17] offset:80 glc12708; GFX90A-NEXT: s_waitcnt vmcnt(0)12709; GFX90A-NEXT: ;;#ASMSTART12710; GFX90A-NEXT: ; use v[0:1]12711; GFX90A-NEXT: ;;#ASMEND12712; GFX90A-NEXT: s_setpc_b64 s[30:31]12713;12714; GFX950-LABEL: global_atomic_fmax_f64_saddr_ret_av_av:12715; GFX950: ; %bb.0:12716; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12717; GFX950-NEXT: v_mov_b32_e32 v2, 012718; GFX950-NEXT: ;;#ASMSTART12719; GFX950-NEXT: ; def v[0:1]12720; GFX950-NEXT: ;;#ASMEND12721; GFX950-NEXT: global_atomic_max_f64 v[0:1], v2, v[0:1], s[0:1] offset:80 sc012722; GFX950-NEXT: s_waitcnt vmcnt(0)12723; GFX950-NEXT: ;;#ASMSTART12724; GFX950-NEXT: ; use v[0:1]12725; GFX950-NEXT: ;;#ASMEND12726; GFX950-NEXT: s_setpc_b64 s[30:31]12727 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012728 %data = call double asm "; def $0", "=^VA"()12729 %result = atomicrmw fmax ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012730 call void asm "; use $0", "^VA"(double %result)12731 ret void12732}12733 12734define void @global_atomic_fmin_f64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12735; GFX90A-LABEL: global_atomic_fmin_f64_saddr_ret_a_a:12736; GFX90A: ; %bb.0:12737; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12738; GFX90A-NEXT: ;;#ASMSTART12739; GFX90A-NEXT: ; def a[0:1]12740; GFX90A-NEXT: ;;#ASMEND12741; GFX90A-NEXT: v_accvgpr_read_b32 v0, a012742; GFX90A-NEXT: v_mov_b32_e32 v2, 012743; GFX90A-NEXT: v_accvgpr_read_b32 v1, a112744; GFX90A-NEXT: global_atomic_min_f64 v[0:1], v2, v[0:1], s[16:17] offset:80 glc12745; GFX90A-NEXT: s_waitcnt vmcnt(0)12746; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012747; GFX90A-NEXT: v_accvgpr_write_b32 a1, v112748; GFX90A-NEXT: ;;#ASMSTART12749; GFX90A-NEXT: ; use a[0:1]12750; GFX90A-NEXT: ;;#ASMEND12751; GFX90A-NEXT: s_setpc_b64 s[30:31]12752;12753; GFX950-LABEL: global_atomic_fmin_f64_saddr_ret_a_a:12754; GFX950: ; %bb.0:12755; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12756; GFX950-NEXT: ;;#ASMSTART12757; GFX950-NEXT: ; def a[0:1]12758; GFX950-NEXT: ;;#ASMEND12759; GFX950-NEXT: v_mov_b32_e32 v2, 012760; GFX950-NEXT: v_accvgpr_read_b32 v0, a012761; GFX950-NEXT: v_accvgpr_read_b32 v1, a112762; GFX950-NEXT: global_atomic_min_f64 v[0:1], v2, v[0:1], s[0:1] offset:80 sc012763; GFX950-NEXT: s_waitcnt vmcnt(0)12764; GFX950-NEXT: v_accvgpr_write_b32 a0, v012765; GFX950-NEXT: v_accvgpr_write_b32 a1, v112766; GFX950-NEXT: ;;#ASMSTART12767; GFX950-NEXT: ; use a[0:1]12768; GFX950-NEXT: ;;#ASMEND12769; GFX950-NEXT: s_setpc_b64 s[30:31]12770 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012771 %data = call double asm "; def $0", "=a"()12772 %result = atomicrmw fmin ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012773 call void asm "; use $0", "a"(double %result)12774 ret void12775}12776 12777define void @global_atomic_fmin_f64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {12778; GFX90A-LABEL: global_atomic_fmin_f64_saddr_ret_av_av:12779; GFX90A: ; %bb.0:12780; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12781; GFX90A-NEXT: v_mov_b32_e32 v2, 012782; GFX90A-NEXT: ;;#ASMSTART12783; GFX90A-NEXT: ; def v[0:1]12784; GFX90A-NEXT: ;;#ASMEND12785; GFX90A-NEXT: global_atomic_min_f64 v[0:1], v2, v[0:1], s[16:17] offset:80 glc12786; GFX90A-NEXT: s_waitcnt vmcnt(0)12787; GFX90A-NEXT: ;;#ASMSTART12788; GFX90A-NEXT: ; use v[0:1]12789; GFX90A-NEXT: ;;#ASMEND12790; GFX90A-NEXT: s_setpc_b64 s[30:31]12791;12792; GFX950-LABEL: global_atomic_fmin_f64_saddr_ret_av_av:12793; GFX950: ; %bb.0:12794; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12795; GFX950-NEXT: v_mov_b32_e32 v2, 012796; GFX950-NEXT: ;;#ASMSTART12797; GFX950-NEXT: ; def v[0:1]12798; GFX950-NEXT: ;;#ASMEND12799; GFX950-NEXT: global_atomic_min_f64 v[0:1], v2, v[0:1], s[0:1] offset:80 sc012800; GFX950-NEXT: s_waitcnt vmcnt(0)12801; GFX950-NEXT: ;;#ASMSTART12802; GFX950-NEXT: ; use v[0:1]12803; GFX950-NEXT: ;;#ASMEND12804; GFX950-NEXT: s_setpc_b64 s[30:31]12805 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012806 %data = call double asm "; def $0", "=^VA"()12807 %result = atomicrmw fmin ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012808 call void asm "; use $0", "^VA"(double %result)12809 ret void12810}12811 12812define void @global_atomic_fmaximum_f64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12813; GFX90A-LABEL: global_atomic_fmaximum_f64_saddr_ret_a_a:12814; GFX90A: ; %bb.0:12815; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12816; GFX90A-NEXT: v_mov_b32_e32 v6, 012817; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8012818; GFX90A-NEXT: ;;#ASMSTART12819; GFX90A-NEXT: ; def a[0:1]12820; GFX90A-NEXT: ;;#ASMEND12821; GFX90A-NEXT: v_accvgpr_read_b32 v5, a112822; GFX90A-NEXT: v_accvgpr_read_b32 v4, a012823; GFX90A-NEXT: s_mov_b64 s[4:5], 012824; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff8000012825; GFX90A-NEXT: .LBB243_1: ; %atomicrmw.start12826; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112827; GFX90A-NEXT: s_waitcnt vmcnt(0)12828; GFX90A-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]12829; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]12830; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc12831; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc12832; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc12833; GFX90A-NEXT: s_waitcnt vmcnt(0)12834; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12835; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12836; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]12837; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12838; GFX90A-NEXT: s_cbranch_execnz .LBB243_112839; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12840; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12841; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012842; GFX90A-NEXT: v_accvgpr_write_b32 a1, v112843; GFX90A-NEXT: ;;#ASMSTART12844; GFX90A-NEXT: ; use a[0:1]12845; GFX90A-NEXT: ;;#ASMEND12846; GFX90A-NEXT: s_setpc_b64 s[30:31]12847;12848; GFX950-LABEL: global_atomic_fmaximum_f64_saddr_ret_a_a:12849; GFX950: ; %bb.0:12850; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12851; GFX950-NEXT: v_mov_b32_e32 v6, 012852; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8012853; GFX950-NEXT: ;;#ASMSTART12854; GFX950-NEXT: ; def a[0:1]12855; GFX950-NEXT: ;;#ASMEND12856; GFX950-NEXT: s_mov_b64 s[2:3], 012857; GFX950-NEXT: v_accvgpr_read_b32 v5, a112858; GFX950-NEXT: v_accvgpr_read_b32 v4, a012859; GFX950-NEXT: v_mov_b32_e32 v7, 0x7ff8000012860; GFX950-NEXT: .LBB243_1: ; %atomicrmw.start12861; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112862; GFX950-NEXT: s_waitcnt vmcnt(0)12863; GFX950-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]12864; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]12865; GFX950-NEXT: s_nop 112866; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc12867; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc12868; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc012869; GFX950-NEXT: s_waitcnt vmcnt(0)12870; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12871; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12872; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]12873; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12874; GFX950-NEXT: s_cbranch_execnz .LBB243_112875; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12876; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12877; GFX950-NEXT: v_accvgpr_write_b32 a0, v012878; GFX950-NEXT: v_accvgpr_write_b32 a1, v112879; GFX950-NEXT: ;;#ASMSTART12880; GFX950-NEXT: ; use a[0:1]12881; GFX950-NEXT: ;;#ASMEND12882; GFX950-NEXT: s_setpc_b64 s[30:31]12883 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012884 %data = call double asm "; def $0", "=a"()12885 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012886 call void asm "; use $0", "a"(double %result)12887 ret void12888}12889 12890define void @global_atomic_fmaximum_f64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {12891; GFX90A-LABEL: global_atomic_fmaximum_f64_saddr_ret_av_av:12892; GFX90A: ; %bb.0:12893; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12894; GFX90A-NEXT: v_mov_b32_e32 v6, 012895; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8012896; GFX90A-NEXT: s_mov_b64 s[4:5], 012897; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff8000012898; GFX90A-NEXT: ;;#ASMSTART12899; GFX90A-NEXT: ; def v[4:5]12900; GFX90A-NEXT: ;;#ASMEND12901; GFX90A-NEXT: .LBB244_1: ; %atomicrmw.start12902; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112903; GFX90A-NEXT: s_waitcnt vmcnt(0)12904; GFX90A-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]12905; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]12906; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc12907; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc12908; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc12909; GFX90A-NEXT: s_waitcnt vmcnt(0)12910; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12911; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12912; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]12913; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12914; GFX90A-NEXT: s_cbranch_execnz .LBB244_112915; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12916; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12917; GFX90A-NEXT: ;;#ASMSTART12918; GFX90A-NEXT: ; use v[0:1]12919; GFX90A-NEXT: ;;#ASMEND12920; GFX90A-NEXT: s_setpc_b64 s[30:31]12921;12922; GFX950-LABEL: global_atomic_fmaximum_f64_saddr_ret_av_av:12923; GFX950: ; %bb.0:12924; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12925; GFX950-NEXT: v_mov_b32_e32 v6, 012926; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8012927; GFX950-NEXT: s_mov_b64 s[2:3], 012928; GFX950-NEXT: v_mov_b32_e32 v7, 0x7ff8000012929; GFX950-NEXT: ;;#ASMSTART12930; GFX950-NEXT: ; def v[4:5]12931; GFX950-NEXT: ;;#ASMEND12932; GFX950-NEXT: .LBB244_1: ; %atomicrmw.start12933; GFX950-NEXT: ; =>This Inner Loop Header: Depth=112934; GFX950-NEXT: s_waitcnt vmcnt(0)12935; GFX950-NEXT: v_max_f64 v[0:1], v[2:3], v[4:5]12936; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]12937; GFX950-NEXT: s_nop 112938; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc12939; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc12940; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc012941; GFX950-NEXT: s_waitcnt vmcnt(0)12942; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12943; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]12944; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]12945; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]12946; GFX950-NEXT: s_cbranch_execnz .LBB244_112947; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end12948; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]12949; GFX950-NEXT: ;;#ASMSTART12950; GFX950-NEXT: ; use v[0:1]12951; GFX950-NEXT: ;;#ASMEND12952; GFX950-NEXT: s_setpc_b64 s[30:31]12953 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1012954 %data = call double asm "; def $0", "=^VA"()12955 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !012956 call void asm "; use $0", "^VA"(double %result)12957 ret void12958}12959 12960define void @global_atomic_fminimum_f64_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {12961; GFX90A-LABEL: global_atomic_fminimum_f64_saddr_ret_a_a:12962; GFX90A: ; %bb.0:12963; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12964; GFX90A-NEXT: v_mov_b32_e32 v6, 012965; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8012966; GFX90A-NEXT: ;;#ASMSTART12967; GFX90A-NEXT: ; def a[0:1]12968; GFX90A-NEXT: ;;#ASMEND12969; GFX90A-NEXT: v_accvgpr_read_b32 v5, a112970; GFX90A-NEXT: v_accvgpr_read_b32 v4, a012971; GFX90A-NEXT: s_mov_b64 s[4:5], 012972; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff8000012973; GFX90A-NEXT: .LBB245_1: ; %atomicrmw.start12974; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=112975; GFX90A-NEXT: s_waitcnt vmcnt(0)12976; GFX90A-NEXT: v_min_f64 v[0:1], v[2:3], v[4:5]12977; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]12978; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc12979; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc12980; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc12981; GFX90A-NEXT: s_waitcnt vmcnt(0)12982; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]12983; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]12984; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]12985; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]12986; GFX90A-NEXT: s_cbranch_execnz .LBB245_112987; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end12988; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]12989; GFX90A-NEXT: v_accvgpr_write_b32 a0, v012990; GFX90A-NEXT: v_accvgpr_write_b32 a1, v112991; GFX90A-NEXT: ;;#ASMSTART12992; GFX90A-NEXT: ; use a[0:1]12993; GFX90A-NEXT: ;;#ASMEND12994; GFX90A-NEXT: s_setpc_b64 s[30:31]12995;12996; GFX950-LABEL: global_atomic_fminimum_f64_saddr_ret_a_a:12997; GFX950: ; %bb.0:12998; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12999; GFX950-NEXT: v_mov_b32_e32 v6, 013000; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8013001; GFX950-NEXT: ;;#ASMSTART13002; GFX950-NEXT: ; def a[0:1]13003; GFX950-NEXT: ;;#ASMEND13004; GFX950-NEXT: s_mov_b64 s[2:3], 013005; GFX950-NEXT: v_accvgpr_read_b32 v5, a113006; GFX950-NEXT: v_accvgpr_read_b32 v4, a013007; GFX950-NEXT: v_mov_b32_e32 v7, 0x7ff8000013008; GFX950-NEXT: .LBB245_1: ; %atomicrmw.start13009; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113010; GFX950-NEXT: s_waitcnt vmcnt(0)13011; GFX950-NEXT: v_min_f64 v[0:1], v[2:3], v[4:5]13012; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]13013; GFX950-NEXT: s_nop 113014; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc13015; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc13016; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc013017; GFX950-NEXT: s_waitcnt vmcnt(0)13018; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]13019; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13020; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]13021; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13022; GFX950-NEXT: s_cbranch_execnz .LBB245_113023; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13024; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13025; GFX950-NEXT: v_accvgpr_write_b32 a0, v013026; GFX950-NEXT: v_accvgpr_write_b32 a1, v113027; GFX950-NEXT: ;;#ASMSTART13028; GFX950-NEXT: ; use a[0:1]13029; GFX950-NEXT: ;;#ASMEND13030; GFX950-NEXT: s_setpc_b64 s[30:31]13031 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1013032 %data = call double asm "; def $0", "=a"()13033 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013034 call void asm "; use $0", "a"(double %result)13035 ret void13036}13037 13038define void @global_atomic_fminimum_f64_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {13039; GFX90A-LABEL: global_atomic_fminimum_f64_saddr_ret_av_av:13040; GFX90A: ; %bb.0:13041; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13042; GFX90A-NEXT: v_mov_b32_e32 v6, 013043; GFX90A-NEXT: global_load_dwordx2 v[2:3], v6, s[16:17] offset:8013044; GFX90A-NEXT: s_mov_b64 s[4:5], 013045; GFX90A-NEXT: v_mov_b32_e32 v7, 0x7ff8000013046; GFX90A-NEXT: ;;#ASMSTART13047; GFX90A-NEXT: ; def v[4:5]13048; GFX90A-NEXT: ;;#ASMEND13049; GFX90A-NEXT: .LBB246_1: ; %atomicrmw.start13050; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113051; GFX90A-NEXT: s_waitcnt vmcnt(0)13052; GFX90A-NEXT: v_min_f64 v[0:1], v[2:3], v[4:5]13053; GFX90A-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]13054; GFX90A-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc13055; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc13056; GFX90A-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[16:17] offset:80 glc13057; GFX90A-NEXT: s_waitcnt vmcnt(0)13058; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]13059; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]13060; GFX90A-NEXT: v_pk_mov_b32 v[2:3], v[0:1], v[0:1] op_sel:[0,1]13061; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]13062; GFX90A-NEXT: s_cbranch_execnz .LBB246_113063; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13064; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]13065; GFX90A-NEXT: ;;#ASMSTART13066; GFX90A-NEXT: ; use v[0:1]13067; GFX90A-NEXT: ;;#ASMEND13068; GFX90A-NEXT: s_setpc_b64 s[30:31]13069;13070; GFX950-LABEL: global_atomic_fminimum_f64_saddr_ret_av_av:13071; GFX950: ; %bb.0:13072; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13073; GFX950-NEXT: v_mov_b32_e32 v6, 013074; GFX950-NEXT: global_load_dwordx2 v[2:3], v6, s[0:1] offset:8013075; GFX950-NEXT: s_mov_b64 s[2:3], 013076; GFX950-NEXT: v_mov_b32_e32 v7, 0x7ff8000013077; GFX950-NEXT: ;;#ASMSTART13078; GFX950-NEXT: ; def v[4:5]13079; GFX950-NEXT: ;;#ASMEND13080; GFX950-NEXT: .LBB246_1: ; %atomicrmw.start13081; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113082; GFX950-NEXT: s_waitcnt vmcnt(0)13083; GFX950-NEXT: v_min_f64 v[0:1], v[2:3], v[4:5]13084; GFX950-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[4:5]13085; GFX950-NEXT: s_nop 113086; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc13087; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc13088; GFX950-NEXT: global_atomic_cmpswap_x2 v[0:1], v6, v[0:3], s[0:1] offset:80 sc013089; GFX950-NEXT: s_waitcnt vmcnt(0)13090; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]13091; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13092; GFX950-NEXT: v_mov_b64_e32 v[2:3], v[0:1]13093; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13094; GFX950-NEXT: s_cbranch_execnz .LBB246_113095; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13096; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13097; GFX950-NEXT: ;;#ASMSTART13098; GFX950-NEXT: ; use v[0:1]13099; GFX950-NEXT: ;;#ASMEND13100; GFX950-NEXT: s_setpc_b64 s[30:31]13101 %gep.0 = getelementptr inbounds [512 x double], ptr addrspace(1) %ptr, i64 0, i64 1013102 %data = call double asm "; def $0", "=^VA"()13103 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, double %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013104 call void asm "; use $0", "^VA"(double %result)13105 ret void13106}13107 13108;---------------------------------------------------------------------13109; other atomics v2f16, with aa+av cases using saddr13110;---------------------------------------------------------------------13111 13112define void @global_atomic_fadd_v2f16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {13113; GFX90A-LABEL: global_atomic_fadd_v2f16_saddr_ret_a_a:13114; GFX90A: ; %bb.0:13115; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13116; GFX90A-NEXT: v_mov_b32_e32 v0, 013117; GFX90A-NEXT: ;;#ASMSTART13118; GFX90A-NEXT: ; def a013119; GFX90A-NEXT: ;;#ASMEND13120; GFX90A-NEXT: v_accvgpr_read_b32 v1, a013121; GFX90A-NEXT: global_atomic_pk_add_f16 v0, v0, v1, s[16:17] offset:40 glc13122; GFX90A-NEXT: s_waitcnt vmcnt(0)13123; GFX90A-NEXT: v_accvgpr_write_b32 a0, v013124; GFX90A-NEXT: ;;#ASMSTART13125; GFX90A-NEXT: ; use a013126; GFX90A-NEXT: ;;#ASMEND13127; GFX90A-NEXT: s_setpc_b64 s[30:31]13128;13129; GFX950-LABEL: global_atomic_fadd_v2f16_saddr_ret_a_a:13130; GFX950: ; %bb.0:13131; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13132; GFX950-NEXT: v_mov_b32_e32 v0, 013133; GFX950-NEXT: ;;#ASMSTART13134; GFX950-NEXT: ; def a013135; GFX950-NEXT: ;;#ASMEND13136; GFX950-NEXT: s_nop 013137; GFX950-NEXT: v_accvgpr_read_b32 v1, a013138; GFX950-NEXT: global_atomic_pk_add_f16 v0, v0, v1, s[0:1] offset:40 sc013139; GFX950-NEXT: s_waitcnt vmcnt(0)13140; GFX950-NEXT: v_accvgpr_write_b32 a0, v013141; GFX950-NEXT: ;;#ASMSTART13142; GFX950-NEXT: ; use a013143; GFX950-NEXT: ;;#ASMEND13144; GFX950-NEXT: s_setpc_b64 s[30:31]13145 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013146 %data = call <2 x half> asm "; def $0", "=a"()13147 %result = atomicrmw fadd ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013148 call void asm "; use $0", "a"(<2 x half> %result)13149 ret void13150}13151 13152define void @global_atomic_fadd_v2f16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {13153; GFX90A-LABEL: global_atomic_fadd_v2f16_saddr_ret_av_av:13154; GFX90A: ; %bb.0:13155; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13156; GFX90A-NEXT: v_mov_b32_e32 v0, 013157; GFX90A-NEXT: ;;#ASMSTART13158; GFX90A-NEXT: ; def v113159; GFX90A-NEXT: ;;#ASMEND13160; GFX90A-NEXT: global_atomic_pk_add_f16 v0, v0, v1, s[16:17] offset:40 glc13161; GFX90A-NEXT: s_waitcnt vmcnt(0)13162; GFX90A-NEXT: ;;#ASMSTART13163; GFX90A-NEXT: ; use v013164; GFX90A-NEXT: ;;#ASMEND13165; GFX90A-NEXT: s_setpc_b64 s[30:31]13166;13167; GFX950-LABEL: global_atomic_fadd_v2f16_saddr_ret_av_av:13168; GFX950: ; %bb.0:13169; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13170; GFX950-NEXT: v_mov_b32_e32 v0, 013171; GFX950-NEXT: ;;#ASMSTART13172; GFX950-NEXT: ; def v113173; GFX950-NEXT: ;;#ASMEND13174; GFX950-NEXT: global_atomic_pk_add_f16 v0, v0, v1, s[0:1] offset:40 sc013175; GFX950-NEXT: s_waitcnt vmcnt(0)13176; GFX950-NEXT: ;;#ASMSTART13177; GFX950-NEXT: ; use v013178; GFX950-NEXT: ;;#ASMEND13179; GFX950-NEXT: s_setpc_b64 s[30:31]13180 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013181 %data = call <2 x half> asm "; def $0", "=^VA"()13182 %result = atomicrmw fadd ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013183 call void asm "; use $0", "^VA"(<2 x half> %result)13184 ret void13185}13186 13187define void @global_atomic_fsub_v2f16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {13188; GFX90A-LABEL: global_atomic_fsub_v2f16_saddr_ret_a_a:13189; GFX90A: ; %bb.0:13190; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13191; GFX90A-NEXT: v_mov_b32_e32 v2, 013192; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013193; GFX90A-NEXT: ;;#ASMSTART13194; GFX90A-NEXT: ; def a013195; GFX90A-NEXT: ;;#ASMEND13196; GFX90A-NEXT: v_accvgpr_read_b32 v3, a013197; GFX90A-NEXT: s_mov_b64 s[4:5], 013198; GFX90A-NEXT: .LBB249_1: ; %atomicrmw.start13199; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113200; GFX90A-NEXT: s_waitcnt vmcnt(0)13201; GFX90A-NEXT: v_pk_add_f16 v0, v1, v3 neg_lo:[0,1] neg_hi:[0,1]13202; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13203; GFX90A-NEXT: s_waitcnt vmcnt(0)13204; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113205; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]13206; GFX90A-NEXT: v_mov_b32_e32 v1, v013207; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]13208; GFX90A-NEXT: s_cbranch_execnz .LBB249_113209; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13210; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]13211; GFX90A-NEXT: v_accvgpr_write_b32 a0, v013212; GFX90A-NEXT: ;;#ASMSTART13213; GFX90A-NEXT: ; use a013214; GFX90A-NEXT: ;;#ASMEND13215; GFX90A-NEXT: s_setpc_b64 s[30:31]13216;13217; GFX950-LABEL: global_atomic_fsub_v2f16_saddr_ret_a_a:13218; GFX950: ; %bb.0:13219; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13220; GFX950-NEXT: v_mov_b32_e32 v2, 013221; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013222; GFX950-NEXT: ;;#ASMSTART13223; GFX950-NEXT: ; def a013224; GFX950-NEXT: ;;#ASMEND13225; GFX950-NEXT: s_mov_b64 s[2:3], 013226; GFX950-NEXT: v_accvgpr_read_b32 v3, a013227; GFX950-NEXT: .LBB249_1: ; %atomicrmw.start13228; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113229; GFX950-NEXT: s_waitcnt vmcnt(0)13230; GFX950-NEXT: v_pk_add_f16 v0, v1, v3 neg_lo:[0,1] neg_hi:[0,1]13231; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013232; GFX950-NEXT: s_waitcnt vmcnt(0)13233; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113234; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13235; GFX950-NEXT: v_mov_b32_e32 v1, v013236; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13237; GFX950-NEXT: s_cbranch_execnz .LBB249_113238; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13239; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13240; GFX950-NEXT: v_accvgpr_write_b32 a0, v013241; GFX950-NEXT: ;;#ASMSTART13242; GFX950-NEXT: ; use a013243; GFX950-NEXT: ;;#ASMEND13244; GFX950-NEXT: s_setpc_b64 s[30:31]13245 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013246 %data = call <2 x half> asm "; def $0", "=a"()13247 %result = atomicrmw fsub ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013248 call void asm "; use $0", "a"(<2 x half> %result)13249 ret void13250}13251 13252define void @global_atomic_fsub_v2f16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {13253; GFX90A-LABEL: global_atomic_fsub_v2f16_saddr_ret_av_av:13254; GFX90A: ; %bb.0:13255; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13256; GFX90A-NEXT: v_mov_b32_e32 v2, 013257; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013258; GFX90A-NEXT: s_mov_b64 s[4:5], 013259; GFX90A-NEXT: ;;#ASMSTART13260; GFX90A-NEXT: ; def v313261; GFX90A-NEXT: ;;#ASMEND13262; GFX90A-NEXT: .LBB250_1: ; %atomicrmw.start13263; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113264; GFX90A-NEXT: s_waitcnt vmcnt(0)13265; GFX90A-NEXT: v_pk_add_f16 v0, v1, v3 neg_lo:[0,1] neg_hi:[0,1]13266; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13267; GFX90A-NEXT: s_waitcnt vmcnt(0)13268; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113269; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]13270; GFX90A-NEXT: v_mov_b32_e32 v1, v013271; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]13272; GFX90A-NEXT: s_cbranch_execnz .LBB250_113273; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13274; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]13275; GFX90A-NEXT: ;;#ASMSTART13276; GFX90A-NEXT: ; use v013277; GFX90A-NEXT: ;;#ASMEND13278; GFX90A-NEXT: s_setpc_b64 s[30:31]13279;13280; GFX950-LABEL: global_atomic_fsub_v2f16_saddr_ret_av_av:13281; GFX950: ; %bb.0:13282; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13283; GFX950-NEXT: v_mov_b32_e32 v2, 013284; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013285; GFX950-NEXT: s_mov_b64 s[2:3], 013286; GFX950-NEXT: ;;#ASMSTART13287; GFX950-NEXT: ; def v313288; GFX950-NEXT: ;;#ASMEND13289; GFX950-NEXT: .LBB250_1: ; %atomicrmw.start13290; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113291; GFX950-NEXT: s_waitcnt vmcnt(0)13292; GFX950-NEXT: v_pk_add_f16 v0, v1, v3 neg_lo:[0,1] neg_hi:[0,1]13293; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013294; GFX950-NEXT: s_waitcnt vmcnt(0)13295; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113296; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13297; GFX950-NEXT: v_mov_b32_e32 v1, v013298; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13299; GFX950-NEXT: s_cbranch_execnz .LBB250_113300; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13301; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13302; GFX950-NEXT: ;;#ASMSTART13303; GFX950-NEXT: ; use v013304; GFX950-NEXT: ;;#ASMEND13305; GFX950-NEXT: s_setpc_b64 s[30:31]13306 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013307 %data = call <2 x half> asm "; def $0", "=^VA"()13308 %result = atomicrmw fsub ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013309 call void asm "; use $0", "^VA"(<2 x half> %result)13310 ret void13311}13312 13313define void @global_atomic_fmax_v2f16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {13314; GFX90A-LABEL: global_atomic_fmax_v2f16_saddr_ret_a_a:13315; GFX90A: ; %bb.0:13316; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13317; GFX90A-NEXT: v_mov_b32_e32 v2, 013318; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013319; GFX90A-NEXT: ;;#ASMSTART13320; GFX90A-NEXT: ; def a013321; GFX90A-NEXT: ;;#ASMEND13322; GFX90A-NEXT: v_accvgpr_read_b32 v0, a013323; GFX90A-NEXT: s_mov_b64 s[4:5], 013324; GFX90A-NEXT: v_pk_max_f16 v3, v0, v013325; GFX90A-NEXT: .LBB251_1: ; %atomicrmw.start13326; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113327; GFX90A-NEXT: s_waitcnt vmcnt(0)13328; GFX90A-NEXT: v_pk_max_f16 v0, v1, v113329; GFX90A-NEXT: v_pk_max_f16 v0, v0, v313330; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13331; GFX90A-NEXT: s_waitcnt vmcnt(0)13332; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113333; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]13334; GFX90A-NEXT: v_mov_b32_e32 v1, v013335; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]13336; GFX90A-NEXT: s_cbranch_execnz .LBB251_113337; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13338; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]13339; GFX90A-NEXT: v_accvgpr_write_b32 a0, v013340; GFX90A-NEXT: ;;#ASMSTART13341; GFX90A-NEXT: ; use a013342; GFX90A-NEXT: ;;#ASMEND13343; GFX90A-NEXT: s_setpc_b64 s[30:31]13344;13345; GFX950-LABEL: global_atomic_fmax_v2f16_saddr_ret_a_a:13346; GFX950: ; %bb.0:13347; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13348; GFX950-NEXT: v_mov_b32_e32 v2, 013349; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013350; GFX950-NEXT: ;;#ASMSTART13351; GFX950-NEXT: ; def a013352; GFX950-NEXT: ;;#ASMEND13353; GFX950-NEXT: s_mov_b64 s[2:3], 013354; GFX950-NEXT: v_accvgpr_read_b32 v0, a013355; GFX950-NEXT: v_pk_max_f16 v3, v0, v013356; GFX950-NEXT: .LBB251_1: ; %atomicrmw.start13357; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113358; GFX950-NEXT: s_waitcnt vmcnt(0)13359; GFX950-NEXT: v_pk_max_f16 v0, v1, v113360; GFX950-NEXT: s_nop 013361; GFX950-NEXT: v_pk_max_f16 v0, v0, v313362; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013363; GFX950-NEXT: s_waitcnt vmcnt(0)13364; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113365; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13366; GFX950-NEXT: v_mov_b32_e32 v1, v013367; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13368; GFX950-NEXT: s_cbranch_execnz .LBB251_113369; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13370; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13371; GFX950-NEXT: v_accvgpr_write_b32 a0, v013372; GFX950-NEXT: ;;#ASMSTART13373; GFX950-NEXT: ; use a013374; GFX950-NEXT: ;;#ASMEND13375; GFX950-NEXT: s_setpc_b64 s[30:31]13376 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013377 %data = call <2 x half> asm "; def $0", "=a"()13378 %result = atomicrmw fmax ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013379 call void asm "; use $0", "a"(<2 x half> %result)13380 ret void13381}13382 13383define void @global_atomic_fmax_v2f16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {13384; GFX90A-LABEL: global_atomic_fmax_v2f16_saddr_ret_av_av:13385; GFX90A: ; %bb.0:13386; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13387; GFX90A-NEXT: v_mov_b32_e32 v2, 013388; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013389; GFX90A-NEXT: ;;#ASMSTART13390; GFX90A-NEXT: ; def v013391; GFX90A-NEXT: ;;#ASMEND13392; GFX90A-NEXT: s_mov_b64 s[4:5], 013393; GFX90A-NEXT: v_pk_max_f16 v3, v0, v013394; GFX90A-NEXT: .LBB252_1: ; %atomicrmw.start13395; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113396; GFX90A-NEXT: s_waitcnt vmcnt(0)13397; GFX90A-NEXT: v_pk_max_f16 v0, v1, v113398; GFX90A-NEXT: v_pk_max_f16 v0, v0, v313399; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13400; GFX90A-NEXT: s_waitcnt vmcnt(0)13401; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113402; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]13403; GFX90A-NEXT: v_mov_b32_e32 v1, v013404; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]13405; GFX90A-NEXT: s_cbranch_execnz .LBB252_113406; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13407; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]13408; GFX90A-NEXT: ;;#ASMSTART13409; GFX90A-NEXT: ; use v013410; GFX90A-NEXT: ;;#ASMEND13411; GFX90A-NEXT: s_setpc_b64 s[30:31]13412;13413; GFX950-LABEL: global_atomic_fmax_v2f16_saddr_ret_av_av:13414; GFX950: ; %bb.0:13415; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13416; GFX950-NEXT: v_mov_b32_e32 v2, 013417; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013418; GFX950-NEXT: ;;#ASMSTART13419; GFX950-NEXT: ; def v013420; GFX950-NEXT: ;;#ASMEND13421; GFX950-NEXT: s_mov_b64 s[2:3], 013422; GFX950-NEXT: v_pk_max_f16 v3, v0, v013423; GFX950-NEXT: .LBB252_1: ; %atomicrmw.start13424; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113425; GFX950-NEXT: s_waitcnt vmcnt(0)13426; GFX950-NEXT: v_pk_max_f16 v0, v1, v113427; GFX950-NEXT: s_nop 013428; GFX950-NEXT: v_pk_max_f16 v0, v0, v313429; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013430; GFX950-NEXT: s_waitcnt vmcnt(0)13431; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113432; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13433; GFX950-NEXT: v_mov_b32_e32 v1, v013434; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13435; GFX950-NEXT: s_cbranch_execnz .LBB252_113436; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13437; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13438; GFX950-NEXT: ;;#ASMSTART13439; GFX950-NEXT: ; use v013440; GFX950-NEXT: ;;#ASMEND13441; GFX950-NEXT: s_setpc_b64 s[30:31]13442 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013443 %data = call <2 x half> asm "; def $0", "=^VA"()13444 %result = atomicrmw fmax ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013445 call void asm "; use $0", "^VA"(<2 x half> %result)13446 ret void13447}13448 13449define void @global_atomic_fmin_v2f16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {13450; GFX90A-LABEL: global_atomic_fmin_v2f16_saddr_ret_a_a:13451; GFX90A: ; %bb.0:13452; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13453; GFX90A-NEXT: v_mov_b32_e32 v2, 013454; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013455; GFX90A-NEXT: ;;#ASMSTART13456; GFX90A-NEXT: ; def a013457; GFX90A-NEXT: ;;#ASMEND13458; GFX90A-NEXT: v_accvgpr_read_b32 v0, a013459; GFX90A-NEXT: s_mov_b64 s[4:5], 013460; GFX90A-NEXT: v_pk_max_f16 v3, v0, v013461; GFX90A-NEXT: .LBB253_1: ; %atomicrmw.start13462; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113463; GFX90A-NEXT: s_waitcnt vmcnt(0)13464; GFX90A-NEXT: v_pk_max_f16 v0, v1, v113465; GFX90A-NEXT: v_pk_min_f16 v0, v0, v313466; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13467; GFX90A-NEXT: s_waitcnt vmcnt(0)13468; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113469; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]13470; GFX90A-NEXT: v_mov_b32_e32 v1, v013471; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]13472; GFX90A-NEXT: s_cbranch_execnz .LBB253_113473; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13474; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]13475; GFX90A-NEXT: v_accvgpr_write_b32 a0, v013476; GFX90A-NEXT: ;;#ASMSTART13477; GFX90A-NEXT: ; use a013478; GFX90A-NEXT: ;;#ASMEND13479; GFX90A-NEXT: s_setpc_b64 s[30:31]13480;13481; GFX950-LABEL: global_atomic_fmin_v2f16_saddr_ret_a_a:13482; GFX950: ; %bb.0:13483; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13484; GFX950-NEXT: v_mov_b32_e32 v2, 013485; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013486; GFX950-NEXT: ;;#ASMSTART13487; GFX950-NEXT: ; def a013488; GFX950-NEXT: ;;#ASMEND13489; GFX950-NEXT: s_mov_b64 s[2:3], 013490; GFX950-NEXT: v_accvgpr_read_b32 v0, a013491; GFX950-NEXT: v_pk_max_f16 v3, v0, v013492; GFX950-NEXT: .LBB253_1: ; %atomicrmw.start13493; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113494; GFX950-NEXT: s_waitcnt vmcnt(0)13495; GFX950-NEXT: v_pk_max_f16 v0, v1, v113496; GFX950-NEXT: s_nop 013497; GFX950-NEXT: v_pk_min_f16 v0, v0, v313498; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013499; GFX950-NEXT: s_waitcnt vmcnt(0)13500; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113501; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13502; GFX950-NEXT: v_mov_b32_e32 v1, v013503; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13504; GFX950-NEXT: s_cbranch_execnz .LBB253_113505; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13506; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13507; GFX950-NEXT: v_accvgpr_write_b32 a0, v013508; GFX950-NEXT: ;;#ASMSTART13509; GFX950-NEXT: ; use a013510; GFX950-NEXT: ;;#ASMEND13511; GFX950-NEXT: s_setpc_b64 s[30:31]13512 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013513 %data = call <2 x half> asm "; def $0", "=a"()13514 %result = atomicrmw fmin ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013515 call void asm "; use $0", "a"(<2 x half> %result)13516 ret void13517}13518 13519define void @global_atomic_fmin_v2f16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {13520; GFX90A-LABEL: global_atomic_fmin_v2f16_saddr_ret_av_av:13521; GFX90A: ; %bb.0:13522; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13523; GFX90A-NEXT: v_mov_b32_e32 v2, 013524; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013525; GFX90A-NEXT: ;;#ASMSTART13526; GFX90A-NEXT: ; def v013527; GFX90A-NEXT: ;;#ASMEND13528; GFX90A-NEXT: s_mov_b64 s[4:5], 013529; GFX90A-NEXT: v_pk_max_f16 v3, v0, v013530; GFX90A-NEXT: .LBB254_1: ; %atomicrmw.start13531; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113532; GFX90A-NEXT: s_waitcnt vmcnt(0)13533; GFX90A-NEXT: v_pk_max_f16 v0, v1, v113534; GFX90A-NEXT: v_pk_min_f16 v0, v0, v313535; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13536; GFX90A-NEXT: s_waitcnt vmcnt(0)13537; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113538; GFX90A-NEXT: s_or_b64 s[4:5], vcc, s[4:5]13539; GFX90A-NEXT: v_mov_b32_e32 v1, v013540; GFX90A-NEXT: s_andn2_b64 exec, exec, s[4:5]13541; GFX90A-NEXT: s_cbranch_execnz .LBB254_113542; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13543; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]13544; GFX90A-NEXT: ;;#ASMSTART13545; GFX90A-NEXT: ; use v013546; GFX90A-NEXT: ;;#ASMEND13547; GFX90A-NEXT: s_setpc_b64 s[30:31]13548;13549; GFX950-LABEL: global_atomic_fmin_v2f16_saddr_ret_av_av:13550; GFX950: ; %bb.0:13551; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13552; GFX950-NEXT: v_mov_b32_e32 v2, 013553; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013554; GFX950-NEXT: ;;#ASMSTART13555; GFX950-NEXT: ; def v013556; GFX950-NEXT: ;;#ASMEND13557; GFX950-NEXT: s_mov_b64 s[2:3], 013558; GFX950-NEXT: v_pk_max_f16 v3, v0, v013559; GFX950-NEXT: .LBB254_1: ; %atomicrmw.start13560; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113561; GFX950-NEXT: s_waitcnt vmcnt(0)13562; GFX950-NEXT: v_pk_max_f16 v0, v1, v113563; GFX950-NEXT: s_nop 013564; GFX950-NEXT: v_pk_min_f16 v0, v0, v313565; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013566; GFX950-NEXT: s_waitcnt vmcnt(0)13567; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113568; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13569; GFX950-NEXT: v_mov_b32_e32 v1, v013570; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13571; GFX950-NEXT: s_cbranch_execnz .LBB254_113572; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13573; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13574; GFX950-NEXT: ;;#ASMSTART13575; GFX950-NEXT: ; use v013576; GFX950-NEXT: ;;#ASMEND13577; GFX950-NEXT: s_setpc_b64 s[30:31]13578 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013579 %data = call <2 x half> asm "; def $0", "=^VA"()13580 %result = atomicrmw fmin ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013581 call void asm "; use $0", "^VA"(<2 x half> %result)13582 ret void13583}13584 13585define void @global_atomic_fmaximum_v2f16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {13586; GFX90A-LABEL: global_atomic_fmaximum_v2f16_saddr_ret_a_a:13587; GFX90A: ; %bb.0:13588; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13589; GFX90A-NEXT: v_mov_b32_e32 v2, 013590; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013591; GFX90A-NEXT: ;;#ASMSTART13592; GFX90A-NEXT: ; def a013593; GFX90A-NEXT: ;;#ASMEND13594; GFX90A-NEXT: v_accvgpr_read_b32 v3, a013595; GFX90A-NEXT: s_mov_b64 s[6:7], 013596; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7e0013597; GFX90A-NEXT: s_mov_b32 s8, 0x504010013598; GFX90A-NEXT: .LBB255_1: ; %atomicrmw.start13599; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113600; GFX90A-NEXT: s_waitcnt vmcnt(0)13601; GFX90A-NEXT: v_pk_max_f16 v0, v1, v313602; GFX90A-NEXT: v_cmp_o_f16_sdwa vcc, v1, v3 src0_sel:WORD_1 src1_sel:WORD_113603; GFX90A-NEXT: v_cmp_o_f16_e64 s[4:5], v1, v313604; GFX90A-NEXT: v_cndmask_b32_e64 v5, v4, v0, s[4:5]13605; GFX90A-NEXT: v_cndmask_b32_sdwa v0, v4, v0, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_113606; GFX90A-NEXT: v_perm_b32 v0, v0, v5, s813607; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13608; GFX90A-NEXT: s_waitcnt vmcnt(0)13609; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113610; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]13611; GFX90A-NEXT: v_mov_b32_e32 v1, v013612; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]13613; GFX90A-NEXT: s_cbranch_execnz .LBB255_113614; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13615; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]13616; GFX90A-NEXT: v_accvgpr_write_b32 a0, v013617; GFX90A-NEXT: ;;#ASMSTART13618; GFX90A-NEXT: ; use a013619; GFX90A-NEXT: ;;#ASMEND13620; GFX90A-NEXT: s_setpc_b64 s[30:31]13621;13622; GFX950-LABEL: global_atomic_fmaximum_v2f16_saddr_ret_a_a:13623; GFX950: ; %bb.0:13624; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13625; GFX950-NEXT: v_mov_b32_e32 v2, 013626; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013627; GFX950-NEXT: ;;#ASMSTART13628; GFX950-NEXT: ; def a013629; GFX950-NEXT: ;;#ASMEND13630; GFX950-NEXT: s_mov_b64 s[2:3], 013631; GFX950-NEXT: v_accvgpr_read_b32 v3, a013632; GFX950-NEXT: .LBB255_1: ; %atomicrmw.start13633; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113634; GFX950-NEXT: s_waitcnt vmcnt(0)13635; GFX950-NEXT: v_pk_maximum3_f16 v0, v1, v3, v313636; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013637; GFX950-NEXT: s_waitcnt vmcnt(0)13638; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113639; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13640; GFX950-NEXT: v_mov_b32_e32 v1, v013641; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13642; GFX950-NEXT: s_cbranch_execnz .LBB255_113643; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13644; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13645; GFX950-NEXT: v_accvgpr_write_b32 a0, v013646; GFX950-NEXT: ;;#ASMSTART13647; GFX950-NEXT: ; use a013648; GFX950-NEXT: ;;#ASMEND13649; GFX950-NEXT: s_setpc_b64 s[30:31]13650 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013651 %data = call <2 x half> asm "; def $0", "=a"()13652 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013653 call void asm "; use $0", "a"(<2 x half> %result)13654 ret void13655}13656 13657define void @global_atomic_fmaximum_v2f16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {13658; GFX90A-LABEL: global_atomic_fmaximum_v2f16_saddr_ret_av_av:13659; GFX90A: ; %bb.0:13660; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13661; GFX90A-NEXT: v_mov_b32_e32 v2, 013662; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013663; GFX90A-NEXT: s_mov_b64 s[6:7], 013664; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7e0013665; GFX90A-NEXT: s_mov_b32 s8, 0x504010013666; GFX90A-NEXT: ;;#ASMSTART13667; GFX90A-NEXT: ; def v313668; GFX90A-NEXT: ;;#ASMEND13669; GFX90A-NEXT: .LBB256_1: ; %atomicrmw.start13670; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113671; GFX90A-NEXT: s_waitcnt vmcnt(0)13672; GFX90A-NEXT: v_pk_max_f16 v0, v1, v313673; GFX90A-NEXT: v_cmp_o_f16_sdwa vcc, v1, v3 src0_sel:WORD_1 src1_sel:WORD_113674; GFX90A-NEXT: v_cmp_o_f16_e64 s[4:5], v1, v313675; GFX90A-NEXT: v_cndmask_b32_e64 v5, v4, v0, s[4:5]13676; GFX90A-NEXT: v_cndmask_b32_sdwa v0, v4, v0, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_113677; GFX90A-NEXT: v_perm_b32 v0, v0, v5, s813678; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13679; GFX90A-NEXT: s_waitcnt vmcnt(0)13680; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113681; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]13682; GFX90A-NEXT: v_mov_b32_e32 v1, v013683; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]13684; GFX90A-NEXT: s_cbranch_execnz .LBB256_113685; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13686; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]13687; GFX90A-NEXT: ;;#ASMSTART13688; GFX90A-NEXT: ; use v013689; GFX90A-NEXT: ;;#ASMEND13690; GFX90A-NEXT: s_setpc_b64 s[30:31]13691;13692; GFX950-LABEL: global_atomic_fmaximum_v2f16_saddr_ret_av_av:13693; GFX950: ; %bb.0:13694; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13695; GFX950-NEXT: v_mov_b32_e32 v2, 013696; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013697; GFX950-NEXT: s_mov_b64 s[2:3], 013698; GFX950-NEXT: ;;#ASMSTART13699; GFX950-NEXT: ; def v313700; GFX950-NEXT: ;;#ASMEND13701; GFX950-NEXT: .LBB256_1: ; %atomicrmw.start13702; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113703; GFX950-NEXT: s_waitcnt vmcnt(0)13704; GFX950-NEXT: v_pk_maximum3_f16 v0, v1, v3, v313705; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013706; GFX950-NEXT: s_waitcnt vmcnt(0)13707; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113708; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13709; GFX950-NEXT: v_mov_b32_e32 v1, v013710; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13711; GFX950-NEXT: s_cbranch_execnz .LBB256_113712; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13713; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13714; GFX950-NEXT: ;;#ASMSTART13715; GFX950-NEXT: ; use v013716; GFX950-NEXT: ;;#ASMEND13717; GFX950-NEXT: s_setpc_b64 s[30:31]13718 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013719 %data = call <2 x half> asm "; def $0", "=^VA"()13720 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013721 call void asm "; use $0", "^VA"(<2 x half> %result)13722 ret void13723}13724 13725define void @global_atomic_fminimum_v2f16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {13726; GFX90A-LABEL: global_atomic_fminimum_v2f16_saddr_ret_a_a:13727; GFX90A: ; %bb.0:13728; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13729; GFX90A-NEXT: v_mov_b32_e32 v2, 013730; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013731; GFX90A-NEXT: ;;#ASMSTART13732; GFX90A-NEXT: ; def a013733; GFX90A-NEXT: ;;#ASMEND13734; GFX90A-NEXT: v_accvgpr_read_b32 v3, a013735; GFX90A-NEXT: s_mov_b64 s[6:7], 013736; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7e0013737; GFX90A-NEXT: s_mov_b32 s8, 0x504010013738; GFX90A-NEXT: .LBB257_1: ; %atomicrmw.start13739; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113740; GFX90A-NEXT: s_waitcnt vmcnt(0)13741; GFX90A-NEXT: v_pk_min_f16 v0, v1, v313742; GFX90A-NEXT: v_cmp_o_f16_sdwa vcc, v1, v3 src0_sel:WORD_1 src1_sel:WORD_113743; GFX90A-NEXT: v_cmp_o_f16_e64 s[4:5], v1, v313744; GFX90A-NEXT: v_cndmask_b32_e64 v5, v4, v0, s[4:5]13745; GFX90A-NEXT: v_cndmask_b32_sdwa v0, v4, v0, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_113746; GFX90A-NEXT: v_perm_b32 v0, v0, v5, s813747; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13748; GFX90A-NEXT: s_waitcnt vmcnt(0)13749; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113750; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]13751; GFX90A-NEXT: v_mov_b32_e32 v1, v013752; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]13753; GFX90A-NEXT: s_cbranch_execnz .LBB257_113754; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13755; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]13756; GFX90A-NEXT: v_accvgpr_write_b32 a0, v013757; GFX90A-NEXT: ;;#ASMSTART13758; GFX90A-NEXT: ; use a013759; GFX90A-NEXT: ;;#ASMEND13760; GFX90A-NEXT: s_setpc_b64 s[30:31]13761;13762; GFX950-LABEL: global_atomic_fminimum_v2f16_saddr_ret_a_a:13763; GFX950: ; %bb.0:13764; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13765; GFX950-NEXT: v_mov_b32_e32 v2, 013766; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013767; GFX950-NEXT: ;;#ASMSTART13768; GFX950-NEXT: ; def a013769; GFX950-NEXT: ;;#ASMEND13770; GFX950-NEXT: s_mov_b64 s[2:3], 013771; GFX950-NEXT: v_accvgpr_read_b32 v3, a013772; GFX950-NEXT: .LBB257_1: ; %atomicrmw.start13773; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113774; GFX950-NEXT: s_waitcnt vmcnt(0)13775; GFX950-NEXT: v_pk_minimum3_f16 v0, v1, v3, v313776; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013777; GFX950-NEXT: s_waitcnt vmcnt(0)13778; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113779; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13780; GFX950-NEXT: v_mov_b32_e32 v1, v013781; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13782; GFX950-NEXT: s_cbranch_execnz .LBB257_113783; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13784; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13785; GFX950-NEXT: v_accvgpr_write_b32 a0, v013786; GFX950-NEXT: ;;#ASMSTART13787; GFX950-NEXT: ; use a013788; GFX950-NEXT: ;;#ASMEND13789; GFX950-NEXT: s_setpc_b64 s[30:31]13790 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013791 %data = call <2 x half> asm "; def $0", "=a"()13792 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013793 call void asm "; use $0", "a"(<2 x half> %result)13794 ret void13795}13796 13797define void @global_atomic_fminimum_v2f16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {13798; GFX90A-LABEL: global_atomic_fminimum_v2f16_saddr_ret_av_av:13799; GFX90A: ; %bb.0:13800; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13801; GFX90A-NEXT: v_mov_b32_e32 v2, 013802; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013803; GFX90A-NEXT: s_mov_b64 s[6:7], 013804; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7e0013805; GFX90A-NEXT: s_mov_b32 s8, 0x504010013806; GFX90A-NEXT: ;;#ASMSTART13807; GFX90A-NEXT: ; def v313808; GFX90A-NEXT: ;;#ASMEND13809; GFX90A-NEXT: .LBB258_1: ; %atomicrmw.start13810; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113811; GFX90A-NEXT: s_waitcnt vmcnt(0)13812; GFX90A-NEXT: v_pk_min_f16 v0, v1, v313813; GFX90A-NEXT: v_cmp_o_f16_sdwa vcc, v1, v3 src0_sel:WORD_1 src1_sel:WORD_113814; GFX90A-NEXT: v_cmp_o_f16_e64 s[4:5], v1, v313815; GFX90A-NEXT: v_cndmask_b32_e64 v5, v4, v0, s[4:5]13816; GFX90A-NEXT: v_cndmask_b32_sdwa v0, v4, v0, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_113817; GFX90A-NEXT: v_perm_b32 v0, v0, v5, s813818; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13819; GFX90A-NEXT: s_waitcnt vmcnt(0)13820; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113821; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]13822; GFX90A-NEXT: v_mov_b32_e32 v1, v013823; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]13824; GFX90A-NEXT: s_cbranch_execnz .LBB258_113825; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13826; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]13827; GFX90A-NEXT: ;;#ASMSTART13828; GFX90A-NEXT: ; use v013829; GFX90A-NEXT: ;;#ASMEND13830; GFX90A-NEXT: s_setpc_b64 s[30:31]13831;13832; GFX950-LABEL: global_atomic_fminimum_v2f16_saddr_ret_av_av:13833; GFX950: ; %bb.0:13834; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13835; GFX950-NEXT: v_mov_b32_e32 v2, 013836; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4013837; GFX950-NEXT: s_mov_b64 s[2:3], 013838; GFX950-NEXT: ;;#ASMSTART13839; GFX950-NEXT: ; def v313840; GFX950-NEXT: ;;#ASMEND13841; GFX950-NEXT: .LBB258_1: ; %atomicrmw.start13842; GFX950-NEXT: ; =>This Inner Loop Header: Depth=113843; GFX950-NEXT: s_waitcnt vmcnt(0)13844; GFX950-NEXT: v_pk_minimum3_f16 v0, v1, v3, v313845; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc013846; GFX950-NEXT: s_waitcnt vmcnt(0)13847; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113848; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]13849; GFX950-NEXT: v_mov_b32_e32 v1, v013850; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]13851; GFX950-NEXT: s_cbranch_execnz .LBB258_113852; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end13853; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]13854; GFX950-NEXT: ;;#ASMSTART13855; GFX950-NEXT: ; use v013856; GFX950-NEXT: ;;#ASMEND13857; GFX950-NEXT: s_setpc_b64 s[30:31]13858 %gep.0 = getelementptr inbounds [512 x <2 x half>], ptr addrspace(1) %ptr, i64 0, i64 1013859 %data = call <2 x half> asm "; def $0", "=^VA"()13860 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, <2 x half> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013861 call void asm "; use $0", "^VA"(<2 x half> %result)13862 ret void13863}13864 13865;---------------------------------------------------------------------13866; other atomics v2bf16, with aa+av cases using saddr13867;---------------------------------------------------------------------13868 13869define void @global_atomic_fadd_v2bf16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {13870; GFX90A-LABEL: global_atomic_fadd_v2bf16_saddr_ret_a_a:13871; GFX90A: ; %bb.0:13872; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13873; GFX90A-NEXT: v_mov_b32_e32 v2, 013874; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013875; GFX90A-NEXT: ;;#ASMSTART13876; GFX90A-NEXT: ; def a013877; GFX90A-NEXT: ;;#ASMEND13878; GFX90A-NEXT: v_accvgpr_read_b32 v0, a013879; GFX90A-NEXT: s_mov_b64 s[6:7], 013880; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v013881; GFX90A-NEXT: s_movk_i32 s8, 0x7fff13882; GFX90A-NEXT: v_and_b32_e32 v4, 0xffff0000, v013883; GFX90A-NEXT: s_mov_b32 s9, 0x706030213884; GFX90A-NEXT: .LBB259_1: ; %atomicrmw.start13885; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113886; GFX90A-NEXT: s_waitcnt vmcnt(0)13887; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v113888; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v113889; GFX90A-NEXT: v_add_f32_e32 v0, v0, v313890; GFX90A-NEXT: v_add_f32_e32 v5, v5, v413891; GFX90A-NEXT: v_bfe_u32 v6, v0, 16, 113892; GFX90A-NEXT: v_bfe_u32 v8, v5, 16, 113893; GFX90A-NEXT: v_or_b32_e32 v7, 0x400000, v013894; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v513895; GFX90A-NEXT: v_add3_u32 v6, v6, v0, s813896; GFX90A-NEXT: v_add3_u32 v8, v8, v5, s813897; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v5, v513898; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v013899; GFX90A-NEXT: v_cndmask_b32_e64 v0, v6, v7, s[4:5]13900; GFX90A-NEXT: v_cndmask_b32_e32 v5, v8, v9, vcc13901; GFX90A-NEXT: v_perm_b32 v0, v5, v0, s913902; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13903; GFX90A-NEXT: s_waitcnt vmcnt(0)13904; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113905; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]13906; GFX90A-NEXT: v_mov_b32_e32 v1, v013907; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]13908; GFX90A-NEXT: s_cbranch_execnz .LBB259_113909; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13910; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]13911; GFX90A-NEXT: v_accvgpr_write_b32 a0, v013912; GFX90A-NEXT: ;;#ASMSTART13913; GFX90A-NEXT: ; use a013914; GFX90A-NEXT: ;;#ASMEND13915; GFX90A-NEXT: s_setpc_b64 s[30:31]13916;13917; GFX950-LABEL: global_atomic_fadd_v2bf16_saddr_ret_a_a:13918; GFX950: ; %bb.0:13919; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13920; GFX950-NEXT: v_mov_b32_e32 v0, 013921; GFX950-NEXT: ;;#ASMSTART13922; GFX950-NEXT: ; def a013923; GFX950-NEXT: ;;#ASMEND13924; GFX950-NEXT: s_nop 013925; GFX950-NEXT: v_accvgpr_read_b32 v1, a013926; GFX950-NEXT: global_atomic_pk_add_bf16 v0, v0, v1, s[0:1] offset:40 sc013927; GFX950-NEXT: s_waitcnt vmcnt(0)13928; GFX950-NEXT: v_accvgpr_write_b32 a0, v013929; GFX950-NEXT: ;;#ASMSTART13930; GFX950-NEXT: ; use a013931; GFX950-NEXT: ;;#ASMEND13932; GFX950-NEXT: s_setpc_b64 s[30:31]13933 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1013934 %data = call <2 x bfloat> asm "; def $0", "=a"()13935 %result = atomicrmw fadd ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !013936 call void asm "; use $0", "a"(<2 x bfloat> %result)13937 ret void13938}13939 13940define void @global_atomic_fadd_v2bf16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {13941; GFX90A-LABEL: global_atomic_fadd_v2bf16_saddr_ret_av_av:13942; GFX90A: ; %bb.0:13943; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13944; GFX90A-NEXT: v_mov_b32_e32 v2, 013945; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4013946; GFX90A-NEXT: ;;#ASMSTART13947; GFX90A-NEXT: ; def v013948; GFX90A-NEXT: ;;#ASMEND13949; GFX90A-NEXT: s_mov_b64 s[6:7], 013950; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v013951; GFX90A-NEXT: s_movk_i32 s8, 0x7fff13952; GFX90A-NEXT: v_and_b32_e32 v4, 0xffff0000, v013953; GFX90A-NEXT: s_mov_b32 s9, 0x706030213954; GFX90A-NEXT: .LBB260_1: ; %atomicrmw.start13955; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=113956; GFX90A-NEXT: s_waitcnt vmcnt(0)13957; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v113958; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v113959; GFX90A-NEXT: v_add_f32_e32 v0, v0, v313960; GFX90A-NEXT: v_add_f32_e32 v5, v5, v413961; GFX90A-NEXT: v_bfe_u32 v6, v0, 16, 113962; GFX90A-NEXT: v_bfe_u32 v8, v5, 16, 113963; GFX90A-NEXT: v_or_b32_e32 v7, 0x400000, v013964; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v513965; GFX90A-NEXT: v_add3_u32 v6, v6, v0, s813966; GFX90A-NEXT: v_add3_u32 v8, v8, v5, s813967; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v5, v513968; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v013969; GFX90A-NEXT: v_cndmask_b32_e64 v0, v6, v7, s[4:5]13970; GFX90A-NEXT: v_cndmask_b32_e32 v5, v8, v9, vcc13971; GFX90A-NEXT: v_perm_b32 v0, v5, v0, s913972; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc13973; GFX90A-NEXT: s_waitcnt vmcnt(0)13974; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v113975; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]13976; GFX90A-NEXT: v_mov_b32_e32 v1, v013977; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]13978; GFX90A-NEXT: s_cbranch_execnz .LBB260_113979; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end13980; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]13981; GFX90A-NEXT: ;;#ASMSTART13982; GFX90A-NEXT: ; use v013983; GFX90A-NEXT: ;;#ASMEND13984; GFX90A-NEXT: s_setpc_b64 s[30:31]13985;13986; GFX950-LABEL: global_atomic_fadd_v2bf16_saddr_ret_av_av:13987; GFX950: ; %bb.0:13988; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13989; GFX950-NEXT: v_mov_b32_e32 v0, 013990; GFX950-NEXT: ;;#ASMSTART13991; GFX950-NEXT: ; def v113992; GFX950-NEXT: ;;#ASMEND13993; GFX950-NEXT: global_atomic_pk_add_bf16 v0, v0, v1, s[0:1] offset:40 sc013994; GFX950-NEXT: s_waitcnt vmcnt(0)13995; GFX950-NEXT: ;;#ASMSTART13996; GFX950-NEXT: ; use v013997; GFX950-NEXT: ;;#ASMEND13998; GFX950-NEXT: s_setpc_b64 s[30:31]13999 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014000 %data = call <2 x bfloat> asm "; def $0", "=^VA"()14001 %result = atomicrmw fadd ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014002 call void asm "; use $0", "^VA"(<2 x bfloat> %result)14003 ret void14004}14005 14006define void @global_atomic_fsub_v2bf16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {14007; GFX90A-LABEL: global_atomic_fsub_v2bf16_saddr_ret_a_a:14008; GFX90A: ; %bb.0:14009; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14010; GFX90A-NEXT: v_mov_b32_e32 v2, 014011; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014012; GFX90A-NEXT: ;;#ASMSTART14013; GFX90A-NEXT: ; def a014014; GFX90A-NEXT: ;;#ASMEND14015; GFX90A-NEXT: v_accvgpr_read_b32 v0, a014016; GFX90A-NEXT: s_mov_b64 s[6:7], 014017; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014018; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14019; GFX90A-NEXT: v_and_b32_e32 v4, 0xffff0000, v014020; GFX90A-NEXT: s_mov_b32 s9, 0x706030214021; GFX90A-NEXT: .LBB261_1: ; %atomicrmw.start14022; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114023; GFX90A-NEXT: s_waitcnt vmcnt(0)14024; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114025; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v114026; GFX90A-NEXT: v_sub_f32_e32 v0, v0, v314027; GFX90A-NEXT: v_sub_f32_e32 v5, v5, v414028; GFX90A-NEXT: v_bfe_u32 v6, v0, 16, 114029; GFX90A-NEXT: v_bfe_u32 v8, v5, 16, 114030; GFX90A-NEXT: v_or_b32_e32 v7, 0x400000, v014031; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v514032; GFX90A-NEXT: v_add3_u32 v6, v6, v0, s814033; GFX90A-NEXT: v_add3_u32 v8, v8, v5, s814034; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v5, v514035; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014036; GFX90A-NEXT: v_cndmask_b32_e64 v0, v6, v7, s[4:5]14037; GFX90A-NEXT: v_cndmask_b32_e32 v5, v8, v9, vcc14038; GFX90A-NEXT: v_perm_b32 v0, v5, v0, s914039; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14040; GFX90A-NEXT: s_waitcnt vmcnt(0)14041; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114042; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14043; GFX90A-NEXT: v_mov_b32_e32 v1, v014044; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14045; GFX90A-NEXT: s_cbranch_execnz .LBB261_114046; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14047; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14048; GFX90A-NEXT: v_accvgpr_write_b32 a0, v014049; GFX90A-NEXT: ;;#ASMSTART14050; GFX90A-NEXT: ; use a014051; GFX90A-NEXT: ;;#ASMEND14052; GFX90A-NEXT: s_setpc_b64 s[30:31]14053;14054; GFX950-LABEL: global_atomic_fsub_v2bf16_saddr_ret_a_a:14055; GFX950: ; %bb.0:14056; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14057; GFX950-NEXT: v_mov_b32_e32 v2, 014058; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014059; GFX950-NEXT: ;;#ASMSTART14060; GFX950-NEXT: ; def a014061; GFX950-NEXT: ;;#ASMEND14062; GFX950-NEXT: s_mov_b64 s[2:3], 014063; GFX950-NEXT: v_accvgpr_read_b32 v0, a014064; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014065; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014066; GFX950-NEXT: .LBB261_1: ; %atomicrmw.start14067; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114068; GFX950-NEXT: s_waitcnt vmcnt(0)14069; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114070; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114071; GFX950-NEXT: v_sub_f32_e32 v0, v0, v314072; GFX950-NEXT: v_sub_f32_e32 v5, v5, v414073; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014074; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014075; GFX950-NEXT: s_waitcnt vmcnt(0)14076; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114077; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14078; GFX950-NEXT: v_mov_b32_e32 v1, v014079; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14080; GFX950-NEXT: s_cbranch_execnz .LBB261_114081; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14082; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14083; GFX950-NEXT: v_accvgpr_write_b32 a0, v014084; GFX950-NEXT: ;;#ASMSTART14085; GFX950-NEXT: ; use a014086; GFX950-NEXT: ;;#ASMEND14087; GFX950-NEXT: s_setpc_b64 s[30:31]14088 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014089 %data = call <2 x bfloat> asm "; def $0", "=a"()14090 %result = atomicrmw fsub ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014091 call void asm "; use $0", "a"(<2 x bfloat> %result)14092 ret void14093}14094 14095define void @global_atomic_fsub_v2bf16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {14096; GFX90A-LABEL: global_atomic_fsub_v2bf16_saddr_ret_av_av:14097; GFX90A: ; %bb.0:14098; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14099; GFX90A-NEXT: v_mov_b32_e32 v2, 014100; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014101; GFX90A-NEXT: ;;#ASMSTART14102; GFX90A-NEXT: ; def v014103; GFX90A-NEXT: ;;#ASMEND14104; GFX90A-NEXT: s_mov_b64 s[6:7], 014105; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014106; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14107; GFX90A-NEXT: v_and_b32_e32 v4, 0xffff0000, v014108; GFX90A-NEXT: s_mov_b32 s9, 0x706030214109; GFX90A-NEXT: .LBB262_1: ; %atomicrmw.start14110; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114111; GFX90A-NEXT: s_waitcnt vmcnt(0)14112; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114113; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v114114; GFX90A-NEXT: v_sub_f32_e32 v0, v0, v314115; GFX90A-NEXT: v_sub_f32_e32 v5, v5, v414116; GFX90A-NEXT: v_bfe_u32 v6, v0, 16, 114117; GFX90A-NEXT: v_bfe_u32 v8, v5, 16, 114118; GFX90A-NEXT: v_or_b32_e32 v7, 0x400000, v014119; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v514120; GFX90A-NEXT: v_add3_u32 v6, v6, v0, s814121; GFX90A-NEXT: v_add3_u32 v8, v8, v5, s814122; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v5, v514123; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014124; GFX90A-NEXT: v_cndmask_b32_e64 v0, v6, v7, s[4:5]14125; GFX90A-NEXT: v_cndmask_b32_e32 v5, v8, v9, vcc14126; GFX90A-NEXT: v_perm_b32 v0, v5, v0, s914127; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14128; GFX90A-NEXT: s_waitcnt vmcnt(0)14129; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114130; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14131; GFX90A-NEXT: v_mov_b32_e32 v1, v014132; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14133; GFX90A-NEXT: s_cbranch_execnz .LBB262_114134; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14135; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14136; GFX90A-NEXT: ;;#ASMSTART14137; GFX90A-NEXT: ; use v014138; GFX90A-NEXT: ;;#ASMEND14139; GFX90A-NEXT: s_setpc_b64 s[30:31]14140;14141; GFX950-LABEL: global_atomic_fsub_v2bf16_saddr_ret_av_av:14142; GFX950: ; %bb.0:14143; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14144; GFX950-NEXT: v_mov_b32_e32 v2, 014145; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014146; GFX950-NEXT: ;;#ASMSTART14147; GFX950-NEXT: ; def v014148; GFX950-NEXT: ;;#ASMEND14149; GFX950-NEXT: s_mov_b64 s[2:3], 014150; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014151; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014152; GFX950-NEXT: .LBB262_1: ; %atomicrmw.start14153; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114154; GFX950-NEXT: s_waitcnt vmcnt(0)14155; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114156; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114157; GFX950-NEXT: v_sub_f32_e32 v0, v0, v314158; GFX950-NEXT: v_sub_f32_e32 v5, v5, v414159; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014160; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014161; GFX950-NEXT: s_waitcnt vmcnt(0)14162; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114163; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14164; GFX950-NEXT: v_mov_b32_e32 v1, v014165; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14166; GFX950-NEXT: s_cbranch_execnz .LBB262_114167; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14168; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14169; GFX950-NEXT: ;;#ASMSTART14170; GFX950-NEXT: ; use v014171; GFX950-NEXT: ;;#ASMEND14172; GFX950-NEXT: s_setpc_b64 s[30:31]14173 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014174 %data = call <2 x bfloat> asm "; def $0", "=^VA"()14175 %result = atomicrmw fsub ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014176 call void asm "; use $0", "^VA"(<2 x bfloat> %result)14177 ret void14178}14179 14180define void @global_atomic_fmax_v2bf16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {14181; GFX90A-LABEL: global_atomic_fmax_v2bf16_saddr_ret_a_a:14182; GFX90A: ; %bb.0:14183; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14184; GFX90A-NEXT: v_mov_b32_e32 v2, 014185; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014186; GFX90A-NEXT: ;;#ASMSTART14187; GFX90A-NEXT: ; def a014188; GFX90A-NEXT: ;;#ASMEND14189; GFX90A-NEXT: v_accvgpr_read_b32 v0, a014190; GFX90A-NEXT: s_mov_b64 s[6:7], 014191; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014192; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14193; GFX90A-NEXT: v_and_b32_e32 v4, 0xffff0000, v014194; GFX90A-NEXT: s_mov_b32 s9, 0x706030214195; GFX90A-NEXT: .LBB263_1: ; %atomicrmw.start14196; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114197; GFX90A-NEXT: s_waitcnt vmcnt(0)14198; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114199; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v114200; GFX90A-NEXT: v_max_f32_e32 v0, v0, v314201; GFX90A-NEXT: v_max_f32_e32 v5, v5, v414202; GFX90A-NEXT: v_bfe_u32 v6, v0, 16, 114203; GFX90A-NEXT: v_bfe_u32 v8, v5, 16, 114204; GFX90A-NEXT: v_or_b32_e32 v7, 0x400000, v014205; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v514206; GFX90A-NEXT: v_add3_u32 v6, v6, v0, s814207; GFX90A-NEXT: v_add3_u32 v8, v8, v5, s814208; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v5, v514209; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014210; GFX90A-NEXT: v_cndmask_b32_e64 v0, v6, v7, s[4:5]14211; GFX90A-NEXT: v_cndmask_b32_e32 v5, v8, v9, vcc14212; GFX90A-NEXT: v_perm_b32 v0, v5, v0, s914213; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14214; GFX90A-NEXT: s_waitcnt vmcnt(0)14215; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114216; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14217; GFX90A-NEXT: v_mov_b32_e32 v1, v014218; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14219; GFX90A-NEXT: s_cbranch_execnz .LBB263_114220; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14221; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14222; GFX90A-NEXT: v_accvgpr_write_b32 a0, v014223; GFX90A-NEXT: ;;#ASMSTART14224; GFX90A-NEXT: ; use a014225; GFX90A-NEXT: ;;#ASMEND14226; GFX90A-NEXT: s_setpc_b64 s[30:31]14227;14228; GFX950-LABEL: global_atomic_fmax_v2bf16_saddr_ret_a_a:14229; GFX950: ; %bb.0:14230; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14231; GFX950-NEXT: v_mov_b32_e32 v2, 014232; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014233; GFX950-NEXT: ;;#ASMSTART14234; GFX950-NEXT: ; def a014235; GFX950-NEXT: ;;#ASMEND14236; GFX950-NEXT: s_mov_b64 s[2:3], 014237; GFX950-NEXT: v_accvgpr_read_b32 v0, a014238; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014239; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014240; GFX950-NEXT: .LBB263_1: ; %atomicrmw.start14241; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114242; GFX950-NEXT: s_waitcnt vmcnt(0)14243; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114244; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114245; GFX950-NEXT: v_max_f32_e32 v0, v0, v314246; GFX950-NEXT: v_max_f32_e32 v5, v5, v414247; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014248; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014249; GFX950-NEXT: s_waitcnt vmcnt(0)14250; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114251; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14252; GFX950-NEXT: v_mov_b32_e32 v1, v014253; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14254; GFX950-NEXT: s_cbranch_execnz .LBB263_114255; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14256; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14257; GFX950-NEXT: v_accvgpr_write_b32 a0, v014258; GFX950-NEXT: ;;#ASMSTART14259; GFX950-NEXT: ; use a014260; GFX950-NEXT: ;;#ASMEND14261; GFX950-NEXT: s_setpc_b64 s[30:31]14262 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014263 %data = call <2 x bfloat> asm "; def $0", "=a"()14264 %result = atomicrmw fmax ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014265 call void asm "; use $0", "a"(<2 x bfloat> %result)14266 ret void14267}14268 14269define void @global_atomic_fmax_v2bf16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {14270; GFX90A-LABEL: global_atomic_fmax_v2bf16_saddr_ret_av_av:14271; GFX90A: ; %bb.0:14272; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14273; GFX90A-NEXT: v_mov_b32_e32 v2, 014274; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014275; GFX90A-NEXT: ;;#ASMSTART14276; GFX90A-NEXT: ; def v014277; GFX90A-NEXT: ;;#ASMEND14278; GFX90A-NEXT: s_mov_b64 s[6:7], 014279; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014280; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14281; GFX90A-NEXT: v_and_b32_e32 v4, 0xffff0000, v014282; GFX90A-NEXT: s_mov_b32 s9, 0x706030214283; GFX90A-NEXT: .LBB264_1: ; %atomicrmw.start14284; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114285; GFX90A-NEXT: s_waitcnt vmcnt(0)14286; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114287; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v114288; GFX90A-NEXT: v_max_f32_e32 v0, v0, v314289; GFX90A-NEXT: v_max_f32_e32 v5, v5, v414290; GFX90A-NEXT: v_bfe_u32 v6, v0, 16, 114291; GFX90A-NEXT: v_bfe_u32 v8, v5, 16, 114292; GFX90A-NEXT: v_or_b32_e32 v7, 0x400000, v014293; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v514294; GFX90A-NEXT: v_add3_u32 v6, v6, v0, s814295; GFX90A-NEXT: v_add3_u32 v8, v8, v5, s814296; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v5, v514297; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014298; GFX90A-NEXT: v_cndmask_b32_e64 v0, v6, v7, s[4:5]14299; GFX90A-NEXT: v_cndmask_b32_e32 v5, v8, v9, vcc14300; GFX90A-NEXT: v_perm_b32 v0, v5, v0, s914301; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14302; GFX90A-NEXT: s_waitcnt vmcnt(0)14303; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114304; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14305; GFX90A-NEXT: v_mov_b32_e32 v1, v014306; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14307; GFX90A-NEXT: s_cbranch_execnz .LBB264_114308; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14309; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14310; GFX90A-NEXT: ;;#ASMSTART14311; GFX90A-NEXT: ; use v014312; GFX90A-NEXT: ;;#ASMEND14313; GFX90A-NEXT: s_setpc_b64 s[30:31]14314;14315; GFX950-LABEL: global_atomic_fmax_v2bf16_saddr_ret_av_av:14316; GFX950: ; %bb.0:14317; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14318; GFX950-NEXT: v_mov_b32_e32 v2, 014319; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014320; GFX950-NEXT: ;;#ASMSTART14321; GFX950-NEXT: ; def v014322; GFX950-NEXT: ;;#ASMEND14323; GFX950-NEXT: s_mov_b64 s[2:3], 014324; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014325; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014326; GFX950-NEXT: .LBB264_1: ; %atomicrmw.start14327; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114328; GFX950-NEXT: s_waitcnt vmcnt(0)14329; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114330; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114331; GFX950-NEXT: v_max_f32_e32 v0, v0, v314332; GFX950-NEXT: v_max_f32_e32 v5, v5, v414333; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014334; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014335; GFX950-NEXT: s_waitcnt vmcnt(0)14336; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114337; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14338; GFX950-NEXT: v_mov_b32_e32 v1, v014339; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14340; GFX950-NEXT: s_cbranch_execnz .LBB264_114341; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14342; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14343; GFX950-NEXT: ;;#ASMSTART14344; GFX950-NEXT: ; use v014345; GFX950-NEXT: ;;#ASMEND14346; GFX950-NEXT: s_setpc_b64 s[30:31]14347 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014348 %data = call <2 x bfloat> asm "; def $0", "=^VA"()14349 %result = atomicrmw fmax ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014350 call void asm "; use $0", "^VA"(<2 x bfloat> %result)14351 ret void14352}14353 14354define void @global_atomic_fmin_v2bf16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {14355; GFX90A-LABEL: global_atomic_fmin_v2bf16_saddr_ret_a_a:14356; GFX90A: ; %bb.0:14357; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14358; GFX90A-NEXT: v_mov_b32_e32 v2, 014359; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014360; GFX90A-NEXT: ;;#ASMSTART14361; GFX90A-NEXT: ; def a014362; GFX90A-NEXT: ;;#ASMEND14363; GFX90A-NEXT: v_accvgpr_read_b32 v0, a014364; GFX90A-NEXT: s_mov_b64 s[6:7], 014365; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014366; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14367; GFX90A-NEXT: v_and_b32_e32 v4, 0xffff0000, v014368; GFX90A-NEXT: s_mov_b32 s9, 0x706030214369; GFX90A-NEXT: .LBB265_1: ; %atomicrmw.start14370; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114371; GFX90A-NEXT: s_waitcnt vmcnt(0)14372; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114373; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v114374; GFX90A-NEXT: v_min_f32_e32 v0, v0, v314375; GFX90A-NEXT: v_min_f32_e32 v5, v5, v414376; GFX90A-NEXT: v_bfe_u32 v6, v0, 16, 114377; GFX90A-NEXT: v_bfe_u32 v8, v5, 16, 114378; GFX90A-NEXT: v_or_b32_e32 v7, 0x400000, v014379; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v514380; GFX90A-NEXT: v_add3_u32 v6, v6, v0, s814381; GFX90A-NEXT: v_add3_u32 v8, v8, v5, s814382; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v5, v514383; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014384; GFX90A-NEXT: v_cndmask_b32_e64 v0, v6, v7, s[4:5]14385; GFX90A-NEXT: v_cndmask_b32_e32 v5, v8, v9, vcc14386; GFX90A-NEXT: v_perm_b32 v0, v5, v0, s914387; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14388; GFX90A-NEXT: s_waitcnt vmcnt(0)14389; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114390; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14391; GFX90A-NEXT: v_mov_b32_e32 v1, v014392; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14393; GFX90A-NEXT: s_cbranch_execnz .LBB265_114394; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14395; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14396; GFX90A-NEXT: v_accvgpr_write_b32 a0, v014397; GFX90A-NEXT: ;;#ASMSTART14398; GFX90A-NEXT: ; use a014399; GFX90A-NEXT: ;;#ASMEND14400; GFX90A-NEXT: s_setpc_b64 s[30:31]14401;14402; GFX950-LABEL: global_atomic_fmin_v2bf16_saddr_ret_a_a:14403; GFX950: ; %bb.0:14404; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14405; GFX950-NEXT: v_mov_b32_e32 v2, 014406; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014407; GFX950-NEXT: ;;#ASMSTART14408; GFX950-NEXT: ; def a014409; GFX950-NEXT: ;;#ASMEND14410; GFX950-NEXT: s_mov_b64 s[2:3], 014411; GFX950-NEXT: v_accvgpr_read_b32 v0, a014412; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014413; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014414; GFX950-NEXT: .LBB265_1: ; %atomicrmw.start14415; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114416; GFX950-NEXT: s_waitcnt vmcnt(0)14417; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114418; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114419; GFX950-NEXT: v_min_f32_e32 v0, v0, v314420; GFX950-NEXT: v_min_f32_e32 v5, v5, v414421; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014422; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014423; GFX950-NEXT: s_waitcnt vmcnt(0)14424; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114425; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14426; GFX950-NEXT: v_mov_b32_e32 v1, v014427; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14428; GFX950-NEXT: s_cbranch_execnz .LBB265_114429; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14430; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14431; GFX950-NEXT: v_accvgpr_write_b32 a0, v014432; GFX950-NEXT: ;;#ASMSTART14433; GFX950-NEXT: ; use a014434; GFX950-NEXT: ;;#ASMEND14435; GFX950-NEXT: s_setpc_b64 s[30:31]14436 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014437 %data = call <2 x bfloat> asm "; def $0", "=a"()14438 %result = atomicrmw fmin ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014439 call void asm "; use $0", "a"(<2 x bfloat> %result)14440 ret void14441}14442 14443define void @global_atomic_fmin_v2bf16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {14444; GFX90A-LABEL: global_atomic_fmin_v2bf16_saddr_ret_av_av:14445; GFX90A: ; %bb.0:14446; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14447; GFX90A-NEXT: v_mov_b32_e32 v2, 014448; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014449; GFX90A-NEXT: ;;#ASMSTART14450; GFX90A-NEXT: ; def v014451; GFX90A-NEXT: ;;#ASMEND14452; GFX90A-NEXT: s_mov_b64 s[6:7], 014453; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014454; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14455; GFX90A-NEXT: v_and_b32_e32 v4, 0xffff0000, v014456; GFX90A-NEXT: s_mov_b32 s9, 0x706030214457; GFX90A-NEXT: .LBB266_1: ; %atomicrmw.start14458; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114459; GFX90A-NEXT: s_waitcnt vmcnt(0)14460; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114461; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v114462; GFX90A-NEXT: v_min_f32_e32 v0, v0, v314463; GFX90A-NEXT: v_min_f32_e32 v5, v5, v414464; GFX90A-NEXT: v_bfe_u32 v6, v0, 16, 114465; GFX90A-NEXT: v_bfe_u32 v8, v5, 16, 114466; GFX90A-NEXT: v_or_b32_e32 v7, 0x400000, v014467; GFX90A-NEXT: v_or_b32_e32 v9, 0x400000, v514468; GFX90A-NEXT: v_add3_u32 v6, v6, v0, s814469; GFX90A-NEXT: v_add3_u32 v8, v8, v5, s814470; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v5, v514471; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014472; GFX90A-NEXT: v_cndmask_b32_e64 v0, v6, v7, s[4:5]14473; GFX90A-NEXT: v_cndmask_b32_e32 v5, v8, v9, vcc14474; GFX90A-NEXT: v_perm_b32 v0, v5, v0, s914475; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14476; GFX90A-NEXT: s_waitcnt vmcnt(0)14477; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114478; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14479; GFX90A-NEXT: v_mov_b32_e32 v1, v014480; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14481; GFX90A-NEXT: s_cbranch_execnz .LBB266_114482; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14483; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14484; GFX90A-NEXT: ;;#ASMSTART14485; GFX90A-NEXT: ; use v014486; GFX90A-NEXT: ;;#ASMEND14487; GFX90A-NEXT: s_setpc_b64 s[30:31]14488;14489; GFX950-LABEL: global_atomic_fmin_v2bf16_saddr_ret_av_av:14490; GFX950: ; %bb.0:14491; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14492; GFX950-NEXT: v_mov_b32_e32 v2, 014493; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014494; GFX950-NEXT: ;;#ASMSTART14495; GFX950-NEXT: ; def v014496; GFX950-NEXT: ;;#ASMEND14497; GFX950-NEXT: s_mov_b64 s[2:3], 014498; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014499; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014500; GFX950-NEXT: .LBB266_1: ; %atomicrmw.start14501; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114502; GFX950-NEXT: s_waitcnt vmcnt(0)14503; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114504; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114505; GFX950-NEXT: v_min_f32_e32 v0, v0, v314506; GFX950-NEXT: v_min_f32_e32 v5, v5, v414507; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014508; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014509; GFX950-NEXT: s_waitcnt vmcnt(0)14510; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114511; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14512; GFX950-NEXT: v_mov_b32_e32 v1, v014513; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14514; GFX950-NEXT: s_cbranch_execnz .LBB266_114515; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14516; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14517; GFX950-NEXT: ;;#ASMSTART14518; GFX950-NEXT: ; use v014519; GFX950-NEXT: ;;#ASMEND14520; GFX950-NEXT: s_setpc_b64 s[30:31]14521 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014522 %data = call <2 x bfloat> asm "; def $0", "=^VA"()14523 %result = atomicrmw fmin ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014524 call void asm "; use $0", "^VA"(<2 x bfloat> %result)14525 ret void14526}14527 14528define void @global_atomic_fmaximum_v2bf16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {14529; GFX90A-LABEL: global_atomic_fmaximum_v2bf16_saddr_ret_a_a:14530; GFX90A: ; %bb.0:14531; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14532; GFX90A-NEXT: v_mov_b32_e32 v2, 014533; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014534; GFX90A-NEXT: ;;#ASMSTART14535; GFX90A-NEXT: ; def a014536; GFX90A-NEXT: ;;#ASMEND14537; GFX90A-NEXT: v_accvgpr_read_b32 v0, a014538; GFX90A-NEXT: s_mov_b64 s[6:7], 014539; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014540; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7fc0000014541; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14542; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v014543; GFX90A-NEXT: s_mov_b32 s9, 0x706030214544; GFX90A-NEXT: .LBB267_1: ; %atomicrmw.start14545; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114546; GFX90A-NEXT: s_waitcnt vmcnt(0)14547; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114548; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v114549; GFX90A-NEXT: v_max_f32_e32 v7, v0, v314550; GFX90A-NEXT: v_max_f32_e32 v8, v6, v514551; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v6, v514552; GFX90A-NEXT: v_cmp_o_f32_e64 s[4:5], v0, v314553; GFX90A-NEXT: v_cndmask_b32_e64 v0, v4, v7, s[4:5]14554; GFX90A-NEXT: v_cndmask_b32_e32 v6, v4, v8, vcc14555; GFX90A-NEXT: v_bfe_u32 v7, v0, 16, 114556; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 114557; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v014558; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v614559; GFX90A-NEXT: v_add3_u32 v7, v7, v0, s814560; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s814561; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v614562; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014563; GFX90A-NEXT: v_cndmask_b32_e64 v0, v7, v8, s[4:5]14564; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc14565; GFX90A-NEXT: v_perm_b32 v0, v6, v0, s914566; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14567; GFX90A-NEXT: s_waitcnt vmcnt(0)14568; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114569; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14570; GFX90A-NEXT: v_mov_b32_e32 v1, v014571; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14572; GFX90A-NEXT: s_cbranch_execnz .LBB267_114573; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14574; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14575; GFX90A-NEXT: v_accvgpr_write_b32 a0, v014576; GFX90A-NEXT: ;;#ASMSTART14577; GFX90A-NEXT: ; use a014578; GFX90A-NEXT: ;;#ASMEND14579; GFX90A-NEXT: s_setpc_b64 s[30:31]14580;14581; GFX950-LABEL: global_atomic_fmaximum_v2bf16_saddr_ret_a_a:14582; GFX950: ; %bb.0:14583; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14584; GFX950-NEXT: v_mov_b32_e32 v2, 014585; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014586; GFX950-NEXT: ;;#ASMSTART14587; GFX950-NEXT: ; def a014588; GFX950-NEXT: ;;#ASMEND14589; GFX950-NEXT: s_mov_b64 s[2:3], 014590; GFX950-NEXT: v_accvgpr_read_b32 v0, a014591; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014592; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014593; GFX950-NEXT: .LBB267_1: ; %atomicrmw.start14594; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114595; GFX950-NEXT: s_waitcnt vmcnt(0)14596; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114597; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114598; GFX950-NEXT: v_maximum3_f32 v0, v0, v3, v314599; GFX950-NEXT: v_maximum3_f32 v5, v5, v4, v414600; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014601; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014602; GFX950-NEXT: s_waitcnt vmcnt(0)14603; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114604; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14605; GFX950-NEXT: v_mov_b32_e32 v1, v014606; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14607; GFX950-NEXT: s_cbranch_execnz .LBB267_114608; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14609; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14610; GFX950-NEXT: v_accvgpr_write_b32 a0, v014611; GFX950-NEXT: ;;#ASMSTART14612; GFX950-NEXT: ; use a014613; GFX950-NEXT: ;;#ASMEND14614; GFX950-NEXT: s_setpc_b64 s[30:31]14615 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014616 %data = call <2 x bfloat> asm "; def $0", "=a"()14617 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014618 call void asm "; use $0", "a"(<2 x bfloat> %result)14619 ret void14620}14621 14622define void @global_atomic_fmaximum_v2bf16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {14623; GFX90A-LABEL: global_atomic_fmaximum_v2bf16_saddr_ret_av_av:14624; GFX90A: ; %bb.0:14625; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14626; GFX90A-NEXT: v_mov_b32_e32 v2, 014627; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014628; GFX90A-NEXT: ;;#ASMSTART14629; GFX90A-NEXT: ; def v014630; GFX90A-NEXT: ;;#ASMEND14631; GFX90A-NEXT: s_mov_b64 s[6:7], 014632; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014633; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7fc0000014634; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14635; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v014636; GFX90A-NEXT: s_mov_b32 s9, 0x706030214637; GFX90A-NEXT: .LBB268_1: ; %atomicrmw.start14638; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114639; GFX90A-NEXT: s_waitcnt vmcnt(0)14640; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114641; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v114642; GFX90A-NEXT: v_max_f32_e32 v7, v0, v314643; GFX90A-NEXT: v_max_f32_e32 v8, v6, v514644; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v6, v514645; GFX90A-NEXT: v_cmp_o_f32_e64 s[4:5], v0, v314646; GFX90A-NEXT: v_cndmask_b32_e64 v0, v4, v7, s[4:5]14647; GFX90A-NEXT: v_cndmask_b32_e32 v6, v4, v8, vcc14648; GFX90A-NEXT: v_bfe_u32 v7, v0, 16, 114649; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 114650; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v014651; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v614652; GFX90A-NEXT: v_add3_u32 v7, v7, v0, s814653; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s814654; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v614655; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014656; GFX90A-NEXT: v_cndmask_b32_e64 v0, v7, v8, s[4:5]14657; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc14658; GFX90A-NEXT: v_perm_b32 v0, v6, v0, s914659; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14660; GFX90A-NEXT: s_waitcnt vmcnt(0)14661; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114662; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14663; GFX90A-NEXT: v_mov_b32_e32 v1, v014664; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14665; GFX90A-NEXT: s_cbranch_execnz .LBB268_114666; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14667; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14668; GFX90A-NEXT: ;;#ASMSTART14669; GFX90A-NEXT: ; use v014670; GFX90A-NEXT: ;;#ASMEND14671; GFX90A-NEXT: s_setpc_b64 s[30:31]14672;14673; GFX950-LABEL: global_atomic_fmaximum_v2bf16_saddr_ret_av_av:14674; GFX950: ; %bb.0:14675; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14676; GFX950-NEXT: v_mov_b32_e32 v2, 014677; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014678; GFX950-NEXT: ;;#ASMSTART14679; GFX950-NEXT: ; def v014680; GFX950-NEXT: ;;#ASMEND14681; GFX950-NEXT: s_mov_b64 s[2:3], 014682; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014683; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014684; GFX950-NEXT: .LBB268_1: ; %atomicrmw.start14685; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114686; GFX950-NEXT: s_waitcnt vmcnt(0)14687; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114688; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114689; GFX950-NEXT: v_maximum3_f32 v0, v0, v3, v314690; GFX950-NEXT: v_maximum3_f32 v5, v5, v4, v414691; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014692; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014693; GFX950-NEXT: s_waitcnt vmcnt(0)14694; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114695; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14696; GFX950-NEXT: v_mov_b32_e32 v1, v014697; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14698; GFX950-NEXT: s_cbranch_execnz .LBB268_114699; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14700; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14701; GFX950-NEXT: ;;#ASMSTART14702; GFX950-NEXT: ; use v014703; GFX950-NEXT: ;;#ASMEND14704; GFX950-NEXT: s_setpc_b64 s[30:31]14705 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014706 %data = call <2 x bfloat> asm "; def $0", "=^VA"()14707 %result = atomicrmw fmaximum ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014708 call void asm "; use $0", "^VA"(<2 x bfloat> %result)14709 ret void14710}14711 14712define void @global_atomic_fminimum_v2bf16_saddr_ret_a_a(ptr addrspace(1) inreg %ptr) #0 {14713; GFX90A-LABEL: global_atomic_fminimum_v2bf16_saddr_ret_a_a:14714; GFX90A: ; %bb.0:14715; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14716; GFX90A-NEXT: v_mov_b32_e32 v2, 014717; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014718; GFX90A-NEXT: ;;#ASMSTART14719; GFX90A-NEXT: ; def a014720; GFX90A-NEXT: ;;#ASMEND14721; GFX90A-NEXT: v_accvgpr_read_b32 v0, a014722; GFX90A-NEXT: s_mov_b64 s[6:7], 014723; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014724; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7fc0000014725; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14726; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v014727; GFX90A-NEXT: s_mov_b32 s9, 0x706030214728; GFX90A-NEXT: .LBB269_1: ; %atomicrmw.start14729; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114730; GFX90A-NEXT: s_waitcnt vmcnt(0)14731; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114732; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v114733; GFX90A-NEXT: v_min_f32_e32 v7, v0, v314734; GFX90A-NEXT: v_min_f32_e32 v8, v6, v514735; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v6, v514736; GFX90A-NEXT: v_cmp_o_f32_e64 s[4:5], v0, v314737; GFX90A-NEXT: v_cndmask_b32_e64 v0, v4, v7, s[4:5]14738; GFX90A-NEXT: v_cndmask_b32_e32 v6, v4, v8, vcc14739; GFX90A-NEXT: v_bfe_u32 v7, v0, 16, 114740; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 114741; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v014742; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v614743; GFX90A-NEXT: v_add3_u32 v7, v7, v0, s814744; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s814745; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v614746; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014747; GFX90A-NEXT: v_cndmask_b32_e64 v0, v7, v8, s[4:5]14748; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc14749; GFX90A-NEXT: v_perm_b32 v0, v6, v0, s914750; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14751; GFX90A-NEXT: s_waitcnt vmcnt(0)14752; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114753; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14754; GFX90A-NEXT: v_mov_b32_e32 v1, v014755; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14756; GFX90A-NEXT: s_cbranch_execnz .LBB269_114757; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14758; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14759; GFX90A-NEXT: v_accvgpr_write_b32 a0, v014760; GFX90A-NEXT: ;;#ASMSTART14761; GFX90A-NEXT: ; use a014762; GFX90A-NEXT: ;;#ASMEND14763; GFX90A-NEXT: s_setpc_b64 s[30:31]14764;14765; GFX950-LABEL: global_atomic_fminimum_v2bf16_saddr_ret_a_a:14766; GFX950: ; %bb.0:14767; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14768; GFX950-NEXT: v_mov_b32_e32 v2, 014769; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014770; GFX950-NEXT: ;;#ASMSTART14771; GFX950-NEXT: ; def a014772; GFX950-NEXT: ;;#ASMEND14773; GFX950-NEXT: s_mov_b64 s[2:3], 014774; GFX950-NEXT: v_accvgpr_read_b32 v0, a014775; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014776; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014777; GFX950-NEXT: .LBB269_1: ; %atomicrmw.start14778; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114779; GFX950-NEXT: s_waitcnt vmcnt(0)14780; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114781; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114782; GFX950-NEXT: v_minimum3_f32 v0, v0, v3, v314783; GFX950-NEXT: v_minimum3_f32 v5, v5, v4, v414784; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014785; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014786; GFX950-NEXT: s_waitcnt vmcnt(0)14787; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114788; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14789; GFX950-NEXT: v_mov_b32_e32 v1, v014790; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14791; GFX950-NEXT: s_cbranch_execnz .LBB269_114792; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14793; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14794; GFX950-NEXT: v_accvgpr_write_b32 a0, v014795; GFX950-NEXT: ;;#ASMSTART14796; GFX950-NEXT: ; use a014797; GFX950-NEXT: ;;#ASMEND14798; GFX950-NEXT: s_setpc_b64 s[30:31]14799 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014800 %data = call <2 x bfloat> asm "; def $0", "=a"()14801 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014802 call void asm "; use $0", "a"(<2 x bfloat> %result)14803 ret void14804}14805 14806define void @global_atomic_fminimum_v2bf16_saddr_ret_av_av(ptr addrspace(1) inreg %ptr) #0 {14807; GFX90A-LABEL: global_atomic_fminimum_v2bf16_saddr_ret_av_av:14808; GFX90A: ; %bb.0:14809; GFX90A-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14810; GFX90A-NEXT: v_mov_b32_e32 v2, 014811; GFX90A-NEXT: global_load_dword v1, v2, s[16:17] offset:4014812; GFX90A-NEXT: ;;#ASMSTART14813; GFX90A-NEXT: ; def v014814; GFX90A-NEXT: ;;#ASMEND14815; GFX90A-NEXT: s_mov_b64 s[6:7], 014816; GFX90A-NEXT: v_lshlrev_b32_e32 v3, 16, v014817; GFX90A-NEXT: v_mov_b32_e32 v4, 0x7fc0000014818; GFX90A-NEXT: s_movk_i32 s8, 0x7fff14819; GFX90A-NEXT: v_and_b32_e32 v5, 0xffff0000, v014820; GFX90A-NEXT: s_mov_b32 s9, 0x706030214821; GFX90A-NEXT: .LBB270_1: ; %atomicrmw.start14822; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=114823; GFX90A-NEXT: s_waitcnt vmcnt(0)14824; GFX90A-NEXT: v_lshlrev_b32_e32 v0, 16, v114825; GFX90A-NEXT: v_and_b32_e32 v6, 0xffff0000, v114826; GFX90A-NEXT: v_min_f32_e32 v7, v0, v314827; GFX90A-NEXT: v_min_f32_e32 v8, v6, v514828; GFX90A-NEXT: v_cmp_o_f32_e32 vcc, v6, v514829; GFX90A-NEXT: v_cmp_o_f32_e64 s[4:5], v0, v314830; GFX90A-NEXT: v_cndmask_b32_e64 v0, v4, v7, s[4:5]14831; GFX90A-NEXT: v_cndmask_b32_e32 v6, v4, v8, vcc14832; GFX90A-NEXT: v_bfe_u32 v7, v0, 16, 114833; GFX90A-NEXT: v_bfe_u32 v9, v6, 16, 114834; GFX90A-NEXT: v_or_b32_e32 v8, 0x400000, v014835; GFX90A-NEXT: v_or_b32_e32 v10, 0x400000, v614836; GFX90A-NEXT: v_add3_u32 v7, v7, v0, s814837; GFX90A-NEXT: v_add3_u32 v9, v9, v6, s814838; GFX90A-NEXT: v_cmp_u_f32_e32 vcc, v6, v614839; GFX90A-NEXT: v_cmp_u_f32_e64 s[4:5], v0, v014840; GFX90A-NEXT: v_cndmask_b32_e64 v0, v7, v8, s[4:5]14841; GFX90A-NEXT: v_cndmask_b32_e32 v6, v9, v10, vcc14842; GFX90A-NEXT: v_perm_b32 v0, v6, v0, s914843; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[16:17] offset:40 glc14844; GFX90A-NEXT: s_waitcnt vmcnt(0)14845; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114846; GFX90A-NEXT: s_or_b64 s[6:7], vcc, s[6:7]14847; GFX90A-NEXT: v_mov_b32_e32 v1, v014848; GFX90A-NEXT: s_andn2_b64 exec, exec, s[6:7]14849; GFX90A-NEXT: s_cbranch_execnz .LBB270_114850; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end14851; GFX90A-NEXT: s_or_b64 exec, exec, s[6:7]14852; GFX90A-NEXT: ;;#ASMSTART14853; GFX90A-NEXT: ; use v014854; GFX90A-NEXT: ;;#ASMEND14855; GFX90A-NEXT: s_setpc_b64 s[30:31]14856;14857; GFX950-LABEL: global_atomic_fminimum_v2bf16_saddr_ret_av_av:14858; GFX950: ; %bb.0:14859; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)14860; GFX950-NEXT: v_mov_b32_e32 v2, 014861; GFX950-NEXT: global_load_dword v1, v2, s[0:1] offset:4014862; GFX950-NEXT: ;;#ASMSTART14863; GFX950-NEXT: ; def v014864; GFX950-NEXT: ;;#ASMEND14865; GFX950-NEXT: s_mov_b64 s[2:3], 014866; GFX950-NEXT: v_and_b32_e32 v3, 0xffff0000, v014867; GFX950-NEXT: v_lshlrev_b32_e32 v4, 16, v014868; GFX950-NEXT: .LBB270_1: ; %atomicrmw.start14869; GFX950-NEXT: ; =>This Inner Loop Header: Depth=114870; GFX950-NEXT: s_waitcnt vmcnt(0)14871; GFX950-NEXT: v_and_b32_e32 v0, 0xffff0000, v114872; GFX950-NEXT: v_lshlrev_b32_e32 v5, 16, v114873; GFX950-NEXT: v_minimum3_f32 v0, v0, v3, v314874; GFX950-NEXT: v_minimum3_f32 v5, v5, v4, v414875; GFX950-NEXT: v_cvt_pk_bf16_f32 v0, v5, v014876; GFX950-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:40 sc014877; GFX950-NEXT: s_waitcnt vmcnt(0)14878; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, v0, v114879; GFX950-NEXT: s_or_b64 s[2:3], vcc, s[2:3]14880; GFX950-NEXT: v_mov_b32_e32 v1, v014881; GFX950-NEXT: s_andn2_b64 exec, exec, s[2:3]14882; GFX950-NEXT: s_cbranch_execnz .LBB270_114883; GFX950-NEXT: ; %bb.2: ; %atomicrmw.end14884; GFX950-NEXT: s_or_b64 exec, exec, s[2:3]14885; GFX950-NEXT: ;;#ASMSTART14886; GFX950-NEXT: ; use v014887; GFX950-NEXT: ;;#ASMEND14888; GFX950-NEXT: s_setpc_b64 s[30:31]14889 %gep.0 = getelementptr inbounds [512 x <2 x bfloat>], ptr addrspace(1) %ptr, i64 0, i64 1014890 %data = call <2 x bfloat> asm "; def $0", "=^VA"()14891 %result = atomicrmw fminimum ptr addrspace(1) %gep.0, <2 x bfloat> %data syncscope("workgroup") seq_cst, !amdgpu.no.fine.grained.memory !014892 call void asm "; use $0", "^VA"(<2 x bfloat> %result)14893 ret void14894}14895 14896attributes #0 = { nounwind "amdgpu-waves-per-eu"="10,10" }14897 14898!0 = !{}14899 14900;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:14901; CHECK: {{.*}}14902