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