1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX11,GFX11-SDAG %s 3; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX11,GFX11-GISEL %s 4 5define amdgpu_kernel void @test_get_doorbell(i32 addrspace(1)* %out) { 6; GFX11-SDAG-LABEL: test_get_doorbell: 7; GFX11-SDAG: ; %bb.0: 8; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 9; GFX11-SDAG-NEXT: s_sendmsg_rtn_b32 s2, sendmsg(MSG_RTN_GET_DOORBELL) 10; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 11; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2 12; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1] 13; GFX11-SDAG-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 14; GFX11-SDAG-NEXT: s_endpgm 15; 16; GFX11-GISEL-LABEL: test_get_doorbell: 17; GFX11-GISEL: ; %bb.0: 18; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 19; GFX11-GISEL-NEXT: s_sendmsg_rtn_b32 s2, sendmsg(MSG_RTN_GET_DOORBELL) 20; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 21; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2 22; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1] 23; GFX11-GISEL-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 24; GFX11-GISEL-NEXT: s_endpgm 25 %ret = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 128) 26 store i32 %ret, i32 addrspace(1)* %out 27 ret void 28} 29 30define amdgpu_kernel void @test_get_ddid(i32 addrspace(1)* %out) { 31; GFX11-SDAG-LABEL: test_get_ddid: 32; GFX11-SDAG: ; %bb.0: 33; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 34; GFX11-SDAG-NEXT: s_sendmsg_rtn_b32 s2, sendmsg(MSG_RTN_GET_DDID) 35; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 36; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2 37; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1] 38; GFX11-SDAG-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 39; GFX11-SDAG-NEXT: s_endpgm 40; 41; GFX11-GISEL-LABEL: test_get_ddid: 42; GFX11-GISEL: ; %bb.0: 43; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 44; GFX11-GISEL-NEXT: s_sendmsg_rtn_b32 s2, sendmsg(MSG_RTN_GET_DDID) 45; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 46; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2 47; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1] 48; GFX11-GISEL-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 49; GFX11-GISEL-NEXT: s_endpgm 50 %ret = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 129) 51 store i32 %ret, i32 addrspace(1)* %out 52 ret void 53} 54 55define amdgpu_kernel void @test_get_tma(i64 addrspace(1)* %out) { 56; GFX11-LABEL: test_get_tma: 57; GFX11: ; %bb.0: 58; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 59; GFX11-NEXT: s_sendmsg_rtn_b64 s[2:3], sendmsg(MSG_RTN_GET_TMA) 60; GFX11-NEXT: v_mov_b32_e32 v2, 0 61; GFX11-NEXT: s_waitcnt lgkmcnt(0) 62; GFX11-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3 63; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1] 64; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 65; GFX11-NEXT: s_endpgm 66 %ret = call i64 @llvm.amdgcn.s.sendmsg.rtn.i64(i32 130) 67 store i64 %ret, i64 addrspace(1)* %out 68 ret void 69} 70 71define amdgpu_kernel void @test_get_realtime(i64 addrspace(1)* %out) { 72; GFX11-LABEL: test_get_realtime: 73; GFX11: ; %bb.0: 74; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 75; GFX11-NEXT: s_sendmsg_rtn_b64 s[2:3], sendmsg(MSG_RTN_GET_REALTIME) 76; GFX11-NEXT: v_mov_b32_e32 v2, 0 77; GFX11-NEXT: s_waitcnt lgkmcnt(0) 78; GFX11-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3 79; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1] 80; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 81; GFX11-NEXT: s_endpgm 82 %ret = call i64 @llvm.amdgcn.s.sendmsg.rtn.i64(i32 131) 83 store i64 %ret, i64 addrspace(1)* %out 84 ret void 85} 86 87define amdgpu_kernel void @test_savewave(i32 addrspace(1)* %out) { 88; GFX11-SDAG-LABEL: test_savewave: 89; GFX11-SDAG: ; %bb.0: 90; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 91; GFX11-SDAG-NEXT: s_sendmsg_rtn_b32 s2, sendmsg(MSG_RTN_SAVE_WAVE) 92; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 93; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2 94; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1] 95; GFX11-SDAG-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 96; GFX11-SDAG-NEXT: s_endpgm 97; 98; GFX11-GISEL-LABEL: test_savewave: 99; GFX11-GISEL: ; %bb.0: 100; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 101; GFX11-GISEL-NEXT: s_sendmsg_rtn_b32 s2, sendmsg(MSG_RTN_SAVE_WAVE) 102; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 103; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2 104; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1] 105; GFX11-GISEL-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 106; GFX11-GISEL-NEXT: s_endpgm 107 %ret = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 132) 108 store i32 %ret, i32 addrspace(1)* %out 109 ret void 110} 111 112define amdgpu_kernel void @test_get_tba(i64 addrspace(1)* %out) { 113; GFX11-LABEL: test_get_tba: 114; GFX11: ; %bb.0: 115; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 116; GFX11-NEXT: s_sendmsg_rtn_b64 s[2:3], sendmsg(MSG_RTN_GET_TBA) 117; GFX11-NEXT: v_mov_b32_e32 v2, 0 118; GFX11-NEXT: s_waitcnt lgkmcnt(0) 119; GFX11-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3 120; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1] 121; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 122; GFX11-NEXT: s_endpgm 123 %ret = call i64 @llvm.amdgcn.s.sendmsg.rtn.i64(i32 133) 124 store i64 %ret, i64 addrspace(1)* %out 125 ret void 126} 127 128define amdgpu_kernel void @test_get_0_i32(i32 addrspace(1)* %out) { 129; GFX11-SDAG-LABEL: test_get_0_i32: 130; GFX11-SDAG: ; %bb.0: 131; GFX11-SDAG-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 132; GFX11-SDAG-NEXT: s_sendmsg_rtn_b32 s2, sendmsg(0, 0, 0) 133; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 134; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2 135; GFX11-SDAG-NEXT: global_store_b32 v0, v1, s[0:1] 136; GFX11-SDAG-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 137; GFX11-SDAG-NEXT: s_endpgm 138; 139; GFX11-GISEL-LABEL: test_get_0_i32: 140; GFX11-GISEL: ; %bb.0: 141; GFX11-GISEL-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 142; GFX11-GISEL-NEXT: s_sendmsg_rtn_b32 s2, sendmsg(0, 0, 0) 143; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 144; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2 145; GFX11-GISEL-NEXT: global_store_b32 v1, v0, s[0:1] 146; GFX11-GISEL-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 147; GFX11-GISEL-NEXT: s_endpgm 148 %ret = call i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32 0) 149 store i32 %ret, i32 addrspace(1)* %out 150 ret void 151} 152 153define amdgpu_kernel void @test_get_99999_i64(i64 addrspace(1)* %out) { 154; GFX11-LABEL: test_get_99999_i64: 155; GFX11: ; %bb.0: 156; GFX11-NEXT: s_load_b64 s[0:1], s[0:1], 0x24 157; GFX11-NEXT: s_sendmsg_rtn_b64 s[2:3], 99999 158; GFX11-NEXT: v_mov_b32_e32 v2, 0 159; GFX11-NEXT: s_waitcnt lgkmcnt(0) 160; GFX11-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3 161; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1] 162; GFX11-NEXT: s_sendmsg sendmsg(MSG_DEALLOC_VGPRS) 163; GFX11-NEXT: s_endpgm 164 %ret = call i64 @llvm.amdgcn.s.sendmsg.rtn.i64(i32 99999) 165 store i64 %ret, i64 addrspace(1)* %out 166 ret void 167} 168 169declare i32 @llvm.amdgcn.s.sendmsg.rtn.i32(i32) 170declare i64 @llvm.amdgcn.s.sendmsg.rtn.i64(i32) 171