xref: /llvm-project/llvm/test/CodeGen/AMDGPU/fpenv.ll (revision 1fc5e50cebf1e423bce105930c3a075044998f68)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=amdgcn -global-isel=0 -mcpu=tahiti < %s | FileCheck -check-prefixes=GFX6-SDAG %s
3; RUN: llc -mtriple=amdgcn -global-isel=1 -mcpu=tahiti < %s | FileCheck -check-prefixes=GFX6-ISEL %s
4; RUN: llc -mtriple=amdgcn -global-isel=0 -mcpu=fiji < %s | FileCheck -check-prefixes=GFX8-SDAG %s
5; RUN: llc -mtriple=amdgcn -global-isel=1 -mcpu=fiji < %s | FileCheck -check-prefixes=GFX8-ISEL %s
6; RUN: llc -mtriple=amdgcn -global-isel=0 -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9-SDAG %s
7; RUN: llc -mtriple=amdgcn -global-isel=1 -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9-ISEL %s
8; RUN: llc -mtriple=amdgcn -global-isel=0 -mcpu=gfx1030 < %s | FileCheck -check-prefixes=GFX10-SDAG %s
9; RUN: llc -mtriple=amdgcn -global-isel=1 -mcpu=gfx1030 < %s | FileCheck -check-prefixes=GFX10-ISEL %s
10; RUN: llc -mtriple=amdgcn -amdgpu-enable-delay-alu=0 -global-isel=0 -mcpu=gfx1100 < %s | FileCheck -check-prefixes=GFX11-SDAG %s
11; RUN: llc -mtriple=amdgcn -amdgpu-enable-delay-alu=0 -global-isel=1 -mcpu=gfx1100 < %s | FileCheck -check-prefixes=GFX11-ISEL %s
12
13declare i64 @llvm.get.fpenv.i64()
14
15declare void @llvm.set.fpenv.i64(i64)
16
17define i64 @get_fpenv() {
18; GFX6-SDAG-LABEL: get_fpenv:
19; GFX6-SDAG:       ; %bb.0: ; %entry
20; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
21; GFX6-SDAG-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_TRAPSTS, 0, 5)
22; GFX6-SDAG-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_MODE, 0, 23)
23; GFX6-SDAG-NEXT:    v_mov_b32_e32 v0, s5
24; GFX6-SDAG-NEXT:    v_mov_b32_e32 v1, s4
25; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
26;
27; GFX6-ISEL-LABEL: get_fpenv:
28; GFX6-ISEL:       ; %bb.0: ; %entry
29; GFX6-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
30; GFX6-ISEL-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 23)
31; GFX6-ISEL-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_TRAPSTS, 0, 5)
32; GFX6-ISEL-NEXT:    v_mov_b32_e32 v0, s4
33; GFX6-ISEL-NEXT:    v_mov_b32_e32 v1, s5
34; GFX6-ISEL-NEXT:    s_setpc_b64 s[30:31]
35;
36; GFX8-SDAG-LABEL: get_fpenv:
37; GFX8-SDAG:       ; %bb.0: ; %entry
38; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
39; GFX8-SDAG-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_TRAPSTS, 0, 5)
40; GFX8-SDAG-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_MODE, 0, 23)
41; GFX8-SDAG-NEXT:    v_mov_b32_e32 v0, s5
42; GFX8-SDAG-NEXT:    v_mov_b32_e32 v1, s4
43; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
44;
45; GFX8-ISEL-LABEL: get_fpenv:
46; GFX8-ISEL:       ; %bb.0: ; %entry
47; GFX8-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
48; GFX8-ISEL-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 23)
49; GFX8-ISEL-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_TRAPSTS, 0, 5)
50; GFX8-ISEL-NEXT:    v_mov_b32_e32 v0, s4
51; GFX8-ISEL-NEXT:    v_mov_b32_e32 v1, s5
52; GFX8-ISEL-NEXT:    s_setpc_b64 s[30:31]
53;
54; GFX9-SDAG-LABEL: get_fpenv:
55; GFX9-SDAG:       ; %bb.0: ; %entry
56; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
57; GFX9-SDAG-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_TRAPSTS, 0, 5)
58; GFX9-SDAG-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_MODE, 0, 23)
59; GFX9-SDAG-NEXT:    v_mov_b32_e32 v0, s5
60; GFX9-SDAG-NEXT:    v_mov_b32_e32 v1, s4
61; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
62;
63; GFX9-ISEL-LABEL: get_fpenv:
64; GFX9-ISEL:       ; %bb.0: ; %entry
65; GFX9-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
66; GFX9-ISEL-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 23)
67; GFX9-ISEL-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_TRAPSTS, 0, 5)
68; GFX9-ISEL-NEXT:    v_mov_b32_e32 v0, s4
69; GFX9-ISEL-NEXT:    v_mov_b32_e32 v1, s5
70; GFX9-ISEL-NEXT:    s_setpc_b64 s[30:31]
71;
72; GFX10-SDAG-LABEL: get_fpenv:
73; GFX10-SDAG:       ; %bb.0: ; %entry
74; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
75; GFX10-SDAG-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_TRAPSTS, 0, 5)
76; GFX10-SDAG-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_MODE, 0, 23)
77; GFX10-SDAG-NEXT:    v_mov_b32_e32 v1, s4
78; GFX10-SDAG-NEXT:    v_mov_b32_e32 v0, s5
79; GFX10-SDAG-NEXT:    s_setpc_b64 s[30:31]
80;
81; GFX10-ISEL-LABEL: get_fpenv:
82; GFX10-ISEL:       ; %bb.0: ; %entry
83; GFX10-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
84; GFX10-ISEL-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 23)
85; GFX10-ISEL-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_TRAPSTS, 0, 5)
86; GFX10-ISEL-NEXT:    v_mov_b32_e32 v0, s4
87; GFX10-ISEL-NEXT:    v_mov_b32_e32 v1, s5
88; GFX10-ISEL-NEXT:    s_setpc_b64 s[30:31]
89;
90; GFX11-SDAG-LABEL: get_fpenv:
91; GFX11-SDAG:       ; %bb.0: ; %entry
92; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
93; GFX11-SDAG-NEXT:    s_getreg_b32 s0, hwreg(HW_REG_TRAPSTS, 0, 5)
94; GFX11-SDAG-NEXT:    s_getreg_b32 s1, hwreg(HW_REG_MODE, 0, 23)
95; GFX11-SDAG-NEXT:    v_dual_mov_b32 v1, s0 :: v_dual_mov_b32 v0, s1
96; GFX11-SDAG-NEXT:    s_setpc_b64 s[30:31]
97;
98; GFX11-ISEL-LABEL: get_fpenv:
99; GFX11-ISEL:       ; %bb.0: ; %entry
100; GFX11-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
101; GFX11-ISEL-NEXT:    s_getreg_b32 s0, hwreg(HW_REG_MODE, 0, 23)
102; GFX11-ISEL-NEXT:    s_getreg_b32 s1, hwreg(HW_REG_TRAPSTS, 0, 5)
103; GFX11-ISEL-NEXT:    v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1
104; GFX11-ISEL-NEXT:    s_setpc_b64 s[30:31]
105entry:
106  %0 = call i64 @llvm.get.fpenv.i64()
107  ret i64 %0
108}
109
110define void @set_fpenv(i64 %env) {
111; GFX6-SDAG-LABEL: set_fpenv:
112; GFX6-SDAG:       ; %bb.0: ; %entry
113; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
114; GFX6-SDAG-NEXT:    v_readfirstlane_b32 s4, v0
115; GFX6-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
116; GFX6-SDAG-NEXT:    v_readfirstlane_b32 s4, v1
117; GFX6-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
118; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
119;
120; GFX6-ISEL-LABEL: set_fpenv:
121; GFX6-ISEL:       ; %bb.0: ; %entry
122; GFX6-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
123; GFX6-ISEL-NEXT:    v_readfirstlane_b32 s4, v0
124; GFX6-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
125; GFX6-ISEL-NEXT:    v_readfirstlane_b32 s4, v1
126; GFX6-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
127; GFX6-ISEL-NEXT:    s_setpc_b64 s[30:31]
128;
129; GFX8-SDAG-LABEL: set_fpenv:
130; GFX8-SDAG:       ; %bb.0: ; %entry
131; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
132; GFX8-SDAG-NEXT:    v_readfirstlane_b32 s4, v0
133; GFX8-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
134; GFX8-SDAG-NEXT:    v_readfirstlane_b32 s4, v1
135; GFX8-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
136; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
137;
138; GFX8-ISEL-LABEL: set_fpenv:
139; GFX8-ISEL:       ; %bb.0: ; %entry
140; GFX8-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
141; GFX8-ISEL-NEXT:    v_readfirstlane_b32 s4, v0
142; GFX8-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
143; GFX8-ISEL-NEXT:    v_readfirstlane_b32 s4, v1
144; GFX8-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
145; GFX8-ISEL-NEXT:    s_setpc_b64 s[30:31]
146;
147; GFX9-SDAG-LABEL: set_fpenv:
148; GFX9-SDAG:       ; %bb.0: ; %entry
149; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
150; GFX9-SDAG-NEXT:    v_readfirstlane_b32 s4, v0
151; GFX9-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
152; GFX9-SDAG-NEXT:    v_readfirstlane_b32 s4, v1
153; GFX9-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
154; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
155;
156; GFX9-ISEL-LABEL: set_fpenv:
157; GFX9-ISEL:       ; %bb.0: ; %entry
158; GFX9-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
159; GFX9-ISEL-NEXT:    v_readfirstlane_b32 s4, v0
160; GFX9-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
161; GFX9-ISEL-NEXT:    v_readfirstlane_b32 s4, v1
162; GFX9-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
163; GFX9-ISEL-NEXT:    s_setpc_b64 s[30:31]
164;
165; GFX10-SDAG-LABEL: set_fpenv:
166; GFX10-SDAG:       ; %bb.0: ; %entry
167; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
168; GFX10-SDAG-NEXT:    v_readfirstlane_b32 s4, v0
169; GFX10-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
170; GFX10-SDAG-NEXT:    v_readfirstlane_b32 s4, v1
171; GFX10-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
172; GFX10-SDAG-NEXT:    s_setpc_b64 s[30:31]
173;
174; GFX10-ISEL-LABEL: set_fpenv:
175; GFX10-ISEL:       ; %bb.0: ; %entry
176; GFX10-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
177; GFX10-ISEL-NEXT:    v_readfirstlane_b32 s4, v0
178; GFX10-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
179; GFX10-ISEL-NEXT:    v_readfirstlane_b32 s4, v1
180; GFX10-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
181; GFX10-ISEL-NEXT:    s_setpc_b64 s[30:31]
182;
183; GFX11-SDAG-LABEL: set_fpenv:
184; GFX11-SDAG:       ; %bb.0: ; %entry
185; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
186; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s0, v0
187; GFX11-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s0
188; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s0, v1
189; GFX11-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s0
190; GFX11-SDAG-NEXT:    s_setpc_b64 s[30:31]
191;
192; GFX11-ISEL-LABEL: set_fpenv:
193; GFX11-ISEL:       ; %bb.0: ; %entry
194; GFX11-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
195; GFX11-ISEL-NEXT:    v_readfirstlane_b32 s0, v0
196; GFX11-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s0
197; GFX11-ISEL-NEXT:    v_readfirstlane_b32 s0, v1
198; GFX11-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s0
199; GFX11-ISEL-NEXT:    s_setpc_b64 s[30:31]
200entry:
201  call void @llvm.set.fpenv.i64(i64 %env)
202  ret void
203}
204
205define void @set_fpenv_constant() {
206; GFX6-SDAG-LABEL: set_fpenv_constant:
207; GFX6-SDAG:       ; %bb.0: ; %entry
208; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
209; GFX6-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
210; GFX6-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
211; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
212;
213; GFX6-ISEL-LABEL: set_fpenv_constant:
214; GFX6-ISEL:       ; %bb.0: ; %entry
215; GFX6-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
216; GFX6-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
217; GFX6-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
218; GFX6-ISEL-NEXT:    s_setpc_b64 s[30:31]
219;
220; GFX8-SDAG-LABEL: set_fpenv_constant:
221; GFX8-SDAG:       ; %bb.0: ; %entry
222; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
223; GFX8-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
224; GFX8-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
225; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
226;
227; GFX8-ISEL-LABEL: set_fpenv_constant:
228; GFX8-ISEL:       ; %bb.0: ; %entry
229; GFX8-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
230; GFX8-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
231; GFX8-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
232; GFX8-ISEL-NEXT:    s_setpc_b64 s[30:31]
233;
234; GFX9-SDAG-LABEL: set_fpenv_constant:
235; GFX9-SDAG:       ; %bb.0: ; %entry
236; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
237; GFX9-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
238; GFX9-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
239; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
240;
241; GFX9-ISEL-LABEL: set_fpenv_constant:
242; GFX9-ISEL:       ; %bb.0: ; %entry
243; GFX9-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
244; GFX9-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
245; GFX9-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
246; GFX9-ISEL-NEXT:    s_setpc_b64 s[30:31]
247;
248; GFX10-SDAG-LABEL: set_fpenv_constant:
249; GFX10-SDAG:       ; %bb.0: ; %entry
250; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
251; GFX10-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
252; GFX10-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
253; GFX10-SDAG-NEXT:    s_setpc_b64 s[30:31]
254;
255; GFX10-ISEL-LABEL: set_fpenv_constant:
256; GFX10-ISEL:       ; %bb.0: ; %entry
257; GFX10-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
258; GFX10-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
259; GFX10-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
260; GFX10-ISEL-NEXT:    s_setpc_b64 s[30:31]
261;
262; GFX11-SDAG-LABEL: set_fpenv_constant:
263; GFX11-SDAG:       ; %bb.0: ; %entry
264; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
265; GFX11-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
266; GFX11-SDAG-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
267; GFX11-SDAG-NEXT:    s_setpc_b64 s[30:31]
268;
269; GFX11-ISEL-LABEL: set_fpenv_constant:
270; GFX11-ISEL:       ; %bb.0: ; %entry
271; GFX11-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
272; GFX11-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 23), 0
273; GFX11-ISEL-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_TRAPSTS, 0, 5), 0
274; GFX11-ISEL-NEXT:    s_setpc_b64 s[30:31]
275entry:
276  call void @llvm.set.fpenv.i64(i64 0)
277  ret void
278}
279
280define void @get_set_fpenv() {
281; GFX6-SDAG-LABEL: get_set_fpenv:
282; GFX6-SDAG:       ; %bb.0: ; %entry
283; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
284; GFX6-SDAG-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_TRAPSTS, 0, 5)
285; GFX6-SDAG-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_MODE, 0, 23)
286; GFX6-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s5
287; GFX6-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
288; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
289;
290; GFX6-ISEL-LABEL: get_set_fpenv:
291; GFX6-ISEL:       ; %bb.0: ; %entry
292; GFX6-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
293; GFX6-ISEL-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 23)
294; GFX6-ISEL-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_TRAPSTS, 0, 5)
295; GFX6-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
296; GFX6-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s5
297; GFX6-ISEL-NEXT:    s_setpc_b64 s[30:31]
298;
299; GFX8-SDAG-LABEL: get_set_fpenv:
300; GFX8-SDAG:       ; %bb.0: ; %entry
301; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
302; GFX8-SDAG-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_TRAPSTS, 0, 5)
303; GFX8-SDAG-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_MODE, 0, 23)
304; GFX8-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s5
305; GFX8-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
306; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
307;
308; GFX8-ISEL-LABEL: get_set_fpenv:
309; GFX8-ISEL:       ; %bb.0: ; %entry
310; GFX8-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
311; GFX8-ISEL-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 23)
312; GFX8-ISEL-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_TRAPSTS, 0, 5)
313; GFX8-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
314; GFX8-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s5
315; GFX8-ISEL-NEXT:    s_setpc_b64 s[30:31]
316;
317; GFX9-SDAG-LABEL: get_set_fpenv:
318; GFX9-SDAG:       ; %bb.0: ; %entry
319; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
320; GFX9-SDAG-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_TRAPSTS, 0, 5)
321; GFX9-SDAG-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_MODE, 0, 23)
322; GFX9-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s5
323; GFX9-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
324; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
325;
326; GFX9-ISEL-LABEL: get_set_fpenv:
327; GFX9-ISEL:       ; %bb.0: ; %entry
328; GFX9-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
329; GFX9-ISEL-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 23)
330; GFX9-ISEL-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_TRAPSTS, 0, 5)
331; GFX9-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
332; GFX9-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s5
333; GFX9-ISEL-NEXT:    s_setpc_b64 s[30:31]
334;
335; GFX10-SDAG-LABEL: get_set_fpenv:
336; GFX10-SDAG:       ; %bb.0: ; %entry
337; GFX10-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
338; GFX10-SDAG-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_TRAPSTS, 0, 5)
339; GFX10-SDAG-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_MODE, 0, 23)
340; GFX10-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s5
341; GFX10-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s4
342; GFX10-SDAG-NEXT:    s_setpc_b64 s[30:31]
343;
344; GFX10-ISEL-LABEL: get_set_fpenv:
345; GFX10-ISEL:       ; %bb.0: ; %entry
346; GFX10-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
347; GFX10-ISEL-NEXT:    s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 23)
348; GFX10-ISEL-NEXT:    s_getreg_b32 s5, hwreg(HW_REG_TRAPSTS, 0, 5)
349; GFX10-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s4
350; GFX10-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s5
351; GFX10-ISEL-NEXT:    s_setpc_b64 s[30:31]
352;
353; GFX11-SDAG-LABEL: get_set_fpenv:
354; GFX11-SDAG:       ; %bb.0: ; %entry
355; GFX11-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
356; GFX11-SDAG-NEXT:    s_getreg_b32 s0, hwreg(HW_REG_TRAPSTS, 0, 5)
357; GFX11-SDAG-NEXT:    s_getreg_b32 s1, hwreg(HW_REG_MODE, 0, 23)
358; GFX11-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s1
359; GFX11-SDAG-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s0
360; GFX11-SDAG-NEXT:    s_setpc_b64 s[30:31]
361;
362; GFX11-ISEL-LABEL: get_set_fpenv:
363; GFX11-ISEL:       ; %bb.0: ; %entry
364; GFX11-ISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
365; GFX11-ISEL-NEXT:    s_getreg_b32 s0, hwreg(HW_REG_MODE, 0, 23)
366; GFX11-ISEL-NEXT:    s_getreg_b32 s1, hwreg(HW_REG_TRAPSTS, 0, 5)
367; GFX11-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_MODE, 0, 23), s0
368; GFX11-ISEL-NEXT:    s_setreg_b32 hwreg(HW_REG_TRAPSTS, 0, 5), s1
369; GFX11-ISEL-NEXT:    s_setpc_b64 s[30:31]
370entry:
371  %0 = call i64 @llvm.get.fpenv.i64()
372  call void @llvm.set.fpenv.i64(i64 %0)
373  ret void
374}
375