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