[AMDGPU] Make v8i16/v8f16 legal
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / ssubsat.ll
blob1f8a322dbdd1264a1a14af0dd272b98a752ba904
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=tahiti -o - %s | FileCheck -check-prefix=GFX6 %s
3 ; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=fiji -o - %s | FileCheck -check-prefix=GFX8 %s
4 ; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=gfx900 -o - %s | FileCheck -check-prefix=GFX9 %s
5 ; RUN: llc -global-isel -mtriple=amdgcn-amd-amdpal -mcpu=gfx1010 -o - %s | FileCheck -check-prefix=GFX10 %s
7 define i7 @v_ssubsat_i7(i7 %lhs, i7 %rhs) {
8 ; GFX6-LABEL: v_ssubsat_i7:
9 ; GFX6:       ; %bb.0:
10 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
11 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 25, v0
12 ; GFX6-NEXT:    v_max_i32_e32 v2, -1, v0
13 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 25, v1
14 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, 0x7fffffff, v2
15 ; GFX6-NEXT:    v_min_i32_e32 v3, -1, v0
16 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, 0x80000000, v3
17 ; GFX6-NEXT:    v_max_i32_e32 v1, v2, v1
18 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v3
19 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
20 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 25, v0
21 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
23 ; GFX8-LABEL: v_ssubsat_i7:
24 ; GFX8:       ; %bb.0:
25 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
26 ; GFX8-NEXT:    v_lshlrev_b16_e32 v0, 9, v0
27 ; GFX8-NEXT:    v_max_i16_e32 v2, -1, v0
28 ; GFX8-NEXT:    v_lshlrev_b16_e32 v1, 9, v1
29 ; GFX8-NEXT:    v_subrev_u16_e32 v2, 0x7fff, v2
30 ; GFX8-NEXT:    v_min_i16_e32 v3, -1, v0
31 ; GFX8-NEXT:    v_subrev_u16_e32 v3, 0x8000, v3
32 ; GFX8-NEXT:    v_max_i16_e32 v1, v2, v1
33 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v3
34 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v1
35 ; GFX8-NEXT:    v_ashrrev_i16_e32 v0, 9, v0
36 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
38 ; GFX9-LABEL: v_ssubsat_i7:
39 ; GFX9:       ; %bb.0:
40 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
41 ; GFX9-NEXT:    v_lshlrev_b16_e32 v0, 9, v0
42 ; GFX9-NEXT:    v_lshlrev_b16_e32 v1, 9, v1
43 ; GFX9-NEXT:    v_sub_i16 v0, v0, v1 clamp
44 ; GFX9-NEXT:    v_ashrrev_i16_e32 v0, 9, v0
45 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
47 ; GFX10-LABEL: v_ssubsat_i7:
48 ; GFX10:       ; %bb.0:
49 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
50 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
51 ; GFX10-NEXT:    v_lshlrev_b16 v0, 9, v0
52 ; GFX10-NEXT:    v_lshlrev_b16 v1, 9, v1
53 ; GFX10-NEXT:    v_sub_nc_i16 v0, v0, v1 clamp
54 ; GFX10-NEXT:    v_ashrrev_i16 v0, 9, v0
55 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
56   %result = call i7 @llvm.ssub.sat.i7(i7 %lhs, i7 %rhs)
57   ret i7 %result
60 define amdgpu_ps i7 @s_ssubsat_i7(i7 inreg %lhs, i7 inreg %rhs) {
61 ; GFX6-LABEL: s_ssubsat_i7:
62 ; GFX6:       ; %bb.0:
63 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 25
64 ; GFX6-NEXT:    s_max_i32 s2, s0, -1
65 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 25
66 ; GFX6-NEXT:    s_sub_i32 s2, s2, 0x7fffffff
67 ; GFX6-NEXT:    s_min_i32 s3, s0, -1
68 ; GFX6-NEXT:    s_sub_i32 s3, s3, 0x80000000
69 ; GFX6-NEXT:    s_max_i32 s1, s2, s1
70 ; GFX6-NEXT:    s_min_i32 s1, s1, s3
71 ; GFX6-NEXT:    s_sub_i32 s0, s0, s1
72 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 25
73 ; GFX6-NEXT:    ; return to shader part epilog
75 ; GFX8-LABEL: s_ssubsat_i7:
76 ; GFX8:       ; %bb.0:
77 ; GFX8-NEXT:    s_bfe_u32 s2, 9, 0x100000
78 ; GFX8-NEXT:    s_lshl_b32 s0, s0, s2
79 ; GFX8-NEXT:    s_sext_i32_i16 s3, s0
80 ; GFX8-NEXT:    s_sext_i32_i16 s4, -1
81 ; GFX8-NEXT:    s_max_i32 s5, s3, s4
82 ; GFX8-NEXT:    s_lshl_b32 s1, s1, s2
83 ; GFX8-NEXT:    s_sub_i32 s5, s5, 0x7fff
84 ; GFX8-NEXT:    s_min_i32 s3, s3, s4
85 ; GFX8-NEXT:    s_sext_i32_i16 s4, s5
86 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
87 ; GFX8-NEXT:    s_sub_i32 s3, s3, 0xffff8000
88 ; GFX8-NEXT:    s_max_i32 s1, s4, s1
89 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
90 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
91 ; GFX8-NEXT:    s_min_i32 s1, s1, s3
92 ; GFX8-NEXT:    s_sub_i32 s0, s0, s1
93 ; GFX8-NEXT:    s_sext_i32_i16 s0, s0
94 ; GFX8-NEXT:    s_ashr_i32 s0, s0, s2
95 ; GFX8-NEXT:    ; return to shader part epilog
97 ; GFX9-LABEL: s_ssubsat_i7:
98 ; GFX9:       ; %bb.0:
99 ; GFX9-NEXT:    s_bfe_u32 s2, 9, 0x100000
100 ; GFX9-NEXT:    s_lshl_b32 s1, s1, s2
101 ; GFX9-NEXT:    s_lshl_b32 s0, s0, s2
102 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
103 ; GFX9-NEXT:    v_sub_i16 v0, s0, v0 clamp
104 ; GFX9-NEXT:    v_ashrrev_i16_e32 v0, 9, v0
105 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
106 ; GFX9-NEXT:    ; return to shader part epilog
108 ; GFX10-LABEL: s_ssubsat_i7:
109 ; GFX10:       ; %bb.0:
110 ; GFX10-NEXT:    s_bfe_u32 s2, 9, 0x100000
111 ; GFX10-NEXT:    s_lshl_b32 s0, s0, s2
112 ; GFX10-NEXT:    s_lshl_b32 s1, s1, s2
113 ; GFX10-NEXT:    v_sub_nc_i16 v0, s0, s1 clamp
114 ; GFX10-NEXT:    v_ashrrev_i16 v0, 9, v0
115 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
116 ; GFX10-NEXT:    ; return to shader part epilog
117   %result = call i7 @llvm.ssub.sat.i7(i7 %lhs, i7 %rhs)
118   ret i7 %result
121 define i8 @v_ssubsat_i8(i8 %lhs, i8 %rhs) {
122 ; GFX6-LABEL: v_ssubsat_i8:
123 ; GFX6:       ; %bb.0:
124 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
125 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
126 ; GFX6-NEXT:    v_max_i32_e32 v2, -1, v0
127 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
128 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, 0x7fffffff, v2
129 ; GFX6-NEXT:    v_min_i32_e32 v3, -1, v0
130 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, 0x80000000, v3
131 ; GFX6-NEXT:    v_max_i32_e32 v1, v2, v1
132 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v3
133 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
134 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 24, v0
135 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
137 ; GFX8-LABEL: v_ssubsat_i8:
138 ; GFX8:       ; %bb.0:
139 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
140 ; GFX8-NEXT:    v_lshlrev_b16_e32 v0, 8, v0
141 ; GFX8-NEXT:    v_max_i16_e32 v2, -1, v0
142 ; GFX8-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
143 ; GFX8-NEXT:    v_subrev_u16_e32 v2, 0x7fff, v2
144 ; GFX8-NEXT:    v_min_i16_e32 v3, -1, v0
145 ; GFX8-NEXT:    v_subrev_u16_e32 v3, 0x8000, v3
146 ; GFX8-NEXT:    v_max_i16_e32 v1, v2, v1
147 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v3
148 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v1
149 ; GFX8-NEXT:    v_ashrrev_i16_e32 v0, 8, v0
150 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
152 ; GFX9-LABEL: v_ssubsat_i8:
153 ; GFX9:       ; %bb.0:
154 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
155 ; GFX9-NEXT:    v_lshlrev_b16_e32 v0, 8, v0
156 ; GFX9-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
157 ; GFX9-NEXT:    v_sub_i16 v0, v0, v1 clamp
158 ; GFX9-NEXT:    v_ashrrev_i16_e32 v0, 8, v0
159 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
161 ; GFX10-LABEL: v_ssubsat_i8:
162 ; GFX10:       ; %bb.0:
163 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
164 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
165 ; GFX10-NEXT:    v_lshlrev_b16 v0, 8, v0
166 ; GFX10-NEXT:    v_lshlrev_b16 v1, 8, v1
167 ; GFX10-NEXT:    v_sub_nc_i16 v0, v0, v1 clamp
168 ; GFX10-NEXT:    v_ashrrev_i16 v0, 8, v0
169 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
170   %result = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
171   ret i8 %result
174 define amdgpu_ps i8 @s_ssubsat_i8(i8 inreg %lhs, i8 inreg %rhs) {
175 ; GFX6-LABEL: s_ssubsat_i8:
176 ; GFX6:       ; %bb.0:
177 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 24
178 ; GFX6-NEXT:    s_max_i32 s2, s0, -1
179 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 24
180 ; GFX6-NEXT:    s_sub_i32 s2, s2, 0x7fffffff
181 ; GFX6-NEXT:    s_min_i32 s3, s0, -1
182 ; GFX6-NEXT:    s_sub_i32 s3, s3, 0x80000000
183 ; GFX6-NEXT:    s_max_i32 s1, s2, s1
184 ; GFX6-NEXT:    s_min_i32 s1, s1, s3
185 ; GFX6-NEXT:    s_sub_i32 s0, s0, s1
186 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 24
187 ; GFX6-NEXT:    ; return to shader part epilog
189 ; GFX8-LABEL: s_ssubsat_i8:
190 ; GFX8:       ; %bb.0:
191 ; GFX8-NEXT:    s_bfe_u32 s2, 8, 0x100000
192 ; GFX8-NEXT:    s_lshl_b32 s0, s0, s2
193 ; GFX8-NEXT:    s_sext_i32_i16 s3, s0
194 ; GFX8-NEXT:    s_sext_i32_i16 s4, -1
195 ; GFX8-NEXT:    s_max_i32 s5, s3, s4
196 ; GFX8-NEXT:    s_lshl_b32 s1, s1, s2
197 ; GFX8-NEXT:    s_sub_i32 s5, s5, 0x7fff
198 ; GFX8-NEXT:    s_min_i32 s3, s3, s4
199 ; GFX8-NEXT:    s_sext_i32_i16 s4, s5
200 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
201 ; GFX8-NEXT:    s_sub_i32 s3, s3, 0xffff8000
202 ; GFX8-NEXT:    s_max_i32 s1, s4, s1
203 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
204 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
205 ; GFX8-NEXT:    s_min_i32 s1, s1, s3
206 ; GFX8-NEXT:    s_sub_i32 s0, s0, s1
207 ; GFX8-NEXT:    s_sext_i32_i16 s0, s0
208 ; GFX8-NEXT:    s_ashr_i32 s0, s0, s2
209 ; GFX8-NEXT:    ; return to shader part epilog
211 ; GFX9-LABEL: s_ssubsat_i8:
212 ; GFX9:       ; %bb.0:
213 ; GFX9-NEXT:    s_bfe_u32 s2, 8, 0x100000
214 ; GFX9-NEXT:    s_lshl_b32 s1, s1, s2
215 ; GFX9-NEXT:    s_lshl_b32 s0, s0, s2
216 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
217 ; GFX9-NEXT:    v_sub_i16 v0, s0, v0 clamp
218 ; GFX9-NEXT:    v_ashrrev_i16_e32 v0, 8, v0
219 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
220 ; GFX9-NEXT:    ; return to shader part epilog
222 ; GFX10-LABEL: s_ssubsat_i8:
223 ; GFX10:       ; %bb.0:
224 ; GFX10-NEXT:    s_bfe_u32 s2, 8, 0x100000
225 ; GFX10-NEXT:    s_lshl_b32 s0, s0, s2
226 ; GFX10-NEXT:    s_lshl_b32 s1, s1, s2
227 ; GFX10-NEXT:    v_sub_nc_i16 v0, s0, s1 clamp
228 ; GFX10-NEXT:    v_ashrrev_i16 v0, 8, v0
229 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
230 ; GFX10-NEXT:    ; return to shader part epilog
231   %result = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
232   ret i8 %result
235 define i16 @v_ssubsat_v2i8(i16 %lhs.arg, i16 %rhs.arg) {
236 ; GFX6-LABEL: v_ssubsat_v2i8:
237 ; GFX6:       ; %bb.0:
238 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
239 ; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
240 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
241 ; GFX6-NEXT:    s_brev_b32 s4, -2
242 ; GFX6-NEXT:    v_max_i32_e32 v4, -1, v0
243 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
244 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
245 ; GFX6-NEXT:    s_brev_b32 s5, 1
246 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s4, v4
247 ; GFX6-NEXT:    v_min_i32_e32 v5, -1, v0
248 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s5, v5
249 ; GFX6-NEXT:    v_max_i32_e32 v1, v4, v1
250 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v5
251 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
252 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
253 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
254 ; GFX6-NEXT:    v_max_i32_e32 v3, -1, v1
255 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, s4, v3
256 ; GFX6-NEXT:    v_min_i32_e32 v4, -1, v1
257 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s5, v4
258 ; GFX6-NEXT:    v_max_i32_e32 v2, v3, v2
259 ; GFX6-NEXT:    v_min_i32_e32 v2, v2, v4
260 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v2
261 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 24, v1
262 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0xff
263 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 24, v0
264 ; GFX6-NEXT:    v_and_b32_e32 v1, v1, v2
265 ; GFX6-NEXT:    v_and_b32_e32 v0, v0, v2
266 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
267 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
268 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
270 ; GFX8-LABEL: v_ssubsat_v2i8:
271 ; GFX8:       ; %bb.0:
272 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
273 ; GFX8-NEXT:    v_mov_b32_e32 v2, 8
274 ; GFX8-NEXT:    v_lshrrev_b32_sdwa v3, v2, v0 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
275 ; GFX8-NEXT:    v_lshlrev_b16_e32 v0, 8, v0
276 ; GFX8-NEXT:    s_movk_i32 s4, 0x7fff
277 ; GFX8-NEXT:    v_max_i16_e32 v4, -1, v0
278 ; GFX8-NEXT:    v_lshrrev_b32_sdwa v2, v2, v1 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
279 ; GFX8-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
280 ; GFX8-NEXT:    s_movk_i32 s5, 0x8000
281 ; GFX8-NEXT:    v_subrev_u16_e32 v4, s4, v4
282 ; GFX8-NEXT:    v_min_i16_e32 v5, -1, v0
283 ; GFX8-NEXT:    v_subrev_u16_e32 v5, s5, v5
284 ; GFX8-NEXT:    v_max_i16_e32 v1, v4, v1
285 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v5
286 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v1
287 ; GFX8-NEXT:    v_max_i16_e32 v1, -1, v3
288 ; GFX8-NEXT:    v_subrev_u16_e32 v1, s4, v1
289 ; GFX8-NEXT:    v_min_i16_e32 v4, -1, v3
290 ; GFX8-NEXT:    v_subrev_u16_e32 v4, s5, v4
291 ; GFX8-NEXT:    v_max_i16_e32 v1, v1, v2
292 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v4
293 ; GFX8-NEXT:    v_sub_u16_e32 v1, v3, v1
294 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0xff
295 ; GFX8-NEXT:    v_and_b32_sdwa v0, sext(v0), v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
296 ; GFX8-NEXT:    v_and_b32_sdwa v1, sext(v1), v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
297 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
298 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
300 ; GFX9-LABEL: v_ssubsat_v2i8:
301 ; GFX9:       ; %bb.0:
302 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
303 ; GFX9-NEXT:    s_mov_b32 s4, 8
304 ; GFX9-NEXT:    v_lshrrev_b32_sdwa v2, s4, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
305 ; GFX9-NEXT:    v_lshrrev_b32_sdwa v3, s4, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
306 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0xffff
307 ; GFX9-NEXT:    v_and_or_b32 v0, v0, v4, v2
308 ; GFX9-NEXT:    v_and_or_b32 v1, v1, v4, v3
309 ; GFX9-NEXT:    v_pk_lshlrev_b16 v0, 8, v0 op_sel_hi:[0,1]
310 ; GFX9-NEXT:    v_pk_lshlrev_b16 v1, 8, v1 op_sel_hi:[0,1]
311 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v1 clamp
312 ; GFX9-NEXT:    v_pk_ashrrev_i16 v0, 8, v0 op_sel_hi:[0,1]
313 ; GFX9-NEXT:    s_movk_i32 s4, 0xff
314 ; GFX9-NEXT:    v_and_b32_sdwa v1, v0, s4 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
315 ; GFX9-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
316 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
318 ; GFX10-LABEL: v_ssubsat_v2i8:
319 ; GFX10:       ; %bb.0:
320 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
321 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
322 ; GFX10-NEXT:    s_mov_b32 s4, 8
323 ; GFX10-NEXT:    v_mov_b32_e32 v2, 0xffff
324 ; GFX10-NEXT:    v_lshrrev_b32_sdwa v3, s4, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
325 ; GFX10-NEXT:    v_lshrrev_b32_sdwa v4, s4, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
326 ; GFX10-NEXT:    s_movk_i32 s4, 0xff
327 ; GFX10-NEXT:    v_and_or_b32 v0, v0, v2, v3
328 ; GFX10-NEXT:    v_and_or_b32 v1, v1, v2, v4
329 ; GFX10-NEXT:    v_pk_lshlrev_b16 v0, 8, v0 op_sel_hi:[0,1]
330 ; GFX10-NEXT:    v_pk_lshlrev_b16 v1, 8, v1 op_sel_hi:[0,1]
331 ; GFX10-NEXT:    v_pk_sub_i16 v0, v0, v1 clamp
332 ; GFX10-NEXT:    v_pk_ashrrev_i16 v0, 8, v0 op_sel_hi:[0,1]
333 ; GFX10-NEXT:    v_and_b32_sdwa v1, v0, s4 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
334 ; GFX10-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
335 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
336   %lhs = bitcast i16 %lhs.arg to <2 x i8>
337   %rhs = bitcast i16 %rhs.arg to <2 x i8>
338   %result = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %lhs, <2 x i8> %rhs)
339   %cast.result = bitcast <2 x i8> %result to i16
340   ret i16 %cast.result
343 define amdgpu_ps i16 @s_ssubsat_v2i8(i16 inreg %lhs.arg, i16 inreg %rhs.arg) {
344 ; GFX6-LABEL: s_ssubsat_v2i8:
345 ; GFX6:       ; %bb.0:
346 ; GFX6-NEXT:    s_lshr_b32 s2, s0, 8
347 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 24
348 ; GFX6-NEXT:    s_brev_b32 s4, -2
349 ; GFX6-NEXT:    s_max_i32 s6, s0, -1
350 ; GFX6-NEXT:    s_lshr_b32 s3, s1, 8
351 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 24
352 ; GFX6-NEXT:    s_brev_b32 s5, 1
353 ; GFX6-NEXT:    s_sub_i32 s6, s6, s4
354 ; GFX6-NEXT:    s_min_i32 s7, s0, -1
355 ; GFX6-NEXT:    s_sub_i32 s7, s7, s5
356 ; GFX6-NEXT:    s_max_i32 s1, s6, s1
357 ; GFX6-NEXT:    s_min_i32 s1, s1, s7
358 ; GFX6-NEXT:    s_sub_i32 s0, s0, s1
359 ; GFX6-NEXT:    s_lshl_b32 s1, s2, 24
360 ; GFX6-NEXT:    s_lshl_b32 s2, s3, 24
361 ; GFX6-NEXT:    s_max_i32 s3, s1, -1
362 ; GFX6-NEXT:    s_sub_i32 s3, s3, s4
363 ; GFX6-NEXT:    s_min_i32 s4, s1, -1
364 ; GFX6-NEXT:    s_sub_i32 s4, s4, s5
365 ; GFX6-NEXT:    s_max_i32 s2, s3, s2
366 ; GFX6-NEXT:    s_min_i32 s2, s2, s4
367 ; GFX6-NEXT:    s_sub_i32 s1, s1, s2
368 ; GFX6-NEXT:    s_ashr_i32 s1, s1, 24
369 ; GFX6-NEXT:    s_movk_i32 s2, 0xff
370 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 24
371 ; GFX6-NEXT:    s_and_b32 s1, s1, s2
372 ; GFX6-NEXT:    s_and_b32 s0, s0, s2
373 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 8
374 ; GFX6-NEXT:    s_or_b32 s0, s0, s1
375 ; GFX6-NEXT:    ; return to shader part epilog
377 ; GFX8-LABEL: s_ssubsat_v2i8:
378 ; GFX8:       ; %bb.0:
379 ; GFX8-NEXT:    s_bfe_u32 s4, 8, 0x100000
380 ; GFX8-NEXT:    s_lshr_b32 s2, s0, 8
381 ; GFX8-NEXT:    s_lshl_b32 s0, s0, s4
382 ; GFX8-NEXT:    s_sext_i32_i16 s7, s0
383 ; GFX8-NEXT:    s_sext_i32_i16 s8, -1
384 ; GFX8-NEXT:    s_movk_i32 s5, 0x7fff
385 ; GFX8-NEXT:    s_max_i32 s9, s7, s8
386 ; GFX8-NEXT:    s_lshr_b32 s3, s1, 8
387 ; GFX8-NEXT:    s_lshl_b32 s1, s1, s4
388 ; GFX8-NEXT:    s_sub_i32 s9, s9, s5
389 ; GFX8-NEXT:    s_movk_i32 s6, 0x8000
390 ; GFX8-NEXT:    s_min_i32 s7, s7, s8
391 ; GFX8-NEXT:    s_sext_i32_i16 s9, s9
392 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
393 ; GFX8-NEXT:    s_sub_i32 s7, s7, s6
394 ; GFX8-NEXT:    s_max_i32 s1, s9, s1
395 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
396 ; GFX8-NEXT:    s_sext_i32_i16 s7, s7
397 ; GFX8-NEXT:    s_min_i32 s1, s1, s7
398 ; GFX8-NEXT:    s_sub_i32 s0, s0, s1
399 ; GFX8-NEXT:    s_lshl_b32 s1, s2, s4
400 ; GFX8-NEXT:    s_lshl_b32 s2, s3, s4
401 ; GFX8-NEXT:    s_sext_i32_i16 s3, s1
402 ; GFX8-NEXT:    s_max_i32 s7, s3, s8
403 ; GFX8-NEXT:    s_sub_i32 s5, s7, s5
404 ; GFX8-NEXT:    s_min_i32 s3, s3, s8
405 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
406 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
407 ; GFX8-NEXT:    s_sub_i32 s3, s3, s6
408 ; GFX8-NEXT:    s_max_i32 s2, s5, s2
409 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
410 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
411 ; GFX8-NEXT:    s_min_i32 s2, s2, s3
412 ; GFX8-NEXT:    s_sub_i32 s1, s1, s2
413 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
414 ; GFX8-NEXT:    s_sext_i32_i16 s0, s0
415 ; GFX8-NEXT:    s_ashr_i32 s1, s1, s4
416 ; GFX8-NEXT:    s_movk_i32 s2, 0xff
417 ; GFX8-NEXT:    s_ashr_i32 s0, s0, s4
418 ; GFX8-NEXT:    s_and_b32 s1, s1, s2
419 ; GFX8-NEXT:    s_and_b32 s0, s0, s2
420 ; GFX8-NEXT:    s_lshl_b32 s1, s1, s4
421 ; GFX8-NEXT:    s_or_b32 s0, s0, s1
422 ; GFX8-NEXT:    ; return to shader part epilog
424 ; GFX9-LABEL: s_ssubsat_v2i8:
425 ; GFX9:       ; %bb.0:
426 ; GFX9-NEXT:    s_lshr_b32 s2, s0, 8
427 ; GFX9-NEXT:    s_lshr_b32 s3, s1, 8
428 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, s2
429 ; GFX9-NEXT:    s_pack_ll_b32_b16 s1, s1, s3
430 ; GFX9-NEXT:    s_mov_b32 s2, 0x80008
431 ; GFX9-NEXT:    s_lshr_b32 s3, s0, 16
432 ; GFX9-NEXT:    s_lshl_b32 s0, s0, s2
433 ; GFX9-NEXT:    s_lshl_b32 s3, s3, 8
434 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, s3
435 ; GFX9-NEXT:    s_lshr_b32 s3, s1, 16
436 ; GFX9-NEXT:    s_lshl_b32 s1, s1, s2
437 ; GFX9-NEXT:    s_lshl_b32 s2, s3, 8
438 ; GFX9-NEXT:    s_pack_ll_b32_b16 s1, s1, s2
439 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
440 ; GFX9-NEXT:    v_pk_sub_i16 v0, s0, v0 clamp
441 ; GFX9-NEXT:    v_pk_ashrrev_i16 v0, 8, v0 op_sel_hi:[0,1]
442 ; GFX9-NEXT:    s_movk_i32 s0, 0xff
443 ; GFX9-NEXT:    v_and_b32_sdwa v1, v0, s0 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
444 ; GFX9-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
445 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
446 ; GFX9-NEXT:    ; return to shader part epilog
448 ; GFX10-LABEL: s_ssubsat_v2i8:
449 ; GFX10:       ; %bb.0:
450 ; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
451 ; GFX10-NEXT:    s_lshr_b32 s3, s1, 8
452 ; GFX10-NEXT:    s_pack_ll_b32_b16 s0, s0, s2
453 ; GFX10-NEXT:    s_pack_ll_b32_b16 s1, s1, s3
454 ; GFX10-NEXT:    s_mov_b32 s2, 0x80008
455 ; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
456 ; GFX10-NEXT:    s_lshr_b32 s4, s1, 16
457 ; GFX10-NEXT:    s_lshl_b32 s0, s0, s2
458 ; GFX10-NEXT:    s_lshl_b32 s3, s3, 8
459 ; GFX10-NEXT:    s_lshl_b32 s1, s1, s2
460 ; GFX10-NEXT:    s_lshl_b32 s2, s4, 8
461 ; GFX10-NEXT:    s_pack_ll_b32_b16 s0, s0, s3
462 ; GFX10-NEXT:    s_pack_ll_b32_b16 s1, s1, s2
463 ; GFX10-NEXT:    v_pk_sub_i16 v0, s0, s1 clamp
464 ; GFX10-NEXT:    s_movk_i32 s0, 0xff
465 ; GFX10-NEXT:    v_pk_ashrrev_i16 v0, 8, v0 op_sel_hi:[0,1]
466 ; GFX10-NEXT:    v_and_b32_sdwa v1, v0, s0 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
467 ; GFX10-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
468 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
469 ; GFX10-NEXT:    ; return to shader part epilog
470   %lhs = bitcast i16 %lhs.arg to <2 x i8>
471   %rhs = bitcast i16 %rhs.arg to <2 x i8>
472   %result = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %lhs, <2 x i8> %rhs)
473   %cast.result = bitcast <2 x i8> %result to i16
474   ret i16 %cast.result
477 define i32 @v_ssubsat_v4i8(i32 %lhs.arg, i32 %rhs.arg) {
478 ; GFX6-LABEL: v_ssubsat_v4i8:
479 ; GFX6:       ; %bb.0:
480 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
481 ; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
482 ; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
483 ; GFX6-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
484 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
485 ; GFX6-NEXT:    s_brev_b32 s4, -2
486 ; GFX6-NEXT:    v_max_i32_e32 v8, -1, v0
487 ; GFX6-NEXT:    v_lshrrev_b32_e32 v5, 8, v1
488 ; GFX6-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
489 ; GFX6-NEXT:    v_lshrrev_b32_e32 v7, 24, v1
490 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
491 ; GFX6-NEXT:    s_brev_b32 s5, 1
492 ; GFX6-NEXT:    v_subrev_i32_e32 v8, vcc, s4, v8
493 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v0
494 ; GFX6-NEXT:    v_subrev_i32_e32 v10, vcc, s5, v10
495 ; GFX6-NEXT:    v_max_i32_e32 v1, v8, v1
496 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v10
497 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
498 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
499 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 24, v5
500 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v1
501 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s4, v5
502 ; GFX6-NEXT:    v_min_i32_e32 v8, -1, v1
503 ; GFX6-NEXT:    v_subrev_i32_e32 v8, vcc, s5, v8
504 ; GFX6-NEXT:    v_max_i32_e32 v2, v5, v2
505 ; GFX6-NEXT:    v_min_i32_e32 v2, v2, v8
506 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v2
507 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 24, v3
508 ; GFX6-NEXT:    v_bfrev_b32_e32 v9, -2
509 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v2
510 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 24, v6
511 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v9
512 ; GFX6-NEXT:    v_min_i32_e32 v6, -1, v2
513 ; GFX6-NEXT:    v_subrev_i32_e32 v6, vcc, s5, v6
514 ; GFX6-NEXT:    v_max_i32_e32 v3, v5, v3
515 ; GFX6-NEXT:    v_min_i32_e32 v3, v3, v6
516 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v3
517 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 24, v4
518 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v3
519 ; GFX6-NEXT:    v_bfrev_b32_e32 v11, 1
520 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 24, v1
521 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 24, v7
522 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v9
523 ; GFX6-NEXT:    v_min_i32_e32 v6, -1, v3
524 ; GFX6-NEXT:    s_movk_i32 s4, 0xff
525 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 24, v0
526 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, v6, v11
527 ; GFX6-NEXT:    v_max_i32_e32 v4, v5, v4
528 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v1
529 ; GFX6-NEXT:    v_ashrrev_i32_e32 v2, 24, v2
530 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v6
531 ; GFX6-NEXT:    v_and_b32_e32 v0, s4, v0
532 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
533 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v3, v4
534 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
535 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v2
536 ; GFX6-NEXT:    v_ashrrev_i32_e32 v3, 24, v3
537 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
538 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
539 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v3
540 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
541 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
542 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
544 ; GFX8-LABEL: v_ssubsat_v4i8:
545 ; GFX8:       ; %bb.0:
546 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
547 ; GFX8-NEXT:    v_mov_b32_e32 v2, 8
548 ; GFX8-NEXT:    v_lshrrev_b32_sdwa v3, v2, v0 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
549 ; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
550 ; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 24, v0
551 ; GFX8-NEXT:    v_lshlrev_b16_e32 v0, 8, v0
552 ; GFX8-NEXT:    s_movk_i32 s4, 0x7fff
553 ; GFX8-NEXT:    v_max_i16_e32 v8, -1, v0
554 ; GFX8-NEXT:    v_lshrrev_b32_sdwa v2, v2, v1 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
555 ; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
556 ; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 24, v1
557 ; GFX8-NEXT:    v_lshlrev_b16_e32 v1, 8, v1
558 ; GFX8-NEXT:    s_movk_i32 s5, 0x8000
559 ; GFX8-NEXT:    v_subrev_u16_e32 v8, s4, v8
560 ; GFX8-NEXT:    v_min_i16_e32 v10, -1, v0
561 ; GFX8-NEXT:    v_subrev_u16_e32 v10, s5, v10
562 ; GFX8-NEXT:    v_max_i16_e32 v1, v8, v1
563 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v10
564 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v1
565 ; GFX8-NEXT:    v_max_i16_e32 v1, -1, v3
566 ; GFX8-NEXT:    v_subrev_u16_e32 v1, s4, v1
567 ; GFX8-NEXT:    v_min_i16_e32 v8, -1, v3
568 ; GFX8-NEXT:    v_subrev_u16_e32 v8, s5, v8
569 ; GFX8-NEXT:    v_max_i16_e32 v1, v1, v2
570 ; GFX8-NEXT:    v_lshlrev_b16_e32 v2, 8, v4
571 ; GFX8-NEXT:    v_mov_b32_e32 v9, 0x7fff
572 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v8
573 ; GFX8-NEXT:    v_max_i16_e32 v4, -1, v2
574 ; GFX8-NEXT:    v_sub_u16_e32 v1, v3, v1
575 ; GFX8-NEXT:    v_lshlrev_b16_e32 v3, 8, v6
576 ; GFX8-NEXT:    v_sub_u16_e32 v4, v4, v9
577 ; GFX8-NEXT:    v_min_i16_e32 v6, -1, v2
578 ; GFX8-NEXT:    v_subrev_u16_e32 v6, s5, v6
579 ; GFX8-NEXT:    v_max_i16_e32 v3, v4, v3
580 ; GFX8-NEXT:    v_min_i16_e32 v3, v3, v6
581 ; GFX8-NEXT:    v_sub_u16_e32 v2, v2, v3
582 ; GFX8-NEXT:    v_lshlrev_b16_e32 v3, 8, v5
583 ; GFX8-NEXT:    v_max_i16_e32 v5, -1, v3
584 ; GFX8-NEXT:    v_lshlrev_b16_e32 v4, 8, v7
585 ; GFX8-NEXT:    v_sub_u16_e32 v5, v5, v9
586 ; GFX8-NEXT:    v_min_i16_e32 v6, -1, v3
587 ; GFX8-NEXT:    v_subrev_u16_e32 v6, 0x8000, v6
588 ; GFX8-NEXT:    v_max_i16_e32 v4, v5, v4
589 ; GFX8-NEXT:    v_min_i16_e32 v4, v4, v6
590 ; GFX8-NEXT:    v_sub_u16_e32 v3, v3, v4
591 ; GFX8-NEXT:    v_mov_b32_e32 v4, 0xff
592 ; GFX8-NEXT:    v_and_b32_sdwa v1, sext(v1), v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
593 ; GFX8-NEXT:    v_and_b32_sdwa v0, sext(v0), v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
594 ; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
595 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
596 ; GFX8-NEXT:    v_and_b32_sdwa v1, sext(v2), v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
597 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
598 ; GFX8-NEXT:    v_and_b32_sdwa v1, sext(v3), v4 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
599 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
600 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
602 ; GFX9-LABEL: v_ssubsat_v4i8:
603 ; GFX9:       ; %bb.0:
604 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
605 ; GFX9-NEXT:    s_mov_b32 s4, 8
606 ; GFX9-NEXT:    v_lshrrev_b32_sdwa v2, s4, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
607 ; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
608 ; GFX9-NEXT:    v_mov_b32_e32 v8, 0xffff
609 ; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
610 ; GFX9-NEXT:    v_lshrrev_b32_sdwa v5, s4, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
611 ; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 24, v1
612 ; GFX9-NEXT:    v_and_or_b32 v0, v0, v8, v2
613 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 16, v4
614 ; GFX9-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
615 ; GFX9-NEXT:    v_and_or_b32 v2, v3, v8, v2
616 ; GFX9-NEXT:    v_and_or_b32 v1, v1, v8, v5
617 ; GFX9-NEXT:    v_lshlrev_b32_e32 v3, 16, v7
618 ; GFX9-NEXT:    v_pk_lshlrev_b16 v0, 8, v0 op_sel_hi:[0,1]
619 ; GFX9-NEXT:    v_and_or_b32 v3, v6, v8, v3
620 ; GFX9-NEXT:    v_pk_lshlrev_b16 v1, 8, v1 op_sel_hi:[0,1]
621 ; GFX9-NEXT:    v_pk_lshlrev_b16 v2, 8, v2 op_sel_hi:[0,1]
622 ; GFX9-NEXT:    v_pk_lshlrev_b16 v3, 8, v3 op_sel_hi:[0,1]
623 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v1 clamp
624 ; GFX9-NEXT:    v_pk_sub_i16 v1, v2, v3 clamp
625 ; GFX9-NEXT:    v_pk_ashrrev_i16 v0, 8, v0 op_sel_hi:[0,1]
626 ; GFX9-NEXT:    v_mov_b32_e32 v2, 8
627 ; GFX9-NEXT:    v_pk_ashrrev_i16 v1, 8, v1 op_sel_hi:[0,1]
628 ; GFX9-NEXT:    s_movk_i32 s4, 0xff
629 ; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
630 ; GFX9-NEXT:    v_and_or_b32 v0, v0, s4, v2
631 ; GFX9-NEXT:    v_and_b32_e32 v2, s4, v1
632 ; GFX9-NEXT:    v_mov_b32_e32 v3, 24
633 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
634 ; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
635 ; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
636 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
638 ; GFX10-LABEL: v_ssubsat_v4i8:
639 ; GFX10:       ; %bb.0:
640 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
641 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
642 ; GFX10-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
643 ; GFX10-NEXT:    v_lshrrev_b32_e32 v5, 24, v1
644 ; GFX10-NEXT:    s_mov_b32 s4, 8
645 ; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
646 ; GFX10-NEXT:    v_lshrrev_b32_sdwa v2, s4, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
647 ; GFX10-NEXT:    v_lshrrev_b32_sdwa v6, s4, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
648 ; GFX10-NEXT:    v_mov_b32_e32 v7, 0xffff
649 ; GFX10-NEXT:    v_lshrrev_b32_e32 v8, 16, v1
650 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
651 ; GFX10-NEXT:    v_lshlrev_b32_e32 v5, 16, v5
652 ; GFX10-NEXT:    s_movk_i32 s4, 0xff
653 ; GFX10-NEXT:    v_and_or_b32 v0, v0, v7, v2
654 ; GFX10-NEXT:    v_and_or_b32 v1, v1, v7, v6
655 ; GFX10-NEXT:    v_and_or_b32 v2, v3, v7, v4
656 ; GFX10-NEXT:    v_and_or_b32 v3, v8, v7, v5
657 ; GFX10-NEXT:    v_mov_b32_e32 v4, 24
658 ; GFX10-NEXT:    v_pk_lshlrev_b16 v0, 8, v0 op_sel_hi:[0,1]
659 ; GFX10-NEXT:    v_pk_lshlrev_b16 v1, 8, v1 op_sel_hi:[0,1]
660 ; GFX10-NEXT:    v_pk_lshlrev_b16 v2, 8, v2 op_sel_hi:[0,1]
661 ; GFX10-NEXT:    v_pk_lshlrev_b16 v3, 8, v3 op_sel_hi:[0,1]
662 ; GFX10-NEXT:    v_pk_sub_i16 v0, v0, v1 clamp
663 ; GFX10-NEXT:    v_pk_sub_i16 v1, v2, v3 clamp
664 ; GFX10-NEXT:    v_mov_b32_e32 v2, 8
665 ; GFX10-NEXT:    v_pk_ashrrev_i16 v0, 8, v0 op_sel_hi:[0,1]
666 ; GFX10-NEXT:    v_pk_ashrrev_i16 v1, 8, v1 op_sel_hi:[0,1]
667 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
668 ; GFX10-NEXT:    v_and_b32_e32 v3, s4, v1
669 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
670 ; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v2
671 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 16, v3
672 ; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
673 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
674   %lhs = bitcast i32 %lhs.arg to <4 x i8>
675   %rhs = bitcast i32 %rhs.arg to <4 x i8>
676   %result = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %lhs, <4 x i8> %rhs)
677   %cast.result = bitcast <4 x i8> %result to i32
678   ret i32 %cast.result
681 define amdgpu_ps i32 @s_ssubsat_v4i8(i32 inreg %lhs.arg, i32 inreg %rhs.arg) {
682 ; GFX6-LABEL: s_ssubsat_v4i8:
683 ; GFX6:       ; %bb.0:
684 ; GFX6-NEXT:    s_lshr_b32 s2, s0, 8
685 ; GFX6-NEXT:    s_lshr_b32 s3, s0, 16
686 ; GFX6-NEXT:    s_lshr_b32 s4, s0, 24
687 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 24
688 ; GFX6-NEXT:    s_brev_b32 s8, -2
689 ; GFX6-NEXT:    s_max_i32 s10, s0, -1
690 ; GFX6-NEXT:    s_lshr_b32 s5, s1, 8
691 ; GFX6-NEXT:    s_lshr_b32 s6, s1, 16
692 ; GFX6-NEXT:    s_lshr_b32 s7, s1, 24
693 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 24
694 ; GFX6-NEXT:    s_brev_b32 s9, 1
695 ; GFX6-NEXT:    s_sub_i32 s10, s10, s8
696 ; GFX6-NEXT:    s_min_i32 s11, s0, -1
697 ; GFX6-NEXT:    s_sub_i32 s11, s11, s9
698 ; GFX6-NEXT:    s_max_i32 s1, s10, s1
699 ; GFX6-NEXT:    s_min_i32 s1, s1, s11
700 ; GFX6-NEXT:    s_sub_i32 s0, s0, s1
701 ; GFX6-NEXT:    s_lshl_b32 s1, s2, 24
702 ; GFX6-NEXT:    s_lshl_b32 s2, s5, 24
703 ; GFX6-NEXT:    s_max_i32 s5, s1, -1
704 ; GFX6-NEXT:    s_sub_i32 s5, s5, s8
705 ; GFX6-NEXT:    s_min_i32 s10, s1, -1
706 ; GFX6-NEXT:    s_sub_i32 s10, s10, s9
707 ; GFX6-NEXT:    s_max_i32 s2, s5, s2
708 ; GFX6-NEXT:    s_min_i32 s2, s2, s10
709 ; GFX6-NEXT:    s_sub_i32 s1, s1, s2
710 ; GFX6-NEXT:    s_lshl_b32 s2, s3, 24
711 ; GFX6-NEXT:    s_max_i32 s5, s2, -1
712 ; GFX6-NEXT:    s_lshl_b32 s3, s6, 24
713 ; GFX6-NEXT:    s_sub_i32 s5, s5, s8
714 ; GFX6-NEXT:    s_min_i32 s6, s2, -1
715 ; GFX6-NEXT:    s_sub_i32 s6, s6, s9
716 ; GFX6-NEXT:    s_max_i32 s3, s5, s3
717 ; GFX6-NEXT:    s_min_i32 s3, s3, s6
718 ; GFX6-NEXT:    s_sub_i32 s2, s2, s3
719 ; GFX6-NEXT:    s_lshl_b32 s3, s4, 24
720 ; GFX6-NEXT:    s_max_i32 s5, s3, -1
721 ; GFX6-NEXT:    s_lshl_b32 s4, s7, 24
722 ; GFX6-NEXT:    s_sub_i32 s5, s5, s8
723 ; GFX6-NEXT:    s_min_i32 s6, s3, -1
724 ; GFX6-NEXT:    s_sub_i32 s6, s6, s9
725 ; GFX6-NEXT:    s_max_i32 s4, s5, s4
726 ; GFX6-NEXT:    s_min_i32 s4, s4, s6
727 ; GFX6-NEXT:    s_ashr_i32 s1, s1, 24
728 ; GFX6-NEXT:    s_sub_i32 s3, s3, s4
729 ; GFX6-NEXT:    s_movk_i32 s4, 0xff
730 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 24
731 ; GFX6-NEXT:    s_and_b32 s1, s1, s4
732 ; GFX6-NEXT:    s_ashr_i32 s2, s2, 24
733 ; GFX6-NEXT:    s_and_b32 s0, s0, s4
734 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 8
735 ; GFX6-NEXT:    s_or_b32 s0, s0, s1
736 ; GFX6-NEXT:    s_and_b32 s1, s2, s4
737 ; GFX6-NEXT:    s_ashr_i32 s3, s3, 24
738 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
739 ; GFX6-NEXT:    s_or_b32 s0, s0, s1
740 ; GFX6-NEXT:    s_and_b32 s1, s3, s4
741 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 24
742 ; GFX6-NEXT:    s_or_b32 s0, s0, s1
743 ; GFX6-NEXT:    ; return to shader part epilog
745 ; GFX8-LABEL: s_ssubsat_v4i8:
746 ; GFX8:       ; %bb.0:
747 ; GFX8-NEXT:    s_bfe_u32 s8, 8, 0x100000
748 ; GFX8-NEXT:    s_lshr_b32 s2, s0, 8
749 ; GFX8-NEXT:    s_lshr_b32 s3, s0, 16
750 ; GFX8-NEXT:    s_lshr_b32 s4, s0, 24
751 ; GFX8-NEXT:    s_lshl_b32 s0, s0, s8
752 ; GFX8-NEXT:    s_sext_i32_i16 s11, s0
753 ; GFX8-NEXT:    s_sext_i32_i16 s12, -1
754 ; GFX8-NEXT:    s_movk_i32 s9, 0x7fff
755 ; GFX8-NEXT:    s_max_i32 s13, s11, s12
756 ; GFX8-NEXT:    s_lshr_b32 s5, s1, 8
757 ; GFX8-NEXT:    s_lshr_b32 s6, s1, 16
758 ; GFX8-NEXT:    s_lshr_b32 s7, s1, 24
759 ; GFX8-NEXT:    s_lshl_b32 s1, s1, s8
760 ; GFX8-NEXT:    s_sub_i32 s13, s13, s9
761 ; GFX8-NEXT:    s_movk_i32 s10, 0x8000
762 ; GFX8-NEXT:    s_min_i32 s11, s11, s12
763 ; GFX8-NEXT:    s_sext_i32_i16 s13, s13
764 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
765 ; GFX8-NEXT:    s_sub_i32 s11, s11, s10
766 ; GFX8-NEXT:    s_max_i32 s1, s13, s1
767 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
768 ; GFX8-NEXT:    s_sext_i32_i16 s11, s11
769 ; GFX8-NEXT:    s_min_i32 s1, s1, s11
770 ; GFX8-NEXT:    s_sub_i32 s0, s0, s1
771 ; GFX8-NEXT:    s_lshl_b32 s1, s2, s8
772 ; GFX8-NEXT:    s_lshl_b32 s2, s5, s8
773 ; GFX8-NEXT:    s_sext_i32_i16 s5, s1
774 ; GFX8-NEXT:    s_max_i32 s11, s5, s12
775 ; GFX8-NEXT:    s_sub_i32 s11, s11, s9
776 ; GFX8-NEXT:    s_min_i32 s5, s5, s12
777 ; GFX8-NEXT:    s_sext_i32_i16 s11, s11
778 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
779 ; GFX8-NEXT:    s_sub_i32 s5, s5, s10
780 ; GFX8-NEXT:    s_max_i32 s2, s11, s2
781 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
782 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
783 ; GFX8-NEXT:    s_min_i32 s2, s2, s5
784 ; GFX8-NEXT:    s_sub_i32 s1, s1, s2
785 ; GFX8-NEXT:    s_lshl_b32 s2, s3, s8
786 ; GFX8-NEXT:    s_sext_i32_i16 s5, s2
787 ; GFX8-NEXT:    s_lshl_b32 s3, s6, s8
788 ; GFX8-NEXT:    s_max_i32 s6, s5, s12
789 ; GFX8-NEXT:    s_sub_i32 s6, s6, s9
790 ; GFX8-NEXT:    s_min_i32 s5, s5, s12
791 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
792 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
793 ; GFX8-NEXT:    s_sub_i32 s5, s5, s10
794 ; GFX8-NEXT:    s_max_i32 s3, s6, s3
795 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
796 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
797 ; GFX8-NEXT:    s_min_i32 s3, s3, s5
798 ; GFX8-NEXT:    s_sub_i32 s2, s2, s3
799 ; GFX8-NEXT:    s_lshl_b32 s3, s4, s8
800 ; GFX8-NEXT:    s_sext_i32_i16 s5, s3
801 ; GFX8-NEXT:    s_max_i32 s6, s5, s12
802 ; GFX8-NEXT:    s_lshl_b32 s4, s7, s8
803 ; GFX8-NEXT:    s_sub_i32 s6, s6, s9
804 ; GFX8-NEXT:    s_min_i32 s5, s5, s12
805 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
806 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
807 ; GFX8-NEXT:    s_sub_i32 s5, s5, s10
808 ; GFX8-NEXT:    s_max_i32 s4, s6, s4
809 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
810 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
811 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
812 ; GFX8-NEXT:    s_min_i32 s4, s4, s5
813 ; GFX8-NEXT:    s_sext_i32_i16 s0, s0
814 ; GFX8-NEXT:    s_ashr_i32 s1, s1, s8
815 ; GFX8-NEXT:    s_sub_i32 s3, s3, s4
816 ; GFX8-NEXT:    s_movk_i32 s4, 0xff
817 ; GFX8-NEXT:    s_ashr_i32 s0, s0, s8
818 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
819 ; GFX8-NEXT:    s_and_b32 s1, s1, s4
820 ; GFX8-NEXT:    s_ashr_i32 s2, s2, s8
821 ; GFX8-NEXT:    s_and_b32 s0, s0, s4
822 ; GFX8-NEXT:    s_lshl_b32 s1, s1, 8
823 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
824 ; GFX8-NEXT:    s_or_b32 s0, s0, s1
825 ; GFX8-NEXT:    s_and_b32 s1, s2, s4
826 ; GFX8-NEXT:    s_ashr_i32 s3, s3, s8
827 ; GFX8-NEXT:    s_lshl_b32 s1, s1, 16
828 ; GFX8-NEXT:    s_or_b32 s0, s0, s1
829 ; GFX8-NEXT:    s_and_b32 s1, s3, s4
830 ; GFX8-NEXT:    s_lshl_b32 s1, s1, 24
831 ; GFX8-NEXT:    s_or_b32 s0, s0, s1
832 ; GFX8-NEXT:    ; return to shader part epilog
834 ; GFX9-LABEL: s_ssubsat_v4i8:
835 ; GFX9:       ; %bb.0:
836 ; GFX9-NEXT:    s_lshr_b32 s3, s0, 8
837 ; GFX9-NEXT:    s_lshr_b32 s4, s0, 16
838 ; GFX9-NEXT:    s_lshr_b32 s6, s0, 24
839 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, s3
840 ; GFX9-NEXT:    s_pack_ll_b32_b16 s3, s4, s6
841 ; GFX9-NEXT:    s_mov_b32 s4, 0x80008
842 ; GFX9-NEXT:    s_lshr_b32 s6, s0, 16
843 ; GFX9-NEXT:    s_lshr_b32 s7, s1, 8
844 ; GFX9-NEXT:    s_lshl_b32 s0, s0, s4
845 ; GFX9-NEXT:    s_lshl_b32 s6, s6, 8
846 ; GFX9-NEXT:    s_lshr_b32 s8, s1, 16
847 ; GFX9-NEXT:    s_lshr_b32 s9, s1, 24
848 ; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s0, s6
849 ; GFX9-NEXT:    s_lshr_b32 s6, s3, 16
850 ; GFX9-NEXT:    s_pack_ll_b32_b16 s1, s1, s7
851 ; GFX9-NEXT:    s_lshl_b32 s3, s3, s4
852 ; GFX9-NEXT:    s_lshl_b32 s6, s6, 8
853 ; GFX9-NEXT:    s_lshr_b32 s7, s1, 16
854 ; GFX9-NEXT:    s_pack_ll_b32_b16 s3, s3, s6
855 ; GFX9-NEXT:    s_pack_ll_b32_b16 s6, s8, s9
856 ; GFX9-NEXT:    s_lshl_b32 s1, s1, s4
857 ; GFX9-NEXT:    s_lshl_b32 s7, s7, 8
858 ; GFX9-NEXT:    s_pack_ll_b32_b16 s1, s1, s7
859 ; GFX9-NEXT:    s_lshr_b32 s7, s6, 16
860 ; GFX9-NEXT:    s_lshl_b32 s4, s6, s4
861 ; GFX9-NEXT:    s_lshl_b32 s6, s7, 8
862 ; GFX9-NEXT:    s_pack_ll_b32_b16 s4, s4, s6
863 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
864 ; GFX9-NEXT:    v_pk_sub_i16 v0, s0, v0 clamp
865 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
866 ; GFX9-NEXT:    s_mov_b32 s2, 8
867 ; GFX9-NEXT:    v_pk_sub_i16 v1, s3, v1 clamp
868 ; GFX9-NEXT:    v_pk_ashrrev_i16 v0, 8, v0 op_sel_hi:[0,1]
869 ; GFX9-NEXT:    v_pk_ashrrev_i16 v1, 8, v1 op_sel_hi:[0,1]
870 ; GFX9-NEXT:    s_movk_i32 s0, 0xff
871 ; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, s2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
872 ; GFX9-NEXT:    s_mov_b32 s5, 24
873 ; GFX9-NEXT:    v_and_or_b32 v0, v0, s0, v2
874 ; GFX9-NEXT:    v_and_b32_e32 v2, s0, v1
875 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
876 ; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s5, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
877 ; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
878 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
879 ; GFX9-NEXT:    ; return to shader part epilog
881 ; GFX10-LABEL: s_ssubsat_v4i8:
882 ; GFX10:       ; %bb.0:
883 ; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
884 ; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
885 ; GFX10-NEXT:    s_lshr_b32 s4, s0, 24
886 ; GFX10-NEXT:    s_pack_ll_b32_b16 s0, s0, s2
887 ; GFX10-NEXT:    s_pack_ll_b32_b16 s2, s3, s4
888 ; GFX10-NEXT:    s_mov_b32 s3, 0x80008
889 ; GFX10-NEXT:    s_lshr_b32 s4, s0, 16
890 ; GFX10-NEXT:    s_lshr_b32 s5, s1, 8
891 ; GFX10-NEXT:    s_lshr_b32 s6, s1, 16
892 ; GFX10-NEXT:    s_lshr_b32 s7, s1, 24
893 ; GFX10-NEXT:    s_lshl_b32 s0, s0, s3
894 ; GFX10-NEXT:    s_lshl_b32 s4, s4, 8
895 ; GFX10-NEXT:    s_pack_ll_b32_b16 s1, s1, s5
896 ; GFX10-NEXT:    s_pack_ll_b32_b16 s0, s0, s4
897 ; GFX10-NEXT:    s_pack_ll_b32_b16 s4, s6, s7
898 ; GFX10-NEXT:    s_lshr_b32 s8, s2, 16
899 ; GFX10-NEXT:    s_lshr_b32 s5, s1, 16
900 ; GFX10-NEXT:    s_lshr_b32 s6, s4, 16
901 ; GFX10-NEXT:    s_lshl_b32 s2, s2, s3
902 ; GFX10-NEXT:    s_lshl_b32 s8, s8, 8
903 ; GFX10-NEXT:    s_lshl_b32 s1, s1, s3
904 ; GFX10-NEXT:    s_lshl_b32 s5, s5, 8
905 ; GFX10-NEXT:    s_lshl_b32 s3, s4, s3
906 ; GFX10-NEXT:    s_lshl_b32 s4, s6, 8
907 ; GFX10-NEXT:    s_pack_ll_b32_b16 s2, s2, s8
908 ; GFX10-NEXT:    s_pack_ll_b32_b16 s1, s1, s5
909 ; GFX10-NEXT:    s_pack_ll_b32_b16 s3, s3, s4
910 ; GFX10-NEXT:    v_pk_sub_i16 v0, s0, s1 clamp
911 ; GFX10-NEXT:    v_pk_sub_i16 v1, s2, s3 clamp
912 ; GFX10-NEXT:    s_mov_b32 s0, 8
913 ; GFX10-NEXT:    s_movk_i32 s1, 0xff
914 ; GFX10-NEXT:    v_pk_ashrrev_i16 v0, 8, v0 op_sel_hi:[0,1]
915 ; GFX10-NEXT:    v_pk_ashrrev_i16 v1, 8, v1 op_sel_hi:[0,1]
916 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, s0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
917 ; GFX10-NEXT:    v_and_b32_e32 v3, s1, v1
918 ; GFX10-NEXT:    s_mov_b32 s0, 24
919 ; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_2
920 ; GFX10-NEXT:    v_and_or_b32 v0, v0, s1, v2
921 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 16, v3
922 ; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
923 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
924 ; GFX10-NEXT:    ; return to shader part epilog
925   %lhs = bitcast i32 %lhs.arg to <4 x i8>
926   %rhs = bitcast i32 %rhs.arg to <4 x i8>
927   %result = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %lhs, <4 x i8> %rhs)
928   %cast.result = bitcast <4 x i8> %result to i32
929   ret i32 %cast.result
932 define i24 @v_ssubsat_i24(i24 %lhs, i24 %rhs) {
933 ; GFX6-LABEL: v_ssubsat_i24:
934 ; GFX6:       ; %bb.0:
935 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
936 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
937 ; GFX6-NEXT:    v_max_i32_e32 v2, -1, v0
938 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
939 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, 0x7fffffff, v2
940 ; GFX6-NEXT:    v_min_i32_e32 v3, -1, v0
941 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, 0x80000000, v3
942 ; GFX6-NEXT:    v_max_i32_e32 v1, v2, v1
943 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v3
944 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
945 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 8, v0
946 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
948 ; GFX8-LABEL: v_ssubsat_i24:
949 ; GFX8:       ; %bb.0:
950 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
951 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, v0, v1
952 ; GFX8-NEXT:    v_bfe_i32 v3, v2, 0, 24
953 ; GFX8-NEXT:    v_bfe_i32 v0, v0, 0, 24
954 ; GFX8-NEXT:    v_cmp_lt_i32_e64 s[4:5], v3, v0
955 ; GFX8-NEXT:    v_bfe_i32 v0, v1, 0, 24
956 ; GFX8-NEXT:    v_cmp_lt_i32_e64 s[6:7], 0, v0
957 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 23, v3
958 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 0xff800000, v0
959 ; GFX8-NEXT:    s_xor_b64 vcc, s[6:7], s[4:5]
960 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc
961 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
963 ; GFX9-LABEL: v_ssubsat_i24:
964 ; GFX9:       ; %bb.0:
965 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
966 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
967 ; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
968 ; GFX9-NEXT:    v_sub_i32 v0, v0, v1 clamp
969 ; GFX9-NEXT:    v_ashrrev_i32_e32 v0, 8, v0
970 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
972 ; GFX10-LABEL: v_ssubsat_i24:
973 ; GFX10:       ; %bb.0:
974 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
975 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
976 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
977 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
978 ; GFX10-NEXT:    v_sub_nc_i32 v0, v0, v1 clamp
979 ; GFX10-NEXT:    v_ashrrev_i32_e32 v0, 8, v0
980 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
981   %result = call i24 @llvm.ssub.sat.i24(i24 %lhs, i24 %rhs)
982   ret i24 %result
985 define amdgpu_ps i24 @s_ssubsat_i24(i24 inreg %lhs, i24 inreg %rhs) {
986 ; GFX6-LABEL: s_ssubsat_i24:
987 ; GFX6:       ; %bb.0:
988 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 8
989 ; GFX6-NEXT:    s_max_i32 s2, s0, -1
990 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 8
991 ; GFX6-NEXT:    s_sub_i32 s2, s2, 0x7fffffff
992 ; GFX6-NEXT:    s_min_i32 s3, s0, -1
993 ; GFX6-NEXT:    s_sub_i32 s3, s3, 0x80000000
994 ; GFX6-NEXT:    s_max_i32 s1, s2, s1
995 ; GFX6-NEXT:    s_min_i32 s1, s1, s3
996 ; GFX6-NEXT:    s_sub_i32 s0, s0, s1
997 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 8
998 ; GFX6-NEXT:    ; return to shader part epilog
1000 ; GFX8-LABEL: s_ssubsat_i24:
1001 ; GFX8:       ; %bb.0:
1002 ; GFX8-NEXT:    s_sub_i32 s2, s0, s1
1003 ; GFX8-NEXT:    s_bfe_i32 s3, s2, 0x180000
1004 ; GFX8-NEXT:    s_bfe_i32 s0, s0, 0x180000
1005 ; GFX8-NEXT:    s_cmp_lt_i32 s3, s0
1006 ; GFX8-NEXT:    s_cselect_b32 s0, 1, 0
1007 ; GFX8-NEXT:    s_bfe_i32 s1, s1, 0x180000
1008 ; GFX8-NEXT:    s_cmp_gt_i32 s1, 0
1009 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
1010 ; GFX8-NEXT:    s_xor_b32 s0, s1, s0
1011 ; GFX8-NEXT:    s_ashr_i32 s1, s3, 23
1012 ; GFX8-NEXT:    s_add_i32 s1, s1, 0xff800000
1013 ; GFX8-NEXT:    s_and_b32 s0, s0, 1
1014 ; GFX8-NEXT:    s_cmp_lg_u32 s0, 0
1015 ; GFX8-NEXT:    s_cselect_b32 s0, s1, s2
1016 ; GFX8-NEXT:    ; return to shader part epilog
1018 ; GFX9-LABEL: s_ssubsat_i24:
1019 ; GFX9:       ; %bb.0:
1020 ; GFX9-NEXT:    s_lshl_b32 s1, s1, 8
1021 ; GFX9-NEXT:    s_lshl_b32 s0, s0, 8
1022 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
1023 ; GFX9-NEXT:    v_sub_i32 v0, s0, v0 clamp
1024 ; GFX9-NEXT:    v_ashrrev_i32_e32 v0, 8, v0
1025 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
1026 ; GFX9-NEXT:    ; return to shader part epilog
1028 ; GFX10-LABEL: s_ssubsat_i24:
1029 ; GFX10:       ; %bb.0:
1030 ; GFX10-NEXT:    s_lshl_b32 s0, s0, 8
1031 ; GFX10-NEXT:    s_lshl_b32 s1, s1, 8
1032 ; GFX10-NEXT:    v_sub_nc_i32 v0, s0, s1 clamp
1033 ; GFX10-NEXT:    v_ashrrev_i32_e32 v0, 8, v0
1034 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1035 ; GFX10-NEXT:    ; return to shader part epilog
1036   %result = call i24 @llvm.ssub.sat.i24(i24 %lhs, i24 %rhs)
1037   ret i24 %result
1040 define i32 @v_ssubsat_i32(i32 %lhs, i32 %rhs) {
1041 ; GFX6-LABEL: v_ssubsat_i32:
1042 ; GFX6:       ; %bb.0:
1043 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1044 ; GFX6-NEXT:    v_max_i32_e32 v2, -1, v0
1045 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, 0x7fffffff, v2
1046 ; GFX6-NEXT:    v_min_i32_e32 v3, -1, v0
1047 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, 0x80000000, v3
1048 ; GFX6-NEXT:    v_max_i32_e32 v1, v2, v1
1049 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v3
1050 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
1051 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1053 ; GFX8-LABEL: v_ssubsat_i32:
1054 ; GFX8:       ; %bb.0:
1055 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1056 ; GFX8-NEXT:    v_max_i32_e32 v2, -1, v0
1057 ; GFX8-NEXT:    v_subrev_u32_e32 v2, vcc, 0x7fffffff, v2
1058 ; GFX8-NEXT:    v_min_i32_e32 v3, -1, v0
1059 ; GFX8-NEXT:    v_subrev_u32_e32 v3, vcc, 0x80000000, v3
1060 ; GFX8-NEXT:    v_max_i32_e32 v1, v2, v1
1061 ; GFX8-NEXT:    v_min_i32_e32 v1, v1, v3
1062 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v1
1063 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1065 ; GFX9-LABEL: v_ssubsat_i32:
1066 ; GFX9:       ; %bb.0:
1067 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1068 ; GFX9-NEXT:    v_sub_i32 v0, v0, v1 clamp
1069 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1071 ; GFX10-LABEL: v_ssubsat_i32:
1072 ; GFX10:       ; %bb.0:
1073 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1074 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1075 ; GFX10-NEXT:    v_sub_nc_i32 v0, v0, v1 clamp
1076 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1077   %result = call i32 @llvm.ssub.sat.i32(i32 %lhs, i32 %rhs)
1078   ret i32 %result
1081 define amdgpu_ps i32 @s_ssubsat_i32(i32 inreg %lhs, i32 inreg %rhs) {
1082 ; GFX6-LABEL: s_ssubsat_i32:
1083 ; GFX6:       ; %bb.0:
1084 ; GFX6-NEXT:    s_max_i32 s2, s0, -1
1085 ; GFX6-NEXT:    s_sub_i32 s2, s2, 0x7fffffff
1086 ; GFX6-NEXT:    s_min_i32 s3, s0, -1
1087 ; GFX6-NEXT:    s_sub_i32 s3, s3, 0x80000000
1088 ; GFX6-NEXT:    s_max_i32 s1, s2, s1
1089 ; GFX6-NEXT:    s_min_i32 s1, s1, s3
1090 ; GFX6-NEXT:    s_sub_i32 s0, s0, s1
1091 ; GFX6-NEXT:    ; return to shader part epilog
1093 ; GFX8-LABEL: s_ssubsat_i32:
1094 ; GFX8:       ; %bb.0:
1095 ; GFX8-NEXT:    s_max_i32 s2, s0, -1
1096 ; GFX8-NEXT:    s_sub_i32 s2, s2, 0x7fffffff
1097 ; GFX8-NEXT:    s_min_i32 s3, s0, -1
1098 ; GFX8-NEXT:    s_sub_i32 s3, s3, 0x80000000
1099 ; GFX8-NEXT:    s_max_i32 s1, s2, s1
1100 ; GFX8-NEXT:    s_min_i32 s1, s1, s3
1101 ; GFX8-NEXT:    s_sub_i32 s0, s0, s1
1102 ; GFX8-NEXT:    ; return to shader part epilog
1104 ; GFX9-LABEL: s_ssubsat_i32:
1105 ; GFX9:       ; %bb.0:
1106 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
1107 ; GFX9-NEXT:    v_sub_i32 v0, s0, v0 clamp
1108 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
1109 ; GFX9-NEXT:    ; return to shader part epilog
1111 ; GFX10-LABEL: s_ssubsat_i32:
1112 ; GFX10:       ; %bb.0:
1113 ; GFX10-NEXT:    v_sub_nc_i32 v0, s0, s1 clamp
1114 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1115 ; GFX10-NEXT:    ; return to shader part epilog
1116   %result = call i32 @llvm.ssub.sat.i32(i32 %lhs, i32 %rhs)
1117   ret i32 %result
1120 define amdgpu_ps float @ssubsat_i32_sv(i32 inreg %lhs, i32 %rhs) {
1121 ; GFX6-LABEL: ssubsat_i32_sv:
1122 ; GFX6:       ; %bb.0:
1123 ; GFX6-NEXT:    s_max_i32 s1, s0, -1
1124 ; GFX6-NEXT:    s_sub_i32 s1, s1, 0x7fffffff
1125 ; GFX6-NEXT:    s_min_i32 s2, s0, -1
1126 ; GFX6-NEXT:    s_sub_i32 s2, s2, 0x80000000
1127 ; GFX6-NEXT:    v_max_i32_e32 v0, s1, v0
1128 ; GFX6-NEXT:    v_min_i32_e32 v0, s2, v0
1129 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s0, v0
1130 ; GFX6-NEXT:    ; return to shader part epilog
1132 ; GFX8-LABEL: ssubsat_i32_sv:
1133 ; GFX8:       ; %bb.0:
1134 ; GFX8-NEXT:    s_max_i32 s1, s0, -1
1135 ; GFX8-NEXT:    s_sub_i32 s1, s1, 0x7fffffff
1136 ; GFX8-NEXT:    s_min_i32 s2, s0, -1
1137 ; GFX8-NEXT:    s_sub_i32 s2, s2, 0x80000000
1138 ; GFX8-NEXT:    v_max_i32_e32 v0, s1, v0
1139 ; GFX8-NEXT:    v_min_i32_e32 v0, s2, v0
1140 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, s0, v0
1141 ; GFX8-NEXT:    ; return to shader part epilog
1143 ; GFX9-LABEL: ssubsat_i32_sv:
1144 ; GFX9:       ; %bb.0:
1145 ; GFX9-NEXT:    v_sub_i32 v0, s0, v0 clamp
1146 ; GFX9-NEXT:    ; return to shader part epilog
1148 ; GFX10-LABEL: ssubsat_i32_sv:
1149 ; GFX10:       ; %bb.0:
1150 ; GFX10-NEXT:    v_sub_nc_i32 v0, s0, v0 clamp
1151 ; GFX10-NEXT:    ; return to shader part epilog
1152   %result = call i32 @llvm.ssub.sat.i32(i32 %lhs, i32 %rhs)
1153   %cast = bitcast i32 %result to float
1154   ret float %cast
1157 define amdgpu_ps float @ssubsat_i32_vs(i32 %lhs, i32 inreg %rhs) {
1158 ; GFX6-LABEL: ssubsat_i32_vs:
1159 ; GFX6:       ; %bb.0:
1160 ; GFX6-NEXT:    v_max_i32_e32 v1, -1, v0
1161 ; GFX6-NEXT:    v_subrev_i32_e32 v1, vcc, 0x7fffffff, v1
1162 ; GFX6-NEXT:    v_min_i32_e32 v2, -1, v0
1163 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, 0x80000000, v2
1164 ; GFX6-NEXT:    v_max_i32_e32 v1, s0, v1
1165 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v2
1166 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
1167 ; GFX6-NEXT:    ; return to shader part epilog
1169 ; GFX8-LABEL: ssubsat_i32_vs:
1170 ; GFX8:       ; %bb.0:
1171 ; GFX8-NEXT:    v_max_i32_e32 v1, -1, v0
1172 ; GFX8-NEXT:    v_subrev_u32_e32 v1, vcc, 0x7fffffff, v1
1173 ; GFX8-NEXT:    v_min_i32_e32 v2, -1, v0
1174 ; GFX8-NEXT:    v_subrev_u32_e32 v2, vcc, 0x80000000, v2
1175 ; GFX8-NEXT:    v_max_i32_e32 v1, s0, v1
1176 ; GFX8-NEXT:    v_min_i32_e32 v1, v1, v2
1177 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v1
1178 ; GFX8-NEXT:    ; return to shader part epilog
1180 ; GFX9-LABEL: ssubsat_i32_vs:
1181 ; GFX9:       ; %bb.0:
1182 ; GFX9-NEXT:    v_sub_i32 v0, v0, s0 clamp
1183 ; GFX9-NEXT:    ; return to shader part epilog
1185 ; GFX10-LABEL: ssubsat_i32_vs:
1186 ; GFX10:       ; %bb.0:
1187 ; GFX10-NEXT:    v_sub_nc_i32 v0, v0, s0 clamp
1188 ; GFX10-NEXT:    ; return to shader part epilog
1189   %result = call i32 @llvm.ssub.sat.i32(i32 %lhs, i32 %rhs)
1190   %cast = bitcast i32 %result to float
1191   ret float %cast
1194 define <2 x i32> @v_ssubsat_v2i32(<2 x i32> %lhs, <2 x i32> %rhs) {
1195 ; GFX6-LABEL: v_ssubsat_v2i32:
1196 ; GFX6:       ; %bb.0:
1197 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1198 ; GFX6-NEXT:    s_brev_b32 s4, -2
1199 ; GFX6-NEXT:    v_max_i32_e32 v4, -1, v0
1200 ; GFX6-NEXT:    s_brev_b32 s5, 1
1201 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s4, v4
1202 ; GFX6-NEXT:    v_min_i32_e32 v5, -1, v0
1203 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s5, v5
1204 ; GFX6-NEXT:    v_max_i32_e32 v2, v4, v2
1205 ; GFX6-NEXT:    v_min_i32_e32 v2, v2, v5
1206 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2
1207 ; GFX6-NEXT:    v_max_i32_e32 v2, -1, v1
1208 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s4, v2
1209 ; GFX6-NEXT:    v_min_i32_e32 v4, -1, v1
1210 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s5, v4
1211 ; GFX6-NEXT:    v_max_i32_e32 v2, v2, v3
1212 ; GFX6-NEXT:    v_min_i32_e32 v2, v2, v4
1213 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v2
1214 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1216 ; GFX8-LABEL: v_ssubsat_v2i32:
1217 ; GFX8:       ; %bb.0:
1218 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1219 ; GFX8-NEXT:    s_brev_b32 s4, -2
1220 ; GFX8-NEXT:    v_max_i32_e32 v4, -1, v0
1221 ; GFX8-NEXT:    s_brev_b32 s5, 1
1222 ; GFX8-NEXT:    v_subrev_u32_e32 v4, vcc, s4, v4
1223 ; GFX8-NEXT:    v_min_i32_e32 v5, -1, v0
1224 ; GFX8-NEXT:    v_subrev_u32_e32 v5, vcc, s5, v5
1225 ; GFX8-NEXT:    v_max_i32_e32 v2, v4, v2
1226 ; GFX8-NEXT:    v_min_i32_e32 v2, v2, v5
1227 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v2
1228 ; GFX8-NEXT:    v_max_i32_e32 v2, -1, v1
1229 ; GFX8-NEXT:    v_subrev_u32_e32 v2, vcc, s4, v2
1230 ; GFX8-NEXT:    v_min_i32_e32 v4, -1, v1
1231 ; GFX8-NEXT:    v_subrev_u32_e32 v4, vcc, s5, v4
1232 ; GFX8-NEXT:    v_max_i32_e32 v2, v2, v3
1233 ; GFX8-NEXT:    v_min_i32_e32 v2, v2, v4
1234 ; GFX8-NEXT:    v_sub_u32_e32 v1, vcc, v1, v2
1235 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1237 ; GFX9-LABEL: v_ssubsat_v2i32:
1238 ; GFX9:       ; %bb.0:
1239 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1240 ; GFX9-NEXT:    v_sub_i32 v0, v0, v2 clamp
1241 ; GFX9-NEXT:    v_sub_i32 v1, v1, v3 clamp
1242 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1244 ; GFX10-LABEL: v_ssubsat_v2i32:
1245 ; GFX10:       ; %bb.0:
1246 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1247 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1248 ; GFX10-NEXT:    v_sub_nc_i32 v0, v0, v2 clamp
1249 ; GFX10-NEXT:    v_sub_nc_i32 v1, v1, v3 clamp
1250 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1251   %result = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %lhs, <2 x i32> %rhs)
1252   ret <2 x i32> %result
1255 define amdgpu_ps <2 x i32> @s_ssubsat_v2i32(<2 x i32> inreg %lhs, <2 x i32> inreg %rhs) {
1256 ; GFX6-LABEL: s_ssubsat_v2i32:
1257 ; GFX6:       ; %bb.0:
1258 ; GFX6-NEXT:    s_brev_b32 s4, -2
1259 ; GFX6-NEXT:    s_max_i32 s6, s0, -1
1260 ; GFX6-NEXT:    s_brev_b32 s5, 1
1261 ; GFX6-NEXT:    s_sub_i32 s6, s6, s4
1262 ; GFX6-NEXT:    s_min_i32 s7, s0, -1
1263 ; GFX6-NEXT:    s_sub_i32 s7, s7, s5
1264 ; GFX6-NEXT:    s_max_i32 s2, s6, s2
1265 ; GFX6-NEXT:    s_min_i32 s2, s2, s7
1266 ; GFX6-NEXT:    s_sub_i32 s0, s0, s2
1267 ; GFX6-NEXT:    s_max_i32 s2, s1, -1
1268 ; GFX6-NEXT:    s_sub_i32 s2, s2, s4
1269 ; GFX6-NEXT:    s_min_i32 s4, s1, -1
1270 ; GFX6-NEXT:    s_sub_i32 s4, s4, s5
1271 ; GFX6-NEXT:    s_max_i32 s2, s2, s3
1272 ; GFX6-NEXT:    s_min_i32 s2, s2, s4
1273 ; GFX6-NEXT:    s_sub_i32 s1, s1, s2
1274 ; GFX6-NEXT:    ; return to shader part epilog
1276 ; GFX8-LABEL: s_ssubsat_v2i32:
1277 ; GFX8:       ; %bb.0:
1278 ; GFX8-NEXT:    s_brev_b32 s4, -2
1279 ; GFX8-NEXT:    s_max_i32 s6, s0, -1
1280 ; GFX8-NEXT:    s_brev_b32 s5, 1
1281 ; GFX8-NEXT:    s_sub_i32 s6, s6, s4
1282 ; GFX8-NEXT:    s_min_i32 s7, s0, -1
1283 ; GFX8-NEXT:    s_sub_i32 s7, s7, s5
1284 ; GFX8-NEXT:    s_max_i32 s2, s6, s2
1285 ; GFX8-NEXT:    s_min_i32 s2, s2, s7
1286 ; GFX8-NEXT:    s_sub_i32 s0, s0, s2
1287 ; GFX8-NEXT:    s_max_i32 s2, s1, -1
1288 ; GFX8-NEXT:    s_sub_i32 s2, s2, s4
1289 ; GFX8-NEXT:    s_min_i32 s4, s1, -1
1290 ; GFX8-NEXT:    s_sub_i32 s4, s4, s5
1291 ; GFX8-NEXT:    s_max_i32 s2, s2, s3
1292 ; GFX8-NEXT:    s_min_i32 s2, s2, s4
1293 ; GFX8-NEXT:    s_sub_i32 s1, s1, s2
1294 ; GFX8-NEXT:    ; return to shader part epilog
1296 ; GFX9-LABEL: s_ssubsat_v2i32:
1297 ; GFX9:       ; %bb.0:
1298 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
1299 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
1300 ; GFX9-NEXT:    v_sub_i32 v0, s0, v0 clamp
1301 ; GFX9-NEXT:    v_sub_i32 v1, s1, v1 clamp
1302 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
1303 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
1304 ; GFX9-NEXT:    ; return to shader part epilog
1306 ; GFX10-LABEL: s_ssubsat_v2i32:
1307 ; GFX10:       ; %bb.0:
1308 ; GFX10-NEXT:    v_sub_nc_i32 v0, s0, s2 clamp
1309 ; GFX10-NEXT:    v_sub_nc_i32 v1, s1, s3 clamp
1310 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1311 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
1312 ; GFX10-NEXT:    ; return to shader part epilog
1313   %result = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %lhs, <2 x i32> %rhs)
1314   ret <2 x i32> %result
1317 define <3 x i32> @v_ssubsat_v3i32(<3 x i32> %lhs, <3 x i32> %rhs) {
1318 ; GFX6-LABEL: v_ssubsat_v3i32:
1319 ; GFX6:       ; %bb.0:
1320 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1321 ; GFX6-NEXT:    s_brev_b32 s4, -2
1322 ; GFX6-NEXT:    v_max_i32_e32 v6, -1, v0
1323 ; GFX6-NEXT:    s_brev_b32 s5, 1
1324 ; GFX6-NEXT:    v_subrev_i32_e32 v6, vcc, s4, v6
1325 ; GFX6-NEXT:    v_min_i32_e32 v7, -1, v0
1326 ; GFX6-NEXT:    v_subrev_i32_e32 v7, vcc, s5, v7
1327 ; GFX6-NEXT:    v_max_i32_e32 v3, v6, v3
1328 ; GFX6-NEXT:    v_min_i32_e32 v3, v3, v7
1329 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v3
1330 ; GFX6-NEXT:    v_max_i32_e32 v3, -1, v1
1331 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, s4, v3
1332 ; GFX6-NEXT:    v_min_i32_e32 v6, -1, v1
1333 ; GFX6-NEXT:    v_subrev_i32_e32 v6, vcc, s5, v6
1334 ; GFX6-NEXT:    v_max_i32_e32 v3, v3, v4
1335 ; GFX6-NEXT:    v_min_i32_e32 v3, v3, v6
1336 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v3
1337 ; GFX6-NEXT:    v_max_i32_e32 v3, -1, v2
1338 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, s4, v3
1339 ; GFX6-NEXT:    v_min_i32_e32 v4, -1, v2
1340 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s5, v4
1341 ; GFX6-NEXT:    v_max_i32_e32 v3, v3, v5
1342 ; GFX6-NEXT:    v_min_i32_e32 v3, v3, v4
1343 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v3
1344 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1346 ; GFX8-LABEL: v_ssubsat_v3i32:
1347 ; GFX8:       ; %bb.0:
1348 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1349 ; GFX8-NEXT:    s_brev_b32 s4, -2
1350 ; GFX8-NEXT:    v_max_i32_e32 v6, -1, v0
1351 ; GFX8-NEXT:    s_brev_b32 s5, 1
1352 ; GFX8-NEXT:    v_subrev_u32_e32 v6, vcc, s4, v6
1353 ; GFX8-NEXT:    v_min_i32_e32 v7, -1, v0
1354 ; GFX8-NEXT:    v_subrev_u32_e32 v7, vcc, s5, v7
1355 ; GFX8-NEXT:    v_max_i32_e32 v3, v6, v3
1356 ; GFX8-NEXT:    v_min_i32_e32 v3, v3, v7
1357 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v3
1358 ; GFX8-NEXT:    v_max_i32_e32 v3, -1, v1
1359 ; GFX8-NEXT:    v_subrev_u32_e32 v3, vcc, s4, v3
1360 ; GFX8-NEXT:    v_min_i32_e32 v6, -1, v1
1361 ; GFX8-NEXT:    v_subrev_u32_e32 v6, vcc, s5, v6
1362 ; GFX8-NEXT:    v_max_i32_e32 v3, v3, v4
1363 ; GFX8-NEXT:    v_min_i32_e32 v3, v3, v6
1364 ; GFX8-NEXT:    v_sub_u32_e32 v1, vcc, v1, v3
1365 ; GFX8-NEXT:    v_max_i32_e32 v3, -1, v2
1366 ; GFX8-NEXT:    v_subrev_u32_e32 v3, vcc, s4, v3
1367 ; GFX8-NEXT:    v_min_i32_e32 v4, -1, v2
1368 ; GFX8-NEXT:    v_subrev_u32_e32 v4, vcc, s5, v4
1369 ; GFX8-NEXT:    v_max_i32_e32 v3, v3, v5
1370 ; GFX8-NEXT:    v_min_i32_e32 v3, v3, v4
1371 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, v2, v3
1372 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1374 ; GFX9-LABEL: v_ssubsat_v3i32:
1375 ; GFX9:       ; %bb.0:
1376 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1377 ; GFX9-NEXT:    v_sub_i32 v0, v0, v3 clamp
1378 ; GFX9-NEXT:    v_sub_i32 v1, v1, v4 clamp
1379 ; GFX9-NEXT:    v_sub_i32 v2, v2, v5 clamp
1380 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1382 ; GFX10-LABEL: v_ssubsat_v3i32:
1383 ; GFX10:       ; %bb.0:
1384 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1385 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1386 ; GFX10-NEXT:    v_sub_nc_i32 v0, v0, v3 clamp
1387 ; GFX10-NEXT:    v_sub_nc_i32 v1, v1, v4 clamp
1388 ; GFX10-NEXT:    v_sub_nc_i32 v2, v2, v5 clamp
1389 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1390   %result = call <3 x i32> @llvm.ssub.sat.v3i32(<3 x i32> %lhs, <3 x i32> %rhs)
1391   ret <3 x i32> %result
1394 define amdgpu_ps <3 x i32> @s_ssubsat_v3i32(<3 x i32> inreg %lhs, <3 x i32> inreg %rhs) {
1395 ; GFX6-LABEL: s_ssubsat_v3i32:
1396 ; GFX6:       ; %bb.0:
1397 ; GFX6-NEXT:    s_brev_b32 s6, -2
1398 ; GFX6-NEXT:    s_max_i32 s8, s0, -1
1399 ; GFX6-NEXT:    s_brev_b32 s7, 1
1400 ; GFX6-NEXT:    s_sub_i32 s8, s8, s6
1401 ; GFX6-NEXT:    s_min_i32 s9, s0, -1
1402 ; GFX6-NEXT:    s_sub_i32 s9, s9, s7
1403 ; GFX6-NEXT:    s_max_i32 s3, s8, s3
1404 ; GFX6-NEXT:    s_min_i32 s3, s3, s9
1405 ; GFX6-NEXT:    s_sub_i32 s0, s0, s3
1406 ; GFX6-NEXT:    s_max_i32 s3, s1, -1
1407 ; GFX6-NEXT:    s_sub_i32 s3, s3, s6
1408 ; GFX6-NEXT:    s_min_i32 s8, s1, -1
1409 ; GFX6-NEXT:    s_sub_i32 s8, s8, s7
1410 ; GFX6-NEXT:    s_max_i32 s3, s3, s4
1411 ; GFX6-NEXT:    s_min_i32 s3, s3, s8
1412 ; GFX6-NEXT:    s_sub_i32 s1, s1, s3
1413 ; GFX6-NEXT:    s_max_i32 s3, s2, -1
1414 ; GFX6-NEXT:    s_sub_i32 s3, s3, s6
1415 ; GFX6-NEXT:    s_min_i32 s4, s2, -1
1416 ; GFX6-NEXT:    s_sub_i32 s4, s4, s7
1417 ; GFX6-NEXT:    s_max_i32 s3, s3, s5
1418 ; GFX6-NEXT:    s_min_i32 s3, s3, s4
1419 ; GFX6-NEXT:    s_sub_i32 s2, s2, s3
1420 ; GFX6-NEXT:    ; return to shader part epilog
1422 ; GFX8-LABEL: s_ssubsat_v3i32:
1423 ; GFX8:       ; %bb.0:
1424 ; GFX8-NEXT:    s_brev_b32 s6, -2
1425 ; GFX8-NEXT:    s_max_i32 s8, s0, -1
1426 ; GFX8-NEXT:    s_brev_b32 s7, 1
1427 ; GFX8-NEXT:    s_sub_i32 s8, s8, s6
1428 ; GFX8-NEXT:    s_min_i32 s9, s0, -1
1429 ; GFX8-NEXT:    s_sub_i32 s9, s9, s7
1430 ; GFX8-NEXT:    s_max_i32 s3, s8, s3
1431 ; GFX8-NEXT:    s_min_i32 s3, s3, s9
1432 ; GFX8-NEXT:    s_sub_i32 s0, s0, s3
1433 ; GFX8-NEXT:    s_max_i32 s3, s1, -1
1434 ; GFX8-NEXT:    s_sub_i32 s3, s3, s6
1435 ; GFX8-NEXT:    s_min_i32 s8, s1, -1
1436 ; GFX8-NEXT:    s_sub_i32 s8, s8, s7
1437 ; GFX8-NEXT:    s_max_i32 s3, s3, s4
1438 ; GFX8-NEXT:    s_min_i32 s3, s3, s8
1439 ; GFX8-NEXT:    s_sub_i32 s1, s1, s3
1440 ; GFX8-NEXT:    s_max_i32 s3, s2, -1
1441 ; GFX8-NEXT:    s_sub_i32 s3, s3, s6
1442 ; GFX8-NEXT:    s_min_i32 s4, s2, -1
1443 ; GFX8-NEXT:    s_sub_i32 s4, s4, s7
1444 ; GFX8-NEXT:    s_max_i32 s3, s3, s5
1445 ; GFX8-NEXT:    s_min_i32 s3, s3, s4
1446 ; GFX8-NEXT:    s_sub_i32 s2, s2, s3
1447 ; GFX8-NEXT:    ; return to shader part epilog
1449 ; GFX9-LABEL: s_ssubsat_v3i32:
1450 ; GFX9:       ; %bb.0:
1451 ; GFX9-NEXT:    v_mov_b32_e32 v0, s3
1452 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
1453 ; GFX9-NEXT:    v_mov_b32_e32 v2, s5
1454 ; GFX9-NEXT:    v_sub_i32 v0, s0, v0 clamp
1455 ; GFX9-NEXT:    v_sub_i32 v1, s1, v1 clamp
1456 ; GFX9-NEXT:    v_sub_i32 v2, s2, v2 clamp
1457 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
1458 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
1459 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
1460 ; GFX9-NEXT:    ; return to shader part epilog
1462 ; GFX10-LABEL: s_ssubsat_v3i32:
1463 ; GFX10:       ; %bb.0:
1464 ; GFX10-NEXT:    v_sub_nc_i32 v0, s0, s3 clamp
1465 ; GFX10-NEXT:    v_sub_nc_i32 v1, s1, s4 clamp
1466 ; GFX10-NEXT:    v_sub_nc_i32 v2, s2, s5 clamp
1467 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1468 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
1469 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
1470 ; GFX10-NEXT:    ; return to shader part epilog
1471   %result = call <3 x i32> @llvm.ssub.sat.v3i32(<3 x i32> %lhs, <3 x i32> %rhs)
1472   ret <3 x i32> %result
1475 define <4 x i32> @v_ssubsat_v4i32(<4 x i32> %lhs, <4 x i32> %rhs) {
1476 ; GFX6-LABEL: v_ssubsat_v4i32:
1477 ; GFX6:       ; %bb.0:
1478 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1479 ; GFX6-NEXT:    s_brev_b32 s4, -2
1480 ; GFX6-NEXT:    v_max_i32_e32 v8, -1, v0
1481 ; GFX6-NEXT:    s_brev_b32 s5, 1
1482 ; GFX6-NEXT:    v_subrev_i32_e32 v8, vcc, s4, v8
1483 ; GFX6-NEXT:    v_min_i32_e32 v9, -1, v0
1484 ; GFX6-NEXT:    v_subrev_i32_e32 v9, vcc, s5, v9
1485 ; GFX6-NEXT:    v_max_i32_e32 v4, v8, v4
1486 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v9
1487 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v4
1488 ; GFX6-NEXT:    v_max_i32_e32 v4, -1, v1
1489 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s4, v4
1490 ; GFX6-NEXT:    v_min_i32_e32 v8, -1, v1
1491 ; GFX6-NEXT:    v_subrev_i32_e32 v8, vcc, s5, v8
1492 ; GFX6-NEXT:    v_max_i32_e32 v4, v4, v5
1493 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v8
1494 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v4
1495 ; GFX6-NEXT:    v_max_i32_e32 v4, -1, v2
1496 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s4, v4
1497 ; GFX6-NEXT:    v_min_i32_e32 v5, -1, v2
1498 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s5, v5
1499 ; GFX6-NEXT:    v_max_i32_e32 v4, v4, v6
1500 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v5
1501 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v4
1502 ; GFX6-NEXT:    v_max_i32_e32 v4, -1, v3
1503 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, 0x7fffffff, v4
1504 ; GFX6-NEXT:    v_min_i32_e32 v5, -1, v3
1505 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, 0x80000000, v5
1506 ; GFX6-NEXT:    v_max_i32_e32 v4, v4, v7
1507 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v5
1508 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v3, v4
1509 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1511 ; GFX8-LABEL: v_ssubsat_v4i32:
1512 ; GFX8:       ; %bb.0:
1513 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1514 ; GFX8-NEXT:    s_brev_b32 s4, -2
1515 ; GFX8-NEXT:    v_max_i32_e32 v8, -1, v0
1516 ; GFX8-NEXT:    s_brev_b32 s5, 1
1517 ; GFX8-NEXT:    v_subrev_u32_e32 v8, vcc, s4, v8
1518 ; GFX8-NEXT:    v_min_i32_e32 v9, -1, v0
1519 ; GFX8-NEXT:    v_subrev_u32_e32 v9, vcc, s5, v9
1520 ; GFX8-NEXT:    v_max_i32_e32 v4, v8, v4
1521 ; GFX8-NEXT:    v_min_i32_e32 v4, v4, v9
1522 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v4
1523 ; GFX8-NEXT:    v_max_i32_e32 v4, -1, v1
1524 ; GFX8-NEXT:    v_subrev_u32_e32 v4, vcc, s4, v4
1525 ; GFX8-NEXT:    v_min_i32_e32 v8, -1, v1
1526 ; GFX8-NEXT:    v_subrev_u32_e32 v8, vcc, s5, v8
1527 ; GFX8-NEXT:    v_max_i32_e32 v4, v4, v5
1528 ; GFX8-NEXT:    v_min_i32_e32 v4, v4, v8
1529 ; GFX8-NEXT:    v_sub_u32_e32 v1, vcc, v1, v4
1530 ; GFX8-NEXT:    v_max_i32_e32 v4, -1, v2
1531 ; GFX8-NEXT:    v_subrev_u32_e32 v4, vcc, s4, v4
1532 ; GFX8-NEXT:    v_min_i32_e32 v5, -1, v2
1533 ; GFX8-NEXT:    v_subrev_u32_e32 v5, vcc, s5, v5
1534 ; GFX8-NEXT:    v_max_i32_e32 v4, v4, v6
1535 ; GFX8-NEXT:    v_min_i32_e32 v4, v4, v5
1536 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, v2, v4
1537 ; GFX8-NEXT:    v_max_i32_e32 v4, -1, v3
1538 ; GFX8-NEXT:    v_subrev_u32_e32 v4, vcc, 0x7fffffff, v4
1539 ; GFX8-NEXT:    v_min_i32_e32 v5, -1, v3
1540 ; GFX8-NEXT:    v_subrev_u32_e32 v5, vcc, 0x80000000, v5
1541 ; GFX8-NEXT:    v_max_i32_e32 v4, v4, v7
1542 ; GFX8-NEXT:    v_min_i32_e32 v4, v4, v5
1543 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, v3, v4
1544 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1546 ; GFX9-LABEL: v_ssubsat_v4i32:
1547 ; GFX9:       ; %bb.0:
1548 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1549 ; GFX9-NEXT:    v_sub_i32 v0, v0, v4 clamp
1550 ; GFX9-NEXT:    v_sub_i32 v1, v1, v5 clamp
1551 ; GFX9-NEXT:    v_sub_i32 v2, v2, v6 clamp
1552 ; GFX9-NEXT:    v_sub_i32 v3, v3, v7 clamp
1553 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1555 ; GFX10-LABEL: v_ssubsat_v4i32:
1556 ; GFX10:       ; %bb.0:
1557 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1558 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1559 ; GFX10-NEXT:    v_sub_nc_i32 v0, v0, v4 clamp
1560 ; GFX10-NEXT:    v_sub_nc_i32 v1, v1, v5 clamp
1561 ; GFX10-NEXT:    v_sub_nc_i32 v2, v2, v6 clamp
1562 ; GFX10-NEXT:    v_sub_nc_i32 v3, v3, v7 clamp
1563 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1564   %result = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %lhs, <4 x i32> %rhs)
1565   ret <4 x i32> %result
1568 define amdgpu_ps <4 x i32> @s_ssubsat_v4i32(<4 x i32> inreg %lhs, <4 x i32> inreg %rhs) {
1569 ; GFX6-LABEL: s_ssubsat_v4i32:
1570 ; GFX6:       ; %bb.0:
1571 ; GFX6-NEXT:    s_brev_b32 s8, -2
1572 ; GFX6-NEXT:    s_max_i32 s10, s0, -1
1573 ; GFX6-NEXT:    s_brev_b32 s9, 1
1574 ; GFX6-NEXT:    s_sub_i32 s10, s10, s8
1575 ; GFX6-NEXT:    s_min_i32 s11, s0, -1
1576 ; GFX6-NEXT:    s_sub_i32 s11, s11, s9
1577 ; GFX6-NEXT:    s_max_i32 s4, s10, s4
1578 ; GFX6-NEXT:    s_min_i32 s4, s4, s11
1579 ; GFX6-NEXT:    s_sub_i32 s0, s0, s4
1580 ; GFX6-NEXT:    s_max_i32 s4, s1, -1
1581 ; GFX6-NEXT:    s_sub_i32 s4, s4, s8
1582 ; GFX6-NEXT:    s_min_i32 s10, s1, -1
1583 ; GFX6-NEXT:    s_sub_i32 s10, s10, s9
1584 ; GFX6-NEXT:    s_max_i32 s4, s4, s5
1585 ; GFX6-NEXT:    s_min_i32 s4, s4, s10
1586 ; GFX6-NEXT:    s_sub_i32 s1, s1, s4
1587 ; GFX6-NEXT:    s_max_i32 s4, s2, -1
1588 ; GFX6-NEXT:    s_sub_i32 s4, s4, s8
1589 ; GFX6-NEXT:    s_min_i32 s5, s2, -1
1590 ; GFX6-NEXT:    s_sub_i32 s5, s5, s9
1591 ; GFX6-NEXT:    s_max_i32 s4, s4, s6
1592 ; GFX6-NEXT:    s_min_i32 s4, s4, s5
1593 ; GFX6-NEXT:    s_sub_i32 s2, s2, s4
1594 ; GFX6-NEXT:    s_max_i32 s4, s3, -1
1595 ; GFX6-NEXT:    s_sub_i32 s4, s4, s8
1596 ; GFX6-NEXT:    s_min_i32 s5, s3, -1
1597 ; GFX6-NEXT:    s_sub_i32 s5, s5, s9
1598 ; GFX6-NEXT:    s_max_i32 s4, s4, s7
1599 ; GFX6-NEXT:    s_min_i32 s4, s4, s5
1600 ; GFX6-NEXT:    s_sub_i32 s3, s3, s4
1601 ; GFX6-NEXT:    ; return to shader part epilog
1603 ; GFX8-LABEL: s_ssubsat_v4i32:
1604 ; GFX8:       ; %bb.0:
1605 ; GFX8-NEXT:    s_brev_b32 s8, -2
1606 ; GFX8-NEXT:    s_max_i32 s10, s0, -1
1607 ; GFX8-NEXT:    s_brev_b32 s9, 1
1608 ; GFX8-NEXT:    s_sub_i32 s10, s10, s8
1609 ; GFX8-NEXT:    s_min_i32 s11, s0, -1
1610 ; GFX8-NEXT:    s_sub_i32 s11, s11, s9
1611 ; GFX8-NEXT:    s_max_i32 s4, s10, s4
1612 ; GFX8-NEXT:    s_min_i32 s4, s4, s11
1613 ; GFX8-NEXT:    s_sub_i32 s0, s0, s4
1614 ; GFX8-NEXT:    s_max_i32 s4, s1, -1
1615 ; GFX8-NEXT:    s_sub_i32 s4, s4, s8
1616 ; GFX8-NEXT:    s_min_i32 s10, s1, -1
1617 ; GFX8-NEXT:    s_sub_i32 s10, s10, s9
1618 ; GFX8-NEXT:    s_max_i32 s4, s4, s5
1619 ; GFX8-NEXT:    s_min_i32 s4, s4, s10
1620 ; GFX8-NEXT:    s_sub_i32 s1, s1, s4
1621 ; GFX8-NEXT:    s_max_i32 s4, s2, -1
1622 ; GFX8-NEXT:    s_sub_i32 s4, s4, s8
1623 ; GFX8-NEXT:    s_min_i32 s5, s2, -1
1624 ; GFX8-NEXT:    s_sub_i32 s5, s5, s9
1625 ; GFX8-NEXT:    s_max_i32 s4, s4, s6
1626 ; GFX8-NEXT:    s_min_i32 s4, s4, s5
1627 ; GFX8-NEXT:    s_sub_i32 s2, s2, s4
1628 ; GFX8-NEXT:    s_max_i32 s4, s3, -1
1629 ; GFX8-NEXT:    s_sub_i32 s4, s4, s8
1630 ; GFX8-NEXT:    s_min_i32 s5, s3, -1
1631 ; GFX8-NEXT:    s_sub_i32 s5, s5, s9
1632 ; GFX8-NEXT:    s_max_i32 s4, s4, s7
1633 ; GFX8-NEXT:    s_min_i32 s4, s4, s5
1634 ; GFX8-NEXT:    s_sub_i32 s3, s3, s4
1635 ; GFX8-NEXT:    ; return to shader part epilog
1637 ; GFX9-LABEL: s_ssubsat_v4i32:
1638 ; GFX9:       ; %bb.0:
1639 ; GFX9-NEXT:    v_mov_b32_e32 v0, s4
1640 ; GFX9-NEXT:    v_mov_b32_e32 v1, s5
1641 ; GFX9-NEXT:    v_mov_b32_e32 v2, s6
1642 ; GFX9-NEXT:    v_mov_b32_e32 v3, s7
1643 ; GFX9-NEXT:    v_sub_i32 v0, s0, v0 clamp
1644 ; GFX9-NEXT:    v_sub_i32 v1, s1, v1 clamp
1645 ; GFX9-NEXT:    v_sub_i32 v2, s2, v2 clamp
1646 ; GFX9-NEXT:    v_sub_i32 v3, s3, v3 clamp
1647 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
1648 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
1649 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
1650 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
1651 ; GFX9-NEXT:    ; return to shader part epilog
1653 ; GFX10-LABEL: s_ssubsat_v4i32:
1654 ; GFX10:       ; %bb.0:
1655 ; GFX10-NEXT:    v_sub_nc_i32 v0, s0, s4 clamp
1656 ; GFX10-NEXT:    v_sub_nc_i32 v1, s1, s5 clamp
1657 ; GFX10-NEXT:    v_sub_nc_i32 v2, s2, s6 clamp
1658 ; GFX10-NEXT:    v_sub_nc_i32 v3, s3, s7 clamp
1659 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1660 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
1661 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
1662 ; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
1663 ; GFX10-NEXT:    ; return to shader part epilog
1664   %result = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %lhs, <4 x i32> %rhs)
1665   ret <4 x i32> %result
1668 define <5 x i32> @v_ssubsat_v5i32(<5 x i32> %lhs, <5 x i32> %rhs) {
1669 ; GFX6-LABEL: v_ssubsat_v5i32:
1670 ; GFX6:       ; %bb.0:
1671 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1672 ; GFX6-NEXT:    s_brev_b32 s4, -2
1673 ; GFX6-NEXT:    v_max_i32_e32 v10, -1, v0
1674 ; GFX6-NEXT:    s_brev_b32 s5, 1
1675 ; GFX6-NEXT:    v_subrev_i32_e32 v10, vcc, s4, v10
1676 ; GFX6-NEXT:    v_min_i32_e32 v12, -1, v0
1677 ; GFX6-NEXT:    v_subrev_i32_e32 v12, vcc, s5, v12
1678 ; GFX6-NEXT:    v_max_i32_e32 v5, v10, v5
1679 ; GFX6-NEXT:    v_min_i32_e32 v5, v5, v12
1680 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v5
1681 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v1
1682 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s4, v5
1683 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v1
1684 ; GFX6-NEXT:    v_subrev_i32_e32 v10, vcc, s5, v10
1685 ; GFX6-NEXT:    v_max_i32_e32 v5, v5, v6
1686 ; GFX6-NEXT:    v_min_i32_e32 v5, v5, v10
1687 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v5
1688 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v2
1689 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s4, v5
1690 ; GFX6-NEXT:    v_min_i32_e32 v6, -1, v2
1691 ; GFX6-NEXT:    v_subrev_i32_e32 v6, vcc, s5, v6
1692 ; GFX6-NEXT:    v_max_i32_e32 v5, v5, v7
1693 ; GFX6-NEXT:    v_min_i32_e32 v5, v5, v6
1694 ; GFX6-NEXT:    v_bfrev_b32_e32 v11, -2
1695 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v5
1696 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v3
1697 ; GFX6-NEXT:    v_bfrev_b32_e32 v13, 1
1698 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v11
1699 ; GFX6-NEXT:    v_min_i32_e32 v6, -1, v3
1700 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, v6, v13
1701 ; GFX6-NEXT:    v_max_i32_e32 v5, v5, v8
1702 ; GFX6-NEXT:    v_min_i32_e32 v5, v5, v6
1703 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v3, v5
1704 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v4
1705 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v11
1706 ; GFX6-NEXT:    v_min_i32_e32 v6, -1, v4
1707 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, v6, v13
1708 ; GFX6-NEXT:    v_max_i32_e32 v5, v5, v9
1709 ; GFX6-NEXT:    v_min_i32_e32 v5, v5, v6
1710 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, v4, v5
1711 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1713 ; GFX8-LABEL: v_ssubsat_v5i32:
1714 ; GFX8:       ; %bb.0:
1715 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1716 ; GFX8-NEXT:    s_brev_b32 s4, -2
1717 ; GFX8-NEXT:    v_max_i32_e32 v10, -1, v0
1718 ; GFX8-NEXT:    s_brev_b32 s5, 1
1719 ; GFX8-NEXT:    v_subrev_u32_e32 v10, vcc, s4, v10
1720 ; GFX8-NEXT:    v_min_i32_e32 v12, -1, v0
1721 ; GFX8-NEXT:    v_subrev_u32_e32 v12, vcc, s5, v12
1722 ; GFX8-NEXT:    v_max_i32_e32 v5, v10, v5
1723 ; GFX8-NEXT:    v_min_i32_e32 v5, v5, v12
1724 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v5
1725 ; GFX8-NEXT:    v_max_i32_e32 v5, -1, v1
1726 ; GFX8-NEXT:    v_subrev_u32_e32 v5, vcc, s4, v5
1727 ; GFX8-NEXT:    v_min_i32_e32 v10, -1, v1
1728 ; GFX8-NEXT:    v_subrev_u32_e32 v10, vcc, s5, v10
1729 ; GFX8-NEXT:    v_max_i32_e32 v5, v5, v6
1730 ; GFX8-NEXT:    v_min_i32_e32 v5, v5, v10
1731 ; GFX8-NEXT:    v_sub_u32_e32 v1, vcc, v1, v5
1732 ; GFX8-NEXT:    v_max_i32_e32 v5, -1, v2
1733 ; GFX8-NEXT:    v_subrev_u32_e32 v5, vcc, s4, v5
1734 ; GFX8-NEXT:    v_min_i32_e32 v6, -1, v2
1735 ; GFX8-NEXT:    v_subrev_u32_e32 v6, vcc, s5, v6
1736 ; GFX8-NEXT:    v_max_i32_e32 v5, v5, v7
1737 ; GFX8-NEXT:    v_min_i32_e32 v5, v5, v6
1738 ; GFX8-NEXT:    v_bfrev_b32_e32 v11, -2
1739 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, v2, v5
1740 ; GFX8-NEXT:    v_max_i32_e32 v5, -1, v3
1741 ; GFX8-NEXT:    v_bfrev_b32_e32 v13, 1
1742 ; GFX8-NEXT:    v_sub_u32_e32 v5, vcc, v5, v11
1743 ; GFX8-NEXT:    v_min_i32_e32 v6, -1, v3
1744 ; GFX8-NEXT:    v_sub_u32_e32 v6, vcc, v6, v13
1745 ; GFX8-NEXT:    v_max_i32_e32 v5, v5, v8
1746 ; GFX8-NEXT:    v_min_i32_e32 v5, v5, v6
1747 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, v3, v5
1748 ; GFX8-NEXT:    v_max_i32_e32 v5, -1, v4
1749 ; GFX8-NEXT:    v_sub_u32_e32 v5, vcc, v5, v11
1750 ; GFX8-NEXT:    v_min_i32_e32 v6, -1, v4
1751 ; GFX8-NEXT:    v_sub_u32_e32 v6, vcc, v6, v13
1752 ; GFX8-NEXT:    v_max_i32_e32 v5, v5, v9
1753 ; GFX8-NEXT:    v_min_i32_e32 v5, v5, v6
1754 ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, v4, v5
1755 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1757 ; GFX9-LABEL: v_ssubsat_v5i32:
1758 ; GFX9:       ; %bb.0:
1759 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1760 ; GFX9-NEXT:    v_sub_i32 v0, v0, v5 clamp
1761 ; GFX9-NEXT:    v_sub_i32 v1, v1, v6 clamp
1762 ; GFX9-NEXT:    v_sub_i32 v2, v2, v7 clamp
1763 ; GFX9-NEXT:    v_sub_i32 v3, v3, v8 clamp
1764 ; GFX9-NEXT:    v_sub_i32 v4, v4, v9 clamp
1765 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1767 ; GFX10-LABEL: v_ssubsat_v5i32:
1768 ; GFX10:       ; %bb.0:
1769 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1770 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1771 ; GFX10-NEXT:    v_sub_nc_i32 v0, v0, v5 clamp
1772 ; GFX10-NEXT:    v_sub_nc_i32 v1, v1, v6 clamp
1773 ; GFX10-NEXT:    v_sub_nc_i32 v2, v2, v7 clamp
1774 ; GFX10-NEXT:    v_sub_nc_i32 v3, v3, v8 clamp
1775 ; GFX10-NEXT:    v_sub_nc_i32 v4, v4, v9 clamp
1776 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1777   %result = call <5 x i32> @llvm.ssub.sat.v5i32(<5 x i32> %lhs, <5 x i32> %rhs)
1778   ret <5 x i32> %result
1781 define amdgpu_ps <5 x i32> @s_ssubsat_v5i32(<5 x i32> inreg %lhs, <5 x i32> inreg %rhs) {
1782 ; GFX6-LABEL: s_ssubsat_v5i32:
1783 ; GFX6:       ; %bb.0:
1784 ; GFX6-NEXT:    s_brev_b32 s10, -2
1785 ; GFX6-NEXT:    s_max_i32 s12, s0, -1
1786 ; GFX6-NEXT:    s_brev_b32 s11, 1
1787 ; GFX6-NEXT:    s_sub_i32 s12, s12, s10
1788 ; GFX6-NEXT:    s_min_i32 s13, s0, -1
1789 ; GFX6-NEXT:    s_sub_i32 s13, s13, s11
1790 ; GFX6-NEXT:    s_max_i32 s5, s12, s5
1791 ; GFX6-NEXT:    s_min_i32 s5, s5, s13
1792 ; GFX6-NEXT:    s_sub_i32 s0, s0, s5
1793 ; GFX6-NEXT:    s_max_i32 s5, s1, -1
1794 ; GFX6-NEXT:    s_sub_i32 s5, s5, s10
1795 ; GFX6-NEXT:    s_min_i32 s12, s1, -1
1796 ; GFX6-NEXT:    s_sub_i32 s12, s12, s11
1797 ; GFX6-NEXT:    s_max_i32 s5, s5, s6
1798 ; GFX6-NEXT:    s_min_i32 s5, s5, s12
1799 ; GFX6-NEXT:    s_sub_i32 s1, s1, s5
1800 ; GFX6-NEXT:    s_max_i32 s5, s2, -1
1801 ; GFX6-NEXT:    s_sub_i32 s5, s5, s10
1802 ; GFX6-NEXT:    s_min_i32 s6, s2, -1
1803 ; GFX6-NEXT:    s_sub_i32 s6, s6, s11
1804 ; GFX6-NEXT:    s_max_i32 s5, s5, s7
1805 ; GFX6-NEXT:    s_min_i32 s5, s5, s6
1806 ; GFX6-NEXT:    s_sub_i32 s2, s2, s5
1807 ; GFX6-NEXT:    s_max_i32 s5, s3, -1
1808 ; GFX6-NEXT:    s_sub_i32 s5, s5, s10
1809 ; GFX6-NEXT:    s_min_i32 s6, s3, -1
1810 ; GFX6-NEXT:    s_sub_i32 s6, s6, s11
1811 ; GFX6-NEXT:    s_max_i32 s5, s5, s8
1812 ; GFX6-NEXT:    s_min_i32 s5, s5, s6
1813 ; GFX6-NEXT:    s_sub_i32 s3, s3, s5
1814 ; GFX6-NEXT:    s_max_i32 s5, s4, -1
1815 ; GFX6-NEXT:    s_sub_i32 s5, s5, s10
1816 ; GFX6-NEXT:    s_min_i32 s6, s4, -1
1817 ; GFX6-NEXT:    s_sub_i32 s6, s6, s11
1818 ; GFX6-NEXT:    s_max_i32 s5, s5, s9
1819 ; GFX6-NEXT:    s_min_i32 s5, s5, s6
1820 ; GFX6-NEXT:    s_sub_i32 s4, s4, s5
1821 ; GFX6-NEXT:    ; return to shader part epilog
1823 ; GFX8-LABEL: s_ssubsat_v5i32:
1824 ; GFX8:       ; %bb.0:
1825 ; GFX8-NEXT:    s_brev_b32 s10, -2
1826 ; GFX8-NEXT:    s_max_i32 s12, s0, -1
1827 ; GFX8-NEXT:    s_brev_b32 s11, 1
1828 ; GFX8-NEXT:    s_sub_i32 s12, s12, s10
1829 ; GFX8-NEXT:    s_min_i32 s13, s0, -1
1830 ; GFX8-NEXT:    s_sub_i32 s13, s13, s11
1831 ; GFX8-NEXT:    s_max_i32 s5, s12, s5
1832 ; GFX8-NEXT:    s_min_i32 s5, s5, s13
1833 ; GFX8-NEXT:    s_sub_i32 s0, s0, s5
1834 ; GFX8-NEXT:    s_max_i32 s5, s1, -1
1835 ; GFX8-NEXT:    s_sub_i32 s5, s5, s10
1836 ; GFX8-NEXT:    s_min_i32 s12, s1, -1
1837 ; GFX8-NEXT:    s_sub_i32 s12, s12, s11
1838 ; GFX8-NEXT:    s_max_i32 s5, s5, s6
1839 ; GFX8-NEXT:    s_min_i32 s5, s5, s12
1840 ; GFX8-NEXT:    s_sub_i32 s1, s1, s5
1841 ; GFX8-NEXT:    s_max_i32 s5, s2, -1
1842 ; GFX8-NEXT:    s_sub_i32 s5, s5, s10
1843 ; GFX8-NEXT:    s_min_i32 s6, s2, -1
1844 ; GFX8-NEXT:    s_sub_i32 s6, s6, s11
1845 ; GFX8-NEXT:    s_max_i32 s5, s5, s7
1846 ; GFX8-NEXT:    s_min_i32 s5, s5, s6
1847 ; GFX8-NEXT:    s_sub_i32 s2, s2, s5
1848 ; GFX8-NEXT:    s_max_i32 s5, s3, -1
1849 ; GFX8-NEXT:    s_sub_i32 s5, s5, s10
1850 ; GFX8-NEXT:    s_min_i32 s6, s3, -1
1851 ; GFX8-NEXT:    s_sub_i32 s6, s6, s11
1852 ; GFX8-NEXT:    s_max_i32 s5, s5, s8
1853 ; GFX8-NEXT:    s_min_i32 s5, s5, s6
1854 ; GFX8-NEXT:    s_sub_i32 s3, s3, s5
1855 ; GFX8-NEXT:    s_max_i32 s5, s4, -1
1856 ; GFX8-NEXT:    s_sub_i32 s5, s5, s10
1857 ; GFX8-NEXT:    s_min_i32 s6, s4, -1
1858 ; GFX8-NEXT:    s_sub_i32 s6, s6, s11
1859 ; GFX8-NEXT:    s_max_i32 s5, s5, s9
1860 ; GFX8-NEXT:    s_min_i32 s5, s5, s6
1861 ; GFX8-NEXT:    s_sub_i32 s4, s4, s5
1862 ; GFX8-NEXT:    ; return to shader part epilog
1864 ; GFX9-LABEL: s_ssubsat_v5i32:
1865 ; GFX9:       ; %bb.0:
1866 ; GFX9-NEXT:    v_mov_b32_e32 v0, s5
1867 ; GFX9-NEXT:    v_mov_b32_e32 v1, s6
1868 ; GFX9-NEXT:    v_mov_b32_e32 v2, s7
1869 ; GFX9-NEXT:    v_mov_b32_e32 v3, s8
1870 ; GFX9-NEXT:    v_mov_b32_e32 v4, s9
1871 ; GFX9-NEXT:    v_sub_i32 v0, s0, v0 clamp
1872 ; GFX9-NEXT:    v_sub_i32 v1, s1, v1 clamp
1873 ; GFX9-NEXT:    v_sub_i32 v2, s2, v2 clamp
1874 ; GFX9-NEXT:    v_sub_i32 v3, s3, v3 clamp
1875 ; GFX9-NEXT:    v_sub_i32 v4, s4, v4 clamp
1876 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
1877 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
1878 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
1879 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
1880 ; GFX9-NEXT:    v_readfirstlane_b32 s4, v4
1881 ; GFX9-NEXT:    ; return to shader part epilog
1883 ; GFX10-LABEL: s_ssubsat_v5i32:
1884 ; GFX10:       ; %bb.0:
1885 ; GFX10-NEXT:    v_sub_nc_i32 v0, s0, s5 clamp
1886 ; GFX10-NEXT:    v_sub_nc_i32 v1, s1, s6 clamp
1887 ; GFX10-NEXT:    v_sub_nc_i32 v2, s2, s7 clamp
1888 ; GFX10-NEXT:    v_sub_nc_i32 v3, s3, s8 clamp
1889 ; GFX10-NEXT:    v_sub_nc_i32 v4, s4, s9 clamp
1890 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1891 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
1892 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
1893 ; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
1894 ; GFX10-NEXT:    v_readfirstlane_b32 s4, v4
1895 ; GFX10-NEXT:    ; return to shader part epilog
1896   %result = call <5 x i32> @llvm.ssub.sat.v5i32(<5 x i32> %lhs, <5 x i32> %rhs)
1897   ret <5 x i32> %result
1900 define <16 x i32> @v_ssubsat_v16i32(<16 x i32> %lhs, <16 x i32> %rhs) {
1901 ; GFX6-LABEL: v_ssubsat_v16i32:
1902 ; GFX6:       ; %bb.0:
1903 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1904 ; GFX6-NEXT:    s_brev_b32 s4, -2
1905 ; GFX6-NEXT:    v_max_i32_e32 v31, -1, v0
1906 ; GFX6-NEXT:    v_subrev_i32_e32 v31, vcc, s4, v31
1907 ; GFX6-NEXT:    v_max_i32_e32 v16, v31, v16
1908 ; GFX6-NEXT:    s_brev_b32 s5, 1
1909 ; GFX6-NEXT:    v_min_i32_e32 v31, -1, v0
1910 ; GFX6-NEXT:    v_subrev_i32_e32 v31, vcc, s5, v31
1911 ; GFX6-NEXT:    v_min_i32_e32 v16, v16, v31
1912 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v16
1913 ; GFX6-NEXT:    v_max_i32_e32 v16, -1, v1
1914 ; GFX6-NEXT:    v_subrev_i32_e32 v16, vcc, s4, v16
1915 ; GFX6-NEXT:    v_max_i32_e32 v16, v16, v17
1916 ; GFX6-NEXT:    v_min_i32_e32 v17, -1, v1
1917 ; GFX6-NEXT:    v_subrev_i32_e32 v17, vcc, s5, v17
1918 ; GFX6-NEXT:    v_min_i32_e32 v16, v16, v17
1919 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v16
1920 ; GFX6-NEXT:    v_max_i32_e32 v16, -1, v2
1921 ; GFX6-NEXT:    v_subrev_i32_e32 v16, vcc, s4, v16
1922 ; GFX6-NEXT:    v_min_i32_e32 v17, -1, v2
1923 ; GFX6-NEXT:    v_max_i32_e32 v16, v16, v18
1924 ; GFX6-NEXT:    v_subrev_i32_e32 v17, vcc, s5, v17
1925 ; GFX6-NEXT:    v_min_i32_e32 v16, v16, v17
1926 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v16
1927 ; GFX6-NEXT:    v_bfrev_b32_e32 v16, -2
1928 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v3
1929 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1930 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v19
1931 ; GFX6-NEXT:    v_bfrev_b32_e32 v18, 1
1932 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v3
1933 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1934 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1935 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v3, v17
1936 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v4
1937 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1938 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v20
1939 ; GFX6-NEXT:    buffer_load_dword v20, off, s[0:3], s32
1940 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v4
1941 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1942 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1943 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, v4, v17
1944 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v5
1945 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1946 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v5
1947 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v21
1948 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1949 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1950 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v17
1951 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v6
1952 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1953 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v6
1954 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v22
1955 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1956 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1957 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, v6, v17
1958 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v7
1959 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1960 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v7
1961 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v23
1962 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1963 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1964 ; GFX6-NEXT:    v_sub_i32_e32 v7, vcc, v7, v17
1965 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v8
1966 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1967 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v8
1968 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v24
1969 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1970 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1971 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, v8, v17
1972 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v9
1973 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1974 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v9
1975 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v25
1976 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1977 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1978 ; GFX6-NEXT:    v_sub_i32_e32 v9, vcc, v9, v17
1979 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v10
1980 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1981 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v10
1982 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v26
1983 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1984 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1985 ; GFX6-NEXT:    v_sub_i32_e32 v10, vcc, v10, v17
1986 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v11
1987 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1988 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v11
1989 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v27
1990 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1991 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1992 ; GFX6-NEXT:    v_sub_i32_e32 v11, vcc, v11, v17
1993 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v12
1994 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
1995 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v12
1996 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v28
1997 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
1998 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
1999 ; GFX6-NEXT:    v_sub_i32_e32 v12, vcc, v12, v17
2000 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v13
2001 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
2002 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v13
2003 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v29
2004 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
2005 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
2006 ; GFX6-NEXT:    v_sub_i32_e32 v13, vcc, v13, v17
2007 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v14
2008 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v16
2009 ; GFX6-NEXT:    v_min_i32_e32 v19, -1, v14
2010 ; GFX6-NEXT:    v_max_i32_e32 v17, v17, v30
2011 ; GFX6-NEXT:    v_sub_i32_e32 v19, vcc, v19, v18
2012 ; GFX6-NEXT:    v_min_i32_e32 v17, v17, v19
2013 ; GFX6-NEXT:    v_sub_i32_e32 v14, vcc, v14, v17
2014 ; GFX6-NEXT:    v_max_i32_e32 v17, -1, v15
2015 ; GFX6-NEXT:    v_sub_i32_e32 v16, vcc, v17, v16
2016 ; GFX6-NEXT:    v_min_i32_e32 v17, -1, v15
2017 ; GFX6-NEXT:    v_sub_i32_e32 v17, vcc, v17, v18
2018 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2019 ; GFX6-NEXT:    v_max_i32_e32 v16, v16, v20
2020 ; GFX6-NEXT:    v_min_i32_e32 v16, v16, v17
2021 ; GFX6-NEXT:    v_sub_i32_e32 v15, vcc, v15, v16
2022 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
2024 ; GFX8-LABEL: v_ssubsat_v16i32:
2025 ; GFX8:       ; %bb.0:
2026 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2027 ; GFX8-NEXT:    s_brev_b32 s4, -2
2028 ; GFX8-NEXT:    v_max_i32_e32 v31, -1, v0
2029 ; GFX8-NEXT:    v_subrev_u32_e32 v31, vcc, s4, v31
2030 ; GFX8-NEXT:    v_max_i32_e32 v16, v31, v16
2031 ; GFX8-NEXT:    s_brev_b32 s5, 1
2032 ; GFX8-NEXT:    v_min_i32_e32 v31, -1, v0
2033 ; GFX8-NEXT:    v_subrev_u32_e32 v31, vcc, s5, v31
2034 ; GFX8-NEXT:    v_min_i32_e32 v16, v16, v31
2035 ; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v16
2036 ; GFX8-NEXT:    v_max_i32_e32 v16, -1, v1
2037 ; GFX8-NEXT:    v_subrev_u32_e32 v16, vcc, s4, v16
2038 ; GFX8-NEXT:    v_max_i32_e32 v16, v16, v17
2039 ; GFX8-NEXT:    v_min_i32_e32 v17, -1, v1
2040 ; GFX8-NEXT:    v_subrev_u32_e32 v17, vcc, s5, v17
2041 ; GFX8-NEXT:    v_min_i32_e32 v16, v16, v17
2042 ; GFX8-NEXT:    v_sub_u32_e32 v1, vcc, v1, v16
2043 ; GFX8-NEXT:    v_max_i32_e32 v16, -1, v2
2044 ; GFX8-NEXT:    v_subrev_u32_e32 v16, vcc, s4, v16
2045 ; GFX8-NEXT:    v_min_i32_e32 v17, -1, v2
2046 ; GFX8-NEXT:    v_max_i32_e32 v16, v16, v18
2047 ; GFX8-NEXT:    v_subrev_u32_e32 v17, vcc, s5, v17
2048 ; GFX8-NEXT:    v_min_i32_e32 v16, v16, v17
2049 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, v2, v16
2050 ; GFX8-NEXT:    v_bfrev_b32_e32 v16, -2
2051 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v3
2052 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2053 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v19
2054 ; GFX8-NEXT:    v_bfrev_b32_e32 v18, 1
2055 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v3
2056 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2057 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2058 ; GFX8-NEXT:    v_sub_u32_e32 v3, vcc, v3, v17
2059 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v4
2060 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2061 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v20
2062 ; GFX8-NEXT:    buffer_load_dword v20, off, s[0:3], s32
2063 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v4
2064 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2065 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2066 ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, v4, v17
2067 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v5
2068 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2069 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v5
2070 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v21
2071 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2072 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2073 ; GFX8-NEXT:    v_sub_u32_e32 v5, vcc, v5, v17
2074 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v6
2075 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2076 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v6
2077 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v22
2078 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2079 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2080 ; GFX8-NEXT:    v_sub_u32_e32 v6, vcc, v6, v17
2081 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v7
2082 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2083 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v7
2084 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v23
2085 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2086 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2087 ; GFX8-NEXT:    v_sub_u32_e32 v7, vcc, v7, v17
2088 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v8
2089 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2090 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v8
2091 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v24
2092 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2093 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2094 ; GFX8-NEXT:    v_sub_u32_e32 v8, vcc, v8, v17
2095 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v9
2096 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2097 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v9
2098 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v25
2099 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2100 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2101 ; GFX8-NEXT:    v_sub_u32_e32 v9, vcc, v9, v17
2102 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v10
2103 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2104 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v10
2105 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v26
2106 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2107 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2108 ; GFX8-NEXT:    v_sub_u32_e32 v10, vcc, v10, v17
2109 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v11
2110 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2111 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v11
2112 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v27
2113 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2114 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2115 ; GFX8-NEXT:    v_sub_u32_e32 v11, vcc, v11, v17
2116 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v12
2117 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2118 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v12
2119 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v28
2120 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2121 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2122 ; GFX8-NEXT:    v_sub_u32_e32 v12, vcc, v12, v17
2123 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v13
2124 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2125 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v13
2126 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v29
2127 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2128 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2129 ; GFX8-NEXT:    v_sub_u32_e32 v13, vcc, v13, v17
2130 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v14
2131 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v16
2132 ; GFX8-NEXT:    v_min_i32_e32 v19, -1, v14
2133 ; GFX8-NEXT:    v_max_i32_e32 v17, v17, v30
2134 ; GFX8-NEXT:    v_sub_u32_e32 v19, vcc, v19, v18
2135 ; GFX8-NEXT:    v_min_i32_e32 v17, v17, v19
2136 ; GFX8-NEXT:    v_sub_u32_e32 v14, vcc, v14, v17
2137 ; GFX8-NEXT:    v_max_i32_e32 v17, -1, v15
2138 ; GFX8-NEXT:    v_sub_u32_e32 v16, vcc, v17, v16
2139 ; GFX8-NEXT:    v_min_i32_e32 v17, -1, v15
2140 ; GFX8-NEXT:    v_sub_u32_e32 v17, vcc, v17, v18
2141 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2142 ; GFX8-NEXT:    v_max_i32_e32 v16, v16, v20
2143 ; GFX8-NEXT:    v_min_i32_e32 v16, v16, v17
2144 ; GFX8-NEXT:    v_sub_u32_e32 v15, vcc, v15, v16
2145 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
2147 ; GFX9-LABEL: v_ssubsat_v16i32:
2148 ; GFX9:       ; %bb.0:
2149 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2150 ; GFX9-NEXT:    v_sub_i32 v0, v0, v16 clamp
2151 ; GFX9-NEXT:    buffer_load_dword v16, off, s[0:3], s32
2152 ; GFX9-NEXT:    v_sub_i32 v1, v1, v17 clamp
2153 ; GFX9-NEXT:    v_sub_i32 v2, v2, v18 clamp
2154 ; GFX9-NEXT:    v_sub_i32 v3, v3, v19 clamp
2155 ; GFX9-NEXT:    v_sub_i32 v4, v4, v20 clamp
2156 ; GFX9-NEXT:    v_sub_i32 v5, v5, v21 clamp
2157 ; GFX9-NEXT:    v_sub_i32 v6, v6, v22 clamp
2158 ; GFX9-NEXT:    v_sub_i32 v7, v7, v23 clamp
2159 ; GFX9-NEXT:    v_sub_i32 v8, v8, v24 clamp
2160 ; GFX9-NEXT:    v_sub_i32 v9, v9, v25 clamp
2161 ; GFX9-NEXT:    v_sub_i32 v10, v10, v26 clamp
2162 ; GFX9-NEXT:    v_sub_i32 v11, v11, v27 clamp
2163 ; GFX9-NEXT:    v_sub_i32 v12, v12, v28 clamp
2164 ; GFX9-NEXT:    v_sub_i32 v13, v13, v29 clamp
2165 ; GFX9-NEXT:    v_sub_i32 v14, v14, v30 clamp
2166 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2167 ; GFX9-NEXT:    v_sub_i32 v15, v15, v16 clamp
2168 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2170 ; GFX10-LABEL: v_ssubsat_v16i32:
2171 ; GFX10:       ; %bb.0:
2172 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2173 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2174 ; GFX10-NEXT:    buffer_load_dword v31, off, s[0:3], s32
2175 ; GFX10-NEXT:    v_sub_nc_i32 v0, v0, v16 clamp
2176 ; GFX10-NEXT:    v_sub_nc_i32 v1, v1, v17 clamp
2177 ; GFX10-NEXT:    v_sub_nc_i32 v2, v2, v18 clamp
2178 ; GFX10-NEXT:    v_sub_nc_i32 v3, v3, v19 clamp
2179 ; GFX10-NEXT:    v_sub_nc_i32 v4, v4, v20 clamp
2180 ; GFX10-NEXT:    v_sub_nc_i32 v5, v5, v21 clamp
2181 ; GFX10-NEXT:    v_sub_nc_i32 v6, v6, v22 clamp
2182 ; GFX10-NEXT:    v_sub_nc_i32 v7, v7, v23 clamp
2183 ; GFX10-NEXT:    v_sub_nc_i32 v8, v8, v24 clamp
2184 ; GFX10-NEXT:    v_sub_nc_i32 v9, v9, v25 clamp
2185 ; GFX10-NEXT:    v_sub_nc_i32 v10, v10, v26 clamp
2186 ; GFX10-NEXT:    v_sub_nc_i32 v11, v11, v27 clamp
2187 ; GFX10-NEXT:    v_sub_nc_i32 v12, v12, v28 clamp
2188 ; GFX10-NEXT:    v_sub_nc_i32 v13, v13, v29 clamp
2189 ; GFX10-NEXT:    v_sub_nc_i32 v14, v14, v30 clamp
2190 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2191 ; GFX10-NEXT:    v_sub_nc_i32 v15, v15, v31 clamp
2192 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2193   %result = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %lhs, <16 x i32> %rhs)
2194   ret <16 x i32> %result
2197 define amdgpu_ps <16 x i32> @s_ssubsat_v16i32(<16 x i32> inreg %lhs, <16 x i32> inreg %rhs) {
2198 ; GFX6-LABEL: s_ssubsat_v16i32:
2199 ; GFX6:       ; %bb.0:
2200 ; GFX6-NEXT:    s_brev_b32 s32, -2
2201 ; GFX6-NEXT:    s_max_i32 s34, s0, -1
2202 ; GFX6-NEXT:    s_brev_b32 s33, 1
2203 ; GFX6-NEXT:    s_sub_i32 s34, s34, s32
2204 ; GFX6-NEXT:    s_min_i32 s35, s0, -1
2205 ; GFX6-NEXT:    s_sub_i32 s35, s35, s33
2206 ; GFX6-NEXT:    s_max_i32 s16, s34, s16
2207 ; GFX6-NEXT:    s_min_i32 s16, s16, s35
2208 ; GFX6-NEXT:    s_sub_i32 s0, s0, s16
2209 ; GFX6-NEXT:    s_max_i32 s16, s1, -1
2210 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2211 ; GFX6-NEXT:    s_min_i32 s34, s1, -1
2212 ; GFX6-NEXT:    s_sub_i32 s34, s34, s33
2213 ; GFX6-NEXT:    s_max_i32 s16, s16, s17
2214 ; GFX6-NEXT:    s_min_i32 s16, s16, s34
2215 ; GFX6-NEXT:    s_sub_i32 s1, s1, s16
2216 ; GFX6-NEXT:    s_max_i32 s16, s2, -1
2217 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2218 ; GFX6-NEXT:    s_min_i32 s17, s2, -1
2219 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2220 ; GFX6-NEXT:    s_max_i32 s16, s16, s18
2221 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2222 ; GFX6-NEXT:    s_sub_i32 s2, s2, s16
2223 ; GFX6-NEXT:    s_max_i32 s16, s3, -1
2224 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2225 ; GFX6-NEXT:    s_min_i32 s17, s3, -1
2226 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2227 ; GFX6-NEXT:    s_max_i32 s16, s16, s19
2228 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2229 ; GFX6-NEXT:    s_sub_i32 s3, s3, s16
2230 ; GFX6-NEXT:    s_max_i32 s16, s4, -1
2231 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2232 ; GFX6-NEXT:    s_min_i32 s17, s4, -1
2233 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2234 ; GFX6-NEXT:    s_max_i32 s16, s16, s20
2235 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2236 ; GFX6-NEXT:    s_sub_i32 s4, s4, s16
2237 ; GFX6-NEXT:    s_max_i32 s16, s5, -1
2238 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2239 ; GFX6-NEXT:    s_min_i32 s17, s5, -1
2240 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2241 ; GFX6-NEXT:    s_max_i32 s16, s16, s21
2242 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2243 ; GFX6-NEXT:    s_sub_i32 s5, s5, s16
2244 ; GFX6-NEXT:    s_max_i32 s16, s6, -1
2245 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2246 ; GFX6-NEXT:    s_min_i32 s17, s6, -1
2247 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2248 ; GFX6-NEXT:    s_max_i32 s16, s16, s22
2249 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2250 ; GFX6-NEXT:    s_sub_i32 s6, s6, s16
2251 ; GFX6-NEXT:    s_max_i32 s16, s7, -1
2252 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2253 ; GFX6-NEXT:    s_min_i32 s17, s7, -1
2254 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2255 ; GFX6-NEXT:    s_max_i32 s16, s16, s23
2256 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2257 ; GFX6-NEXT:    s_sub_i32 s7, s7, s16
2258 ; GFX6-NEXT:    s_max_i32 s16, s8, -1
2259 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2260 ; GFX6-NEXT:    s_min_i32 s17, s8, -1
2261 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2262 ; GFX6-NEXT:    s_max_i32 s16, s16, s24
2263 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2264 ; GFX6-NEXT:    s_sub_i32 s8, s8, s16
2265 ; GFX6-NEXT:    s_max_i32 s16, s9, -1
2266 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2267 ; GFX6-NEXT:    s_min_i32 s17, s9, -1
2268 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2269 ; GFX6-NEXT:    s_max_i32 s16, s16, s25
2270 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2271 ; GFX6-NEXT:    s_sub_i32 s9, s9, s16
2272 ; GFX6-NEXT:    s_max_i32 s16, s10, -1
2273 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2274 ; GFX6-NEXT:    s_min_i32 s17, s10, -1
2275 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2276 ; GFX6-NEXT:    s_max_i32 s16, s16, s26
2277 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2278 ; GFX6-NEXT:    s_sub_i32 s10, s10, s16
2279 ; GFX6-NEXT:    s_max_i32 s16, s11, -1
2280 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2281 ; GFX6-NEXT:    s_min_i32 s17, s11, -1
2282 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2283 ; GFX6-NEXT:    s_max_i32 s16, s16, s27
2284 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2285 ; GFX6-NEXT:    s_sub_i32 s11, s11, s16
2286 ; GFX6-NEXT:    s_max_i32 s16, s12, -1
2287 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2288 ; GFX6-NEXT:    s_min_i32 s17, s12, -1
2289 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2290 ; GFX6-NEXT:    s_max_i32 s16, s16, s28
2291 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2292 ; GFX6-NEXT:    s_sub_i32 s12, s12, s16
2293 ; GFX6-NEXT:    s_max_i32 s16, s13, -1
2294 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2295 ; GFX6-NEXT:    s_min_i32 s17, s13, -1
2296 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2297 ; GFX6-NEXT:    s_max_i32 s16, s16, s29
2298 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2299 ; GFX6-NEXT:    s_sub_i32 s13, s13, s16
2300 ; GFX6-NEXT:    s_max_i32 s16, s14, -1
2301 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2302 ; GFX6-NEXT:    s_min_i32 s17, s14, -1
2303 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2304 ; GFX6-NEXT:    s_max_i32 s16, s16, s30
2305 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2306 ; GFX6-NEXT:    s_sub_i32 s14, s14, s16
2307 ; GFX6-NEXT:    s_max_i32 s16, s15, -1
2308 ; GFX6-NEXT:    s_sub_i32 s16, s16, s32
2309 ; GFX6-NEXT:    s_min_i32 s17, s15, -1
2310 ; GFX6-NEXT:    s_sub_i32 s17, s17, s33
2311 ; GFX6-NEXT:    s_max_i32 s16, s16, s31
2312 ; GFX6-NEXT:    s_min_i32 s16, s16, s17
2313 ; GFX6-NEXT:    s_sub_i32 s15, s15, s16
2314 ; GFX6-NEXT:    ; return to shader part epilog
2316 ; GFX8-LABEL: s_ssubsat_v16i32:
2317 ; GFX8:       ; %bb.0:
2318 ; GFX8-NEXT:    s_brev_b32 s32, -2
2319 ; GFX8-NEXT:    s_max_i32 s34, s0, -1
2320 ; GFX8-NEXT:    s_brev_b32 s33, 1
2321 ; GFX8-NEXT:    s_sub_i32 s34, s34, s32
2322 ; GFX8-NEXT:    s_min_i32 s35, s0, -1
2323 ; GFX8-NEXT:    s_sub_i32 s35, s35, s33
2324 ; GFX8-NEXT:    s_max_i32 s16, s34, s16
2325 ; GFX8-NEXT:    s_min_i32 s16, s16, s35
2326 ; GFX8-NEXT:    s_sub_i32 s0, s0, s16
2327 ; GFX8-NEXT:    s_max_i32 s16, s1, -1
2328 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2329 ; GFX8-NEXT:    s_min_i32 s34, s1, -1
2330 ; GFX8-NEXT:    s_sub_i32 s34, s34, s33
2331 ; GFX8-NEXT:    s_max_i32 s16, s16, s17
2332 ; GFX8-NEXT:    s_min_i32 s16, s16, s34
2333 ; GFX8-NEXT:    s_sub_i32 s1, s1, s16
2334 ; GFX8-NEXT:    s_max_i32 s16, s2, -1
2335 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2336 ; GFX8-NEXT:    s_min_i32 s17, s2, -1
2337 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2338 ; GFX8-NEXT:    s_max_i32 s16, s16, s18
2339 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2340 ; GFX8-NEXT:    s_sub_i32 s2, s2, s16
2341 ; GFX8-NEXT:    s_max_i32 s16, s3, -1
2342 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2343 ; GFX8-NEXT:    s_min_i32 s17, s3, -1
2344 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2345 ; GFX8-NEXT:    s_max_i32 s16, s16, s19
2346 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2347 ; GFX8-NEXT:    s_sub_i32 s3, s3, s16
2348 ; GFX8-NEXT:    s_max_i32 s16, s4, -1
2349 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2350 ; GFX8-NEXT:    s_min_i32 s17, s4, -1
2351 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2352 ; GFX8-NEXT:    s_max_i32 s16, s16, s20
2353 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2354 ; GFX8-NEXT:    s_sub_i32 s4, s4, s16
2355 ; GFX8-NEXT:    s_max_i32 s16, s5, -1
2356 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2357 ; GFX8-NEXT:    s_min_i32 s17, s5, -1
2358 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2359 ; GFX8-NEXT:    s_max_i32 s16, s16, s21
2360 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2361 ; GFX8-NEXT:    s_sub_i32 s5, s5, s16
2362 ; GFX8-NEXT:    s_max_i32 s16, s6, -1
2363 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2364 ; GFX8-NEXT:    s_min_i32 s17, s6, -1
2365 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2366 ; GFX8-NEXT:    s_max_i32 s16, s16, s22
2367 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2368 ; GFX8-NEXT:    s_sub_i32 s6, s6, s16
2369 ; GFX8-NEXT:    s_max_i32 s16, s7, -1
2370 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2371 ; GFX8-NEXT:    s_min_i32 s17, s7, -1
2372 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2373 ; GFX8-NEXT:    s_max_i32 s16, s16, s23
2374 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2375 ; GFX8-NEXT:    s_sub_i32 s7, s7, s16
2376 ; GFX8-NEXT:    s_max_i32 s16, s8, -1
2377 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2378 ; GFX8-NEXT:    s_min_i32 s17, s8, -1
2379 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2380 ; GFX8-NEXT:    s_max_i32 s16, s16, s24
2381 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2382 ; GFX8-NEXT:    s_sub_i32 s8, s8, s16
2383 ; GFX8-NEXT:    s_max_i32 s16, s9, -1
2384 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2385 ; GFX8-NEXT:    s_min_i32 s17, s9, -1
2386 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2387 ; GFX8-NEXT:    s_max_i32 s16, s16, s25
2388 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2389 ; GFX8-NEXT:    s_sub_i32 s9, s9, s16
2390 ; GFX8-NEXT:    s_max_i32 s16, s10, -1
2391 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2392 ; GFX8-NEXT:    s_min_i32 s17, s10, -1
2393 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2394 ; GFX8-NEXT:    s_max_i32 s16, s16, s26
2395 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2396 ; GFX8-NEXT:    s_sub_i32 s10, s10, s16
2397 ; GFX8-NEXT:    s_max_i32 s16, s11, -1
2398 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2399 ; GFX8-NEXT:    s_min_i32 s17, s11, -1
2400 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2401 ; GFX8-NEXT:    s_max_i32 s16, s16, s27
2402 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2403 ; GFX8-NEXT:    s_sub_i32 s11, s11, s16
2404 ; GFX8-NEXT:    s_max_i32 s16, s12, -1
2405 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2406 ; GFX8-NEXT:    s_min_i32 s17, s12, -1
2407 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2408 ; GFX8-NEXT:    s_max_i32 s16, s16, s28
2409 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2410 ; GFX8-NEXT:    s_sub_i32 s12, s12, s16
2411 ; GFX8-NEXT:    s_max_i32 s16, s13, -1
2412 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2413 ; GFX8-NEXT:    s_min_i32 s17, s13, -1
2414 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2415 ; GFX8-NEXT:    s_max_i32 s16, s16, s29
2416 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2417 ; GFX8-NEXT:    s_sub_i32 s13, s13, s16
2418 ; GFX8-NEXT:    s_max_i32 s16, s14, -1
2419 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2420 ; GFX8-NEXT:    s_min_i32 s17, s14, -1
2421 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2422 ; GFX8-NEXT:    s_max_i32 s16, s16, s30
2423 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2424 ; GFX8-NEXT:    s_sub_i32 s14, s14, s16
2425 ; GFX8-NEXT:    s_max_i32 s16, s15, -1
2426 ; GFX8-NEXT:    s_sub_i32 s16, s16, s32
2427 ; GFX8-NEXT:    s_min_i32 s17, s15, -1
2428 ; GFX8-NEXT:    s_sub_i32 s17, s17, s33
2429 ; GFX8-NEXT:    s_max_i32 s16, s16, s31
2430 ; GFX8-NEXT:    s_min_i32 s16, s16, s17
2431 ; GFX8-NEXT:    s_sub_i32 s15, s15, s16
2432 ; GFX8-NEXT:    ; return to shader part epilog
2434 ; GFX9-LABEL: s_ssubsat_v16i32:
2435 ; GFX9:       ; %bb.0:
2436 ; GFX9-NEXT:    v_mov_b32_e32 v0, s16
2437 ; GFX9-NEXT:    v_mov_b32_e32 v1, s17
2438 ; GFX9-NEXT:    v_mov_b32_e32 v2, s18
2439 ; GFX9-NEXT:    v_mov_b32_e32 v3, s19
2440 ; GFX9-NEXT:    v_mov_b32_e32 v4, s20
2441 ; GFX9-NEXT:    v_mov_b32_e32 v5, s21
2442 ; GFX9-NEXT:    v_mov_b32_e32 v6, s22
2443 ; GFX9-NEXT:    v_mov_b32_e32 v7, s23
2444 ; GFX9-NEXT:    v_mov_b32_e32 v8, s24
2445 ; GFX9-NEXT:    v_mov_b32_e32 v9, s25
2446 ; GFX9-NEXT:    v_mov_b32_e32 v10, s26
2447 ; GFX9-NEXT:    v_mov_b32_e32 v11, s27
2448 ; GFX9-NEXT:    v_mov_b32_e32 v12, s28
2449 ; GFX9-NEXT:    v_mov_b32_e32 v13, s29
2450 ; GFX9-NEXT:    v_mov_b32_e32 v14, s30
2451 ; GFX9-NEXT:    v_mov_b32_e32 v15, s31
2452 ; GFX9-NEXT:    v_sub_i32 v0, s0, v0 clamp
2453 ; GFX9-NEXT:    v_sub_i32 v1, s1, v1 clamp
2454 ; GFX9-NEXT:    v_sub_i32 v2, s2, v2 clamp
2455 ; GFX9-NEXT:    v_sub_i32 v3, s3, v3 clamp
2456 ; GFX9-NEXT:    v_sub_i32 v4, s4, v4 clamp
2457 ; GFX9-NEXT:    v_sub_i32 v5, s5, v5 clamp
2458 ; GFX9-NEXT:    v_sub_i32 v6, s6, v6 clamp
2459 ; GFX9-NEXT:    v_sub_i32 v7, s7, v7 clamp
2460 ; GFX9-NEXT:    v_sub_i32 v8, s8, v8 clamp
2461 ; GFX9-NEXT:    v_sub_i32 v9, s9, v9 clamp
2462 ; GFX9-NEXT:    v_sub_i32 v10, s10, v10 clamp
2463 ; GFX9-NEXT:    v_sub_i32 v11, s11, v11 clamp
2464 ; GFX9-NEXT:    v_sub_i32 v12, s12, v12 clamp
2465 ; GFX9-NEXT:    v_sub_i32 v13, s13, v13 clamp
2466 ; GFX9-NEXT:    v_sub_i32 v14, s14, v14 clamp
2467 ; GFX9-NEXT:    v_sub_i32 v15, s15, v15 clamp
2468 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
2469 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
2470 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
2471 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
2472 ; GFX9-NEXT:    v_readfirstlane_b32 s4, v4
2473 ; GFX9-NEXT:    v_readfirstlane_b32 s5, v5
2474 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v6
2475 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v7
2476 ; GFX9-NEXT:    v_readfirstlane_b32 s8, v8
2477 ; GFX9-NEXT:    v_readfirstlane_b32 s9, v9
2478 ; GFX9-NEXT:    v_readfirstlane_b32 s10, v10
2479 ; GFX9-NEXT:    v_readfirstlane_b32 s11, v11
2480 ; GFX9-NEXT:    v_readfirstlane_b32 s12, v12
2481 ; GFX9-NEXT:    v_readfirstlane_b32 s13, v13
2482 ; GFX9-NEXT:    v_readfirstlane_b32 s14, v14
2483 ; GFX9-NEXT:    v_readfirstlane_b32 s15, v15
2484 ; GFX9-NEXT:    ; return to shader part epilog
2486 ; GFX10-LABEL: s_ssubsat_v16i32:
2487 ; GFX10:       ; %bb.0:
2488 ; GFX10-NEXT:    v_sub_nc_i32 v0, s0, s16 clamp
2489 ; GFX10-NEXT:    v_sub_nc_i32 v1, s1, s17 clamp
2490 ; GFX10-NEXT:    v_sub_nc_i32 v2, s2, s18 clamp
2491 ; GFX10-NEXT:    v_sub_nc_i32 v3, s3, s19 clamp
2492 ; GFX10-NEXT:    v_sub_nc_i32 v4, s4, s20 clamp
2493 ; GFX10-NEXT:    v_sub_nc_i32 v5, s5, s21 clamp
2494 ; GFX10-NEXT:    v_sub_nc_i32 v6, s6, s22 clamp
2495 ; GFX10-NEXT:    v_sub_nc_i32 v7, s7, s23 clamp
2496 ; GFX10-NEXT:    v_sub_nc_i32 v8, s8, s24 clamp
2497 ; GFX10-NEXT:    v_sub_nc_i32 v9, s9, s25 clamp
2498 ; GFX10-NEXT:    v_sub_nc_i32 v10, s10, s26 clamp
2499 ; GFX10-NEXT:    v_sub_nc_i32 v11, s11, s27 clamp
2500 ; GFX10-NEXT:    v_sub_nc_i32 v12, s12, s28 clamp
2501 ; GFX10-NEXT:    v_sub_nc_i32 v13, s13, s29 clamp
2502 ; GFX10-NEXT:    v_sub_nc_i32 v14, s14, s30 clamp
2503 ; GFX10-NEXT:    v_sub_nc_i32 v15, s15, s31 clamp
2504 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
2505 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
2506 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
2507 ; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
2508 ; GFX10-NEXT:    v_readfirstlane_b32 s4, v4
2509 ; GFX10-NEXT:    v_readfirstlane_b32 s5, v5
2510 ; GFX10-NEXT:    v_readfirstlane_b32 s6, v6
2511 ; GFX10-NEXT:    v_readfirstlane_b32 s7, v7
2512 ; GFX10-NEXT:    v_readfirstlane_b32 s8, v8
2513 ; GFX10-NEXT:    v_readfirstlane_b32 s9, v9
2514 ; GFX10-NEXT:    v_readfirstlane_b32 s10, v10
2515 ; GFX10-NEXT:    v_readfirstlane_b32 s11, v11
2516 ; GFX10-NEXT:    v_readfirstlane_b32 s12, v12
2517 ; GFX10-NEXT:    v_readfirstlane_b32 s13, v13
2518 ; GFX10-NEXT:    v_readfirstlane_b32 s14, v14
2519 ; GFX10-NEXT:    v_readfirstlane_b32 s15, v15
2520 ; GFX10-NEXT:    ; return to shader part epilog
2521   %result = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %lhs, <16 x i32> %rhs)
2522   ret <16 x i32> %result
2525 define i16 @v_ssubsat_i16(i16 %lhs, i16 %rhs) {
2526 ; GFX6-LABEL: v_ssubsat_i16:
2527 ; GFX6:       ; %bb.0:
2528 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2529 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2530 ; GFX6-NEXT:    v_max_i32_e32 v2, -1, v0
2531 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2532 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, 0x7fffffff, v2
2533 ; GFX6-NEXT:    v_min_i32_e32 v3, -1, v0
2534 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, 0x80000000, v3
2535 ; GFX6-NEXT:    v_max_i32_e32 v1, v2, v1
2536 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v3
2537 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
2538 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2539 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
2541 ; GFX8-LABEL: v_ssubsat_i16:
2542 ; GFX8:       ; %bb.0:
2543 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2544 ; GFX8-NEXT:    v_max_i16_e32 v2, -1, v0
2545 ; GFX8-NEXT:    v_subrev_u16_e32 v2, 0x7fff, v2
2546 ; GFX8-NEXT:    v_min_i16_e32 v3, -1, v0
2547 ; GFX8-NEXT:    v_subrev_u16_e32 v3, 0x8000, v3
2548 ; GFX8-NEXT:    v_max_i16_e32 v1, v2, v1
2549 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v3
2550 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v1
2551 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
2553 ; GFX9-LABEL: v_ssubsat_i16:
2554 ; GFX9:       ; %bb.0:
2555 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2556 ; GFX9-NEXT:    v_sub_i16 v0, v0, v1 clamp
2557 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2559 ; GFX10-LABEL: v_ssubsat_i16:
2560 ; GFX10:       ; %bb.0:
2561 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2562 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2563 ; GFX10-NEXT:    v_sub_nc_i16 v0, v0, v1 clamp
2564 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2565   %result = call i16 @llvm.ssub.sat.i16(i16 %lhs, i16 %rhs)
2566   ret i16 %result
2569 define amdgpu_ps i16 @s_ssubsat_i16(i16 inreg %lhs, i16 inreg %rhs) {
2570 ; GFX6-LABEL: s_ssubsat_i16:
2571 ; GFX6:       ; %bb.0:
2572 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
2573 ; GFX6-NEXT:    s_max_i32 s2, s0, -1
2574 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
2575 ; GFX6-NEXT:    s_sub_i32 s2, s2, 0x7fffffff
2576 ; GFX6-NEXT:    s_min_i32 s3, s0, -1
2577 ; GFX6-NEXT:    s_sub_i32 s3, s3, 0x80000000
2578 ; GFX6-NEXT:    s_max_i32 s1, s2, s1
2579 ; GFX6-NEXT:    s_min_i32 s1, s1, s3
2580 ; GFX6-NEXT:    s_sub_i32 s0, s0, s1
2581 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 16
2582 ; GFX6-NEXT:    ; return to shader part epilog
2584 ; GFX8-LABEL: s_ssubsat_i16:
2585 ; GFX8:       ; %bb.0:
2586 ; GFX8-NEXT:    s_sext_i32_i16 s2, s0
2587 ; GFX8-NEXT:    s_sext_i32_i16 s3, -1
2588 ; GFX8-NEXT:    s_max_i32 s4, s2, s3
2589 ; GFX8-NEXT:    s_sub_i32 s4, s4, 0x7fff
2590 ; GFX8-NEXT:    s_min_i32 s2, s2, s3
2591 ; GFX8-NEXT:    s_sext_i32_i16 s3, s4
2592 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
2593 ; GFX8-NEXT:    s_sub_i32 s2, s2, 0xffff8000
2594 ; GFX8-NEXT:    s_max_i32 s1, s3, s1
2595 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
2596 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
2597 ; GFX8-NEXT:    s_min_i32 s1, s1, s2
2598 ; GFX8-NEXT:    s_sub_i32 s0, s0, s1
2599 ; GFX8-NEXT:    ; return to shader part epilog
2601 ; GFX9-LABEL: s_ssubsat_i16:
2602 ; GFX9:       ; %bb.0:
2603 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
2604 ; GFX9-NEXT:    v_sub_i16 v0, s0, v0 clamp
2605 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
2606 ; GFX9-NEXT:    ; return to shader part epilog
2608 ; GFX10-LABEL: s_ssubsat_i16:
2609 ; GFX10:       ; %bb.0:
2610 ; GFX10-NEXT:    v_sub_nc_i16 v0, s0, s1 clamp
2611 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
2612 ; GFX10-NEXT:    ; return to shader part epilog
2613   %result = call i16 @llvm.ssub.sat.i16(i16 %lhs, i16 %rhs)
2614   ret i16 %result
2617 define amdgpu_ps half @ssubsat_i16_sv(i16 inreg %lhs, i16 %rhs) {
2618 ; GFX6-LABEL: ssubsat_i16_sv:
2619 ; GFX6:       ; %bb.0:
2620 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
2621 ; GFX6-NEXT:    s_max_i32 s1, s0, -1
2622 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2623 ; GFX6-NEXT:    s_sub_i32 s1, s1, 0x7fffffff
2624 ; GFX6-NEXT:    s_min_i32 s2, s0, -1
2625 ; GFX6-NEXT:    s_sub_i32 s2, s2, 0x80000000
2626 ; GFX6-NEXT:    v_max_i32_e32 v0, s1, v0
2627 ; GFX6-NEXT:    v_min_i32_e32 v0, s2, v0
2628 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s0, v0
2629 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2630 ; GFX6-NEXT:    ; return to shader part epilog
2632 ; GFX8-LABEL: ssubsat_i16_sv:
2633 ; GFX8:       ; %bb.0:
2634 ; GFX8-NEXT:    s_sext_i32_i16 s1, s0
2635 ; GFX8-NEXT:    s_sext_i32_i16 s2, -1
2636 ; GFX8-NEXT:    s_max_i32 s3, s1, s2
2637 ; GFX8-NEXT:    s_sub_i32 s3, s3, 0x7fff
2638 ; GFX8-NEXT:    s_min_i32 s1, s1, s2
2639 ; GFX8-NEXT:    s_sub_i32 s1, s1, 0xffff8000
2640 ; GFX8-NEXT:    v_max_i16_e32 v0, s3, v0
2641 ; GFX8-NEXT:    v_min_i16_e32 v0, s1, v0
2642 ; GFX8-NEXT:    v_sub_u16_e32 v0, s0, v0
2643 ; GFX8-NEXT:    ; return to shader part epilog
2645 ; GFX9-LABEL: ssubsat_i16_sv:
2646 ; GFX9:       ; %bb.0:
2647 ; GFX9-NEXT:    v_sub_i16 v0, s0, v0 clamp
2648 ; GFX9-NEXT:    ; return to shader part epilog
2650 ; GFX10-LABEL: ssubsat_i16_sv:
2651 ; GFX10:       ; %bb.0:
2652 ; GFX10-NEXT:    v_sub_nc_i16 v0, s0, v0 clamp
2653 ; GFX10-NEXT:    ; return to shader part epilog
2654   %result = call i16 @llvm.ssub.sat.i16(i16 %lhs, i16 %rhs)
2655   %cast = bitcast i16 %result to half
2656   ret half %cast
2659 define amdgpu_ps half @ssubsat_i16_vs(i16 %lhs, i16 inreg %rhs) {
2660 ; GFX6-LABEL: ssubsat_i16_vs:
2661 ; GFX6:       ; %bb.0:
2662 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2663 ; GFX6-NEXT:    v_max_i32_e32 v1, -1, v0
2664 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
2665 ; GFX6-NEXT:    v_subrev_i32_e32 v1, vcc, 0x7fffffff, v1
2666 ; GFX6-NEXT:    v_min_i32_e32 v2, -1, v0
2667 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, 0x80000000, v2
2668 ; GFX6-NEXT:    v_max_i32_e32 v1, s0, v1
2669 ; GFX6-NEXT:    v_min_i32_e32 v1, v1, v2
2670 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1
2671 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2672 ; GFX6-NEXT:    ; return to shader part epilog
2674 ; GFX8-LABEL: ssubsat_i16_vs:
2675 ; GFX8:       ; %bb.0:
2676 ; GFX8-NEXT:    v_max_i16_e32 v1, -1, v0
2677 ; GFX8-NEXT:    v_subrev_u16_e32 v1, 0x7fff, v1
2678 ; GFX8-NEXT:    v_min_i16_e32 v2, -1, v0
2679 ; GFX8-NEXT:    v_subrev_u16_e32 v2, 0x8000, v2
2680 ; GFX8-NEXT:    v_max_i16_e32 v1, s0, v1
2681 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v2
2682 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v1
2683 ; GFX8-NEXT:    ; return to shader part epilog
2685 ; GFX9-LABEL: ssubsat_i16_vs:
2686 ; GFX9:       ; %bb.0:
2687 ; GFX9-NEXT:    v_sub_i16 v0, v0, s0 clamp
2688 ; GFX9-NEXT:    ; return to shader part epilog
2690 ; GFX10-LABEL: ssubsat_i16_vs:
2691 ; GFX10:       ; %bb.0:
2692 ; GFX10-NEXT:    v_sub_nc_i16 v0, v0, s0 clamp
2693 ; GFX10-NEXT:    ; return to shader part epilog
2694   %result = call i16 @llvm.ssub.sat.i16(i16 %lhs, i16 %rhs)
2695   %cast = bitcast i16 %result to half
2696   ret half %cast
2699 define <2 x i16> @v_ssubsat_v2i16(<2 x i16> %lhs, <2 x i16> %rhs) {
2700 ; GFX6-LABEL: v_ssubsat_v2i16:
2701 ; GFX6:       ; %bb.0:
2702 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2703 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2704 ; GFX6-NEXT:    s_brev_b32 s4, -2
2705 ; GFX6-NEXT:    v_max_i32_e32 v4, -1, v0
2706 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2707 ; GFX6-NEXT:    s_brev_b32 s5, 1
2708 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s4, v4
2709 ; GFX6-NEXT:    v_min_i32_e32 v5, -1, v0
2710 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s5, v5
2711 ; GFX6-NEXT:    v_max_i32_e32 v2, v4, v2
2712 ; GFX6-NEXT:    v_min_i32_e32 v2, v2, v5
2713 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2714 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2
2715 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v3
2716 ; GFX6-NEXT:    v_max_i32_e32 v3, -1, v1
2717 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, s4, v3
2718 ; GFX6-NEXT:    v_min_i32_e32 v4, -1, v1
2719 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s5, v4
2720 ; GFX6-NEXT:    v_max_i32_e32 v2, v3, v2
2721 ; GFX6-NEXT:    v_min_i32_e32 v2, v2, v4
2722 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v2
2723 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2724 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
2725 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
2727 ; GFX8-LABEL: v_ssubsat_v2i16:
2728 ; GFX8:       ; %bb.0:
2729 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2730 ; GFX8-NEXT:    s_movk_i32 s4, 0x7fff
2731 ; GFX8-NEXT:    v_max_i16_e32 v3, -1, v0
2732 ; GFX8-NEXT:    s_movk_i32 s5, 0x8000
2733 ; GFX8-NEXT:    v_subrev_u16_e32 v3, s4, v3
2734 ; GFX8-NEXT:    v_min_i16_e32 v4, -1, v0
2735 ; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
2736 ; GFX8-NEXT:    v_subrev_u16_e32 v4, s5, v4
2737 ; GFX8-NEXT:    v_max_i16_e32 v3, v3, v1
2738 ; GFX8-NEXT:    v_min_i16_e32 v3, v3, v4
2739 ; GFX8-NEXT:    v_max_i16_e32 v4, -1, v2
2740 ; GFX8-NEXT:    v_subrev_u16_e32 v4, s4, v4
2741 ; GFX8-NEXT:    v_min_i16_e32 v5, -1, v2
2742 ; GFX8-NEXT:    v_subrev_u16_e32 v5, s5, v5
2743 ; GFX8-NEXT:    v_max_i16_sdwa v1, v4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2744 ; GFX8-NEXT:    v_min_i16_e32 v1, v1, v5
2745 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v3
2746 ; GFX8-NEXT:    v_sub_u16_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2747 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2748 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
2750 ; GFX9-LABEL: v_ssubsat_v2i16:
2751 ; GFX9:       ; %bb.0:
2752 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2753 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v1 clamp
2754 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2756 ; GFX10-LABEL: v_ssubsat_v2i16:
2757 ; GFX10:       ; %bb.0:
2758 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2759 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2760 ; GFX10-NEXT:    v_pk_sub_i16 v0, v0, v1 clamp
2761 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2762   %result = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %lhs, <2 x i16> %rhs)
2763   ret <2 x i16> %result
2766 define amdgpu_ps i32 @s_ssubsat_v2i16(<2 x i16> inreg %lhs, <2 x i16> inreg %rhs) {
2767 ; GFX6-LABEL: s_ssubsat_v2i16:
2768 ; GFX6:       ; %bb.0:
2769 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
2770 ; GFX6-NEXT:    s_brev_b32 s4, -2
2771 ; GFX6-NEXT:    s_max_i32 s6, s0, -1
2772 ; GFX6-NEXT:    s_lshl_b32 s2, s2, 16
2773 ; GFX6-NEXT:    s_brev_b32 s5, 1
2774 ; GFX6-NEXT:    s_sub_i32 s6, s6, s4
2775 ; GFX6-NEXT:    s_min_i32 s7, s0, -1
2776 ; GFX6-NEXT:    s_sub_i32 s7, s7, s5
2777 ; GFX6-NEXT:    s_max_i32 s2, s6, s2
2778 ; GFX6-NEXT:    s_min_i32 s2, s2, s7
2779 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
2780 ; GFX6-NEXT:    s_sub_i32 s0, s0, s2
2781 ; GFX6-NEXT:    s_lshl_b32 s2, s3, 16
2782 ; GFX6-NEXT:    s_max_i32 s3, s1, -1
2783 ; GFX6-NEXT:    s_sub_i32 s3, s3, s4
2784 ; GFX6-NEXT:    s_min_i32 s4, s1, -1
2785 ; GFX6-NEXT:    s_sub_i32 s4, s4, s5
2786 ; GFX6-NEXT:    s_max_i32 s2, s3, s2
2787 ; GFX6-NEXT:    s_min_i32 s2, s2, s4
2788 ; GFX6-NEXT:    s_sub_i32 s1, s1, s2
2789 ; GFX6-NEXT:    s_ashr_i32 s1, s1, 16
2790 ; GFX6-NEXT:    s_mov_b32 s2, 0xffff
2791 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 16
2792 ; GFX6-NEXT:    s_and_b32 s1, s1, s2
2793 ; GFX6-NEXT:    s_and_b32 s0, s0, s2
2794 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
2795 ; GFX6-NEXT:    s_or_b32 s0, s0, s1
2796 ; GFX6-NEXT:    ; return to shader part epilog
2798 ; GFX8-LABEL: s_ssubsat_v2i16:
2799 ; GFX8:       ; %bb.0:
2800 ; GFX8-NEXT:    s_sext_i32_i16 s6, s0
2801 ; GFX8-NEXT:    s_sext_i32_i16 s7, -1
2802 ; GFX8-NEXT:    s_movk_i32 s4, 0x7fff
2803 ; GFX8-NEXT:    s_max_i32 s8, s6, s7
2804 ; GFX8-NEXT:    s_sub_i32 s8, s8, s4
2805 ; GFX8-NEXT:    s_lshr_b32 s3, s1, 16
2806 ; GFX8-NEXT:    s_movk_i32 s5, 0x8000
2807 ; GFX8-NEXT:    s_min_i32 s6, s6, s7
2808 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
2809 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
2810 ; GFX8-NEXT:    s_sub_i32 s6, s6, s5
2811 ; GFX8-NEXT:    s_max_i32 s1, s8, s1
2812 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
2813 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
2814 ; GFX8-NEXT:    s_lshr_b32 s2, s0, 16
2815 ; GFX8-NEXT:    s_min_i32 s1, s1, s6
2816 ; GFX8-NEXT:    s_sub_i32 s0, s0, s1
2817 ; GFX8-NEXT:    s_sext_i32_i16 s1, s2
2818 ; GFX8-NEXT:    s_max_i32 s6, s1, s7
2819 ; GFX8-NEXT:    s_sub_i32 s4, s6, s4
2820 ; GFX8-NEXT:    s_min_i32 s1, s1, s7
2821 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
2822 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
2823 ; GFX8-NEXT:    s_sub_i32 s1, s1, s5
2824 ; GFX8-NEXT:    s_max_i32 s3, s4, s3
2825 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
2826 ; GFX8-NEXT:    s_sext_i32_i16 s1, s1
2827 ; GFX8-NEXT:    s_min_i32 s1, s3, s1
2828 ; GFX8-NEXT:    s_sub_i32 s1, s2, s1
2829 ; GFX8-NEXT:    s_bfe_u32 s1, s1, 0x100000
2830 ; GFX8-NEXT:    s_bfe_u32 s0, s0, 0x100000
2831 ; GFX8-NEXT:    s_lshl_b32 s1, s1, 16
2832 ; GFX8-NEXT:    s_or_b32 s0, s0, s1
2833 ; GFX8-NEXT:    ; return to shader part epilog
2835 ; GFX9-LABEL: s_ssubsat_v2i16:
2836 ; GFX9:       ; %bb.0:
2837 ; GFX9-NEXT:    v_mov_b32_e32 v0, s1
2838 ; GFX9-NEXT:    v_pk_sub_i16 v0, s0, v0 clamp
2839 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
2840 ; GFX9-NEXT:    ; return to shader part epilog
2842 ; GFX10-LABEL: s_ssubsat_v2i16:
2843 ; GFX10:       ; %bb.0:
2844 ; GFX10-NEXT:    v_pk_sub_i16 v0, s0, s1 clamp
2845 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
2846 ; GFX10-NEXT:    ; return to shader part epilog
2847   %result = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %lhs, <2 x i16> %rhs)
2848   %cast = bitcast <2 x i16> %result to i32
2849   ret i32 %cast
2852 define amdgpu_ps float @ssubsat_v2i16_sv(<2 x i16> inreg %lhs, <2 x i16> %rhs) {
2853 ; GFX6-LABEL: ssubsat_v2i16_sv:
2854 ; GFX6:       ; %bb.0:
2855 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
2856 ; GFX6-NEXT:    s_brev_b32 s2, -2
2857 ; GFX6-NEXT:    s_max_i32 s4, s0, -1
2858 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2859 ; GFX6-NEXT:    s_brev_b32 s3, 1
2860 ; GFX6-NEXT:    s_sub_i32 s4, s4, s2
2861 ; GFX6-NEXT:    s_min_i32 s5, s0, -1
2862 ; GFX6-NEXT:    s_sub_i32 s5, s5, s3
2863 ; GFX6-NEXT:    v_max_i32_e32 v0, s4, v0
2864 ; GFX6-NEXT:    v_min_i32_e32 v0, s5, v0
2865 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, s0, v0
2866 ; GFX6-NEXT:    s_lshl_b32 s0, s1, 16
2867 ; GFX6-NEXT:    s_max_i32 s1, s0, -1
2868 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2869 ; GFX6-NEXT:    s_sub_i32 s1, s1, s2
2870 ; GFX6-NEXT:    s_min_i32 s2, s0, -1
2871 ; GFX6-NEXT:    s_sub_i32 s2, s2, s3
2872 ; GFX6-NEXT:    v_max_i32_e32 v1, s1, v1
2873 ; GFX6-NEXT:    v_min_i32_e32 v1, s2, v1
2874 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, s0, v1
2875 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
2876 ; GFX6-NEXT:    s_mov_b32 s0, 0xffff
2877 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2878 ; GFX6-NEXT:    v_and_b32_e32 v1, s0, v1
2879 ; GFX6-NEXT:    v_and_b32_e32 v0, s0, v0
2880 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2881 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
2882 ; GFX6-NEXT:    ; return to shader part epilog
2884 ; GFX8-LABEL: ssubsat_v2i16_sv:
2885 ; GFX8:       ; %bb.0:
2886 ; GFX8-NEXT:    s_sext_i32_i16 s4, s0
2887 ; GFX8-NEXT:    s_sext_i32_i16 s5, -1
2888 ; GFX8-NEXT:    s_movk_i32 s2, 0x7fff
2889 ; GFX8-NEXT:    s_max_i32 s6, s4, s5
2890 ; GFX8-NEXT:    s_movk_i32 s3, 0x8000
2891 ; GFX8-NEXT:    s_sub_i32 s6, s6, s2
2892 ; GFX8-NEXT:    s_min_i32 s4, s4, s5
2893 ; GFX8-NEXT:    s_lshr_b32 s1, s0, 16
2894 ; GFX8-NEXT:    s_sub_i32 s4, s4, s3
2895 ; GFX8-NEXT:    v_max_i16_e32 v1, s6, v0
2896 ; GFX8-NEXT:    v_min_i16_e32 v1, s4, v1
2897 ; GFX8-NEXT:    s_sext_i32_i16 s4, s1
2898 ; GFX8-NEXT:    s_max_i32 s6, s4, s5
2899 ; GFX8-NEXT:    s_sub_i32 s2, s6, s2
2900 ; GFX8-NEXT:    s_min_i32 s4, s4, s5
2901 ; GFX8-NEXT:    v_mov_b32_e32 v2, s2
2902 ; GFX8-NEXT:    s_sub_i32 s3, s4, s3
2903 ; GFX8-NEXT:    v_max_i16_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
2904 ; GFX8-NEXT:    v_min_i16_e32 v0, s3, v0
2905 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
2906 ; GFX8-NEXT:    v_sub_u16_e32 v1, s0, v1
2907 ; GFX8-NEXT:    v_sub_u16_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2908 ; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
2909 ; GFX8-NEXT:    ; return to shader part epilog
2911 ; GFX9-LABEL: ssubsat_v2i16_sv:
2912 ; GFX9:       ; %bb.0:
2913 ; GFX9-NEXT:    v_pk_sub_i16 v0, s0, v0 clamp
2914 ; GFX9-NEXT:    ; return to shader part epilog
2916 ; GFX10-LABEL: ssubsat_v2i16_sv:
2917 ; GFX10:       ; %bb.0:
2918 ; GFX10-NEXT:    v_pk_sub_i16 v0, s0, v0 clamp
2919 ; GFX10-NEXT:    ; return to shader part epilog
2920   %result = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %lhs, <2 x i16> %rhs)
2921   %cast = bitcast <2 x i16> %result to float
2922   ret float %cast
2925 define amdgpu_ps float @ssubsat_v2i16_vs(<2 x i16> %lhs, <2 x i16> inreg %rhs) {
2926 ; GFX6-LABEL: ssubsat_v2i16_vs:
2927 ; GFX6:       ; %bb.0:
2928 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2929 ; GFX6-NEXT:    s_brev_b32 s2, -2
2930 ; GFX6-NEXT:    v_max_i32_e32 v2, -1, v0
2931 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
2932 ; GFX6-NEXT:    s_brev_b32 s3, 1
2933 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s2, v2
2934 ; GFX6-NEXT:    v_min_i32_e32 v3, -1, v0
2935 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, s3, v3
2936 ; GFX6-NEXT:    v_max_i32_e32 v2, s0, v2
2937 ; GFX6-NEXT:    v_min_i32_e32 v2, v2, v3
2938 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2939 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2
2940 ; GFX6-NEXT:    v_max_i32_e32 v2, -1, v1
2941 ; GFX6-NEXT:    s_lshl_b32 s0, s1, 16
2942 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s2, v2
2943 ; GFX6-NEXT:    v_min_i32_e32 v3, -1, v1
2944 ; GFX6-NEXT:    v_subrev_i32_e32 v3, vcc, s3, v3
2945 ; GFX6-NEXT:    v_max_i32_e32 v2, s0, v2
2946 ; GFX6-NEXT:    v_min_i32_e32 v2, v2, v3
2947 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v2
2948 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
2949 ; GFX6-NEXT:    s_mov_b32 s0, 0xffff
2950 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2951 ; GFX6-NEXT:    v_and_b32_e32 v1, s0, v1
2952 ; GFX6-NEXT:    v_and_b32_e32 v0, s0, v0
2953 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2954 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
2955 ; GFX6-NEXT:    ; return to shader part epilog
2957 ; GFX8-LABEL: ssubsat_v2i16_vs:
2958 ; GFX8:       ; %bb.0:
2959 ; GFX8-NEXT:    s_movk_i32 s2, 0x7fff
2960 ; GFX8-NEXT:    v_max_i16_e32 v2, -1, v0
2961 ; GFX8-NEXT:    s_movk_i32 s3, 0x8000
2962 ; GFX8-NEXT:    v_subrev_u16_e32 v2, s2, v2
2963 ; GFX8-NEXT:    v_min_i16_e32 v3, -1, v0
2964 ; GFX8-NEXT:    v_lshrrev_b32_e32 v1, 16, v0
2965 ; GFX8-NEXT:    v_subrev_u16_e32 v3, s3, v3
2966 ; GFX8-NEXT:    v_max_i16_e32 v2, s0, v2
2967 ; GFX8-NEXT:    v_min_i16_e32 v2, v2, v3
2968 ; GFX8-NEXT:    v_max_i16_e32 v3, -1, v1
2969 ; GFX8-NEXT:    s_lshr_b32 s1, s0, 16
2970 ; GFX8-NEXT:    v_subrev_u16_e32 v3, s2, v3
2971 ; GFX8-NEXT:    v_min_i16_e32 v4, -1, v1
2972 ; GFX8-NEXT:    v_subrev_u16_e32 v4, s3, v4
2973 ; GFX8-NEXT:    v_max_i16_e32 v3, s1, v3
2974 ; GFX8-NEXT:    v_min_i16_e32 v3, v3, v4
2975 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v2
2976 ; GFX8-NEXT:    v_sub_u16_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2977 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2978 ; GFX8-NEXT:    ; return to shader part epilog
2980 ; GFX9-LABEL: ssubsat_v2i16_vs:
2981 ; GFX9:       ; %bb.0:
2982 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, s0 clamp
2983 ; GFX9-NEXT:    ; return to shader part epilog
2985 ; GFX10-LABEL: ssubsat_v2i16_vs:
2986 ; GFX10:       ; %bb.0:
2987 ; GFX10-NEXT:    v_pk_sub_i16 v0, v0, s0 clamp
2988 ; GFX10-NEXT:    ; return to shader part epilog
2989   %result = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %lhs, <2 x i16> %rhs)
2990   %cast = bitcast <2 x i16> %result to float
2991   ret float %cast
2994 ; FIXME: v3i16 insert/extract
2995 ; define <3 x i16> @v_ssubsat_v3i16(<3 x i16> %lhs, <3 x i16> %rhs) {
2996 ;   %result = call <3 x i16> @llvm.ssub.sat.v3i16(<3 x i16> %lhs, <3 x i16> %rhs)
2997 ;   ret <3 x i16> %result
2998 ; }
3000 ; define amdgpu_ps <3 x i16> @s_ssubsat_v3i16(<3 x i16> inreg %lhs, <3 x i16> inreg %rhs) {
3001 ;   %result = call <3 x i16> @llvm.ssub.sat.v3i16(<3 x i16> %lhs, <3 x i16> %rhs)
3002 ;   ret <3 x i16> %result
3003 ; }
3005 define <2 x float> @v_ssubsat_v4i16(<4 x i16> %lhs, <4 x i16> %rhs) {
3006 ; GFX6-LABEL: v_ssubsat_v4i16:
3007 ; GFX6:       ; %bb.0:
3008 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3009 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
3010 ; GFX6-NEXT:    s_brev_b32 s4, -2
3011 ; GFX6-NEXT:    v_max_i32_e32 v8, -1, v0
3012 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3013 ; GFX6-NEXT:    s_brev_b32 s5, 1
3014 ; GFX6-NEXT:    v_subrev_i32_e32 v8, vcc, s4, v8
3015 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v0
3016 ; GFX6-NEXT:    v_subrev_i32_e32 v10, vcc, s5, v10
3017 ; GFX6-NEXT:    v_max_i32_e32 v4, v8, v4
3018 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v10
3019 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3020 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v4
3021 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v5
3022 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v1
3023 ; GFX6-NEXT:    v_subrev_i32_e32 v5, vcc, s4, v5
3024 ; GFX6-NEXT:    v_min_i32_e32 v8, -1, v1
3025 ; GFX6-NEXT:    v_subrev_i32_e32 v8, vcc, s5, v8
3026 ; GFX6-NEXT:    v_max_i32_e32 v4, v5, v4
3027 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3028 ; GFX6-NEXT:    v_bfrev_b32_e32 v9, -2
3029 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v8
3030 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v2
3031 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v4
3032 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v6
3033 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v9
3034 ; GFX6-NEXT:    v_min_i32_e32 v6, -1, v2
3035 ; GFX6-NEXT:    v_subrev_i32_e32 v6, vcc, s5, v6
3036 ; GFX6-NEXT:    v_max_i32_e32 v4, v5, v4
3037 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3038 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v6
3039 ; GFX6-NEXT:    v_max_i32_e32 v5, -1, v3
3040 ; GFX6-NEXT:    v_bfrev_b32_e32 v11, 1
3041 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v4
3042 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v7
3043 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v9
3044 ; GFX6-NEXT:    v_min_i32_e32 v6, -1, v3
3045 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, v6, v11
3046 ; GFX6-NEXT:    v_max_i32_e32 v4, v5, v4
3047 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
3048 ; GFX6-NEXT:    v_min_i32_e32 v4, v4, v6
3049 ; GFX6-NEXT:    s_mov_b32 s4, 0xffff
3050 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
3051 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v3, v4
3052 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v1
3053 ; GFX6-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
3054 ; GFX6-NEXT:    v_ashrrev_i32_e32 v3, 16, v3
3055 ; GFX6-NEXT:    v_and_b32_e32 v0, s4, v0
3056 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3057 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
3058 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v2
3059 ; GFX6-NEXT:    v_and_b32_e32 v2, s4, v3
3060 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3061 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v2
3062 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
3064 ; GFX8-LABEL: v_ssubsat_v4i16:
3065 ; GFX8:       ; %bb.0:
3066 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3067 ; GFX8-NEXT:    s_movk_i32 s4, 0x7fff
3068 ; GFX8-NEXT:    v_max_i16_e32 v6, -1, v0
3069 ; GFX8-NEXT:    s_movk_i32 s5, 0x8000
3070 ; GFX8-NEXT:    v_subrev_u16_e32 v6, s4, v6
3071 ; GFX8-NEXT:    v_min_i16_e32 v7, -1, v0
3072 ; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
3073 ; GFX8-NEXT:    v_subrev_u16_e32 v7, s5, v7
3074 ; GFX8-NEXT:    v_max_i16_e32 v6, v6, v2
3075 ; GFX8-NEXT:    v_min_i16_e32 v6, v6, v7
3076 ; GFX8-NEXT:    v_max_i16_e32 v7, -1, v4
3077 ; GFX8-NEXT:    v_subrev_u16_e32 v7, s4, v7
3078 ; GFX8-NEXT:    v_min_i16_e32 v8, -1, v4
3079 ; GFX8-NEXT:    v_subrev_u16_e32 v8, s5, v8
3080 ; GFX8-NEXT:    v_max_i16_sdwa v2, v7, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3081 ; GFX8-NEXT:    v_max_i16_e32 v7, -1, v1
3082 ; GFX8-NEXT:    v_min_i16_e32 v2, v2, v8
3083 ; GFX8-NEXT:    v_subrev_u16_e32 v7, s4, v7
3084 ; GFX8-NEXT:    v_min_i16_e32 v8, -1, v1
3085 ; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v1
3086 ; GFX8-NEXT:    v_subrev_u16_e32 v8, s5, v8
3087 ; GFX8-NEXT:    v_max_i16_e32 v7, v7, v3
3088 ; GFX8-NEXT:    v_min_i16_e32 v7, v7, v8
3089 ; GFX8-NEXT:    v_max_i16_e32 v8, -1, v5
3090 ; GFX8-NEXT:    v_subrev_u16_e32 v8, s4, v8
3091 ; GFX8-NEXT:    v_min_i16_e32 v9, -1, v5
3092 ; GFX8-NEXT:    v_subrev_u16_e32 v9, s5, v9
3093 ; GFX8-NEXT:    v_max_i16_sdwa v3, v8, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3094 ; GFX8-NEXT:    v_min_i16_e32 v3, v3, v9
3095 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v6
3096 ; GFX8-NEXT:    v_sub_u16_sdwa v2, v4, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3097 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3098 ; GFX8-NEXT:    v_sub_u16_e32 v1, v1, v7
3099 ; GFX8-NEXT:    v_sub_u16_sdwa v2, v5, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3100 ; GFX8-NEXT:    v_or_b32_e32 v1, v1, v2
3101 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
3103 ; GFX9-LABEL: v_ssubsat_v4i16:
3104 ; GFX9:       ; %bb.0:
3105 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3106 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v2 clamp
3107 ; GFX9-NEXT:    v_pk_sub_i16 v1, v1, v3 clamp
3108 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3110 ; GFX10-LABEL: v_ssubsat_v4i16:
3111 ; GFX10:       ; %bb.0:
3112 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3113 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3114 ; GFX10-NEXT:    v_pk_sub_i16 v0, v0, v2 clamp
3115 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, v3 clamp
3116 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3117   %result = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %lhs, <4 x i16> %rhs)
3118   %cast = bitcast <4 x i16> %result to <2 x float>
3119   ret <2 x float> %cast
3122 define amdgpu_ps <2 x i32> @s_ssubsat_v4i16(<4 x i16> inreg %lhs, <4 x i16> inreg %rhs) {
3123 ; GFX6-LABEL: s_ssubsat_v4i16:
3124 ; GFX6:       ; %bb.0:
3125 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
3126 ; GFX6-NEXT:    s_brev_b32 s8, -2
3127 ; GFX6-NEXT:    s_max_i32 s10, s0, -1
3128 ; GFX6-NEXT:    s_lshl_b32 s4, s4, 16
3129 ; GFX6-NEXT:    s_brev_b32 s9, 1
3130 ; GFX6-NEXT:    s_sub_i32 s10, s10, s8
3131 ; GFX6-NEXT:    s_min_i32 s11, s0, -1
3132 ; GFX6-NEXT:    s_sub_i32 s11, s11, s9
3133 ; GFX6-NEXT:    s_max_i32 s4, s10, s4
3134 ; GFX6-NEXT:    s_min_i32 s4, s4, s11
3135 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
3136 ; GFX6-NEXT:    s_sub_i32 s0, s0, s4
3137 ; GFX6-NEXT:    s_lshl_b32 s4, s5, 16
3138 ; GFX6-NEXT:    s_max_i32 s5, s1, -1
3139 ; GFX6-NEXT:    s_sub_i32 s5, s5, s8
3140 ; GFX6-NEXT:    s_min_i32 s10, s1, -1
3141 ; GFX6-NEXT:    s_sub_i32 s10, s10, s9
3142 ; GFX6-NEXT:    s_max_i32 s4, s5, s4
3143 ; GFX6-NEXT:    s_lshl_b32 s2, s2, 16
3144 ; GFX6-NEXT:    s_min_i32 s4, s4, s10
3145 ; GFX6-NEXT:    s_max_i32 s5, s2, -1
3146 ; GFX6-NEXT:    s_sub_i32 s1, s1, s4
3147 ; GFX6-NEXT:    s_lshl_b32 s4, s6, 16
3148 ; GFX6-NEXT:    s_sub_i32 s5, s5, s8
3149 ; GFX6-NEXT:    s_min_i32 s6, s2, -1
3150 ; GFX6-NEXT:    s_sub_i32 s6, s6, s9
3151 ; GFX6-NEXT:    s_max_i32 s4, s5, s4
3152 ; GFX6-NEXT:    s_lshl_b32 s3, s3, 16
3153 ; GFX6-NEXT:    s_min_i32 s4, s4, s6
3154 ; GFX6-NEXT:    s_max_i32 s5, s3, -1
3155 ; GFX6-NEXT:    s_sub_i32 s2, s2, s4
3156 ; GFX6-NEXT:    s_lshl_b32 s4, s7, 16
3157 ; GFX6-NEXT:    s_sub_i32 s5, s5, s8
3158 ; GFX6-NEXT:    s_min_i32 s6, s3, -1
3159 ; GFX6-NEXT:    s_sub_i32 s6, s6, s9
3160 ; GFX6-NEXT:    s_max_i32 s4, s5, s4
3161 ; GFX6-NEXT:    s_min_i32 s4, s4, s6
3162 ; GFX6-NEXT:    s_ashr_i32 s1, s1, 16
3163 ; GFX6-NEXT:    s_sub_i32 s3, s3, s4
3164 ; GFX6-NEXT:    s_mov_b32 s4, 0xffff
3165 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 16
3166 ; GFX6-NEXT:    s_and_b32 s1, s1, s4
3167 ; GFX6-NEXT:    s_ashr_i32 s2, s2, 16
3168 ; GFX6-NEXT:    s_ashr_i32 s3, s3, 16
3169 ; GFX6-NEXT:    s_and_b32 s0, s0, s4
3170 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
3171 ; GFX6-NEXT:    s_or_b32 s0, s0, s1
3172 ; GFX6-NEXT:    s_and_b32 s1, s2, s4
3173 ; GFX6-NEXT:    s_and_b32 s2, s3, s4
3174 ; GFX6-NEXT:    s_lshl_b32 s2, s2, 16
3175 ; GFX6-NEXT:    s_or_b32 s1, s1, s2
3176 ; GFX6-NEXT:    ; return to shader part epilog
3178 ; GFX8-LABEL: s_ssubsat_v4i16:
3179 ; GFX8:       ; %bb.0:
3180 ; GFX8-NEXT:    s_sext_i32_i16 s10, s0
3181 ; GFX8-NEXT:    s_sext_i32_i16 s11, -1
3182 ; GFX8-NEXT:    s_movk_i32 s8, 0x7fff
3183 ; GFX8-NEXT:    s_max_i32 s12, s10, s11
3184 ; GFX8-NEXT:    s_sub_i32 s12, s12, s8
3185 ; GFX8-NEXT:    s_lshr_b32 s6, s2, 16
3186 ; GFX8-NEXT:    s_movk_i32 s9, 0x8000
3187 ; GFX8-NEXT:    s_min_i32 s10, s10, s11
3188 ; GFX8-NEXT:    s_sext_i32_i16 s12, s12
3189 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
3190 ; GFX8-NEXT:    s_sub_i32 s10, s10, s9
3191 ; GFX8-NEXT:    s_max_i32 s2, s12, s2
3192 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
3193 ; GFX8-NEXT:    s_sext_i32_i16 s10, s10
3194 ; GFX8-NEXT:    s_lshr_b32 s4, s0, 16
3195 ; GFX8-NEXT:    s_min_i32 s2, s2, s10
3196 ; GFX8-NEXT:    s_sub_i32 s0, s0, s2
3197 ; GFX8-NEXT:    s_sext_i32_i16 s2, s4
3198 ; GFX8-NEXT:    s_max_i32 s10, s2, s11
3199 ; GFX8-NEXT:    s_sub_i32 s10, s10, s8
3200 ; GFX8-NEXT:    s_min_i32 s2, s2, s11
3201 ; GFX8-NEXT:    s_sext_i32_i16 s10, s10
3202 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3203 ; GFX8-NEXT:    s_sub_i32 s2, s2, s9
3204 ; GFX8-NEXT:    s_max_i32 s6, s10, s6
3205 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3206 ; GFX8-NEXT:    s_sext_i32_i16 s2, s2
3207 ; GFX8-NEXT:    s_min_i32 s2, s6, s2
3208 ; GFX8-NEXT:    s_sub_i32 s2, s4, s2
3209 ; GFX8-NEXT:    s_sext_i32_i16 s4, s1
3210 ; GFX8-NEXT:    s_max_i32 s6, s4, s11
3211 ; GFX8-NEXT:    s_sub_i32 s6, s6, s8
3212 ; GFX8-NEXT:    s_lshr_b32 s7, s3, 16
3213 ; GFX8-NEXT:    s_min_i32 s4, s4, s11
3214 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3215 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
3216 ; GFX8-NEXT:    s_sub_i32 s4, s4, s9
3217 ; GFX8-NEXT:    s_max_i32 s3, s6, s3
3218 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
3219 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3220 ; GFX8-NEXT:    s_lshr_b32 s5, s1, 16
3221 ; GFX8-NEXT:    s_min_i32 s3, s3, s4
3222 ; GFX8-NEXT:    s_sub_i32 s1, s1, s3
3223 ; GFX8-NEXT:    s_sext_i32_i16 s3, s5
3224 ; GFX8-NEXT:    s_max_i32 s4, s3, s11
3225 ; GFX8-NEXT:    s_sub_i32 s4, s4, s8
3226 ; GFX8-NEXT:    s_min_i32 s3, s3, s11
3227 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3228 ; GFX8-NEXT:    s_sext_i32_i16 s6, s7
3229 ; GFX8-NEXT:    s_sub_i32 s3, s3, s9
3230 ; GFX8-NEXT:    s_max_i32 s4, s4, s6
3231 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3232 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
3233 ; GFX8-NEXT:    s_min_i32 s3, s4, s3
3234 ; GFX8-NEXT:    s_bfe_u32 s2, s2, 0x100000
3235 ; GFX8-NEXT:    s_sub_i32 s3, s5, s3
3236 ; GFX8-NEXT:    s_bfe_u32 s0, s0, 0x100000
3237 ; GFX8-NEXT:    s_lshl_b32 s2, s2, 16
3238 ; GFX8-NEXT:    s_or_b32 s0, s0, s2
3239 ; GFX8-NEXT:    s_bfe_u32 s2, s3, 0x100000
3240 ; GFX8-NEXT:    s_bfe_u32 s1, s1, 0x100000
3241 ; GFX8-NEXT:    s_lshl_b32 s2, s2, 16
3242 ; GFX8-NEXT:    s_or_b32 s1, s1, s2
3243 ; GFX8-NEXT:    ; return to shader part epilog
3245 ; GFX9-LABEL: s_ssubsat_v4i16:
3246 ; GFX9:       ; %bb.0:
3247 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
3248 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
3249 ; GFX9-NEXT:    v_pk_sub_i16 v0, s0, v0 clamp
3250 ; GFX9-NEXT:    v_pk_sub_i16 v1, s1, v1 clamp
3251 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
3252 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
3253 ; GFX9-NEXT:    ; return to shader part epilog
3255 ; GFX10-LABEL: s_ssubsat_v4i16:
3256 ; GFX10:       ; %bb.0:
3257 ; GFX10-NEXT:    v_pk_sub_i16 v0, s0, s2 clamp
3258 ; GFX10-NEXT:    v_pk_sub_i16 v1, s1, s3 clamp
3259 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
3260 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
3261 ; GFX10-NEXT:    ; return to shader part epilog
3262   %result = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %lhs, <4 x i16> %rhs)
3263   %cast = bitcast <4 x i16> %result to <2 x i32>
3264   ret <2 x i32> %cast
3267 ; FIXME
3268 ; define <5 x i16> @v_ssubsat_v5i16(<5 x i16> %lhs, <5 x i16> %rhs) {
3269 ;   %result = call <5 x i16> @llvm.ssub.sat.v5i16(<5 x i16> %lhs, <5 x i16> %rhs)
3270 ;   ret <5 x i16> %result
3271 ; }
3273 ; define amdgpu_ps <5 x i16> @s_ssubsat_v5i16(<5 x i16> inreg %lhs, <5 x i16> inreg %rhs) {
3274 ;   %result = call <5 x i16> @llvm.ssub.sat.v5i16(<5 x i16> %lhs, <5 x i16> %rhs)
3275 ;   ret <5 x i16> %result
3276 ; }
3278 define <3 x float> @v_ssubsat_v6i16(<6 x i16> %lhs, <6 x i16> %rhs) {
3279 ; GFX6-LABEL: v_ssubsat_v6i16:
3280 ; GFX6:       ; %bb.0:
3281 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3282 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
3283 ; GFX6-NEXT:    s_brev_b32 s4, -2
3284 ; GFX6-NEXT:    v_max_i32_e32 v12, -1, v0
3285 ; GFX6-NEXT:    v_lshlrev_b32_e32 v6, 16, v6
3286 ; GFX6-NEXT:    s_brev_b32 s5, 1
3287 ; GFX6-NEXT:    v_subrev_i32_e32 v12, vcc, s4, v12
3288 ; GFX6-NEXT:    v_min_i32_e32 v14, -1, v0
3289 ; GFX6-NEXT:    v_subrev_i32_e32 v14, vcc, s5, v14
3290 ; GFX6-NEXT:    v_max_i32_e32 v6, v12, v6
3291 ; GFX6-NEXT:    v_min_i32_e32 v6, v6, v14
3292 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3293 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v6
3294 ; GFX6-NEXT:    v_lshlrev_b32_e32 v6, 16, v7
3295 ; GFX6-NEXT:    v_max_i32_e32 v7, -1, v1
3296 ; GFX6-NEXT:    v_subrev_i32_e32 v7, vcc, s4, v7
3297 ; GFX6-NEXT:    v_min_i32_e32 v12, -1, v1
3298 ; GFX6-NEXT:    v_subrev_i32_e32 v12, vcc, s5, v12
3299 ; GFX6-NEXT:    v_max_i32_e32 v6, v7, v6
3300 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3301 ; GFX6-NEXT:    v_bfrev_b32_e32 v13, -2
3302 ; GFX6-NEXT:    v_min_i32_e32 v6, v6, v12
3303 ; GFX6-NEXT:    v_max_i32_e32 v7, -1, v2
3304 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v6
3305 ; GFX6-NEXT:    v_lshlrev_b32_e32 v6, 16, v8
3306 ; GFX6-NEXT:    v_sub_i32_e32 v7, vcc, v7, v13
3307 ; GFX6-NEXT:    v_min_i32_e32 v8, -1, v2
3308 ; GFX6-NEXT:    v_subrev_i32_e32 v8, vcc, s5, v8
3309 ; GFX6-NEXT:    v_max_i32_e32 v6, v7, v6
3310 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3311 ; GFX6-NEXT:    v_min_i32_e32 v6, v6, v8
3312 ; GFX6-NEXT:    v_max_i32_e32 v7, -1, v3
3313 ; GFX6-NEXT:    v_bfrev_b32_e32 v15, 1
3314 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v6
3315 ; GFX6-NEXT:    v_lshlrev_b32_e32 v6, 16, v9
3316 ; GFX6-NEXT:    v_sub_i32_e32 v7, vcc, v7, v13
3317 ; GFX6-NEXT:    v_min_i32_e32 v8, -1, v3
3318 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, v8, v15
3319 ; GFX6-NEXT:    v_max_i32_e32 v6, v7, v6
3320 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3321 ; GFX6-NEXT:    v_min_i32_e32 v6, v6, v8
3322 ; GFX6-NEXT:    v_max_i32_e32 v7, -1, v4
3323 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v3, v6
3324 ; GFX6-NEXT:    v_lshlrev_b32_e32 v6, 16, v10
3325 ; GFX6-NEXT:    v_sub_i32_e32 v7, vcc, v7, v13
3326 ; GFX6-NEXT:    v_min_i32_e32 v8, -1, v4
3327 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, v8, v15
3328 ; GFX6-NEXT:    v_max_i32_e32 v6, v7, v6
3329 ; GFX6-NEXT:    v_lshlrev_b32_e32 v5, 16, v5
3330 ; GFX6-NEXT:    v_min_i32_e32 v6, v6, v8
3331 ; GFX6-NEXT:    v_max_i32_e32 v7, -1, v5
3332 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, v4, v6
3333 ; GFX6-NEXT:    v_lshlrev_b32_e32 v6, 16, v11
3334 ; GFX6-NEXT:    v_sub_i32_e32 v7, vcc, v7, v13
3335 ; GFX6-NEXT:    v_min_i32_e32 v8, -1, v5
3336 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
3337 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, v8, v15
3338 ; GFX6-NEXT:    v_max_i32_e32 v6, v7, v6
3339 ; GFX6-NEXT:    s_mov_b32 s4, 0xffff
3340 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
3341 ; GFX6-NEXT:    v_min_i32_e32 v6, v6, v8
3342 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v1
3343 ; GFX6-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
3344 ; GFX6-NEXT:    v_ashrrev_i32_e32 v3, 16, v3
3345 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v6
3346 ; GFX6-NEXT:    v_and_b32_e32 v0, s4, v0
3347 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3348 ; GFX6-NEXT:    v_ashrrev_i32_e32 v5, 16, v5
3349 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
3350 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v2
3351 ; GFX6-NEXT:    v_and_b32_e32 v2, s4, v3
3352 ; GFX6-NEXT:    v_ashrrev_i32_e32 v4, 16, v4
3353 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3354 ; GFX6-NEXT:    v_and_b32_e32 v3, s4, v5
3355 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v2
3356 ; GFX6-NEXT:    v_and_b32_e32 v2, s4, v4
3357 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3358 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3359 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
3361 ; GFX8-LABEL: v_ssubsat_v6i16:
3362 ; GFX8:       ; %bb.0:
3363 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3364 ; GFX8-NEXT:    s_movk_i32 s4, 0x7fff
3365 ; GFX8-NEXT:    v_max_i16_e32 v9, -1, v0
3366 ; GFX8-NEXT:    s_movk_i32 s5, 0x8000
3367 ; GFX8-NEXT:    v_subrev_u16_e32 v9, s4, v9
3368 ; GFX8-NEXT:    v_min_i16_e32 v11, -1, v0
3369 ; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
3370 ; GFX8-NEXT:    v_subrev_u16_e32 v11, s5, v11
3371 ; GFX8-NEXT:    v_max_i16_e32 v9, v9, v3
3372 ; GFX8-NEXT:    v_min_i16_e32 v9, v9, v11
3373 ; GFX8-NEXT:    v_max_i16_e32 v11, -1, v6
3374 ; GFX8-NEXT:    v_subrev_u16_e32 v11, s4, v11
3375 ; GFX8-NEXT:    v_min_i16_e32 v13, -1, v6
3376 ; GFX8-NEXT:    v_subrev_u16_e32 v13, s5, v13
3377 ; GFX8-NEXT:    v_max_i16_sdwa v3, v11, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3378 ; GFX8-NEXT:    v_max_i16_e32 v11, -1, v1
3379 ; GFX8-NEXT:    v_min_i16_e32 v3, v3, v13
3380 ; GFX8-NEXT:    v_subrev_u16_e32 v11, s4, v11
3381 ; GFX8-NEXT:    v_min_i16_e32 v13, -1, v1
3382 ; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 16, v1
3383 ; GFX8-NEXT:    v_subrev_u16_e32 v13, s5, v13
3384 ; GFX8-NEXT:    v_max_i16_e32 v11, v11, v4
3385 ; GFX8-NEXT:    v_min_i16_e32 v11, v11, v13
3386 ; GFX8-NEXT:    v_max_i16_e32 v13, -1, v7
3387 ; GFX8-NEXT:    v_subrev_u16_e32 v13, s4, v13
3388 ; GFX8-NEXT:    v_min_i16_e32 v14, -1, v7
3389 ; GFX8-NEXT:    v_mov_b32_e32 v10, 0x7fff
3390 ; GFX8-NEXT:    v_subrev_u16_e32 v14, s5, v14
3391 ; GFX8-NEXT:    v_max_i16_sdwa v4, v13, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3392 ; GFX8-NEXT:    v_max_i16_e32 v13, -1, v2
3393 ; GFX8-NEXT:    v_mov_b32_e32 v12, 0xffff8000
3394 ; GFX8-NEXT:    v_min_i16_e32 v4, v4, v14
3395 ; GFX8-NEXT:    v_sub_u16_e32 v13, v13, v10
3396 ; GFX8-NEXT:    v_min_i16_e32 v14, -1, v2
3397 ; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 16, v2
3398 ; GFX8-NEXT:    v_sub_u16_e32 v14, v14, v12
3399 ; GFX8-NEXT:    v_max_i16_e32 v13, v13, v5
3400 ; GFX8-NEXT:    v_min_i16_e32 v13, v13, v14
3401 ; GFX8-NEXT:    v_max_i16_e32 v14, -1, v8
3402 ; GFX8-NEXT:    v_sub_u16_e32 v10, v14, v10
3403 ; GFX8-NEXT:    v_min_i16_e32 v14, -1, v8
3404 ; GFX8-NEXT:    v_sub_u16_e32 v12, v14, v12
3405 ; GFX8-NEXT:    v_max_i16_sdwa v5, v10, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3406 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v9
3407 ; GFX8-NEXT:    v_sub_u16_sdwa v3, v6, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3408 ; GFX8-NEXT:    v_min_i16_e32 v5, v5, v12
3409 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v3
3410 ; GFX8-NEXT:    v_sub_u16_e32 v1, v1, v11
3411 ; GFX8-NEXT:    v_sub_u16_sdwa v3, v7, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3412 ; GFX8-NEXT:    v_or_b32_e32 v1, v1, v3
3413 ; GFX8-NEXT:    v_sub_u16_e32 v2, v2, v13
3414 ; GFX8-NEXT:    v_sub_u16_sdwa v3, v8, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3415 ; GFX8-NEXT:    v_or_b32_e32 v2, v2, v3
3416 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
3418 ; GFX9-LABEL: v_ssubsat_v6i16:
3419 ; GFX9:       ; %bb.0:
3420 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3421 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v3 clamp
3422 ; GFX9-NEXT:    v_pk_sub_i16 v1, v1, v4 clamp
3423 ; GFX9-NEXT:    v_pk_sub_i16 v2, v2, v5 clamp
3424 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3426 ; GFX10-LABEL: v_ssubsat_v6i16:
3427 ; GFX10:       ; %bb.0:
3428 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3429 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3430 ; GFX10-NEXT:    v_pk_sub_i16 v0, v0, v3 clamp
3431 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, v4 clamp
3432 ; GFX10-NEXT:    v_pk_sub_i16 v2, v2, v5 clamp
3433 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3434   %result = call <6 x i16> @llvm.ssub.sat.v6i16(<6 x i16> %lhs, <6 x i16> %rhs)
3435   %cast = bitcast <6 x i16> %result to <3 x float>
3436   ret <3 x float> %cast
3439 define amdgpu_ps <3 x i32> @s_ssubsat_v6i16(<6 x i16> inreg %lhs, <6 x i16> inreg %rhs) {
3440 ; GFX6-LABEL: s_ssubsat_v6i16:
3441 ; GFX6:       ; %bb.0:
3442 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
3443 ; GFX6-NEXT:    s_brev_b32 s12, -2
3444 ; GFX6-NEXT:    s_max_i32 s14, s0, -1
3445 ; GFX6-NEXT:    s_lshl_b32 s6, s6, 16
3446 ; GFX6-NEXT:    s_brev_b32 s13, 1
3447 ; GFX6-NEXT:    s_sub_i32 s14, s14, s12
3448 ; GFX6-NEXT:    s_min_i32 s15, s0, -1
3449 ; GFX6-NEXT:    s_sub_i32 s15, s15, s13
3450 ; GFX6-NEXT:    s_max_i32 s6, s14, s6
3451 ; GFX6-NEXT:    s_min_i32 s6, s6, s15
3452 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
3453 ; GFX6-NEXT:    s_sub_i32 s0, s0, s6
3454 ; GFX6-NEXT:    s_lshl_b32 s6, s7, 16
3455 ; GFX6-NEXT:    s_max_i32 s7, s1, -1
3456 ; GFX6-NEXT:    s_sub_i32 s7, s7, s12
3457 ; GFX6-NEXT:    s_min_i32 s14, s1, -1
3458 ; GFX6-NEXT:    s_sub_i32 s14, s14, s13
3459 ; GFX6-NEXT:    s_max_i32 s6, s7, s6
3460 ; GFX6-NEXT:    s_lshl_b32 s2, s2, 16
3461 ; GFX6-NEXT:    s_min_i32 s6, s6, s14
3462 ; GFX6-NEXT:    s_max_i32 s7, s2, -1
3463 ; GFX6-NEXT:    s_sub_i32 s1, s1, s6
3464 ; GFX6-NEXT:    s_lshl_b32 s6, s8, 16
3465 ; GFX6-NEXT:    s_sub_i32 s7, s7, s12
3466 ; GFX6-NEXT:    s_min_i32 s8, s2, -1
3467 ; GFX6-NEXT:    s_sub_i32 s8, s8, s13
3468 ; GFX6-NEXT:    s_max_i32 s6, s7, s6
3469 ; GFX6-NEXT:    s_lshl_b32 s3, s3, 16
3470 ; GFX6-NEXT:    s_min_i32 s6, s6, s8
3471 ; GFX6-NEXT:    s_max_i32 s7, s3, -1
3472 ; GFX6-NEXT:    s_sub_i32 s2, s2, s6
3473 ; GFX6-NEXT:    s_lshl_b32 s6, s9, 16
3474 ; GFX6-NEXT:    s_sub_i32 s7, s7, s12
3475 ; GFX6-NEXT:    s_min_i32 s8, s3, -1
3476 ; GFX6-NEXT:    s_sub_i32 s8, s8, s13
3477 ; GFX6-NEXT:    s_max_i32 s6, s7, s6
3478 ; GFX6-NEXT:    s_lshl_b32 s4, s4, 16
3479 ; GFX6-NEXT:    s_min_i32 s6, s6, s8
3480 ; GFX6-NEXT:    s_max_i32 s7, s4, -1
3481 ; GFX6-NEXT:    s_sub_i32 s3, s3, s6
3482 ; GFX6-NEXT:    s_lshl_b32 s6, s10, 16
3483 ; GFX6-NEXT:    s_sub_i32 s7, s7, s12
3484 ; GFX6-NEXT:    s_min_i32 s8, s4, -1
3485 ; GFX6-NEXT:    s_sub_i32 s8, s8, s13
3486 ; GFX6-NEXT:    s_max_i32 s6, s7, s6
3487 ; GFX6-NEXT:    s_lshl_b32 s5, s5, 16
3488 ; GFX6-NEXT:    s_min_i32 s6, s6, s8
3489 ; GFX6-NEXT:    s_max_i32 s7, s5, -1
3490 ; GFX6-NEXT:    s_sub_i32 s4, s4, s6
3491 ; GFX6-NEXT:    s_lshl_b32 s6, s11, 16
3492 ; GFX6-NEXT:    s_sub_i32 s7, s7, s12
3493 ; GFX6-NEXT:    s_min_i32 s8, s5, -1
3494 ; GFX6-NEXT:    s_sub_i32 s8, s8, s13
3495 ; GFX6-NEXT:    s_max_i32 s6, s7, s6
3496 ; GFX6-NEXT:    s_min_i32 s6, s6, s8
3497 ; GFX6-NEXT:    s_ashr_i32 s1, s1, 16
3498 ; GFX6-NEXT:    s_sub_i32 s5, s5, s6
3499 ; GFX6-NEXT:    s_mov_b32 s6, 0xffff
3500 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 16
3501 ; GFX6-NEXT:    s_and_b32 s1, s1, s6
3502 ; GFX6-NEXT:    s_ashr_i32 s2, s2, 16
3503 ; GFX6-NEXT:    s_ashr_i32 s3, s3, 16
3504 ; GFX6-NEXT:    s_and_b32 s0, s0, s6
3505 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
3506 ; GFX6-NEXT:    s_ashr_i32 s5, s5, 16
3507 ; GFX6-NEXT:    s_or_b32 s0, s0, s1
3508 ; GFX6-NEXT:    s_and_b32 s1, s2, s6
3509 ; GFX6-NEXT:    s_and_b32 s2, s3, s6
3510 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 16
3511 ; GFX6-NEXT:    s_lshl_b32 s2, s2, 16
3512 ; GFX6-NEXT:    s_and_b32 s3, s5, s6
3513 ; GFX6-NEXT:    s_or_b32 s1, s1, s2
3514 ; GFX6-NEXT:    s_and_b32 s2, s4, s6
3515 ; GFX6-NEXT:    s_lshl_b32 s3, s3, 16
3516 ; GFX6-NEXT:    s_or_b32 s2, s2, s3
3517 ; GFX6-NEXT:    ; return to shader part epilog
3519 ; GFX8-LABEL: s_ssubsat_v6i16:
3520 ; GFX8:       ; %bb.0:
3521 ; GFX8-NEXT:    s_sext_i32_i16 s14, s0
3522 ; GFX8-NEXT:    s_sext_i32_i16 s15, -1
3523 ; GFX8-NEXT:    s_movk_i32 s12, 0x7fff
3524 ; GFX8-NEXT:    s_max_i32 s16, s14, s15
3525 ; GFX8-NEXT:    s_sub_i32 s16, s16, s12
3526 ; GFX8-NEXT:    s_lshr_b32 s9, s3, 16
3527 ; GFX8-NEXT:    s_movk_i32 s13, 0x8000
3528 ; GFX8-NEXT:    s_min_i32 s14, s14, s15
3529 ; GFX8-NEXT:    s_sext_i32_i16 s16, s16
3530 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
3531 ; GFX8-NEXT:    s_sub_i32 s14, s14, s13
3532 ; GFX8-NEXT:    s_max_i32 s3, s16, s3
3533 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
3534 ; GFX8-NEXT:    s_sext_i32_i16 s14, s14
3535 ; GFX8-NEXT:    s_lshr_b32 s6, s0, 16
3536 ; GFX8-NEXT:    s_min_i32 s3, s3, s14
3537 ; GFX8-NEXT:    s_sub_i32 s0, s0, s3
3538 ; GFX8-NEXT:    s_sext_i32_i16 s3, s6
3539 ; GFX8-NEXT:    s_max_i32 s14, s3, s15
3540 ; GFX8-NEXT:    s_sub_i32 s14, s14, s12
3541 ; GFX8-NEXT:    s_min_i32 s3, s3, s15
3542 ; GFX8-NEXT:    s_sext_i32_i16 s14, s14
3543 ; GFX8-NEXT:    s_sext_i32_i16 s9, s9
3544 ; GFX8-NEXT:    s_sub_i32 s3, s3, s13
3545 ; GFX8-NEXT:    s_max_i32 s9, s14, s9
3546 ; GFX8-NEXT:    s_sext_i32_i16 s9, s9
3547 ; GFX8-NEXT:    s_sext_i32_i16 s3, s3
3548 ; GFX8-NEXT:    s_min_i32 s3, s9, s3
3549 ; GFX8-NEXT:    s_sub_i32 s3, s6, s3
3550 ; GFX8-NEXT:    s_sext_i32_i16 s6, s1
3551 ; GFX8-NEXT:    s_max_i32 s9, s6, s15
3552 ; GFX8-NEXT:    s_sub_i32 s9, s9, s12
3553 ; GFX8-NEXT:    s_lshr_b32 s10, s4, 16
3554 ; GFX8-NEXT:    s_min_i32 s6, s6, s15
3555 ; GFX8-NEXT:    s_sext_i32_i16 s9, s9
3556 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3557 ; GFX8-NEXT:    s_sub_i32 s6, s6, s13
3558 ; GFX8-NEXT:    s_max_i32 s4, s9, s4
3559 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3560 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3561 ; GFX8-NEXT:    s_lshr_b32 s7, s1, 16
3562 ; GFX8-NEXT:    s_min_i32 s4, s4, s6
3563 ; GFX8-NEXT:    s_sub_i32 s1, s1, s4
3564 ; GFX8-NEXT:    s_sext_i32_i16 s4, s7
3565 ; GFX8-NEXT:    s_max_i32 s6, s4, s15
3566 ; GFX8-NEXT:    s_sub_i32 s6, s6, s12
3567 ; GFX8-NEXT:    s_min_i32 s4, s4, s15
3568 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3569 ; GFX8-NEXT:    s_sext_i32_i16 s9, s10
3570 ; GFX8-NEXT:    s_sub_i32 s4, s4, s13
3571 ; GFX8-NEXT:    s_max_i32 s6, s6, s9
3572 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3573 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3574 ; GFX8-NEXT:    s_min_i32 s4, s6, s4
3575 ; GFX8-NEXT:    s_sext_i32_i16 s6, s2
3576 ; GFX8-NEXT:    s_sub_i32 s4, s7, s4
3577 ; GFX8-NEXT:    s_max_i32 s7, s6, s15
3578 ; GFX8-NEXT:    s_sub_i32 s7, s7, s12
3579 ; GFX8-NEXT:    s_lshr_b32 s11, s5, 16
3580 ; GFX8-NEXT:    s_min_i32 s6, s6, s15
3581 ; GFX8-NEXT:    s_sext_i32_i16 s7, s7
3582 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
3583 ; GFX8-NEXT:    s_sub_i32 s6, s6, s13
3584 ; GFX8-NEXT:    s_max_i32 s5, s7, s5
3585 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
3586 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3587 ; GFX8-NEXT:    s_lshr_b32 s8, s2, 16
3588 ; GFX8-NEXT:    s_min_i32 s5, s5, s6
3589 ; GFX8-NEXT:    s_sub_i32 s2, s2, s5
3590 ; GFX8-NEXT:    s_sext_i32_i16 s5, s8
3591 ; GFX8-NEXT:    s_max_i32 s6, s5, s15
3592 ; GFX8-NEXT:    s_sub_i32 s6, s6, s12
3593 ; GFX8-NEXT:    s_min_i32 s5, s5, s15
3594 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3595 ; GFX8-NEXT:    s_sext_i32_i16 s7, s11
3596 ; GFX8-NEXT:    s_sub_i32 s5, s5, s13
3597 ; GFX8-NEXT:    s_max_i32 s6, s6, s7
3598 ; GFX8-NEXT:    s_bfe_u32 s3, s3, 0x100000
3599 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
3600 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
3601 ; GFX8-NEXT:    s_bfe_u32 s0, s0, 0x100000
3602 ; GFX8-NEXT:    s_lshl_b32 s3, s3, 16
3603 ; GFX8-NEXT:    s_min_i32 s5, s6, s5
3604 ; GFX8-NEXT:    s_or_b32 s0, s0, s3
3605 ; GFX8-NEXT:    s_bfe_u32 s3, s4, 0x100000
3606 ; GFX8-NEXT:    s_sub_i32 s5, s8, s5
3607 ; GFX8-NEXT:    s_bfe_u32 s1, s1, 0x100000
3608 ; GFX8-NEXT:    s_lshl_b32 s3, s3, 16
3609 ; GFX8-NEXT:    s_or_b32 s1, s1, s3
3610 ; GFX8-NEXT:    s_bfe_u32 s3, s5, 0x100000
3611 ; GFX8-NEXT:    s_bfe_u32 s2, s2, 0x100000
3612 ; GFX8-NEXT:    s_lshl_b32 s3, s3, 16
3613 ; GFX8-NEXT:    s_or_b32 s2, s2, s3
3614 ; GFX8-NEXT:    ; return to shader part epilog
3616 ; GFX9-LABEL: s_ssubsat_v6i16:
3617 ; GFX9:       ; %bb.0:
3618 ; GFX9-NEXT:    v_mov_b32_e32 v0, s3
3619 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
3620 ; GFX9-NEXT:    v_mov_b32_e32 v2, s5
3621 ; GFX9-NEXT:    v_pk_sub_i16 v0, s0, v0 clamp
3622 ; GFX9-NEXT:    v_pk_sub_i16 v1, s1, v1 clamp
3623 ; GFX9-NEXT:    v_pk_sub_i16 v2, s2, v2 clamp
3624 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
3625 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
3626 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
3627 ; GFX9-NEXT:    ; return to shader part epilog
3629 ; GFX10-LABEL: s_ssubsat_v6i16:
3630 ; GFX10:       ; %bb.0:
3631 ; GFX10-NEXT:    v_pk_sub_i16 v0, s0, s3 clamp
3632 ; GFX10-NEXT:    v_pk_sub_i16 v1, s1, s4 clamp
3633 ; GFX10-NEXT:    v_pk_sub_i16 v2, s2, s5 clamp
3634 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
3635 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
3636 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
3637 ; GFX10-NEXT:    ; return to shader part epilog
3638   %result = call <6 x i16> @llvm.ssub.sat.v6i16(<6 x i16> %lhs, <6 x i16> %rhs)
3639   %cast = bitcast <6 x i16> %result to <3 x i32>
3640   ret <3 x i32> %cast
3643 define <4 x float> @v_ssubsat_v8i16(<8 x i16> %lhs, <8 x i16> %rhs) {
3644 ; GFX6-LABEL: v_ssubsat_v8i16:
3645 ; GFX6:       ; %bb.0:
3646 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3647 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
3648 ; GFX6-NEXT:    s_brev_b32 s4, -2
3649 ; GFX6-NEXT:    v_max_i32_e32 v16, -1, v0
3650 ; GFX6-NEXT:    v_lshlrev_b32_e32 v8, 16, v8
3651 ; GFX6-NEXT:    s_brev_b32 s5, 1
3652 ; GFX6-NEXT:    v_subrev_i32_e32 v16, vcc, s4, v16
3653 ; GFX6-NEXT:    v_min_i32_e32 v18, -1, v0
3654 ; GFX6-NEXT:    v_subrev_i32_e32 v18, vcc, s5, v18
3655 ; GFX6-NEXT:    v_max_i32_e32 v8, v16, v8
3656 ; GFX6-NEXT:    v_min_i32_e32 v8, v8, v18
3657 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3658 ; GFX6-NEXT:    v_sub_i32_e32 v0, vcc, v0, v8
3659 ; GFX6-NEXT:    v_lshlrev_b32_e32 v8, 16, v9
3660 ; GFX6-NEXT:    v_max_i32_e32 v9, -1, v1
3661 ; GFX6-NEXT:    v_subrev_i32_e32 v9, vcc, s4, v9
3662 ; GFX6-NEXT:    v_min_i32_e32 v16, -1, v1
3663 ; GFX6-NEXT:    v_subrev_i32_e32 v16, vcc, s5, v16
3664 ; GFX6-NEXT:    v_max_i32_e32 v8, v9, v8
3665 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3666 ; GFX6-NEXT:    v_bfrev_b32_e32 v17, -2
3667 ; GFX6-NEXT:    v_min_i32_e32 v8, v8, v16
3668 ; GFX6-NEXT:    v_max_i32_e32 v9, -1, v2
3669 ; GFX6-NEXT:    v_sub_i32_e32 v1, vcc, v1, v8
3670 ; GFX6-NEXT:    v_lshlrev_b32_e32 v8, 16, v10
3671 ; GFX6-NEXT:    v_sub_i32_e32 v9, vcc, v9, v17
3672 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v2
3673 ; GFX6-NEXT:    v_subrev_i32_e32 v10, vcc, s5, v10
3674 ; GFX6-NEXT:    v_max_i32_e32 v8, v9, v8
3675 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3676 ; GFX6-NEXT:    v_min_i32_e32 v8, v8, v10
3677 ; GFX6-NEXT:    v_max_i32_e32 v9, -1, v3
3678 ; GFX6-NEXT:    v_bfrev_b32_e32 v19, 1
3679 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, v2, v8
3680 ; GFX6-NEXT:    v_lshlrev_b32_e32 v8, 16, v11
3681 ; GFX6-NEXT:    v_sub_i32_e32 v9, vcc, v9, v17
3682 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v3
3683 ; GFX6-NEXT:    v_sub_i32_e32 v10, vcc, v10, v19
3684 ; GFX6-NEXT:    v_max_i32_e32 v8, v9, v8
3685 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3686 ; GFX6-NEXT:    v_min_i32_e32 v8, v8, v10
3687 ; GFX6-NEXT:    v_max_i32_e32 v9, -1, v4
3688 ; GFX6-NEXT:    v_sub_i32_e32 v3, vcc, v3, v8
3689 ; GFX6-NEXT:    v_lshlrev_b32_e32 v8, 16, v12
3690 ; GFX6-NEXT:    v_sub_i32_e32 v9, vcc, v9, v17
3691 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v4
3692 ; GFX6-NEXT:    v_sub_i32_e32 v10, vcc, v10, v19
3693 ; GFX6-NEXT:    v_max_i32_e32 v8, v9, v8
3694 ; GFX6-NEXT:    v_lshlrev_b32_e32 v5, 16, v5
3695 ; GFX6-NEXT:    v_min_i32_e32 v8, v8, v10
3696 ; GFX6-NEXT:    v_max_i32_e32 v9, -1, v5
3697 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, v4, v8
3698 ; GFX6-NEXT:    v_lshlrev_b32_e32 v8, 16, v13
3699 ; GFX6-NEXT:    v_sub_i32_e32 v9, vcc, v9, v17
3700 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v5
3701 ; GFX6-NEXT:    v_sub_i32_e32 v10, vcc, v10, v19
3702 ; GFX6-NEXT:    v_max_i32_e32 v8, v9, v8
3703 ; GFX6-NEXT:    v_lshlrev_b32_e32 v6, 16, v6
3704 ; GFX6-NEXT:    v_min_i32_e32 v8, v8, v10
3705 ; GFX6-NEXT:    v_max_i32_e32 v9, -1, v6
3706 ; GFX6-NEXT:    v_sub_i32_e32 v5, vcc, v5, v8
3707 ; GFX6-NEXT:    v_lshlrev_b32_e32 v8, 16, v14
3708 ; GFX6-NEXT:    v_sub_i32_e32 v9, vcc, v9, v17
3709 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v6
3710 ; GFX6-NEXT:    v_sub_i32_e32 v10, vcc, v10, v19
3711 ; GFX6-NEXT:    v_max_i32_e32 v8, v9, v8
3712 ; GFX6-NEXT:    v_lshlrev_b32_e32 v7, 16, v7
3713 ; GFX6-NEXT:    v_min_i32_e32 v8, v8, v10
3714 ; GFX6-NEXT:    v_max_i32_e32 v9, -1, v7
3715 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
3716 ; GFX6-NEXT:    v_sub_i32_e32 v6, vcc, v6, v8
3717 ; GFX6-NEXT:    v_lshlrev_b32_e32 v8, 16, v15
3718 ; GFX6-NEXT:    v_sub_i32_e32 v9, vcc, v9, v17
3719 ; GFX6-NEXT:    v_min_i32_e32 v10, -1, v7
3720 ; GFX6-NEXT:    s_mov_b32 s4, 0xffff
3721 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
3722 ; GFX6-NEXT:    v_sub_i32_e32 v10, vcc, v10, v19
3723 ; GFX6-NEXT:    v_max_i32_e32 v8, v9, v8
3724 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v1
3725 ; GFX6-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
3726 ; GFX6-NEXT:    v_ashrrev_i32_e32 v3, 16, v3
3727 ; GFX6-NEXT:    v_min_i32_e32 v8, v8, v10
3728 ; GFX6-NEXT:    v_and_b32_e32 v0, s4, v0
3729 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3730 ; GFX6-NEXT:    v_ashrrev_i32_e32 v5, 16, v5
3731 ; GFX6-NEXT:    v_sub_i32_e32 v7, vcc, v7, v8
3732 ; GFX6-NEXT:    v_or_b32_e32 v0, v0, v1
3733 ; GFX6-NEXT:    v_and_b32_e32 v1, s4, v2
3734 ; GFX6-NEXT:    v_and_b32_e32 v2, s4, v3
3735 ; GFX6-NEXT:    v_ashrrev_i32_e32 v4, 16, v4
3736 ; GFX6-NEXT:    v_ashrrev_i32_e32 v7, 16, v7
3737 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3738 ; GFX6-NEXT:    v_and_b32_e32 v3, s4, v5
3739 ; GFX6-NEXT:    v_ashrrev_i32_e32 v6, 16, v6
3740 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v2
3741 ; GFX6-NEXT:    v_and_b32_e32 v2, s4, v4
3742 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3743 ; GFX6-NEXT:    v_and_b32_e32 v4, s4, v7
3744 ; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3745 ; GFX6-NEXT:    v_and_b32_e32 v3, s4, v6
3746 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
3747 ; GFX6-NEXT:    v_or_b32_e32 v3, v3, v4
3748 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
3750 ; GFX8-LABEL: v_ssubsat_v8i16:
3751 ; GFX8:       ; %bb.0:
3752 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3753 ; GFX8-NEXT:    s_movk_i32 s4, 0x7fff
3754 ; GFX8-NEXT:    v_max_i16_e32 v12, -1, v0
3755 ; GFX8-NEXT:    s_movk_i32 s5, 0x8000
3756 ; GFX8-NEXT:    v_subrev_u16_e32 v12, s4, v12
3757 ; GFX8-NEXT:    v_min_i16_e32 v14, -1, v0
3758 ; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 16, v0
3759 ; GFX8-NEXT:    v_subrev_u16_e32 v14, s5, v14
3760 ; GFX8-NEXT:    v_max_i16_e32 v12, v12, v4
3761 ; GFX8-NEXT:    v_min_i16_e32 v12, v12, v14
3762 ; GFX8-NEXT:    v_max_i16_e32 v14, -1, v8
3763 ; GFX8-NEXT:    v_subrev_u16_e32 v14, s4, v14
3764 ; GFX8-NEXT:    v_min_i16_e32 v16, -1, v8
3765 ; GFX8-NEXT:    v_subrev_u16_e32 v16, s5, v16
3766 ; GFX8-NEXT:    v_max_i16_sdwa v4, v14, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3767 ; GFX8-NEXT:    v_max_i16_e32 v14, -1, v1
3768 ; GFX8-NEXT:    v_min_i16_e32 v4, v4, v16
3769 ; GFX8-NEXT:    v_subrev_u16_e32 v14, s4, v14
3770 ; GFX8-NEXT:    v_min_i16_e32 v16, -1, v1
3771 ; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 16, v1
3772 ; GFX8-NEXT:    v_subrev_u16_e32 v16, s5, v16
3773 ; GFX8-NEXT:    v_max_i16_e32 v14, v14, v5
3774 ; GFX8-NEXT:    v_min_i16_e32 v14, v14, v16
3775 ; GFX8-NEXT:    v_max_i16_e32 v16, -1, v9
3776 ; GFX8-NEXT:    v_subrev_u16_e32 v16, s4, v16
3777 ; GFX8-NEXT:    v_min_i16_e32 v17, -1, v9
3778 ; GFX8-NEXT:    v_mov_b32_e32 v13, 0x7fff
3779 ; GFX8-NEXT:    v_subrev_u16_e32 v17, s5, v17
3780 ; GFX8-NEXT:    v_max_i16_sdwa v5, v16, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3781 ; GFX8-NEXT:    v_max_i16_e32 v16, -1, v2
3782 ; GFX8-NEXT:    v_mov_b32_e32 v15, 0xffff8000
3783 ; GFX8-NEXT:    v_min_i16_e32 v5, v5, v17
3784 ; GFX8-NEXT:    v_sub_u16_e32 v16, v16, v13
3785 ; GFX8-NEXT:    v_min_i16_e32 v17, -1, v2
3786 ; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 16, v2
3787 ; GFX8-NEXT:    v_sub_u16_e32 v17, v17, v15
3788 ; GFX8-NEXT:    v_max_i16_e32 v16, v16, v6
3789 ; GFX8-NEXT:    v_min_i16_e32 v16, v16, v17
3790 ; GFX8-NEXT:    v_max_i16_e32 v17, -1, v10
3791 ; GFX8-NEXT:    v_sub_u16_e32 v17, v17, v13
3792 ; GFX8-NEXT:    v_min_i16_e32 v18, -1, v10
3793 ; GFX8-NEXT:    v_sub_u16_e32 v18, v18, v15
3794 ; GFX8-NEXT:    v_max_i16_sdwa v6, v17, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3795 ; GFX8-NEXT:    v_max_i16_e32 v17, -1, v3
3796 ; GFX8-NEXT:    v_min_i16_e32 v6, v6, v18
3797 ; GFX8-NEXT:    v_sub_u16_e32 v17, v17, v13
3798 ; GFX8-NEXT:    v_min_i16_e32 v18, -1, v3
3799 ; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 16, v3
3800 ; GFX8-NEXT:    v_sub_u16_e32 v18, v18, v15
3801 ; GFX8-NEXT:    v_max_i16_e32 v17, v17, v7
3802 ; GFX8-NEXT:    v_min_i16_e32 v17, v17, v18
3803 ; GFX8-NEXT:    v_max_i16_e32 v18, -1, v11
3804 ; GFX8-NEXT:    v_sub_u16_e32 v13, v18, v13
3805 ; GFX8-NEXT:    v_min_i16_e32 v18, -1, v11
3806 ; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v12
3807 ; GFX8-NEXT:    v_sub_u16_sdwa v4, v8, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3808 ; GFX8-NEXT:    v_sub_u16_e32 v15, v18, v15
3809 ; GFX8-NEXT:    v_max_i16_sdwa v7, v13, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_1
3810 ; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
3811 ; GFX8-NEXT:    v_sub_u16_e32 v1, v1, v14
3812 ; GFX8-NEXT:    v_sub_u16_sdwa v4, v9, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3813 ; GFX8-NEXT:    v_min_i16_e32 v7, v7, v15
3814 ; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
3815 ; GFX8-NEXT:    v_sub_u16_e32 v2, v2, v16
3816 ; GFX8-NEXT:    v_sub_u16_sdwa v4, v10, v6 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3817 ; GFX8-NEXT:    v_or_b32_e32 v2, v2, v4
3818 ; GFX8-NEXT:    v_sub_u16_e32 v3, v3, v17
3819 ; GFX8-NEXT:    v_sub_u16_sdwa v4, v11, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3820 ; GFX8-NEXT:    v_or_b32_e32 v3, v3, v4
3821 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
3823 ; GFX9-LABEL: v_ssubsat_v8i16:
3824 ; GFX9:       ; %bb.0:
3825 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3826 ; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v4 clamp
3827 ; GFX9-NEXT:    v_pk_sub_i16 v1, v1, v5 clamp
3828 ; GFX9-NEXT:    v_pk_sub_i16 v2, v2, v6 clamp
3829 ; GFX9-NEXT:    v_pk_sub_i16 v3, v3, v7 clamp
3830 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3832 ; GFX10-LABEL: v_ssubsat_v8i16:
3833 ; GFX10:       ; %bb.0:
3834 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3835 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3836 ; GFX10-NEXT:    v_pk_sub_i16 v0, v0, v4 clamp
3837 ; GFX10-NEXT:    v_pk_sub_i16 v1, v1, v5 clamp
3838 ; GFX10-NEXT:    v_pk_sub_i16 v2, v2, v6 clamp
3839 ; GFX10-NEXT:    v_pk_sub_i16 v3, v3, v7 clamp
3840 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3841   %result = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %lhs, <8 x i16> %rhs)
3842   %cast = bitcast <8 x i16> %result to <4 x float>
3843   ret <4 x float> %cast
3846 define amdgpu_ps <4 x i32> @s_ssubsat_v8i16(<8 x i16> inreg %lhs, <8 x i16> inreg %rhs) {
3847 ; GFX6-LABEL: s_ssubsat_v8i16:
3848 ; GFX6:       ; %bb.0:
3849 ; GFX6-NEXT:    s_lshl_b32 s0, s0, 16
3850 ; GFX6-NEXT:    s_brev_b32 s16, -2
3851 ; GFX6-NEXT:    s_max_i32 s18, s0, -1
3852 ; GFX6-NEXT:    s_lshl_b32 s8, s8, 16
3853 ; GFX6-NEXT:    s_brev_b32 s17, 1
3854 ; GFX6-NEXT:    s_sub_i32 s18, s18, s16
3855 ; GFX6-NEXT:    s_min_i32 s19, s0, -1
3856 ; GFX6-NEXT:    s_sub_i32 s19, s19, s17
3857 ; GFX6-NEXT:    s_max_i32 s8, s18, s8
3858 ; GFX6-NEXT:    s_min_i32 s8, s8, s19
3859 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
3860 ; GFX6-NEXT:    s_sub_i32 s0, s0, s8
3861 ; GFX6-NEXT:    s_lshl_b32 s8, s9, 16
3862 ; GFX6-NEXT:    s_max_i32 s9, s1, -1
3863 ; GFX6-NEXT:    s_sub_i32 s9, s9, s16
3864 ; GFX6-NEXT:    s_min_i32 s18, s1, -1
3865 ; GFX6-NEXT:    s_sub_i32 s18, s18, s17
3866 ; GFX6-NEXT:    s_max_i32 s8, s9, s8
3867 ; GFX6-NEXT:    s_lshl_b32 s2, s2, 16
3868 ; GFX6-NEXT:    s_min_i32 s8, s8, s18
3869 ; GFX6-NEXT:    s_max_i32 s9, s2, -1
3870 ; GFX6-NEXT:    s_sub_i32 s1, s1, s8
3871 ; GFX6-NEXT:    s_lshl_b32 s8, s10, 16
3872 ; GFX6-NEXT:    s_sub_i32 s9, s9, s16
3873 ; GFX6-NEXT:    s_min_i32 s10, s2, -1
3874 ; GFX6-NEXT:    s_sub_i32 s10, s10, s17
3875 ; GFX6-NEXT:    s_max_i32 s8, s9, s8
3876 ; GFX6-NEXT:    s_lshl_b32 s3, s3, 16
3877 ; GFX6-NEXT:    s_min_i32 s8, s8, s10
3878 ; GFX6-NEXT:    s_max_i32 s9, s3, -1
3879 ; GFX6-NEXT:    s_sub_i32 s2, s2, s8
3880 ; GFX6-NEXT:    s_lshl_b32 s8, s11, 16
3881 ; GFX6-NEXT:    s_sub_i32 s9, s9, s16
3882 ; GFX6-NEXT:    s_min_i32 s10, s3, -1
3883 ; GFX6-NEXT:    s_sub_i32 s10, s10, s17
3884 ; GFX6-NEXT:    s_max_i32 s8, s9, s8
3885 ; GFX6-NEXT:    s_lshl_b32 s4, s4, 16
3886 ; GFX6-NEXT:    s_min_i32 s8, s8, s10
3887 ; GFX6-NEXT:    s_max_i32 s9, s4, -1
3888 ; GFX6-NEXT:    s_sub_i32 s3, s3, s8
3889 ; GFX6-NEXT:    s_lshl_b32 s8, s12, 16
3890 ; GFX6-NEXT:    s_sub_i32 s9, s9, s16
3891 ; GFX6-NEXT:    s_min_i32 s10, s4, -1
3892 ; GFX6-NEXT:    s_sub_i32 s10, s10, s17
3893 ; GFX6-NEXT:    s_max_i32 s8, s9, s8
3894 ; GFX6-NEXT:    s_lshl_b32 s5, s5, 16
3895 ; GFX6-NEXT:    s_min_i32 s8, s8, s10
3896 ; GFX6-NEXT:    s_max_i32 s9, s5, -1
3897 ; GFX6-NEXT:    s_sub_i32 s4, s4, s8
3898 ; GFX6-NEXT:    s_lshl_b32 s8, s13, 16
3899 ; GFX6-NEXT:    s_sub_i32 s9, s9, s16
3900 ; GFX6-NEXT:    s_min_i32 s10, s5, -1
3901 ; GFX6-NEXT:    s_sub_i32 s10, s10, s17
3902 ; GFX6-NEXT:    s_max_i32 s8, s9, s8
3903 ; GFX6-NEXT:    s_lshl_b32 s6, s6, 16
3904 ; GFX6-NEXT:    s_min_i32 s8, s8, s10
3905 ; GFX6-NEXT:    s_max_i32 s9, s6, -1
3906 ; GFX6-NEXT:    s_sub_i32 s5, s5, s8
3907 ; GFX6-NEXT:    s_lshl_b32 s8, s14, 16
3908 ; GFX6-NEXT:    s_sub_i32 s9, s9, s16
3909 ; GFX6-NEXT:    s_min_i32 s10, s6, -1
3910 ; GFX6-NEXT:    s_sub_i32 s10, s10, s17
3911 ; GFX6-NEXT:    s_max_i32 s8, s9, s8
3912 ; GFX6-NEXT:    s_lshl_b32 s7, s7, 16
3913 ; GFX6-NEXT:    s_min_i32 s8, s8, s10
3914 ; GFX6-NEXT:    s_max_i32 s9, s7, -1
3915 ; GFX6-NEXT:    s_sub_i32 s6, s6, s8
3916 ; GFX6-NEXT:    s_lshl_b32 s8, s15, 16
3917 ; GFX6-NEXT:    s_sub_i32 s9, s9, s16
3918 ; GFX6-NEXT:    s_min_i32 s10, s7, -1
3919 ; GFX6-NEXT:    s_sub_i32 s10, s10, s17
3920 ; GFX6-NEXT:    s_max_i32 s8, s9, s8
3921 ; GFX6-NEXT:    s_min_i32 s8, s8, s10
3922 ; GFX6-NEXT:    s_ashr_i32 s1, s1, 16
3923 ; GFX6-NEXT:    s_sub_i32 s7, s7, s8
3924 ; GFX6-NEXT:    s_mov_b32 s8, 0xffff
3925 ; GFX6-NEXT:    s_ashr_i32 s0, s0, 16
3926 ; GFX6-NEXT:    s_and_b32 s1, s1, s8
3927 ; GFX6-NEXT:    s_ashr_i32 s2, s2, 16
3928 ; GFX6-NEXT:    s_ashr_i32 s3, s3, 16
3929 ; GFX6-NEXT:    s_and_b32 s0, s0, s8
3930 ; GFX6-NEXT:    s_lshl_b32 s1, s1, 16
3931 ; GFX6-NEXT:    s_ashr_i32 s5, s5, 16
3932 ; GFX6-NEXT:    s_or_b32 s0, s0, s1
3933 ; GFX6-NEXT:    s_and_b32 s1, s2, s8
3934 ; GFX6-NEXT:    s_and_b32 s2, s3, s8
3935 ; GFX6-NEXT:    s_ashr_i32 s4, s4, 16
3936 ; GFX6-NEXT:    s_ashr_i32 s7, s7, 16
3937 ; GFX6-NEXT:    s_lshl_b32 s2, s2, 16
3938 ; GFX6-NEXT:    s_and_b32 s3, s5, s8
3939 ; GFX6-NEXT:    s_ashr_i32 s6, s6, 16
3940 ; GFX6-NEXT:    s_or_b32 s1, s1, s2
3941 ; GFX6-NEXT:    s_and_b32 s2, s4, s8
3942 ; GFX6-NEXT:    s_lshl_b32 s3, s3, 16
3943 ; GFX6-NEXT:    s_and_b32 s4, s7, s8
3944 ; GFX6-NEXT:    s_or_b32 s2, s2, s3
3945 ; GFX6-NEXT:    s_and_b32 s3, s6, s8
3946 ; GFX6-NEXT:    s_lshl_b32 s4, s4, 16
3947 ; GFX6-NEXT:    s_or_b32 s3, s3, s4
3948 ; GFX6-NEXT:    ; return to shader part epilog
3950 ; GFX8-LABEL: s_ssubsat_v8i16:
3951 ; GFX8:       ; %bb.0:
3952 ; GFX8-NEXT:    s_sext_i32_i16 s18, s0
3953 ; GFX8-NEXT:    s_sext_i32_i16 s19, -1
3954 ; GFX8-NEXT:    s_movk_i32 s16, 0x7fff
3955 ; GFX8-NEXT:    s_max_i32 s20, s18, s19
3956 ; GFX8-NEXT:    s_sub_i32 s20, s20, s16
3957 ; GFX8-NEXT:    s_lshr_b32 s12, s4, 16
3958 ; GFX8-NEXT:    s_movk_i32 s17, 0x8000
3959 ; GFX8-NEXT:    s_min_i32 s18, s18, s19
3960 ; GFX8-NEXT:    s_sext_i32_i16 s20, s20
3961 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3962 ; GFX8-NEXT:    s_sub_i32 s18, s18, s17
3963 ; GFX8-NEXT:    s_max_i32 s4, s20, s4
3964 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3965 ; GFX8-NEXT:    s_sext_i32_i16 s18, s18
3966 ; GFX8-NEXT:    s_lshr_b32 s8, s0, 16
3967 ; GFX8-NEXT:    s_min_i32 s4, s4, s18
3968 ; GFX8-NEXT:    s_sub_i32 s0, s0, s4
3969 ; GFX8-NEXT:    s_sext_i32_i16 s4, s8
3970 ; GFX8-NEXT:    s_max_i32 s18, s4, s19
3971 ; GFX8-NEXT:    s_sub_i32 s18, s18, s16
3972 ; GFX8-NEXT:    s_min_i32 s4, s4, s19
3973 ; GFX8-NEXT:    s_sext_i32_i16 s18, s18
3974 ; GFX8-NEXT:    s_sext_i32_i16 s12, s12
3975 ; GFX8-NEXT:    s_sub_i32 s4, s4, s17
3976 ; GFX8-NEXT:    s_max_i32 s12, s18, s12
3977 ; GFX8-NEXT:    s_sext_i32_i16 s12, s12
3978 ; GFX8-NEXT:    s_sext_i32_i16 s4, s4
3979 ; GFX8-NEXT:    s_min_i32 s4, s12, s4
3980 ; GFX8-NEXT:    s_sub_i32 s4, s8, s4
3981 ; GFX8-NEXT:    s_sext_i32_i16 s8, s1
3982 ; GFX8-NEXT:    s_max_i32 s12, s8, s19
3983 ; GFX8-NEXT:    s_sub_i32 s12, s12, s16
3984 ; GFX8-NEXT:    s_lshr_b32 s13, s5, 16
3985 ; GFX8-NEXT:    s_min_i32 s8, s8, s19
3986 ; GFX8-NEXT:    s_sext_i32_i16 s12, s12
3987 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
3988 ; GFX8-NEXT:    s_sub_i32 s8, s8, s17
3989 ; GFX8-NEXT:    s_max_i32 s5, s12, s5
3990 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
3991 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
3992 ; GFX8-NEXT:    s_lshr_b32 s9, s1, 16
3993 ; GFX8-NEXT:    s_min_i32 s5, s5, s8
3994 ; GFX8-NEXT:    s_sub_i32 s1, s1, s5
3995 ; GFX8-NEXT:    s_sext_i32_i16 s5, s9
3996 ; GFX8-NEXT:    s_max_i32 s8, s5, s19
3997 ; GFX8-NEXT:    s_sub_i32 s8, s8, s16
3998 ; GFX8-NEXT:    s_min_i32 s5, s5, s19
3999 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
4000 ; GFX8-NEXT:    s_sext_i32_i16 s12, s13
4001 ; GFX8-NEXT:    s_sub_i32 s5, s5, s17
4002 ; GFX8-NEXT:    s_max_i32 s8, s8, s12
4003 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
4004 ; GFX8-NEXT:    s_sext_i32_i16 s5, s5
4005 ; GFX8-NEXT:    s_min_i32 s5, s8, s5
4006 ; GFX8-NEXT:    s_sext_i32_i16 s8, s2
4007 ; GFX8-NEXT:    s_sub_i32 s5, s9, s5
4008 ; GFX8-NEXT:    s_max_i32 s9, s8, s19
4009 ; GFX8-NEXT:    s_sub_i32 s9, s9, s16
4010 ; GFX8-NEXT:    s_lshr_b32 s14, s6, 16
4011 ; GFX8-NEXT:    s_min_i32 s8, s8, s19
4012 ; GFX8-NEXT:    s_sext_i32_i16 s9, s9
4013 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
4014 ; GFX8-NEXT:    s_sub_i32 s8, s8, s17
4015 ; GFX8-NEXT:    s_max_i32 s6, s9, s6
4016 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
4017 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
4018 ; GFX8-NEXT:    s_lshr_b32 s10, s2, 16
4019 ; GFX8-NEXT:    s_min_i32 s6, s6, s8
4020 ; GFX8-NEXT:    s_sub_i32 s2, s2, s6
4021 ; GFX8-NEXT:    s_sext_i32_i16 s6, s10
4022 ; GFX8-NEXT:    s_max_i32 s8, s6, s19
4023 ; GFX8-NEXT:    s_sub_i32 s8, s8, s16
4024 ; GFX8-NEXT:    s_min_i32 s6, s6, s19
4025 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
4026 ; GFX8-NEXT:    s_sext_i32_i16 s9, s14
4027 ; GFX8-NEXT:    s_sub_i32 s6, s6, s17
4028 ; GFX8-NEXT:    s_max_i32 s8, s8, s9
4029 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
4030 ; GFX8-NEXT:    s_sext_i32_i16 s6, s6
4031 ; GFX8-NEXT:    s_min_i32 s6, s8, s6
4032 ; GFX8-NEXT:    s_sext_i32_i16 s8, s3
4033 ; GFX8-NEXT:    s_max_i32 s9, s8, s19
4034 ; GFX8-NEXT:    s_sub_i32 s9, s9, s16
4035 ; GFX8-NEXT:    s_lshr_b32 s15, s7, 16
4036 ; GFX8-NEXT:    s_min_i32 s8, s8, s19
4037 ; GFX8-NEXT:    s_sext_i32_i16 s9, s9
4038 ; GFX8-NEXT:    s_sext_i32_i16 s7, s7
4039 ; GFX8-NEXT:    s_sub_i32 s8, s8, s17
4040 ; GFX8-NEXT:    s_max_i32 s7, s9, s7
4041 ; GFX8-NEXT:    s_sext_i32_i16 s7, s7
4042 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
4043 ; GFX8-NEXT:    s_lshr_b32 s11, s3, 16
4044 ; GFX8-NEXT:    s_min_i32 s7, s7, s8
4045 ; GFX8-NEXT:    s_sub_i32 s3, s3, s7
4046 ; GFX8-NEXT:    s_sext_i32_i16 s7, s11
4047 ; GFX8-NEXT:    s_max_i32 s8, s7, s19
4048 ; GFX8-NEXT:    s_sub_i32 s8, s8, s16
4049 ; GFX8-NEXT:    s_bfe_u32 s4, s4, 0x100000
4050 ; GFX8-NEXT:    s_min_i32 s7, s7, s19
4051 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
4052 ; GFX8-NEXT:    s_sext_i32_i16 s9, s15
4053 ; GFX8-NEXT:    s_bfe_u32 s0, s0, 0x100000
4054 ; GFX8-NEXT:    s_lshl_b32 s4, s4, 16
4055 ; GFX8-NEXT:    s_sub_i32 s7, s7, s17
4056 ; GFX8-NEXT:    s_max_i32 s8, s8, s9
4057 ; GFX8-NEXT:    s_or_b32 s0, s0, s4
4058 ; GFX8-NEXT:    s_bfe_u32 s4, s5, 0x100000
4059 ; GFX8-NEXT:    s_sub_i32 s6, s10, s6
4060 ; GFX8-NEXT:    s_sext_i32_i16 s8, s8
4061 ; GFX8-NEXT:    s_sext_i32_i16 s7, s7
4062 ; GFX8-NEXT:    s_bfe_u32 s1, s1, 0x100000
4063 ; GFX8-NEXT:    s_lshl_b32 s4, s4, 16
4064 ; GFX8-NEXT:    s_min_i32 s7, s8, s7
4065 ; GFX8-NEXT:    s_or_b32 s1, s1, s4
4066 ; GFX8-NEXT:    s_bfe_u32 s4, s6, 0x100000
4067 ; GFX8-NEXT:    s_sub_i32 s7, s11, s7
4068 ; GFX8-NEXT:    s_bfe_u32 s2, s2, 0x100000
4069 ; GFX8-NEXT:    s_lshl_b32 s4, s4, 16
4070 ; GFX8-NEXT:    s_or_b32 s2, s2, s4
4071 ; GFX8-NEXT:    s_bfe_u32 s4, s7, 0x100000
4072 ; GFX8-NEXT:    s_bfe_u32 s3, s3, 0x100000
4073 ; GFX8-NEXT:    s_lshl_b32 s4, s4, 16
4074 ; GFX8-NEXT:    s_or_b32 s3, s3, s4
4075 ; GFX8-NEXT:    ; return to shader part epilog
4077 ; GFX9-LABEL: s_ssubsat_v8i16:
4078 ; GFX9:       ; %bb.0:
4079 ; GFX9-NEXT:    v_mov_b32_e32 v0, s4
4080 ; GFX9-NEXT:    v_mov_b32_e32 v1, s5
4081 ; GFX9-NEXT:    v_mov_b32_e32 v2, s6
4082 ; GFX9-NEXT:    v_mov_b32_e32 v3, s7
4083 ; GFX9-NEXT:    v_pk_sub_i16 v0, s0, v0 clamp
4084 ; GFX9-NEXT:    v_pk_sub_i16 v1, s1, v1 clamp
4085 ; GFX9-NEXT:    v_pk_sub_i16 v2, s2, v2 clamp
4086 ; GFX9-NEXT:    v_pk_sub_i16 v3, s3, v3 clamp
4087 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
4088 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
4089 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
4090 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
4091 ; GFX9-NEXT:    ; return to shader part epilog
4093 ; GFX10-LABEL: s_ssubsat_v8i16:
4094 ; GFX10:       ; %bb.0:
4095 ; GFX10-NEXT:    v_pk_sub_i16 v0, s0, s4 clamp
4096 ; GFX10-NEXT:    v_pk_sub_i16 v1, s1, s5 clamp
4097 ; GFX10-NEXT:    v_pk_sub_i16 v2, s2, s6 clamp
4098 ; GFX10-NEXT:    v_pk_sub_i16 v3, s3, s7 clamp
4099 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
4100 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
4101 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
4102 ; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
4103 ; GFX10-NEXT:    ; return to shader part epilog
4104   %result = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %lhs, <8 x i16> %rhs)
4105   %cast = bitcast <8 x i16> %result to <4 x i32>
4106   ret <4 x i32> %cast
4109 ; FIXME: i48 broken because i48 add broken
4110 ; define i48 @v_ssubsat_i48(i48 %lhs, i48 %rhs) {
4111 ;   %result = call i48 @llvm.ssub.sat.i48(i48 %lhs, i48 %rhs)
4112 ;   ret i48 %result
4113 ; }
4115 ; define amdgpu_ps i48 @s_ssubsat_i48(i48 inreg %lhs, i48 inreg %rhs) {
4116 ;   %result = call i48 @llvm.ssub.sat.i48(i48 %lhs, i48 %rhs)
4117 ;   ret i48 %result
4118 ; }
4120 ; define amdgpu_ps <2 x float> @ssubsat_i48_sv(i48 inreg %lhs, i48 %rhs) {
4121 ;   %result = call i48 @llvm.ssub.sat.i48(i48 %lhs, i48 %rhs)
4122 ;   %ext.result = zext i48 %result to i64
4123 ;   %cast = bitcast i64 %ext.result to <2 x float>
4124 ;   ret <2 x float> %cast
4125 ; }
4127 ; define amdgpu_ps <2 x float> @ssubsat_i48_vs(i48 %lhs, i48 inreg %rhs) {
4128 ;   %result = call i48 @llvm.ssub.sat.i48(i48 %lhs, i48 %rhs)
4129 ;   %ext.result = zext i48 %result to i64
4130 ;   %cast = bitcast i64 %ext.result to <2 x float>
4131 ;   ret <2 x float> %cast
4132 ; }
4134 define i64 @v_ssubsat_i64(i64 %lhs, i64 %rhs) {
4135 ; GFX6-LABEL: v_ssubsat_i64:
4136 ; GFX6:       ; %bb.0:
4137 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4138 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, v0, v2
4139 ; GFX6-NEXT:    v_subb_u32_e32 v5, vcc, v1, v3, vcc
4140 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, v[4:5], v[0:1]
4141 ; GFX6-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[2:3]
4142 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 31, v5
4143 ; GFX6-NEXT:    v_bfrev_b32_e32 v1, 1
4144 ; GFX6-NEXT:    v_add_i32_e64 v2, s[6:7], 0, v0
4145 ; GFX6-NEXT:    v_addc_u32_e64 v1, s[6:7], v0, v1, s[6:7]
4146 ; GFX6-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4147 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
4148 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v5, v1, vcc
4149 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
4151 ; GFX8-LABEL: v_ssubsat_i64:
4152 ; GFX8:       ; %bb.0:
4153 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4154 ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, v0, v2
4155 ; GFX8-NEXT:    v_subb_u32_e32 v5, vcc, v1, v3, vcc
4156 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, v[4:5], v[0:1]
4157 ; GFX8-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[2:3]
4158 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 31, v5
4159 ; GFX8-NEXT:    v_bfrev_b32_e32 v1, 1
4160 ; GFX8-NEXT:    v_add_u32_e64 v2, s[6:7], 0, v0
4161 ; GFX8-NEXT:    v_addc_u32_e64 v1, s[6:7], v0, v1, s[6:7]
4162 ; GFX8-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4163 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
4164 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v5, v1, vcc
4165 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
4167 ; GFX9-LABEL: v_ssubsat_i64:
4168 ; GFX9:       ; %bb.0:
4169 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4170 ; GFX9-NEXT:    v_sub_co_u32_e32 v4, vcc, v0, v2
4171 ; GFX9-NEXT:    v_subb_co_u32_e32 v5, vcc, v1, v3, vcc
4172 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, v[4:5], v[0:1]
4173 ; GFX9-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[2:3]
4174 ; GFX9-NEXT:    v_ashrrev_i32_e32 v0, 31, v5
4175 ; GFX9-NEXT:    v_bfrev_b32_e32 v1, 1
4176 ; GFX9-NEXT:    v_add_co_u32_e64 v2, s[6:7], 0, v0
4177 ; GFX9-NEXT:    v_addc_co_u32_e64 v1, s[6:7], v0, v1, s[6:7]
4178 ; GFX9-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4179 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
4180 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v5, v1, vcc
4181 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4183 ; GFX10-LABEL: v_ssubsat_i64:
4184 ; GFX10:       ; %bb.0:
4185 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4186 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4187 ; GFX10-NEXT:    v_sub_co_u32 v4, vcc_lo, v0, v2
4188 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v5, vcc_lo, v1, v3, vcc_lo
4189 ; GFX10-NEXT:    v_cmp_lt_i64_e32 vcc_lo, 0, v[2:3]
4190 ; GFX10-NEXT:    v_ashrrev_i32_e32 v6, 31, v5
4191 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s4, v[4:5], v[0:1]
4192 ; GFX10-NEXT:    v_add_co_u32 v0, s5, v6, 0
4193 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v1, s5, 0x80000000, v6, s5
4194 ; GFX10-NEXT:    s_xor_b32 vcc_lo, vcc_lo, s4
4195 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v4, v0, vcc_lo
4196 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v5, v1, vcc_lo
4197 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4198   %result = call i64 @llvm.ssub.sat.i64(i64 %lhs, i64 %rhs)
4199   ret i64 %result
4202 define amdgpu_ps i64 @s_ssubsat_i64(i64 inreg %lhs, i64 inreg %rhs) {
4203 ; GFX6-LABEL: s_ssubsat_i64:
4204 ; GFX6:       ; %bb.0:
4205 ; GFX6-NEXT:    s_sub_u32 s4, s0, s2
4206 ; GFX6-NEXT:    s_cselect_b32 s5, 1, 0
4207 ; GFX6-NEXT:    s_and_b32 s5, s5, 1
4208 ; GFX6-NEXT:    s_cmp_lg_u32 s5, 0
4209 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
4210 ; GFX6-NEXT:    s_subb_u32 s5, s1, s3
4211 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4212 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, s[4:5], v[0:1]
4213 ; GFX6-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[2:3], 0
4214 ; GFX6-NEXT:    s_ashr_i32 s2, s5, 31
4215 ; GFX6-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4216 ; GFX6-NEXT:    s_add_u32 s0, s2, 0
4217 ; GFX6-NEXT:    s_cselect_b32 s1, 1, 0
4218 ; GFX6-NEXT:    s_and_b32 s1, s1, 1
4219 ; GFX6-NEXT:    s_cmp_lg_u32 s1, 0
4220 ; GFX6-NEXT:    s_addc_u32 s1, s2, 0x80000000
4221 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
4222 ; GFX6-NEXT:    v_mov_b32_e32 v1, s0
4223 ; GFX6-NEXT:    v_mov_b32_e32 v2, s1
4224 ; GFX6-NEXT:    v_mov_b32_e32 v3, s5
4225 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
4226 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v3, v2, vcc
4227 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v0
4228 ; GFX6-NEXT:    v_readfirstlane_b32 s1, v1
4229 ; GFX6-NEXT:    ; return to shader part epilog
4231 ; GFX8-LABEL: s_ssubsat_i64:
4232 ; GFX8:       ; %bb.0:
4233 ; GFX8-NEXT:    s_sub_u32 s4, s0, s2
4234 ; GFX8-NEXT:    s_cselect_b32 s5, 1, 0
4235 ; GFX8-NEXT:    s_and_b32 s5, s5, 1
4236 ; GFX8-NEXT:    s_cmp_lg_u32 s5, 0
4237 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
4238 ; GFX8-NEXT:    s_subb_u32 s5, s1, s3
4239 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
4240 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, s[4:5], v[0:1]
4241 ; GFX8-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[2:3], 0
4242 ; GFX8-NEXT:    s_ashr_i32 s2, s5, 31
4243 ; GFX8-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4244 ; GFX8-NEXT:    s_add_u32 s0, s2, 0
4245 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
4246 ; GFX8-NEXT:    s_and_b32 s1, s1, 1
4247 ; GFX8-NEXT:    s_cmp_lg_u32 s1, 0
4248 ; GFX8-NEXT:    s_addc_u32 s1, s2, 0x80000000
4249 ; GFX8-NEXT:    v_mov_b32_e32 v0, s4
4250 ; GFX8-NEXT:    v_mov_b32_e32 v1, s0
4251 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
4252 ; GFX8-NEXT:    v_mov_b32_e32 v3, s5
4253 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
4254 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v3, v2, vcc
4255 ; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
4256 ; GFX8-NEXT:    v_readfirstlane_b32 s1, v1
4257 ; GFX8-NEXT:    ; return to shader part epilog
4259 ; GFX9-LABEL: s_ssubsat_i64:
4260 ; GFX9:       ; %bb.0:
4261 ; GFX9-NEXT:    s_sub_u32 s4, s0, s2
4262 ; GFX9-NEXT:    s_cselect_b32 s5, 1, 0
4263 ; GFX9-NEXT:    s_and_b32 s5, s5, 1
4264 ; GFX9-NEXT:    s_cmp_lg_u32 s5, 0
4265 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
4266 ; GFX9-NEXT:    s_subb_u32 s5, s1, s3
4267 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
4268 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, s[4:5], v[0:1]
4269 ; GFX9-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[2:3], 0
4270 ; GFX9-NEXT:    s_ashr_i32 s2, s5, 31
4271 ; GFX9-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4272 ; GFX9-NEXT:    s_add_u32 s0, s2, 0
4273 ; GFX9-NEXT:    s_cselect_b32 s1, 1, 0
4274 ; GFX9-NEXT:    s_and_b32 s1, s1, 1
4275 ; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
4276 ; GFX9-NEXT:    s_addc_u32 s1, s2, 0x80000000
4277 ; GFX9-NEXT:    v_mov_b32_e32 v0, s4
4278 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
4279 ; GFX9-NEXT:    v_mov_b32_e32 v2, s1
4280 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
4281 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
4282 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v3, v2, vcc
4283 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
4284 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
4285 ; GFX9-NEXT:    ; return to shader part epilog
4287 ; GFX10-LABEL: s_ssubsat_i64:
4288 ; GFX10:       ; %bb.0:
4289 ; GFX10-NEXT:    s_sub_u32 s4, s0, s2
4290 ; GFX10-NEXT:    s_cselect_b32 s5, 1, 0
4291 ; GFX10-NEXT:    v_mov_b32_e32 v0, s4
4292 ; GFX10-NEXT:    s_and_b32 s5, s5, 1
4293 ; GFX10-NEXT:    s_cmp_lg_u32 s5, 0
4294 ; GFX10-NEXT:    s_subb_u32 s5, s1, s3
4295 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s0, s[4:5], s[0:1]
4296 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s1, s[2:3], 0
4297 ; GFX10-NEXT:    s_ashr_i32 s2, s5, 31
4298 ; GFX10-NEXT:    v_mov_b32_e32 v1, s5
4299 ; GFX10-NEXT:    s_xor_b32 s3, s1, s0
4300 ; GFX10-NEXT:    s_add_u32 s0, s2, 0
4301 ; GFX10-NEXT:    s_cselect_b32 s1, 1, 0
4302 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v0, s0, s3
4303 ; GFX10-NEXT:    s_and_b32 s1, s1, 1
4304 ; GFX10-NEXT:    s_cmp_lg_u32 s1, 0
4305 ; GFX10-NEXT:    s_addc_u32 s1, s2, 0x80000000
4306 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
4307 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, s1, s3
4308 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
4309 ; GFX10-NEXT:    ; return to shader part epilog
4310   %result = call i64 @llvm.ssub.sat.i64(i64 %lhs, i64 %rhs)
4311   ret i64 %result
4314 define amdgpu_ps <2 x float> @ssubsat_i64_sv(i64 inreg %lhs, i64 %rhs) {
4315 ; GFX6-LABEL: ssubsat_i64_sv:
4316 ; GFX6:       ; %bb.0:
4317 ; GFX6-NEXT:    v_mov_b32_e32 v3, s1
4318 ; GFX6-NEXT:    v_sub_i32_e32 v2, vcc, s0, v0
4319 ; GFX6-NEXT:    v_subb_u32_e32 v3, vcc, v3, v1, vcc
4320 ; GFX6-NEXT:    v_cmp_gt_i64_e32 vcc, s[0:1], v[2:3]
4321 ; GFX6-NEXT:    v_cmp_lt_i64_e64 s[0:1], 0, v[0:1]
4322 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 31, v3
4323 ; GFX6-NEXT:    v_bfrev_b32_e32 v1, 1
4324 ; GFX6-NEXT:    v_add_i32_e64 v4, s[2:3], 0, v0
4325 ; GFX6-NEXT:    v_addc_u32_e64 v1, s[2:3], v0, v1, s[2:3]
4326 ; GFX6-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4327 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v2, v4, vcc
4328 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc
4329 ; GFX6-NEXT:    ; return to shader part epilog
4331 ; GFX8-LABEL: ssubsat_i64_sv:
4332 ; GFX8:       ; %bb.0:
4333 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
4334 ; GFX8-NEXT:    v_sub_u32_e32 v2, vcc, s0, v0
4335 ; GFX8-NEXT:    v_subb_u32_e32 v3, vcc, v3, v1, vcc
4336 ; GFX8-NEXT:    v_cmp_gt_i64_e32 vcc, s[0:1], v[2:3]
4337 ; GFX8-NEXT:    v_cmp_lt_i64_e64 s[0:1], 0, v[0:1]
4338 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 31, v3
4339 ; GFX8-NEXT:    v_bfrev_b32_e32 v1, 1
4340 ; GFX8-NEXT:    v_add_u32_e64 v4, s[2:3], 0, v0
4341 ; GFX8-NEXT:    v_addc_u32_e64 v1, s[2:3], v0, v1, s[2:3]
4342 ; GFX8-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4343 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v2, v4, vcc
4344 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc
4345 ; GFX8-NEXT:    ; return to shader part epilog
4347 ; GFX9-LABEL: ssubsat_i64_sv:
4348 ; GFX9:       ; %bb.0:
4349 ; GFX9-NEXT:    v_mov_b32_e32 v3, s1
4350 ; GFX9-NEXT:    v_sub_co_u32_e32 v2, vcc, s0, v0
4351 ; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v3, v1, vcc
4352 ; GFX9-NEXT:    v_cmp_gt_i64_e32 vcc, s[0:1], v[2:3]
4353 ; GFX9-NEXT:    v_cmp_lt_i64_e64 s[0:1], 0, v[0:1]
4354 ; GFX9-NEXT:    v_ashrrev_i32_e32 v0, 31, v3
4355 ; GFX9-NEXT:    v_bfrev_b32_e32 v1, 1
4356 ; GFX9-NEXT:    v_add_co_u32_e64 v4, s[2:3], 0, v0
4357 ; GFX9-NEXT:    v_addc_co_u32_e64 v1, s[2:3], v0, v1, s[2:3]
4358 ; GFX9-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4359 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v2, v4, vcc
4360 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc
4361 ; GFX9-NEXT:    ; return to shader part epilog
4363 ; GFX10-LABEL: ssubsat_i64_sv:
4364 ; GFX10:       ; %bb.0:
4365 ; GFX10-NEXT:    v_sub_co_u32 v2, vcc_lo, s0, v0
4366 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v3, vcc_lo, s1, v1, vcc_lo
4367 ; GFX10-NEXT:    v_cmp_lt_i64_e32 vcc_lo, 0, v[0:1]
4368 ; GFX10-NEXT:    v_ashrrev_i32_e32 v4, 31, v3
4369 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s0, s[0:1], v[2:3]
4370 ; GFX10-NEXT:    v_add_co_u32 v0, s1, v4, 0
4371 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v1, s1, 0x80000000, v4, s1
4372 ; GFX10-NEXT:    s_xor_b32 vcc_lo, vcc_lo, s0
4373 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc_lo
4374 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc_lo
4375 ; GFX10-NEXT:    ; return to shader part epilog
4376   %result = call i64 @llvm.ssub.sat.i64(i64 %lhs, i64 %rhs)
4377   %cast = bitcast i64 %result to <2 x float>
4378   ret <2 x float> %cast
4381 define amdgpu_ps <2 x float> @ssubsat_i64_vs(i64 %lhs, i64 inreg %rhs) {
4382 ; GFX6-LABEL: ssubsat_i64_vs:
4383 ; GFX6:       ; %bb.0:
4384 ; GFX6-NEXT:    v_mov_b32_e32 v3, s1
4385 ; GFX6-NEXT:    v_subrev_i32_e32 v2, vcc, s0, v0
4386 ; GFX6-NEXT:    v_subb_u32_e32 v3, vcc, v1, v3, vcc
4387 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, v[2:3], v[0:1]
4388 ; GFX6-NEXT:    v_cmp_gt_i64_e64 s[2:3], s[0:1], 0
4389 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 31, v3
4390 ; GFX6-NEXT:    v_bfrev_b32_e32 v1, 1
4391 ; GFX6-NEXT:    v_add_i32_e64 v4, s[0:1], 0, v0
4392 ; GFX6-NEXT:    v_addc_u32_e64 v1, s[0:1], v0, v1, s[0:1]
4393 ; GFX6-NEXT:    s_xor_b64 vcc, s[2:3], vcc
4394 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v2, v4, vcc
4395 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc
4396 ; GFX6-NEXT:    ; return to shader part epilog
4398 ; GFX8-LABEL: ssubsat_i64_vs:
4399 ; GFX8:       ; %bb.0:
4400 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
4401 ; GFX8-NEXT:    v_subrev_u32_e32 v2, vcc, s0, v0
4402 ; GFX8-NEXT:    v_subb_u32_e32 v3, vcc, v1, v3, vcc
4403 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, v[2:3], v[0:1]
4404 ; GFX8-NEXT:    v_cmp_gt_i64_e64 s[2:3], s[0:1], 0
4405 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 31, v3
4406 ; GFX8-NEXT:    v_bfrev_b32_e32 v1, 1
4407 ; GFX8-NEXT:    v_add_u32_e64 v4, s[0:1], 0, v0
4408 ; GFX8-NEXT:    v_addc_u32_e64 v1, s[0:1], v0, v1, s[0:1]
4409 ; GFX8-NEXT:    s_xor_b64 vcc, s[2:3], vcc
4410 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v2, v4, vcc
4411 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc
4412 ; GFX8-NEXT:    ; return to shader part epilog
4414 ; GFX9-LABEL: ssubsat_i64_vs:
4415 ; GFX9:       ; %bb.0:
4416 ; GFX9-NEXT:    v_mov_b32_e32 v3, s1
4417 ; GFX9-NEXT:    v_subrev_co_u32_e32 v2, vcc, s0, v0
4418 ; GFX9-NEXT:    v_subb_co_u32_e32 v3, vcc, v1, v3, vcc
4419 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, v[2:3], v[0:1]
4420 ; GFX9-NEXT:    v_cmp_gt_i64_e64 s[2:3], s[0:1], 0
4421 ; GFX9-NEXT:    v_ashrrev_i32_e32 v0, 31, v3
4422 ; GFX9-NEXT:    v_bfrev_b32_e32 v1, 1
4423 ; GFX9-NEXT:    v_add_co_u32_e64 v4, s[0:1], 0, v0
4424 ; GFX9-NEXT:    v_addc_co_u32_e64 v1, s[0:1], v0, v1, s[0:1]
4425 ; GFX9-NEXT:    s_xor_b64 vcc, s[2:3], vcc
4426 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v2, v4, vcc
4427 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc
4428 ; GFX9-NEXT:    ; return to shader part epilog
4430 ; GFX10-LABEL: ssubsat_i64_vs:
4431 ; GFX10:       ; %bb.0:
4432 ; GFX10-NEXT:    v_sub_co_u32 v2, vcc_lo, v0, s0
4433 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v3, vcc_lo, s1, v1, vcc_lo
4434 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s1, s[0:1], 0
4435 ; GFX10-NEXT:    v_ashrrev_i32_e32 v4, 31, v3
4436 ; GFX10-NEXT:    v_cmp_lt_i64_e32 vcc_lo, v[2:3], v[0:1]
4437 ; GFX10-NEXT:    v_add_co_u32 v0, s0, v4, 0
4438 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v1, s0, 0x80000000, v4, s0
4439 ; GFX10-NEXT:    s_xor_b32 vcc_lo, s1, vcc_lo
4440 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc_lo
4441 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc_lo
4442 ; GFX10-NEXT:    ; return to shader part epilog
4443   %result = call i64 @llvm.ssub.sat.i64(i64 %lhs, i64 %rhs)
4444   %cast = bitcast i64 %result to <2 x float>
4445   ret <2 x float> %cast
4448 define <2 x i64> @v_ssubsat_v2i64(<2 x i64> %lhs, <2 x i64> %rhs) {
4449 ; GFX6-LABEL: v_ssubsat_v2i64:
4450 ; GFX6:       ; %bb.0:
4451 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4452 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, v0, v4
4453 ; GFX6-NEXT:    v_subb_u32_e32 v9, vcc, v1, v5, vcc
4454 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, v[8:9], v[0:1]
4455 ; GFX6-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[4:5]
4456 ; GFX6-NEXT:    v_ashrrev_i32_e32 v0, 31, v9
4457 ; GFX6-NEXT:    v_bfrev_b32_e32 v10, 1
4458 ; GFX6-NEXT:    v_add_i32_e64 v1, s[6:7], 0, v0
4459 ; GFX6-NEXT:    v_addc_u32_e64 v4, s[6:7], v0, v10, s[6:7]
4460 ; GFX6-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4461 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v8, v1, vcc
4462 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v9, v4, vcc
4463 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, v2, v6
4464 ; GFX6-NEXT:    v_subb_u32_e32 v5, vcc, v3, v7, vcc
4465 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, v[4:5], v[2:3]
4466 ; GFX6-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[6:7]
4467 ; GFX6-NEXT:    v_ashrrev_i32_e32 v2, 31, v5
4468 ; GFX6-NEXT:    v_add_i32_e64 v3, s[6:7], 0, v2
4469 ; GFX6-NEXT:    v_addc_u32_e64 v6, s[6:7], v2, v10, s[6:7]
4470 ; GFX6-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4471 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v4, v3, vcc
4472 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
4473 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
4475 ; GFX8-LABEL: v_ssubsat_v2i64:
4476 ; GFX8:       ; %bb.0:
4477 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4478 ; GFX8-NEXT:    v_sub_u32_e32 v8, vcc, v0, v4
4479 ; GFX8-NEXT:    v_subb_u32_e32 v9, vcc, v1, v5, vcc
4480 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, v[8:9], v[0:1]
4481 ; GFX8-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[4:5]
4482 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 31, v9
4483 ; GFX8-NEXT:    v_bfrev_b32_e32 v10, 1
4484 ; GFX8-NEXT:    v_add_u32_e64 v1, s[6:7], 0, v0
4485 ; GFX8-NEXT:    v_addc_u32_e64 v4, s[6:7], v0, v10, s[6:7]
4486 ; GFX8-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4487 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v8, v1, vcc
4488 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v9, v4, vcc
4489 ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, v2, v6
4490 ; GFX8-NEXT:    v_subb_u32_e32 v5, vcc, v3, v7, vcc
4491 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, v[4:5], v[2:3]
4492 ; GFX8-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[6:7]
4493 ; GFX8-NEXT:    v_ashrrev_i32_e32 v2, 31, v5
4494 ; GFX8-NEXT:    v_add_u32_e64 v3, s[6:7], 0, v2
4495 ; GFX8-NEXT:    v_addc_u32_e64 v6, s[6:7], v2, v10, s[6:7]
4496 ; GFX8-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4497 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v4, v3, vcc
4498 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
4499 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
4501 ; GFX9-LABEL: v_ssubsat_v2i64:
4502 ; GFX9:       ; %bb.0:
4503 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4504 ; GFX9-NEXT:    v_sub_co_u32_e32 v8, vcc, v0, v4
4505 ; GFX9-NEXT:    v_subb_co_u32_e32 v9, vcc, v1, v5, vcc
4506 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, v[8:9], v[0:1]
4507 ; GFX9-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[4:5]
4508 ; GFX9-NEXT:    v_ashrrev_i32_e32 v0, 31, v9
4509 ; GFX9-NEXT:    v_bfrev_b32_e32 v10, 1
4510 ; GFX9-NEXT:    v_add_co_u32_e64 v1, s[6:7], 0, v0
4511 ; GFX9-NEXT:    v_addc_co_u32_e64 v4, s[6:7], v0, v10, s[6:7]
4512 ; GFX9-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4513 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v8, v1, vcc
4514 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v9, v4, vcc
4515 ; GFX9-NEXT:    v_sub_co_u32_e32 v4, vcc, v2, v6
4516 ; GFX9-NEXT:    v_subb_co_u32_e32 v5, vcc, v3, v7, vcc
4517 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, v[4:5], v[2:3]
4518 ; GFX9-NEXT:    v_cmp_lt_i64_e64 s[4:5], 0, v[6:7]
4519 ; GFX9-NEXT:    v_ashrrev_i32_e32 v2, 31, v5
4520 ; GFX9-NEXT:    v_add_co_u32_e64 v3, s[6:7], 0, v2
4521 ; GFX9-NEXT:    v_addc_co_u32_e64 v6, s[6:7], v2, v10, s[6:7]
4522 ; GFX9-NEXT:    s_xor_b64 vcc, s[4:5], vcc
4523 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v4, v3, vcc
4524 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v5, v6, vcc
4525 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4527 ; GFX10-LABEL: v_ssubsat_v2i64:
4528 ; GFX10:       ; %bb.0:
4529 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4530 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4531 ; GFX10-NEXT:    v_sub_co_u32 v8, vcc_lo, v0, v4
4532 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v9, vcc_lo, v1, v5, vcc_lo
4533 ; GFX10-NEXT:    v_sub_co_u32 v10, vcc_lo, v2, v6
4534 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v11, vcc_lo, v3, v7, vcc_lo
4535 ; GFX10-NEXT:    v_ashrrev_i32_e32 v12, 31, v9
4536 ; GFX10-NEXT:    v_cmp_lt_i64_e32 vcc_lo, v[8:9], v[0:1]
4537 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s4, 0, v[4:5]
4538 ; GFX10-NEXT:    v_ashrrev_i32_e32 v0, 31, v11
4539 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s6, 0, v[6:7]
4540 ; GFX10-NEXT:    v_add_co_u32 v1, s5, v12, 0
4541 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v4, s5, 0x80000000, v12, s5
4542 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s5, v[10:11], v[2:3]
4543 ; GFX10-NEXT:    v_add_co_u32 v2, s7, v0, 0
4544 ; GFX10-NEXT:    v_add_co_ci_u32_e64 v3, s7, 0x80000000, v0, s7
4545 ; GFX10-NEXT:    s_xor_b32 vcc_lo, s4, vcc_lo
4546 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v8, v1, vcc_lo
4547 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v9, v4, vcc_lo
4548 ; GFX10-NEXT:    s_xor_b32 vcc_lo, s6, s5
4549 ; GFX10-NEXT:    v_cndmask_b32_e32 v2, v10, v2, vcc_lo
4550 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v11, v3, vcc_lo
4551 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4552   %result = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %lhs, <2 x i64> %rhs)
4553   ret <2 x i64> %result
4556 define amdgpu_ps <2 x i64> @s_ssubsat_v2i64(<2 x i64> inreg %lhs, <2 x i64> inreg %rhs) {
4557 ; GFX6-LABEL: s_ssubsat_v2i64:
4558 ; GFX6:       ; %bb.0:
4559 ; GFX6-NEXT:    s_sub_u32 s8, s0, s4
4560 ; GFX6-NEXT:    s_cselect_b32 s9, 1, 0
4561 ; GFX6-NEXT:    s_and_b32 s9, s9, 1
4562 ; GFX6-NEXT:    s_cmp_lg_u32 s9, 0
4563 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
4564 ; GFX6-NEXT:    s_subb_u32 s9, s1, s5
4565 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4566 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, s[8:9], v[0:1]
4567 ; GFX6-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[4:5], 0
4568 ; GFX6-NEXT:    s_ashr_i32 s4, s9, 31
4569 ; GFX6-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4570 ; GFX6-NEXT:    s_add_u32 s0, s4, 0
4571 ; GFX6-NEXT:    s_cselect_b32 s1, 1, 0
4572 ; GFX6-NEXT:    s_and_b32 s1, s1, 1
4573 ; GFX6-NEXT:    s_brev_b32 s5, 1
4574 ; GFX6-NEXT:    s_cmp_lg_u32 s1, 0
4575 ; GFX6-NEXT:    s_addc_u32 s1, s4, s5
4576 ; GFX6-NEXT:    v_mov_b32_e32 v1, s0
4577 ; GFX6-NEXT:    s_sub_u32 s0, s2, s6
4578 ; GFX6-NEXT:    v_mov_b32_e32 v2, s1
4579 ; GFX6-NEXT:    s_cselect_b32 s1, 1, 0
4580 ; GFX6-NEXT:    v_mov_b32_e32 v0, s8
4581 ; GFX6-NEXT:    s_and_b32 s1, s1, 1
4582 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, v0, v1, vcc
4583 ; GFX6-NEXT:    s_cmp_lg_u32 s1, 0
4584 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4585 ; GFX6-NEXT:    v_mov_b32_e32 v3, s9
4586 ; GFX6-NEXT:    s_subb_u32 s1, s3, s7
4587 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
4588 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v3, v2, vcc
4589 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, s[0:1], v[0:1]
4590 ; GFX6-NEXT:    v_cmp_gt_i64_e64 s[2:3], s[6:7], 0
4591 ; GFX6-NEXT:    s_ashr_i32 s4, s1, 31
4592 ; GFX6-NEXT:    s_xor_b64 vcc, s[2:3], vcc
4593 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
4594 ; GFX6-NEXT:    s_add_u32 s0, s4, 0
4595 ; GFX6-NEXT:    s_cselect_b32 s2, 1, 0
4596 ; GFX6-NEXT:    s_and_b32 s2, s2, 1
4597 ; GFX6-NEXT:    s_cmp_lg_u32 s2, 0
4598 ; GFX6-NEXT:    s_addc_u32 s3, s4, s5
4599 ; GFX6-NEXT:    v_mov_b32_e32 v1, s0
4600 ; GFX6-NEXT:    v_mov_b32_e32 v3, s3
4601 ; GFX6-NEXT:    v_mov_b32_e32 v5, s1
4602 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
4603 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
4604 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v4
4605 ; GFX6-NEXT:    v_readfirstlane_b32 s1, v2
4606 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v0
4607 ; GFX6-NEXT:    v_readfirstlane_b32 s3, v1
4608 ; GFX6-NEXT:    ; return to shader part epilog
4610 ; GFX8-LABEL: s_ssubsat_v2i64:
4611 ; GFX8:       ; %bb.0:
4612 ; GFX8-NEXT:    s_sub_u32 s8, s0, s4
4613 ; GFX8-NEXT:    s_cselect_b32 s9, 1, 0
4614 ; GFX8-NEXT:    s_and_b32 s9, s9, 1
4615 ; GFX8-NEXT:    s_cmp_lg_u32 s9, 0
4616 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
4617 ; GFX8-NEXT:    s_subb_u32 s9, s1, s5
4618 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
4619 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, s[8:9], v[0:1]
4620 ; GFX8-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[4:5], 0
4621 ; GFX8-NEXT:    s_ashr_i32 s4, s9, 31
4622 ; GFX8-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4623 ; GFX8-NEXT:    s_add_u32 s0, s4, 0
4624 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
4625 ; GFX8-NEXT:    s_and_b32 s1, s1, 1
4626 ; GFX8-NEXT:    s_brev_b32 s5, 1
4627 ; GFX8-NEXT:    s_cmp_lg_u32 s1, 0
4628 ; GFX8-NEXT:    s_addc_u32 s1, s4, s5
4629 ; GFX8-NEXT:    v_mov_b32_e32 v1, s0
4630 ; GFX8-NEXT:    s_sub_u32 s0, s2, s6
4631 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
4632 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
4633 ; GFX8-NEXT:    v_mov_b32_e32 v0, s8
4634 ; GFX8-NEXT:    s_and_b32 s1, s1, 1
4635 ; GFX8-NEXT:    v_cndmask_b32_e32 v4, v0, v1, vcc
4636 ; GFX8-NEXT:    s_cmp_lg_u32 s1, 0
4637 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
4638 ; GFX8-NEXT:    v_mov_b32_e32 v3, s9
4639 ; GFX8-NEXT:    s_subb_u32 s1, s3, s7
4640 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
4641 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v3, v2, vcc
4642 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, s[0:1], v[0:1]
4643 ; GFX8-NEXT:    v_cmp_gt_i64_e64 s[2:3], s[6:7], 0
4644 ; GFX8-NEXT:    s_ashr_i32 s4, s1, 31
4645 ; GFX8-NEXT:    s_xor_b64 vcc, s[2:3], vcc
4646 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
4647 ; GFX8-NEXT:    s_add_u32 s0, s4, 0
4648 ; GFX8-NEXT:    s_cselect_b32 s2, 1, 0
4649 ; GFX8-NEXT:    s_and_b32 s2, s2, 1
4650 ; GFX8-NEXT:    s_cmp_lg_u32 s2, 0
4651 ; GFX8-NEXT:    s_addc_u32 s3, s4, s5
4652 ; GFX8-NEXT:    v_mov_b32_e32 v1, s0
4653 ; GFX8-NEXT:    v_mov_b32_e32 v3, s3
4654 ; GFX8-NEXT:    v_mov_b32_e32 v5, s1
4655 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
4656 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
4657 ; GFX8-NEXT:    v_readfirstlane_b32 s0, v4
4658 ; GFX8-NEXT:    v_readfirstlane_b32 s1, v2
4659 ; GFX8-NEXT:    v_readfirstlane_b32 s2, v0
4660 ; GFX8-NEXT:    v_readfirstlane_b32 s3, v1
4661 ; GFX8-NEXT:    ; return to shader part epilog
4663 ; GFX9-LABEL: s_ssubsat_v2i64:
4664 ; GFX9:       ; %bb.0:
4665 ; GFX9-NEXT:    s_sub_u32 s8, s0, s4
4666 ; GFX9-NEXT:    s_cselect_b32 s9, 1, 0
4667 ; GFX9-NEXT:    s_and_b32 s9, s9, 1
4668 ; GFX9-NEXT:    s_cmp_lg_u32 s9, 0
4669 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
4670 ; GFX9-NEXT:    s_subb_u32 s9, s1, s5
4671 ; GFX9-NEXT:    v_mov_b32_e32 v1, s1
4672 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, s[8:9], v[0:1]
4673 ; GFX9-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[4:5], 0
4674 ; GFX9-NEXT:    s_ashr_i32 s4, s9, 31
4675 ; GFX9-NEXT:    s_xor_b64 vcc, s[0:1], vcc
4676 ; GFX9-NEXT:    s_add_u32 s0, s4, 0
4677 ; GFX9-NEXT:    s_cselect_b32 s1, 1, 0
4678 ; GFX9-NEXT:    s_and_b32 s1, s1, 1
4679 ; GFX9-NEXT:    s_brev_b32 s5, 1
4680 ; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
4681 ; GFX9-NEXT:    s_addc_u32 s1, s4, s5
4682 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
4683 ; GFX9-NEXT:    s_sub_u32 s0, s2, s6
4684 ; GFX9-NEXT:    v_mov_b32_e32 v2, s1
4685 ; GFX9-NEXT:    s_cselect_b32 s1, 1, 0
4686 ; GFX9-NEXT:    v_mov_b32_e32 v0, s8
4687 ; GFX9-NEXT:    s_and_b32 s1, s1, 1
4688 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v0, v1, vcc
4689 ; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
4690 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
4691 ; GFX9-NEXT:    v_mov_b32_e32 v3, s9
4692 ; GFX9-NEXT:    s_subb_u32 s1, s3, s7
4693 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
4694 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v2, vcc
4695 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, s[0:1], v[0:1]
4696 ; GFX9-NEXT:    v_cmp_gt_i64_e64 s[2:3], s[6:7], 0
4697 ; GFX9-NEXT:    s_ashr_i32 s4, s1, 31
4698 ; GFX9-NEXT:    s_xor_b64 vcc, s[2:3], vcc
4699 ; GFX9-NEXT:    v_mov_b32_e32 v0, s0
4700 ; GFX9-NEXT:    s_add_u32 s0, s4, 0
4701 ; GFX9-NEXT:    s_cselect_b32 s2, 1, 0
4702 ; GFX9-NEXT:    s_and_b32 s2, s2, 1
4703 ; GFX9-NEXT:    s_cmp_lg_u32 s2, 0
4704 ; GFX9-NEXT:    s_addc_u32 s3, s4, s5
4705 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
4706 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
4707 ; GFX9-NEXT:    v_mov_b32_e32 v5, s1
4708 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
4709 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
4710 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v4
4711 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v2
4712 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v0
4713 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v1
4714 ; GFX9-NEXT:    ; return to shader part epilog
4716 ; GFX10-LABEL: s_ssubsat_v2i64:
4717 ; GFX10:       ; %bb.0:
4718 ; GFX10-NEXT:    s_sub_u32 s8, s0, s4
4719 ; GFX10-NEXT:    s_cselect_b32 s9, 1, 0
4720 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s4, s[4:5], 0
4721 ; GFX10-NEXT:    s_and_b32 s9, s9, 1
4722 ; GFX10-NEXT:    v_mov_b32_e32 v0, s8
4723 ; GFX10-NEXT:    s_cmp_lg_u32 s9, 0
4724 ; GFX10-NEXT:    s_brev_b32 s10, 1
4725 ; GFX10-NEXT:    s_subb_u32 s9, s1, s5
4726 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s0, s[8:9], s[0:1]
4727 ; GFX10-NEXT:    s_ashr_i32 s1, s9, 31
4728 ; GFX10-NEXT:    v_mov_b32_e32 v1, s9
4729 ; GFX10-NEXT:    s_xor_b32 s8, s4, s0
4730 ; GFX10-NEXT:    s_add_u32 s0, s1, 0
4731 ; GFX10-NEXT:    s_cselect_b32 s4, 1, 0
4732 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v0, s0, s8
4733 ; GFX10-NEXT:    s_and_b32 s4, s4, 1
4734 ; GFX10-NEXT:    s_cmp_lg_u32 s4, 0
4735 ; GFX10-NEXT:    s_addc_u32 s1, s1, s10
4736 ; GFX10-NEXT:    s_sub_u32 s4, s2, s6
4737 ; GFX10-NEXT:    s_cselect_b32 s5, 1, 0
4738 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v1, s1, s8
4739 ; GFX10-NEXT:    s_and_b32 s5, s5, 1
4740 ; GFX10-NEXT:    v_mov_b32_e32 v2, s4
4741 ; GFX10-NEXT:    s_cmp_lg_u32 s5, 0
4742 ; GFX10-NEXT:    s_subb_u32 s5, s3, s7
4743 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s2, s[4:5], s[2:3]
4744 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s3, s[6:7], 0
4745 ; GFX10-NEXT:    s_ashr_i32 s1, s5, 31
4746 ; GFX10-NEXT:    v_mov_b32_e32 v3, s5
4747 ; GFX10-NEXT:    s_xor_b32 s2, s3, s2
4748 ; GFX10-NEXT:    s_add_u32 s0, s1, 0
4749 ; GFX10-NEXT:    s_cselect_b32 s3, 1, 0
4750 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s0, s2
4751 ; GFX10-NEXT:    s_and_b32 s3, s3, 1
4752 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
4753 ; GFX10-NEXT:    s_cmp_lg_u32 s3, 0
4754 ; GFX10-NEXT:    s_addc_u32 s1, s1, s10
4755 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, s1, s2
4756 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
4757 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
4758 ; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
4759 ; GFX10-NEXT:    ; return to shader part epilog
4760   %result = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %lhs, <2 x i64> %rhs)
4761   ret <2 x i64> %result
4764 define amdgpu_ps i128 @s_ssubsat_i128(i128 inreg %lhs, i128 inreg %rhs) {
4765 ; GFX6-LABEL: s_ssubsat_i128:
4766 ; GFX6:       ; %bb.0:
4767 ; GFX6-NEXT:    s_sub_u32 s8, s0, s4
4768 ; GFX6-NEXT:    s_cselect_b32 s9, 1, 0
4769 ; GFX6-NEXT:    s_and_b32 s9, s9, 1
4770 ; GFX6-NEXT:    s_cmp_lg_u32 s9, 0
4771 ; GFX6-NEXT:    s_subb_u32 s9, s1, s5
4772 ; GFX6-NEXT:    s_cselect_b32 s10, 1, 0
4773 ; GFX6-NEXT:    s_and_b32 s10, s10, 1
4774 ; GFX6-NEXT:    s_cmp_lg_u32 s10, 0
4775 ; GFX6-NEXT:    s_subb_u32 s10, s2, s6
4776 ; GFX6-NEXT:    s_cselect_b32 s11, 1, 0
4777 ; GFX6-NEXT:    v_mov_b32_e32 v3, s1
4778 ; GFX6-NEXT:    s_and_b32 s11, s11, 1
4779 ; GFX6-NEXT:    v_mov_b32_e32 v2, s0
4780 ; GFX6-NEXT:    s_cmp_lg_u32 s11, 0
4781 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4782 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, s[8:9], v[2:3]
4783 ; GFX6-NEXT:    s_subb_u32 s11, s3, s7
4784 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
4785 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
4786 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, s[10:11], v[0:1]
4787 ; GFX6-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[4:5], 0
4788 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
4789 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, s[10:11], v[0:1]
4790 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
4791 ; GFX6-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[6:7], 0
4792 ; GFX6-NEXT:    s_ashr_i32 s3, s11, 31
4793 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc
4794 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
4795 ; GFX6-NEXT:    s_add_u32 s0, s3, 0
4796 ; GFX6-NEXT:    s_cselect_b32 s1, 1, 0
4797 ; GFX6-NEXT:    s_and_b32 s1, s1, 1
4798 ; GFX6-NEXT:    s_cmp_lg_u32 s1, 0
4799 ; GFX6-NEXT:    s_addc_u32 s1, s3, 0
4800 ; GFX6-NEXT:    s_cselect_b32 s2, 1, 0
4801 ; GFX6-NEXT:    s_and_b32 s2, s2, 1
4802 ; GFX6-NEXT:    v_cmp_eq_u64_e64 vcc, s[6:7], 0
4803 ; GFX6-NEXT:    s_cmp_lg_u32 s2, 0
4804 ; GFX6-NEXT:    s_addc_u32 s2, s3, 0
4805 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
4806 ; GFX6-NEXT:    s_cselect_b32 s4, 1, 0
4807 ; GFX6-NEXT:    v_xor_b32_e32 v0, v1, v0
4808 ; GFX6-NEXT:    s_and_b32 s4, s4, 1
4809 ; GFX6-NEXT:    s_cmp_lg_u32 s4, 0
4810 ; GFX6-NEXT:    v_and_b32_e32 v0, 1, v0
4811 ; GFX6-NEXT:    s_addc_u32 s3, s3, 0x80000000
4812 ; GFX6-NEXT:    v_mov_b32_e32 v1, s0
4813 ; GFX6-NEXT:    v_mov_b32_e32 v2, s1
4814 ; GFX6-NEXT:    v_mov_b32_e32 v3, s8
4815 ; GFX6-NEXT:    v_mov_b32_e32 v4, s9
4816 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
4817 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v3, v1, vcc
4818 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v4, v2, vcc
4819 ; GFX6-NEXT:    v_mov_b32_e32 v2, s2
4820 ; GFX6-NEXT:    v_mov_b32_e32 v3, s3
4821 ; GFX6-NEXT:    v_mov_b32_e32 v4, s10
4822 ; GFX6-NEXT:    v_mov_b32_e32 v5, s11
4823 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v4, v2, vcc
4824 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v5, v3, vcc
4825 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v0
4826 ; GFX6-NEXT:    v_readfirstlane_b32 s1, v1
4827 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v2
4828 ; GFX6-NEXT:    v_readfirstlane_b32 s3, v3
4829 ; GFX6-NEXT:    ; return to shader part epilog
4831 ; GFX8-LABEL: s_ssubsat_i128:
4832 ; GFX8:       ; %bb.0:
4833 ; GFX8-NEXT:    s_sub_u32 s8, s0, s4
4834 ; GFX8-NEXT:    s_cselect_b32 s9, 1, 0
4835 ; GFX8-NEXT:    s_and_b32 s9, s9, 1
4836 ; GFX8-NEXT:    s_cmp_lg_u32 s9, 0
4837 ; GFX8-NEXT:    s_subb_u32 s9, s1, s5
4838 ; GFX8-NEXT:    s_cselect_b32 s10, 1, 0
4839 ; GFX8-NEXT:    s_and_b32 s10, s10, 1
4840 ; GFX8-NEXT:    s_cmp_lg_u32 s10, 0
4841 ; GFX8-NEXT:    s_subb_u32 s10, s2, s6
4842 ; GFX8-NEXT:    s_cselect_b32 s11, 1, 0
4843 ; GFX8-NEXT:    s_and_b32 s11, s11, 1
4844 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
4845 ; GFX8-NEXT:    s_cmp_lg_u32 s11, 0
4846 ; GFX8-NEXT:    v_mov_b32_e32 v2, s0
4847 ; GFX8-NEXT:    s_subb_u32 s11, s3, s7
4848 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
4849 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, s[8:9], v[2:3]
4850 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
4851 ; GFX8-NEXT:    s_cmp_eq_u64 s[10:11], s[2:3]
4852 ; GFX8-NEXT:    s_cselect_b32 s2, 1, 0
4853 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
4854 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, s[10:11], v[0:1]
4855 ; GFX8-NEXT:    s_and_b32 s0, 1, s2
4856 ; GFX8-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
4857 ; GFX8-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
4858 ; GFX8-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[4:5], 0
4859 ; GFX8-NEXT:    s_cmp_eq_u64 s[6:7], 0
4860 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
4861 ; GFX8-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[6:7], 0
4862 ; GFX8-NEXT:    s_cselect_b32 s2, 1, 0
4863 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
4864 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
4865 ; GFX8-NEXT:    s_and_b32 s0, 1, s2
4866 ; GFX8-NEXT:    s_ashr_i32 s3, s11, 31
4867 ; GFX8-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
4868 ; GFX8-NEXT:    s_add_u32 s0, s3, 0
4869 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
4870 ; GFX8-NEXT:    s_and_b32 s1, s1, 1
4871 ; GFX8-NEXT:    s_cmp_lg_u32 s1, 0
4872 ; GFX8-NEXT:    s_addc_u32 s1, s3, 0
4873 ; GFX8-NEXT:    s_cselect_b32 s2, 1, 0
4874 ; GFX8-NEXT:    s_and_b32 s2, s2, 1
4875 ; GFX8-NEXT:    s_cmp_lg_u32 s2, 0
4876 ; GFX8-NEXT:    s_addc_u32 s2, s3, 0
4877 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
4878 ; GFX8-NEXT:    s_cselect_b32 s4, 1, 0
4879 ; GFX8-NEXT:    v_xor_b32_e32 v0, v1, v0
4880 ; GFX8-NEXT:    s_and_b32 s4, s4, 1
4881 ; GFX8-NEXT:    s_cmp_lg_u32 s4, 0
4882 ; GFX8-NEXT:    v_and_b32_e32 v0, 1, v0
4883 ; GFX8-NEXT:    s_addc_u32 s3, s3, 0x80000000
4884 ; GFX8-NEXT:    v_mov_b32_e32 v1, s0
4885 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
4886 ; GFX8-NEXT:    v_mov_b32_e32 v3, s8
4887 ; GFX8-NEXT:    v_mov_b32_e32 v4, s9
4888 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
4889 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v3, v1, vcc
4890 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v4, v2, vcc
4891 ; GFX8-NEXT:    v_mov_b32_e32 v2, s2
4892 ; GFX8-NEXT:    v_mov_b32_e32 v3, s3
4893 ; GFX8-NEXT:    v_mov_b32_e32 v4, s10
4894 ; GFX8-NEXT:    v_mov_b32_e32 v5, s11
4895 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v4, v2, vcc
4896 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v5, v3, vcc
4897 ; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
4898 ; GFX8-NEXT:    v_readfirstlane_b32 s1, v1
4899 ; GFX8-NEXT:    v_readfirstlane_b32 s2, v2
4900 ; GFX8-NEXT:    v_readfirstlane_b32 s3, v3
4901 ; GFX8-NEXT:    ; return to shader part epilog
4903 ; GFX9-LABEL: s_ssubsat_i128:
4904 ; GFX9:       ; %bb.0:
4905 ; GFX9-NEXT:    s_sub_u32 s8, s0, s4
4906 ; GFX9-NEXT:    s_cselect_b32 s9, 1, 0
4907 ; GFX9-NEXT:    s_and_b32 s9, s9, 1
4908 ; GFX9-NEXT:    s_cmp_lg_u32 s9, 0
4909 ; GFX9-NEXT:    s_subb_u32 s9, s1, s5
4910 ; GFX9-NEXT:    s_cselect_b32 s10, 1, 0
4911 ; GFX9-NEXT:    s_and_b32 s10, s10, 1
4912 ; GFX9-NEXT:    s_cmp_lg_u32 s10, 0
4913 ; GFX9-NEXT:    s_subb_u32 s10, s2, s6
4914 ; GFX9-NEXT:    s_cselect_b32 s11, 1, 0
4915 ; GFX9-NEXT:    s_and_b32 s11, s11, 1
4916 ; GFX9-NEXT:    v_mov_b32_e32 v3, s1
4917 ; GFX9-NEXT:    s_cmp_lg_u32 s11, 0
4918 ; GFX9-NEXT:    v_mov_b32_e32 v2, s0
4919 ; GFX9-NEXT:    s_subb_u32 s11, s3, s7
4920 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
4921 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, s[8:9], v[2:3]
4922 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
4923 ; GFX9-NEXT:    s_cmp_eq_u64 s[10:11], s[2:3]
4924 ; GFX9-NEXT:    s_cselect_b32 s2, 1, 0
4925 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
4926 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, s[10:11], v[0:1]
4927 ; GFX9-NEXT:    s_and_b32 s0, 1, s2
4928 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
4929 ; GFX9-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
4930 ; GFX9-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[4:5], 0
4931 ; GFX9-NEXT:    s_cmp_eq_u64 s[6:7], 0
4932 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
4933 ; GFX9-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[6:7], 0
4934 ; GFX9-NEXT:    s_cselect_b32 s2, 1, 0
4935 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
4936 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
4937 ; GFX9-NEXT:    s_and_b32 s0, 1, s2
4938 ; GFX9-NEXT:    s_ashr_i32 s3, s11, 31
4939 ; GFX9-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
4940 ; GFX9-NEXT:    s_add_u32 s0, s3, 0
4941 ; GFX9-NEXT:    s_cselect_b32 s1, 1, 0
4942 ; GFX9-NEXT:    s_and_b32 s1, s1, 1
4943 ; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
4944 ; GFX9-NEXT:    s_addc_u32 s1, s3, 0
4945 ; GFX9-NEXT:    s_cselect_b32 s2, 1, 0
4946 ; GFX9-NEXT:    s_and_b32 s2, s2, 1
4947 ; GFX9-NEXT:    s_cmp_lg_u32 s2, 0
4948 ; GFX9-NEXT:    s_addc_u32 s2, s3, 0
4949 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
4950 ; GFX9-NEXT:    s_cselect_b32 s4, 1, 0
4951 ; GFX9-NEXT:    v_xor_b32_e32 v0, v1, v0
4952 ; GFX9-NEXT:    s_and_b32 s4, s4, 1
4953 ; GFX9-NEXT:    s_cmp_lg_u32 s4, 0
4954 ; GFX9-NEXT:    v_and_b32_e32 v0, 1, v0
4955 ; GFX9-NEXT:    s_addc_u32 s3, s3, 0x80000000
4956 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
4957 ; GFX9-NEXT:    v_mov_b32_e32 v2, s1
4958 ; GFX9-NEXT:    v_mov_b32_e32 v3, s8
4959 ; GFX9-NEXT:    v_mov_b32_e32 v4, s9
4960 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
4961 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v3, v1, vcc
4962 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v4, v2, vcc
4963 ; GFX9-NEXT:    v_mov_b32_e32 v2, s2
4964 ; GFX9-NEXT:    v_mov_b32_e32 v3, s3
4965 ; GFX9-NEXT:    v_mov_b32_e32 v4, s10
4966 ; GFX9-NEXT:    v_mov_b32_e32 v5, s11
4967 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v4, v2, vcc
4968 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v5, v3, vcc
4969 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
4970 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v1
4971 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v2
4972 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v3
4973 ; GFX9-NEXT:    ; return to shader part epilog
4975 ; GFX10-LABEL: s_ssubsat_i128:
4976 ; GFX10:       ; %bb.0:
4977 ; GFX10-NEXT:    s_sub_u32 s8, s0, s4
4978 ; GFX10-NEXT:    s_cselect_b32 s9, 1, 0
4979 ; GFX10-NEXT:    s_and_b32 s9, s9, 1
4980 ; GFX10-NEXT:    s_cmp_lg_u32 s9, 0
4981 ; GFX10-NEXT:    s_subb_u32 s9, s1, s5
4982 ; GFX10-NEXT:    s_cselect_b32 s10, 1, 0
4983 ; GFX10-NEXT:    v_cmp_lt_u64_e64 s0, s[8:9], s[0:1]
4984 ; GFX10-NEXT:    s_and_b32 s10, s10, 1
4985 ; GFX10-NEXT:    s_cmp_lg_u32 s10, 0
4986 ; GFX10-NEXT:    s_subb_u32 s10, s2, s6
4987 ; GFX10-NEXT:    s_cselect_b32 s11, 1, 0
4988 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
4989 ; GFX10-NEXT:    s_and_b32 s11, s11, 1
4990 ; GFX10-NEXT:    v_mov_b32_e32 v3, s10
4991 ; GFX10-NEXT:    s_cmp_lg_u32 s11, 0
4992 ; GFX10-NEXT:    s_subb_u32 s11, s3, s7
4993 ; GFX10-NEXT:    s_cmp_eq_u64 s[10:11], s[2:3]
4994 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s1, s[10:11], s[2:3]
4995 ; GFX10-NEXT:    s_cselect_b32 s0, 1, 0
4996 ; GFX10-NEXT:    v_mov_b32_e32 v4, s11
4997 ; GFX10-NEXT:    s_and_b32 s0, 1, s0
4998 ; GFX10-NEXT:    s_cmp_eq_u64 s[6:7], 0
4999 ; GFX10-NEXT:    v_cmp_ne_u32_e64 vcc_lo, 0, s0
5000 ; GFX10-NEXT:    v_cmp_gt_u64_e64 s0, s[4:5], 0
5001 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s1
5002 ; GFX10-NEXT:    s_cselect_b32 s1, 1, 0
5003 ; GFX10-NEXT:    s_ashr_i32 s3, s11, 31
5004 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo
5005 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s0
5006 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s0, s[6:7], 0
5007 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s0
5008 ; GFX10-NEXT:    s_and_b32 s0, 1, s1
5009 ; GFX10-NEXT:    v_cmp_ne_u32_e64 vcc_lo, 0, s0
5010 ; GFX10-NEXT:    s_add_u32 s0, s3, 0
5011 ; GFX10-NEXT:    s_cselect_b32 s1, 1, 0
5012 ; GFX10-NEXT:    s_and_b32 s1, s1, 1
5013 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc_lo
5014 ; GFX10-NEXT:    s_cmp_lg_u32 s1, 0
5015 ; GFX10-NEXT:    v_mov_b32_e32 v2, s9
5016 ; GFX10-NEXT:    s_addc_u32 s1, s3, 0
5017 ; GFX10-NEXT:    s_cselect_b32 s2, 1, 0
5018 ; GFX10-NEXT:    v_xor_b32_e32 v0, v1, v0
5019 ; GFX10-NEXT:    s_and_b32 s2, s2, 1
5020 ; GFX10-NEXT:    v_mov_b32_e32 v1, s8
5021 ; GFX10-NEXT:    s_cmp_lg_u32 s2, 0
5022 ; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
5023 ; GFX10-NEXT:    s_addc_u32 s2, s3, 0
5024 ; GFX10-NEXT:    s_cselect_b32 s4, 1, 0
5025 ; GFX10-NEXT:    s_and_b32 s4, s4, 1
5026 ; GFX10-NEXT:    v_cmp_ne_u32_e32 vcc_lo, 0, v0
5027 ; GFX10-NEXT:    s_cmp_lg_u32 s4, 0
5028 ; GFX10-NEXT:    s_addc_u32 s3, s3, 0x80000000
5029 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v1, s0, vcc_lo
5030 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v2, s1, vcc_lo
5031 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v3, s2, vcc_lo
5032 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v4, s3, vcc_lo
5033 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
5034 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
5035 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
5036 ; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
5037 ; GFX10-NEXT:    ; return to shader part epilog
5038   %result = call i128 @llvm.ssub.sat.i128(i128 %lhs, i128 %rhs)
5039   ret i128 %result
5042 define amdgpu_ps <4 x float> @ssubsat_i128_sv(i128 inreg %lhs, i128 %rhs) {
5043 ; GFX6-LABEL: ssubsat_i128_sv:
5044 ; GFX6:       ; %bb.0:
5045 ; GFX6-NEXT:    v_mov_b32_e32 v5, s1
5046 ; GFX6-NEXT:    v_sub_i32_e32 v4, vcc, s0, v0
5047 ; GFX6-NEXT:    v_subb_u32_e32 v5, vcc, v5, v1, vcc
5048 ; GFX6-NEXT:    v_mov_b32_e32 v6, s2
5049 ; GFX6-NEXT:    v_mov_b32_e32 v7, s3
5050 ; GFX6-NEXT:    v_subb_u32_e32 v6, vcc, v6, v2, vcc
5051 ; GFX6-NEXT:    v_subb_u32_e32 v7, vcc, v7, v3, vcc
5052 ; GFX6-NEXT:    v_cmp_gt_u64_e32 vcc, s[0:1], v[4:5]
5053 ; GFX6-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc
5054 ; GFX6-NEXT:    v_cmp_gt_i64_e32 vcc, s[2:3], v[6:7]
5055 ; GFX6-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc
5056 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, s[2:3], v[6:7]
5057 ; GFX6-NEXT:    v_cndmask_b32_e32 v8, v9, v8, vcc
5058 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[0:1]
5059 ; GFX6-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5060 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[2:3]
5061 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5062 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[2:3]
5063 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5064 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v7
5065 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 0, v1
5066 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
5067 ; GFX6-NEXT:    v_xor_b32_e32 v0, v0, v8
5068 ; GFX6-NEXT:    v_bfrev_b32_e32 v8, 1
5069 ; GFX6-NEXT:    v_addc_u32_e32 v9, vcc, 0, v1, vcc
5070 ; GFX6-NEXT:    v_addc_u32_e32 v8, vcc, v1, v8, vcc
5071 ; GFX6-NEXT:    v_and_b32_e32 v0, 1, v0
5072 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5073 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
5074 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
5075 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v6, v9, vcc
5076 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v7, v8, vcc
5077 ; GFX6-NEXT:    ; return to shader part epilog
5079 ; GFX8-LABEL: ssubsat_i128_sv:
5080 ; GFX8:       ; %bb.0:
5081 ; GFX8-NEXT:    v_mov_b32_e32 v5, s1
5082 ; GFX8-NEXT:    v_sub_u32_e32 v4, vcc, s0, v0
5083 ; GFX8-NEXT:    v_subb_u32_e32 v5, vcc, v5, v1, vcc
5084 ; GFX8-NEXT:    v_mov_b32_e32 v6, s2
5085 ; GFX8-NEXT:    v_mov_b32_e32 v7, s3
5086 ; GFX8-NEXT:    v_subb_u32_e32 v6, vcc, v6, v2, vcc
5087 ; GFX8-NEXT:    v_subb_u32_e32 v7, vcc, v7, v3, vcc
5088 ; GFX8-NEXT:    v_cmp_gt_u64_e32 vcc, s[0:1], v[4:5]
5089 ; GFX8-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc
5090 ; GFX8-NEXT:    v_cmp_gt_i64_e32 vcc, s[2:3], v[6:7]
5091 ; GFX8-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc
5092 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, s[2:3], v[6:7]
5093 ; GFX8-NEXT:    v_cndmask_b32_e32 v8, v9, v8, vcc
5094 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[0:1]
5095 ; GFX8-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5096 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[2:3]
5097 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5098 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[2:3]
5099 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5100 ; GFX8-NEXT:    v_ashrrev_i32_e32 v1, 31, v7
5101 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, 0, v1
5102 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
5103 ; GFX8-NEXT:    v_xor_b32_e32 v0, v0, v8
5104 ; GFX8-NEXT:    v_bfrev_b32_e32 v8, 1
5105 ; GFX8-NEXT:    v_addc_u32_e32 v9, vcc, 0, v1, vcc
5106 ; GFX8-NEXT:    v_addc_u32_e32 v8, vcc, v1, v8, vcc
5107 ; GFX8-NEXT:    v_and_b32_e32 v0, 1, v0
5108 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5109 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
5110 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
5111 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v6, v9, vcc
5112 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v7, v8, vcc
5113 ; GFX8-NEXT:    ; return to shader part epilog
5115 ; GFX9-LABEL: ssubsat_i128_sv:
5116 ; GFX9:       ; %bb.0:
5117 ; GFX9-NEXT:    v_mov_b32_e32 v5, s1
5118 ; GFX9-NEXT:    v_sub_co_u32_e32 v4, vcc, s0, v0
5119 ; GFX9-NEXT:    v_subb_co_u32_e32 v5, vcc, v5, v1, vcc
5120 ; GFX9-NEXT:    v_mov_b32_e32 v6, s2
5121 ; GFX9-NEXT:    v_mov_b32_e32 v7, s3
5122 ; GFX9-NEXT:    v_subb_co_u32_e32 v6, vcc, v6, v2, vcc
5123 ; GFX9-NEXT:    v_subb_co_u32_e32 v7, vcc, v7, v3, vcc
5124 ; GFX9-NEXT:    v_cmp_gt_u64_e32 vcc, s[0:1], v[4:5]
5125 ; GFX9-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc
5126 ; GFX9-NEXT:    v_cmp_gt_i64_e32 vcc, s[2:3], v[6:7]
5127 ; GFX9-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc
5128 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, s[2:3], v[6:7]
5129 ; GFX9-NEXT:    v_cndmask_b32_e32 v8, v9, v8, vcc
5130 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[0:1]
5131 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5132 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[2:3]
5133 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5134 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[2:3]
5135 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5136 ; GFX9-NEXT:    v_ashrrev_i32_e32 v1, 31, v7
5137 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, 0, v1
5138 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v1, vcc
5139 ; GFX9-NEXT:    v_xor_b32_e32 v0, v0, v8
5140 ; GFX9-NEXT:    v_bfrev_b32_e32 v8, 1
5141 ; GFX9-NEXT:    v_addc_co_u32_e32 v9, vcc, 0, v1, vcc
5142 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, v1, v8, vcc
5143 ; GFX9-NEXT:    v_and_b32_e32 v0, 1, v0
5144 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5145 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
5146 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
5147 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v6, v9, vcc
5148 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v7, v8, vcc
5149 ; GFX9-NEXT:    ; return to shader part epilog
5151 ; GFX10-LABEL: ssubsat_i128_sv:
5152 ; GFX10:       ; %bb.0:
5153 ; GFX10-NEXT:    v_sub_co_u32 v4, vcc_lo, s0, v0
5154 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v5, vcc_lo, s1, v1, vcc_lo
5155 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v6, vcc_lo, s2, v2, vcc_lo
5156 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v7, vcc_lo, s3, v3, vcc_lo
5157 ; GFX10-NEXT:    v_cmp_gt_u64_e32 vcc_lo, s[0:1], v[4:5]
5158 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc_lo
5159 ; GFX10-NEXT:    v_cmp_gt_i64_e32 vcc_lo, s[2:3], v[6:7]
5160 ; GFX10-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc_lo
5161 ; GFX10-NEXT:    v_cmp_lt_u64_e32 vcc_lo, 0, v[0:1]
5162 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc_lo
5163 ; GFX10-NEXT:    v_cmp_lt_i64_e32 vcc_lo, 0, v[2:3]
5164 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc_lo
5165 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[2:3], v[6:7]
5166 ; GFX10-NEXT:    v_cndmask_b32_e32 v8, v9, v8, vcc_lo
5167 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc_lo, 0, v[2:3]
5168 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo
5169 ; GFX10-NEXT:    v_ashrrev_i32_e32 v1, 31, v7
5170 ; GFX10-NEXT:    v_xor_b32_e32 v0, v0, v8
5171 ; GFX10-NEXT:    v_add_co_u32 v2, vcc_lo, v1, 0
5172 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v1, vcc_lo
5173 ; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
5174 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v8, vcc_lo, 0, v1, vcc_lo
5175 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v9, vcc_lo, 0x80000000, v1, vcc_lo
5176 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s0, 0, v0
5177 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v4, v2, s0
5178 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v5, v3, s0
5179 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v6, v8, s0
5180 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v7, v9, s0
5181 ; GFX10-NEXT:    ; return to shader part epilog
5182   %result = call i128 @llvm.ssub.sat.i128(i128 %lhs, i128 %rhs)
5183   %cast = bitcast i128 %result to <4 x float>
5184   ret <4 x float> %cast
5187 define amdgpu_ps <4 x float> @ssubsat_i128_vs(i128 %lhs, i128 inreg %rhs) {
5188 ; GFX6-LABEL: ssubsat_i128_vs:
5189 ; GFX6:       ; %bb.0:
5190 ; GFX6-NEXT:    v_mov_b32_e32 v5, s1
5191 ; GFX6-NEXT:    v_subrev_i32_e32 v4, vcc, s0, v0
5192 ; GFX6-NEXT:    v_subb_u32_e32 v5, vcc, v1, v5, vcc
5193 ; GFX6-NEXT:    v_mov_b32_e32 v6, s2
5194 ; GFX6-NEXT:    v_mov_b32_e32 v7, s3
5195 ; GFX6-NEXT:    v_subb_u32_e32 v6, vcc, v2, v6, vcc
5196 ; GFX6-NEXT:    v_subb_u32_e32 v7, vcc, v3, v7, vcc
5197 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, v[4:5], v[0:1]
5198 ; GFX6-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[0:1], 0
5199 ; GFX6-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5200 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, v[6:7], v[2:3]
5201 ; GFX6-NEXT:    v_bfrev_b32_e32 v8, 1
5202 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5203 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, v[6:7], v[2:3]
5204 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5205 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
5206 ; GFX6-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[2:3], 0
5207 ; GFX6-NEXT:    v_cmp_eq_u64_e64 vcc, s[2:3], 0
5208 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
5209 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5210 ; GFX6-NEXT:    v_xor_b32_e32 v0, v1, v0
5211 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v7
5212 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 0, v1
5213 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
5214 ; GFX6-NEXT:    v_addc_u32_e32 v9, vcc, 0, v1, vcc
5215 ; GFX6-NEXT:    v_addc_u32_e32 v8, vcc, v1, v8, vcc
5216 ; GFX6-NEXT:    v_and_b32_e32 v0, 1, v0
5217 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5218 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
5219 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
5220 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v6, v9, vcc
5221 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v7, v8, vcc
5222 ; GFX6-NEXT:    ; return to shader part epilog
5224 ; GFX8-LABEL: ssubsat_i128_vs:
5225 ; GFX8:       ; %bb.0:
5226 ; GFX8-NEXT:    v_mov_b32_e32 v5, s1
5227 ; GFX8-NEXT:    v_subrev_u32_e32 v4, vcc, s0, v0
5228 ; GFX8-NEXT:    v_subb_u32_e32 v5, vcc, v1, v5, vcc
5229 ; GFX8-NEXT:    v_mov_b32_e32 v6, s2
5230 ; GFX8-NEXT:    v_mov_b32_e32 v7, s3
5231 ; GFX8-NEXT:    v_subb_u32_e32 v6, vcc, v2, v6, vcc
5232 ; GFX8-NEXT:    v_subb_u32_e32 v7, vcc, v3, v7, vcc
5233 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, v[4:5], v[0:1]
5234 ; GFX8-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[0:1], 0
5235 ; GFX8-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5236 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, v[6:7], v[2:3]
5237 ; GFX8-NEXT:    s_cmp_eq_u64 s[2:3], 0
5238 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5239 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, v[6:7], v[2:3]
5240 ; GFX8-NEXT:    s_cselect_b32 s4, 1, 0
5241 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5242 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
5243 ; GFX8-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[2:3], 0
5244 ; GFX8-NEXT:    v_bfrev_b32_e32 v8, 1
5245 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
5246 ; GFX8-NEXT:    s_and_b32 s0, 1, s4
5247 ; GFX8-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
5248 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5249 ; GFX8-NEXT:    v_xor_b32_e32 v0, v1, v0
5250 ; GFX8-NEXT:    v_ashrrev_i32_e32 v1, 31, v7
5251 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, 0, v1
5252 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
5253 ; GFX8-NEXT:    v_addc_u32_e32 v9, vcc, 0, v1, vcc
5254 ; GFX8-NEXT:    v_addc_u32_e32 v8, vcc, v1, v8, vcc
5255 ; GFX8-NEXT:    v_and_b32_e32 v0, 1, v0
5256 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5257 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
5258 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
5259 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v6, v9, vcc
5260 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v7, v8, vcc
5261 ; GFX8-NEXT:    ; return to shader part epilog
5263 ; GFX9-LABEL: ssubsat_i128_vs:
5264 ; GFX9:       ; %bb.0:
5265 ; GFX9-NEXT:    v_mov_b32_e32 v5, s1
5266 ; GFX9-NEXT:    v_subrev_co_u32_e32 v4, vcc, s0, v0
5267 ; GFX9-NEXT:    v_subb_co_u32_e32 v5, vcc, v1, v5, vcc
5268 ; GFX9-NEXT:    v_mov_b32_e32 v6, s2
5269 ; GFX9-NEXT:    v_mov_b32_e32 v7, s3
5270 ; GFX9-NEXT:    v_subb_co_u32_e32 v6, vcc, v2, v6, vcc
5271 ; GFX9-NEXT:    v_subb_co_u32_e32 v7, vcc, v3, v7, vcc
5272 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, v[4:5], v[0:1]
5273 ; GFX9-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[0:1], 0
5274 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5275 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, v[6:7], v[2:3]
5276 ; GFX9-NEXT:    s_cmp_eq_u64 s[2:3], 0
5277 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5278 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[6:7], v[2:3]
5279 ; GFX9-NEXT:    s_cselect_b32 s4, 1, 0
5280 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5281 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
5282 ; GFX9-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[2:3], 0
5283 ; GFX9-NEXT:    v_bfrev_b32_e32 v8, 1
5284 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
5285 ; GFX9-NEXT:    s_and_b32 s0, 1, s4
5286 ; GFX9-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
5287 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5288 ; GFX9-NEXT:    v_xor_b32_e32 v0, v1, v0
5289 ; GFX9-NEXT:    v_ashrrev_i32_e32 v1, 31, v7
5290 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, 0, v1
5291 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v1, vcc
5292 ; GFX9-NEXT:    v_addc_co_u32_e32 v9, vcc, 0, v1, vcc
5293 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, v1, v8, vcc
5294 ; GFX9-NEXT:    v_and_b32_e32 v0, 1, v0
5295 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5296 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v4, v2, vcc
5297 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v5, v3, vcc
5298 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v6, v9, vcc
5299 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v7, v8, vcc
5300 ; GFX9-NEXT:    ; return to shader part epilog
5302 ; GFX10-LABEL: ssubsat_i128_vs:
5303 ; GFX10:       ; %bb.0:
5304 ; GFX10-NEXT:    v_sub_co_u32 v4, vcc_lo, v0, s0
5305 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v5, vcc_lo, s1, v1, vcc_lo
5306 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v6, vcc_lo, s2, v2, vcc_lo
5307 ; GFX10-NEXT:    v_subrev_co_ci_u32_e32 v7, vcc_lo, s3, v3, vcc_lo
5308 ; GFX10-NEXT:    v_cmp_lt_u64_e32 vcc_lo, v[4:5], v[0:1]
5309 ; GFX10-NEXT:    v_cmp_gt_u64_e64 s0, s[0:1], 0
5310 ; GFX10-NEXT:    s_cmp_eq_u64 s[2:3], 0
5311 ; GFX10-NEXT:    s_cselect_b32 s4, 1, 0
5312 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc_lo
5313 ; GFX10-NEXT:    v_cmp_lt_i64_e32 vcc_lo, v[6:7], v[2:3]
5314 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, 1, s0
5315 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s0, s[2:3], 0
5316 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc_lo
5317 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc_lo, v[6:7], v[2:3]
5318 ; GFX10-NEXT:    v_cndmask_b32_e64 v9, 0, 1, s0
5319 ; GFX10-NEXT:    s_and_b32 s0, 1, s4
5320 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo
5321 ; GFX10-NEXT:    v_cmp_ne_u32_e64 vcc_lo, 0, s0
5322 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v9, v8, vcc_lo
5323 ; GFX10-NEXT:    v_xor_b32_e32 v0, v1, v0
5324 ; GFX10-NEXT:    v_ashrrev_i32_e32 v1, 31, v7
5325 ; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
5326 ; GFX10-NEXT:    v_add_co_u32 v2, vcc_lo, v1, 0
5327 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v1, vcc_lo
5328 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v8, vcc_lo, 0, v1, vcc_lo
5329 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s0, 0, v0
5330 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v9, vcc_lo, 0x80000000, v1, vcc_lo
5331 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v4, v2, s0
5332 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v5, v3, s0
5333 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v6, v8, s0
5334 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v7, v9, s0
5335 ; GFX10-NEXT:    ; return to shader part epilog
5336   %result = call i128 @llvm.ssub.sat.i128(i128 %lhs, i128 %rhs)
5337   %cast = bitcast i128 %result to <4 x float>
5338   ret <4 x float> %cast
5341 define <2 x i128> @v_ssubsat_v2i128(<2 x i128> %lhs, <2 x i128> %rhs) {
5342 ; GFX6-LABEL: v_ssubsat_v2i128:
5343 ; GFX6:       ; %bb.0:
5344 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5345 ; GFX6-NEXT:    v_sub_i32_e32 v16, vcc, v0, v8
5346 ; GFX6-NEXT:    v_subb_u32_e32 v17, vcc, v1, v9, vcc
5347 ; GFX6-NEXT:    v_subb_u32_e32 v18, vcc, v2, v10, vcc
5348 ; GFX6-NEXT:    v_subb_u32_e32 v19, vcc, v3, v11, vcc
5349 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, v[16:17], v[0:1]
5350 ; GFX6-NEXT:    v_bfrev_b32_e32 v20, 1
5351 ; GFX6-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5352 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, v[18:19], v[2:3]
5353 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5354 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, v[18:19], v[2:3]
5355 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5356 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[8:9]
5357 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5358 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[10:11]
5359 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5360 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[10:11]
5361 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5362 ; GFX6-NEXT:    v_xor_b32_e32 v0, v1, v0
5363 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v19
5364 ; GFX6-NEXT:    v_add_i32_e32 v2, vcc, 0, v1
5365 ; GFX6-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
5366 ; GFX6-NEXT:    v_addc_u32_e32 v8, vcc, 0, v1, vcc
5367 ; GFX6-NEXT:    v_addc_u32_e32 v9, vcc, v1, v20, vcc
5368 ; GFX6-NEXT:    v_and_b32_e32 v0, 1, v0
5369 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5370 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v16, v2, vcc
5371 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v17, v3, vcc
5372 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v18, v8, vcc
5373 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v19, v9, vcc
5374 ; GFX6-NEXT:    v_sub_i32_e32 v8, vcc, v4, v12
5375 ; GFX6-NEXT:    v_subb_u32_e32 v9, vcc, v5, v13, vcc
5376 ; GFX6-NEXT:    v_subb_u32_e32 v10, vcc, v6, v14, vcc
5377 ; GFX6-NEXT:    v_subb_u32_e32 v11, vcc, v7, v15, vcc
5378 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, v[8:9], v[4:5]
5379 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
5380 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, v[10:11], v[6:7]
5381 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
5382 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, v[10:11], v[6:7]
5383 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, v5, v4, vcc
5384 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[12:13]
5385 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
5386 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[14:15]
5387 ; GFX6-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
5388 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[14:15]
5389 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, v6, v5, vcc
5390 ; GFX6-NEXT:    v_xor_b32_e32 v4, v5, v4
5391 ; GFX6-NEXT:    v_ashrrev_i32_e32 v5, 31, v11
5392 ; GFX6-NEXT:    v_add_i32_e32 v6, vcc, 0, v5
5393 ; GFX6-NEXT:    v_addc_u32_e32 v7, vcc, 0, v5, vcc
5394 ; GFX6-NEXT:    v_addc_u32_e32 v12, vcc, 0, v5, vcc
5395 ; GFX6-NEXT:    v_addc_u32_e32 v13, vcc, v5, v20, vcc
5396 ; GFX6-NEXT:    v_and_b32_e32 v4, 1, v4
5397 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
5398 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, v8, v6, vcc
5399 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, v9, v7, vcc
5400 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, v10, v12, vcc
5401 ; GFX6-NEXT:    v_cndmask_b32_e32 v7, v11, v13, vcc
5402 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
5404 ; GFX8-LABEL: v_ssubsat_v2i128:
5405 ; GFX8:       ; %bb.0:
5406 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5407 ; GFX8-NEXT:    v_sub_u32_e32 v16, vcc, v0, v8
5408 ; GFX8-NEXT:    v_subb_u32_e32 v17, vcc, v1, v9, vcc
5409 ; GFX8-NEXT:    v_subb_u32_e32 v18, vcc, v2, v10, vcc
5410 ; GFX8-NEXT:    v_subb_u32_e32 v19, vcc, v3, v11, vcc
5411 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, v[16:17], v[0:1]
5412 ; GFX8-NEXT:    v_bfrev_b32_e32 v20, 1
5413 ; GFX8-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5414 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, v[18:19], v[2:3]
5415 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5416 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, v[18:19], v[2:3]
5417 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5418 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[8:9]
5419 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5420 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[10:11]
5421 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5422 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[10:11]
5423 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5424 ; GFX8-NEXT:    v_xor_b32_e32 v0, v1, v0
5425 ; GFX8-NEXT:    v_ashrrev_i32_e32 v1, 31, v19
5426 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, 0, v1
5427 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v1, vcc
5428 ; GFX8-NEXT:    v_addc_u32_e32 v8, vcc, 0, v1, vcc
5429 ; GFX8-NEXT:    v_addc_u32_e32 v9, vcc, v1, v20, vcc
5430 ; GFX8-NEXT:    v_and_b32_e32 v0, 1, v0
5431 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5432 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v16, v2, vcc
5433 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v17, v3, vcc
5434 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v18, v8, vcc
5435 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v19, v9, vcc
5436 ; GFX8-NEXT:    v_sub_u32_e32 v8, vcc, v4, v12
5437 ; GFX8-NEXT:    v_subb_u32_e32 v9, vcc, v5, v13, vcc
5438 ; GFX8-NEXT:    v_subb_u32_e32 v10, vcc, v6, v14, vcc
5439 ; GFX8-NEXT:    v_subb_u32_e32 v11, vcc, v7, v15, vcc
5440 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, v[8:9], v[4:5]
5441 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
5442 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, v[10:11], v[6:7]
5443 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
5444 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, v[10:11], v[6:7]
5445 ; GFX8-NEXT:    v_cndmask_b32_e32 v4, v5, v4, vcc
5446 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[12:13]
5447 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
5448 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[14:15]
5449 ; GFX8-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
5450 ; GFX8-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[14:15]
5451 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v6, v5, vcc
5452 ; GFX8-NEXT:    v_xor_b32_e32 v4, v5, v4
5453 ; GFX8-NEXT:    v_ashrrev_i32_e32 v5, 31, v11
5454 ; GFX8-NEXT:    v_add_u32_e32 v6, vcc, 0, v5
5455 ; GFX8-NEXT:    v_addc_u32_e32 v7, vcc, 0, v5, vcc
5456 ; GFX8-NEXT:    v_addc_u32_e32 v12, vcc, 0, v5, vcc
5457 ; GFX8-NEXT:    v_addc_u32_e32 v13, vcc, v5, v20, vcc
5458 ; GFX8-NEXT:    v_and_b32_e32 v4, 1, v4
5459 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
5460 ; GFX8-NEXT:    v_cndmask_b32_e32 v4, v8, v6, vcc
5461 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v9, v7, vcc
5462 ; GFX8-NEXT:    v_cndmask_b32_e32 v6, v10, v12, vcc
5463 ; GFX8-NEXT:    v_cndmask_b32_e32 v7, v11, v13, vcc
5464 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
5466 ; GFX9-LABEL: v_ssubsat_v2i128:
5467 ; GFX9:       ; %bb.0:
5468 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5469 ; GFX9-NEXT:    v_sub_co_u32_e32 v16, vcc, v0, v8
5470 ; GFX9-NEXT:    v_subb_co_u32_e32 v17, vcc, v1, v9, vcc
5471 ; GFX9-NEXT:    v_subb_co_u32_e32 v18, vcc, v2, v10, vcc
5472 ; GFX9-NEXT:    v_subb_co_u32_e32 v19, vcc, v3, v11, vcc
5473 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, v[16:17], v[0:1]
5474 ; GFX9-NEXT:    v_bfrev_b32_e32 v20, 1
5475 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5476 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, v[18:19], v[2:3]
5477 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5478 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[18:19], v[2:3]
5479 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
5480 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[8:9]
5481 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
5482 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[10:11]
5483 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5484 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[10:11]
5485 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5486 ; GFX9-NEXT:    v_xor_b32_e32 v0, v1, v0
5487 ; GFX9-NEXT:    v_ashrrev_i32_e32 v1, 31, v19
5488 ; GFX9-NEXT:    v_add_co_u32_e32 v2, vcc, 0, v1
5489 ; GFX9-NEXT:    v_addc_co_u32_e32 v3, vcc, 0, v1, vcc
5490 ; GFX9-NEXT:    v_addc_co_u32_e32 v8, vcc, 0, v1, vcc
5491 ; GFX9-NEXT:    v_addc_co_u32_e32 v9, vcc, v1, v20, vcc
5492 ; GFX9-NEXT:    v_and_b32_e32 v0, 1, v0
5493 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5494 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v16, v2, vcc
5495 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v17, v3, vcc
5496 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v18, v8, vcc
5497 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v19, v9, vcc
5498 ; GFX9-NEXT:    v_sub_co_u32_e32 v8, vcc, v4, v12
5499 ; GFX9-NEXT:    v_subb_co_u32_e32 v9, vcc, v5, v13, vcc
5500 ; GFX9-NEXT:    v_subb_co_u32_e32 v10, vcc, v6, v14, vcc
5501 ; GFX9-NEXT:    v_subb_co_u32_e32 v11, vcc, v7, v15, vcc
5502 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, v[8:9], v[4:5]
5503 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc
5504 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, v[10:11], v[6:7]
5505 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
5506 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, v[10:11], v[6:7]
5507 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v5, v4, vcc
5508 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, 0, v[12:13]
5509 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
5510 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, 0, v[14:15]
5511 ; GFX9-NEXT:    v_cndmask_b32_e64 v6, 0, 1, vcc
5512 ; GFX9-NEXT:    v_cmp_eq_u64_e32 vcc, 0, v[14:15]
5513 ; GFX9-NEXT:    v_cndmask_b32_e32 v5, v6, v5, vcc
5514 ; GFX9-NEXT:    v_xor_b32_e32 v4, v5, v4
5515 ; GFX9-NEXT:    v_ashrrev_i32_e32 v5, 31, v11
5516 ; GFX9-NEXT:    v_add_co_u32_e32 v6, vcc, 0, v5
5517 ; GFX9-NEXT:    v_addc_co_u32_e32 v7, vcc, 0, v5, vcc
5518 ; GFX9-NEXT:    v_addc_co_u32_e32 v12, vcc, 0, v5, vcc
5519 ; GFX9-NEXT:    v_addc_co_u32_e32 v13, vcc, v5, v20, vcc
5520 ; GFX9-NEXT:    v_and_b32_e32 v4, 1, v4
5521 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v4
5522 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v8, v6, vcc
5523 ; GFX9-NEXT:    v_cndmask_b32_e32 v5, v9, v7, vcc
5524 ; GFX9-NEXT:    v_cndmask_b32_e32 v6, v10, v12, vcc
5525 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v11, v13, vcc
5526 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
5528 ; GFX10-LABEL: v_ssubsat_v2i128:
5529 ; GFX10:       ; %bb.0:
5530 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5531 ; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
5532 ; GFX10-NEXT:    v_sub_co_u32 v16, vcc_lo, v0, v8
5533 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v17, vcc_lo, v1, v9, vcc_lo
5534 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v18, vcc_lo, v2, v10, vcc_lo
5535 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v19, vcc_lo, v3, v11, vcc_lo
5536 ; GFX10-NEXT:    v_cmp_lt_u64_e32 vcc_lo, v[16:17], v[0:1]
5537 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc_lo
5538 ; GFX10-NEXT:    v_cmp_lt_i64_e32 vcc_lo, v[18:19], v[2:3]
5539 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc_lo
5540 ; GFX10-NEXT:    v_cmp_lt_u64_e32 vcc_lo, 0, v[8:9]
5541 ; GFX10-NEXT:    v_cndmask_b32_e64 v8, 0, 1, vcc_lo
5542 ; GFX10-NEXT:    v_cmp_lt_i64_e32 vcc_lo, 0, v[10:11]
5543 ; GFX10-NEXT:    v_cndmask_b32_e64 v9, 0, 1, vcc_lo
5544 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc_lo, v[18:19], v[2:3]
5545 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo
5546 ; GFX10-NEXT:    v_cmp_eq_u64_e32 vcc_lo, 0, v[10:11]
5547 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v9, v8, vcc_lo
5548 ; GFX10-NEXT:    v_sub_co_u32 v8, vcc_lo, v4, v12
5549 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v9, vcc_lo, v5, v13, vcc_lo
5550 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v10, vcc_lo, v6, v14, vcc_lo
5551 ; GFX10-NEXT:    v_sub_co_ci_u32_e32 v11, vcc_lo, v7, v15, vcc_lo
5552 ; GFX10-NEXT:    v_cmp_lt_u64_e64 s4, v[8:9], v[4:5]
5553 ; GFX10-NEXT:    v_xor_b32_e32 v0, v1, v0
5554 ; GFX10-NEXT:    v_ashrrev_i32_e32 v1, 31, v19
5555 ; GFX10-NEXT:    v_cmp_eq_u64_e64 s5, v[10:11], v[6:7]
5556 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s4
5557 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s4, v[10:11], v[6:7]
5558 ; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
5559 ; GFX10-NEXT:    v_add_co_u32 v2, vcc_lo, v1, 0
5560 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v1, vcc_lo
5561 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s4
5562 ; GFX10-NEXT:    v_cmp_lt_u64_e64 s4, 0, v[12:13]
5563 ; GFX10-NEXT:    v_ashrrev_i32_e32 v7, 31, v11
5564 ; GFX10-NEXT:    v_cndmask_b32_e64 v12, 0, 1, s4
5565 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s4, 0, v[14:15]
5566 ; GFX10-NEXT:    v_cndmask_b32_e64 v13, 0, 1, s4
5567 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s4, 0, v0
5568 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v5, v4, s5
5569 ; GFX10-NEXT:    v_cmp_eq_u64_e64 s5, 0, v[14:15]
5570 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v5, vcc_lo, 0, v1, vcc_lo
5571 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v6, vcc_lo, 0x80000000, v1, vcc_lo
5572 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v17, v3, s4
5573 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, v13, v12, s5
5574 ; GFX10-NEXT:    v_xor_b32_e32 v4, v4, v0
5575 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v16, v2, s4
5576 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v18, v5, s4
5577 ; GFX10-NEXT:    v_and_b32_e32 v3, 1, v4
5578 ; GFX10-NEXT:    v_add_co_u32 v4, vcc_lo, v7, 0
5579 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v5, vcc_lo, 0, v7, vcc_lo
5580 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v12, vcc_lo, 0, v7, vcc_lo
5581 ; GFX10-NEXT:    v_cmp_ne_u32_e64 s5, 0, v3
5582 ; GFX10-NEXT:    v_add_co_ci_u32_e32 v7, vcc_lo, 0x80000000, v7, vcc_lo
5583 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v19, v6, s4
5584 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, v8, v4, s5
5585 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, v9, v5, s5
5586 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, v10, v12, s5
5587 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, v11, v7, s5
5588 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
5589   %result = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %lhs, <2 x i128> %rhs)
5590   ret <2 x i128> %result
5593 define amdgpu_ps <2 x i128> @s_ssubsat_v2i128(<2 x i128> inreg %lhs, <2 x i128> inreg %rhs) {
5594 ; GFX6-LABEL: s_ssubsat_v2i128:
5595 ; GFX6:       ; %bb.0:
5596 ; GFX6-NEXT:    s_sub_u32 s16, s0, s8
5597 ; GFX6-NEXT:    s_cselect_b32 s17, 1, 0
5598 ; GFX6-NEXT:    s_and_b32 s17, s17, 1
5599 ; GFX6-NEXT:    s_cmp_lg_u32 s17, 0
5600 ; GFX6-NEXT:    s_subb_u32 s17, s1, s9
5601 ; GFX6-NEXT:    s_cselect_b32 s18, 1, 0
5602 ; GFX6-NEXT:    s_and_b32 s18, s18, 1
5603 ; GFX6-NEXT:    s_cmp_lg_u32 s18, 0
5604 ; GFX6-NEXT:    s_subb_u32 s18, s2, s10
5605 ; GFX6-NEXT:    s_cselect_b32 s19, 1, 0
5606 ; GFX6-NEXT:    v_mov_b32_e32 v3, s1
5607 ; GFX6-NEXT:    s_and_b32 s19, s19, 1
5608 ; GFX6-NEXT:    v_mov_b32_e32 v2, s0
5609 ; GFX6-NEXT:    s_cmp_lg_u32 s19, 0
5610 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
5611 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, s[16:17], v[2:3]
5612 ; GFX6-NEXT:    s_subb_u32 s19, s3, s11
5613 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
5614 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5615 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, s[18:19], v[0:1]
5616 ; GFX6-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[8:9], 0
5617 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
5618 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, s[18:19], v[0:1]
5619 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
5620 ; GFX6-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[10:11], 0
5621 ; GFX6-NEXT:    s_ashr_i32 s3, s19, 31
5622 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc
5623 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
5624 ; GFX6-NEXT:    s_add_u32 s0, s3, 0
5625 ; GFX6-NEXT:    s_cselect_b32 s1, 1, 0
5626 ; GFX6-NEXT:    s_and_b32 s1, s1, 1
5627 ; GFX6-NEXT:    s_cmp_lg_u32 s1, 0
5628 ; GFX6-NEXT:    s_addc_u32 s1, s3, 0
5629 ; GFX6-NEXT:    s_cselect_b32 s2, 1, 0
5630 ; GFX6-NEXT:    s_and_b32 s2, s2, 1
5631 ; GFX6-NEXT:    s_cmp_lg_u32 s2, 0
5632 ; GFX6-NEXT:    s_addc_u32 s2, s3, 0
5633 ; GFX6-NEXT:    s_cselect_b32 s9, 1, 0
5634 ; GFX6-NEXT:    v_cmp_eq_u64_e64 vcc, s[10:11], 0
5635 ; GFX6-NEXT:    s_and_b32 s9, s9, 1
5636 ; GFX6-NEXT:    s_brev_b32 s8, 1
5637 ; GFX6-NEXT:    s_cmp_lg_u32 s9, 0
5638 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5639 ; GFX6-NEXT:    s_addc_u32 s3, s3, s8
5640 ; GFX6-NEXT:    v_xor_b32_e32 v0, v1, v0
5641 ; GFX6-NEXT:    v_mov_b32_e32 v1, s0
5642 ; GFX6-NEXT:    s_sub_u32 s0, s4, s12
5643 ; GFX6-NEXT:    v_mov_b32_e32 v2, s1
5644 ; GFX6-NEXT:    s_cselect_b32 s1, 1, 0
5645 ; GFX6-NEXT:    s_and_b32 s1, s1, 1
5646 ; GFX6-NEXT:    s_cmp_lg_u32 s1, 0
5647 ; GFX6-NEXT:    v_and_b32_e32 v0, 1, v0
5648 ; GFX6-NEXT:    s_subb_u32 s1, s5, s13
5649 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5650 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
5651 ; GFX6-NEXT:    s_cselect_b32 s2, 1, 0
5652 ; GFX6-NEXT:    s_and_b32 s2, s2, 1
5653 ; GFX6-NEXT:    v_mov_b32_e32 v3, s16
5654 ; GFX6-NEXT:    v_mov_b32_e32 v4, s17
5655 ; GFX6-NEXT:    s_cmp_lg_u32 s2, 0
5656 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, v3, v1, vcc
5657 ; GFX6-NEXT:    v_cndmask_b32_e32 v4, v4, v2, vcc
5658 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
5659 ; GFX6-NEXT:    v_mov_b32_e32 v2, s18
5660 ; GFX6-NEXT:    v_mov_b32_e32 v3, s19
5661 ; GFX6-NEXT:    s_subb_u32 s2, s6, s14
5662 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, v2, v0, vcc
5663 ; GFX6-NEXT:    v_cndmask_b32_e32 v7, v3, v1, vcc
5664 ; GFX6-NEXT:    s_cselect_b32 s3, 1, 0
5665 ; GFX6-NEXT:    v_mov_b32_e32 v2, s4
5666 ; GFX6-NEXT:    s_and_b32 s3, s3, 1
5667 ; GFX6-NEXT:    v_mov_b32_e32 v3, s5
5668 ; GFX6-NEXT:    s_cmp_lg_u32 s3, 0
5669 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
5670 ; GFX6-NEXT:    v_cmp_lt_u64_e32 vcc, s[0:1], v[2:3]
5671 ; GFX6-NEXT:    s_subb_u32 s3, s7, s15
5672 ; GFX6-NEXT:    v_mov_b32_e32 v1, s7
5673 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5674 ; GFX6-NEXT:    v_cmp_lt_i64_e32 vcc, s[2:3], v[0:1]
5675 ; GFX6-NEXT:    v_cmp_gt_u64_e64 s[4:5], s[12:13], 0
5676 ; GFX6-NEXT:    v_cndmask_b32_e64 v3, 0, 1, vcc
5677 ; GFX6-NEXT:    v_cmp_eq_u64_e32 vcc, s[2:3], v[0:1]
5678 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[4:5]
5679 ; GFX6-NEXT:    v_cmp_gt_i64_e64 s[4:5], s[14:15], 0
5680 ; GFX6-NEXT:    s_ashr_i32 s7, s3, 31
5681 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v3, v2, vcc
5682 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[4:5]
5683 ; GFX6-NEXT:    s_add_u32 s4, s7, 0
5684 ; GFX6-NEXT:    s_cselect_b32 s5, 1, 0
5685 ; GFX6-NEXT:    s_and_b32 s5, s5, 1
5686 ; GFX6-NEXT:    s_cmp_lg_u32 s5, 0
5687 ; GFX6-NEXT:    s_addc_u32 s5, s7, 0
5688 ; GFX6-NEXT:    s_cselect_b32 s6, 1, 0
5689 ; GFX6-NEXT:    s_and_b32 s6, s6, 1
5690 ; GFX6-NEXT:    v_cmp_eq_u64_e64 vcc, s[14:15], 0
5691 ; GFX6-NEXT:    s_cmp_lg_u32 s6, 0
5692 ; GFX6-NEXT:    s_addc_u32 s6, s7, 0
5693 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5694 ; GFX6-NEXT:    s_cselect_b32 s9, 1, 0
5695 ; GFX6-NEXT:    v_xor_b32_e32 v0, v1, v0
5696 ; GFX6-NEXT:    s_and_b32 s9, s9, 1
5697 ; GFX6-NEXT:    s_cmp_lg_u32 s9, 0
5698 ; GFX6-NEXT:    v_and_b32_e32 v0, 1, v0
5699 ; GFX6-NEXT:    s_addc_u32 s7, s7, s8
5700 ; GFX6-NEXT:    v_mov_b32_e32 v1, s4
5701 ; GFX6-NEXT:    v_mov_b32_e32 v2, s5
5702 ; GFX6-NEXT:    v_mov_b32_e32 v3, s0
5703 ; GFX6-NEXT:    v_mov_b32_e32 v8, s1
5704 ; GFX6-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5705 ; GFX6-NEXT:    v_cndmask_b32_e32 v0, v3, v1, vcc
5706 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, v8, v2, vcc
5707 ; GFX6-NEXT:    v_mov_b32_e32 v2, s6
5708 ; GFX6-NEXT:    v_mov_b32_e32 v3, s7
5709 ; GFX6-NEXT:    v_mov_b32_e32 v8, s2
5710 ; GFX6-NEXT:    v_mov_b32_e32 v9, s3
5711 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, v8, v2, vcc
5712 ; GFX6-NEXT:    v_cndmask_b32_e32 v3, v9, v3, vcc
5713 ; GFX6-NEXT:    v_readfirstlane_b32 s0, v5
5714 ; GFX6-NEXT:    v_readfirstlane_b32 s1, v4
5715 ; GFX6-NEXT:    v_readfirstlane_b32 s2, v6
5716 ; GFX6-NEXT:    v_readfirstlane_b32 s3, v7
5717 ; GFX6-NEXT:    v_readfirstlane_b32 s4, v0
5718 ; GFX6-NEXT:    v_readfirstlane_b32 s5, v1
5719 ; GFX6-NEXT:    v_readfirstlane_b32 s6, v2
5720 ; GFX6-NEXT:    v_readfirstlane_b32 s7, v3
5721 ; GFX6-NEXT:    ; return to shader part epilog
5723 ; GFX8-LABEL: s_ssubsat_v2i128:
5724 ; GFX8:       ; %bb.0:
5725 ; GFX8-NEXT:    s_sub_u32 s16, s0, s8
5726 ; GFX8-NEXT:    s_cselect_b32 s17, 1, 0
5727 ; GFX8-NEXT:    s_and_b32 s17, s17, 1
5728 ; GFX8-NEXT:    s_cmp_lg_u32 s17, 0
5729 ; GFX8-NEXT:    s_subb_u32 s17, s1, s9
5730 ; GFX8-NEXT:    s_cselect_b32 s18, 1, 0
5731 ; GFX8-NEXT:    s_and_b32 s18, s18, 1
5732 ; GFX8-NEXT:    s_cmp_lg_u32 s18, 0
5733 ; GFX8-NEXT:    s_subb_u32 s18, s2, s10
5734 ; GFX8-NEXT:    s_cselect_b32 s19, 1, 0
5735 ; GFX8-NEXT:    s_and_b32 s19, s19, 1
5736 ; GFX8-NEXT:    v_mov_b32_e32 v3, s1
5737 ; GFX8-NEXT:    s_cmp_lg_u32 s19, 0
5738 ; GFX8-NEXT:    v_mov_b32_e32 v2, s0
5739 ; GFX8-NEXT:    s_subb_u32 s19, s3, s11
5740 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
5741 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, s[16:17], v[2:3]
5742 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
5743 ; GFX8-NEXT:    s_cmp_eq_u64 s[18:19], s[2:3]
5744 ; GFX8-NEXT:    s_cselect_b32 s2, 1, 0
5745 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5746 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, s[18:19], v[0:1]
5747 ; GFX8-NEXT:    s_and_b32 s0, 1, s2
5748 ; GFX8-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5749 ; GFX8-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
5750 ; GFX8-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[8:9], 0
5751 ; GFX8-NEXT:    s_cmp_eq_u64 s[10:11], 0
5752 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
5753 ; GFX8-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[10:11], 0
5754 ; GFX8-NEXT:    s_cselect_b32 s2, 1, 0
5755 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
5756 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
5757 ; GFX8-NEXT:    s_and_b32 s0, 1, s2
5758 ; GFX8-NEXT:    s_ashr_i32 s3, s19, 31
5759 ; GFX8-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
5760 ; GFX8-NEXT:    s_add_u32 s0, s3, 0
5761 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
5762 ; GFX8-NEXT:    s_and_b32 s1, s1, 1
5763 ; GFX8-NEXT:    s_cmp_lg_u32 s1, 0
5764 ; GFX8-NEXT:    s_addc_u32 s1, s3, 0
5765 ; GFX8-NEXT:    s_cselect_b32 s2, 1, 0
5766 ; GFX8-NEXT:    s_and_b32 s2, s2, 1
5767 ; GFX8-NEXT:    s_cmp_lg_u32 s2, 0
5768 ; GFX8-NEXT:    s_addc_u32 s2, s3, 0
5769 ; GFX8-NEXT:    s_cselect_b32 s9, 1, 0
5770 ; GFX8-NEXT:    s_and_b32 s9, s9, 1
5771 ; GFX8-NEXT:    s_brev_b32 s8, 1
5772 ; GFX8-NEXT:    s_cmp_lg_u32 s9, 0
5773 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5774 ; GFX8-NEXT:    s_addc_u32 s3, s3, s8
5775 ; GFX8-NEXT:    v_xor_b32_e32 v0, v1, v0
5776 ; GFX8-NEXT:    v_mov_b32_e32 v1, s0
5777 ; GFX8-NEXT:    s_sub_u32 s0, s4, s12
5778 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
5779 ; GFX8-NEXT:    s_cselect_b32 s1, 1, 0
5780 ; GFX8-NEXT:    s_and_b32 s1, s1, 1
5781 ; GFX8-NEXT:    s_cmp_lg_u32 s1, 0
5782 ; GFX8-NEXT:    v_and_b32_e32 v0, 1, v0
5783 ; GFX8-NEXT:    s_subb_u32 s1, s5, s13
5784 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5785 ; GFX8-NEXT:    v_mov_b32_e32 v0, s2
5786 ; GFX8-NEXT:    s_cselect_b32 s2, 1, 0
5787 ; GFX8-NEXT:    s_and_b32 s2, s2, 1
5788 ; GFX8-NEXT:    s_cmp_lg_u32 s2, 0
5789 ; GFX8-NEXT:    v_mov_b32_e32 v3, s16
5790 ; GFX8-NEXT:    v_mov_b32_e32 v4, s17
5791 ; GFX8-NEXT:    s_subb_u32 s2, s6, s14
5792 ; GFX8-NEXT:    v_cndmask_b32_e32 v5, v3, v1, vcc
5793 ; GFX8-NEXT:    v_cndmask_b32_e32 v4, v4, v2, vcc
5794 ; GFX8-NEXT:    v_mov_b32_e32 v1, s3
5795 ; GFX8-NEXT:    v_mov_b32_e32 v2, s18
5796 ; GFX8-NEXT:    v_mov_b32_e32 v3, s19
5797 ; GFX8-NEXT:    s_cselect_b32 s3, 1, 0
5798 ; GFX8-NEXT:    v_cndmask_b32_e32 v6, v2, v0, vcc
5799 ; GFX8-NEXT:    v_cndmask_b32_e32 v7, v3, v1, vcc
5800 ; GFX8-NEXT:    s_and_b32 s3, s3, 1
5801 ; GFX8-NEXT:    v_mov_b32_e32 v2, s4
5802 ; GFX8-NEXT:    s_cmp_lg_u32 s3, 0
5803 ; GFX8-NEXT:    v_mov_b32_e32 v3, s5
5804 ; GFX8-NEXT:    s_subb_u32 s3, s7, s15
5805 ; GFX8-NEXT:    v_mov_b32_e32 v0, s6
5806 ; GFX8-NEXT:    v_cmp_lt_u64_e32 vcc, s[0:1], v[2:3]
5807 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
5808 ; GFX8-NEXT:    s_cmp_eq_u64 s[2:3], s[6:7]
5809 ; GFX8-NEXT:    s_cselect_b32 s6, 1, 0
5810 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5811 ; GFX8-NEXT:    v_cmp_lt_i64_e32 vcc, s[2:3], v[0:1]
5812 ; GFX8-NEXT:    s_and_b32 s4, 1, s6
5813 ; GFX8-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5814 ; GFX8-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s4
5815 ; GFX8-NEXT:    v_cmp_gt_u64_e64 s[4:5], s[12:13], 0
5816 ; GFX8-NEXT:    s_cmp_eq_u64 s[14:15], 0
5817 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[4:5]
5818 ; GFX8-NEXT:    v_cmp_gt_i64_e64 s[4:5], s[14:15], 0
5819 ; GFX8-NEXT:    s_cselect_b32 s6, 1, 0
5820 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
5821 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[4:5]
5822 ; GFX8-NEXT:    s_and_b32 s4, 1, s6
5823 ; GFX8-NEXT:    s_ashr_i32 s7, s3, 31
5824 ; GFX8-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s4
5825 ; GFX8-NEXT:    s_add_u32 s4, s7, 0
5826 ; GFX8-NEXT:    s_cselect_b32 s5, 1, 0
5827 ; GFX8-NEXT:    s_and_b32 s5, s5, 1
5828 ; GFX8-NEXT:    s_cmp_lg_u32 s5, 0
5829 ; GFX8-NEXT:    s_addc_u32 s5, s7, 0
5830 ; GFX8-NEXT:    s_cselect_b32 s6, 1, 0
5831 ; GFX8-NEXT:    s_and_b32 s6, s6, 1
5832 ; GFX8-NEXT:    s_cmp_lg_u32 s6, 0
5833 ; GFX8-NEXT:    s_addc_u32 s6, s7, 0
5834 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5835 ; GFX8-NEXT:    s_cselect_b32 s9, 1, 0
5836 ; GFX8-NEXT:    v_xor_b32_e32 v0, v1, v0
5837 ; GFX8-NEXT:    s_and_b32 s9, s9, 1
5838 ; GFX8-NEXT:    s_cmp_lg_u32 s9, 0
5839 ; GFX8-NEXT:    v_and_b32_e32 v0, 1, v0
5840 ; GFX8-NEXT:    s_addc_u32 s7, s7, s8
5841 ; GFX8-NEXT:    v_mov_b32_e32 v1, s4
5842 ; GFX8-NEXT:    v_mov_b32_e32 v2, s5
5843 ; GFX8-NEXT:    v_mov_b32_e32 v3, s0
5844 ; GFX8-NEXT:    v_mov_b32_e32 v8, s1
5845 ; GFX8-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5846 ; GFX8-NEXT:    v_cndmask_b32_e32 v0, v3, v1, vcc
5847 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, v8, v2, vcc
5848 ; GFX8-NEXT:    v_mov_b32_e32 v2, s6
5849 ; GFX8-NEXT:    v_mov_b32_e32 v3, s7
5850 ; GFX8-NEXT:    v_mov_b32_e32 v8, s2
5851 ; GFX8-NEXT:    v_mov_b32_e32 v9, s3
5852 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, v8, v2, vcc
5853 ; GFX8-NEXT:    v_cndmask_b32_e32 v3, v9, v3, vcc
5854 ; GFX8-NEXT:    v_readfirstlane_b32 s0, v5
5855 ; GFX8-NEXT:    v_readfirstlane_b32 s1, v4
5856 ; GFX8-NEXT:    v_readfirstlane_b32 s2, v6
5857 ; GFX8-NEXT:    v_readfirstlane_b32 s3, v7
5858 ; GFX8-NEXT:    v_readfirstlane_b32 s4, v0
5859 ; GFX8-NEXT:    v_readfirstlane_b32 s5, v1
5860 ; GFX8-NEXT:    v_readfirstlane_b32 s6, v2
5861 ; GFX8-NEXT:    v_readfirstlane_b32 s7, v3
5862 ; GFX8-NEXT:    ; return to shader part epilog
5864 ; GFX9-LABEL: s_ssubsat_v2i128:
5865 ; GFX9:       ; %bb.0:
5866 ; GFX9-NEXT:    s_sub_u32 s16, s0, s8
5867 ; GFX9-NEXT:    s_cselect_b32 s17, 1, 0
5868 ; GFX9-NEXT:    s_and_b32 s17, s17, 1
5869 ; GFX9-NEXT:    s_cmp_lg_u32 s17, 0
5870 ; GFX9-NEXT:    s_subb_u32 s17, s1, s9
5871 ; GFX9-NEXT:    s_cselect_b32 s18, 1, 0
5872 ; GFX9-NEXT:    s_and_b32 s18, s18, 1
5873 ; GFX9-NEXT:    s_cmp_lg_u32 s18, 0
5874 ; GFX9-NEXT:    s_subb_u32 s18, s2, s10
5875 ; GFX9-NEXT:    s_cselect_b32 s19, 1, 0
5876 ; GFX9-NEXT:    s_and_b32 s19, s19, 1
5877 ; GFX9-NEXT:    v_mov_b32_e32 v3, s1
5878 ; GFX9-NEXT:    s_cmp_lg_u32 s19, 0
5879 ; GFX9-NEXT:    v_mov_b32_e32 v2, s0
5880 ; GFX9-NEXT:    s_subb_u32 s19, s3, s11
5881 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
5882 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, s[16:17], v[2:3]
5883 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
5884 ; GFX9-NEXT:    s_cmp_eq_u64 s[18:19], s[2:3]
5885 ; GFX9-NEXT:    s_cselect_b32 s2, 1, 0
5886 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5887 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, s[18:19], v[0:1]
5888 ; GFX9-NEXT:    s_and_b32 s0, 1, s2
5889 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5890 ; GFX9-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
5891 ; GFX9-NEXT:    v_cmp_gt_u64_e64 s[0:1], s[8:9], 0
5892 ; GFX9-NEXT:    s_cmp_eq_u64 s[10:11], 0
5893 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[0:1]
5894 ; GFX9-NEXT:    v_cmp_gt_i64_e64 s[0:1], s[10:11], 0
5895 ; GFX9-NEXT:    s_cselect_b32 s2, 1, 0
5896 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
5897 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[0:1]
5898 ; GFX9-NEXT:    s_and_b32 s0, 1, s2
5899 ; GFX9-NEXT:    s_ashr_i32 s3, s19, 31
5900 ; GFX9-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s0
5901 ; GFX9-NEXT:    s_add_u32 s0, s3, 0
5902 ; GFX9-NEXT:    s_cselect_b32 s1, 1, 0
5903 ; GFX9-NEXT:    s_and_b32 s1, s1, 1
5904 ; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
5905 ; GFX9-NEXT:    s_addc_u32 s1, s3, 0
5906 ; GFX9-NEXT:    s_cselect_b32 s2, 1, 0
5907 ; GFX9-NEXT:    s_and_b32 s2, s2, 1
5908 ; GFX9-NEXT:    s_cmp_lg_u32 s2, 0
5909 ; GFX9-NEXT:    s_addc_u32 s2, s3, 0
5910 ; GFX9-NEXT:    s_cselect_b32 s9, 1, 0
5911 ; GFX9-NEXT:    s_and_b32 s9, s9, 1
5912 ; GFX9-NEXT:    s_brev_b32 s8, 1
5913 ; GFX9-NEXT:    s_cmp_lg_u32 s9, 0
5914 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5915 ; GFX9-NEXT:    s_addc_u32 s3, s3, s8
5916 ; GFX9-NEXT:    v_xor_b32_e32 v0, v1, v0
5917 ; GFX9-NEXT:    v_mov_b32_e32 v1, s0
5918 ; GFX9-NEXT:    s_sub_u32 s0, s4, s12
5919 ; GFX9-NEXT:    v_mov_b32_e32 v2, s1
5920 ; GFX9-NEXT:    s_cselect_b32 s1, 1, 0
5921 ; GFX9-NEXT:    s_and_b32 s1, s1, 1
5922 ; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
5923 ; GFX9-NEXT:    v_and_b32_e32 v0, 1, v0
5924 ; GFX9-NEXT:    s_subb_u32 s1, s5, s13
5925 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5926 ; GFX9-NEXT:    v_mov_b32_e32 v0, s2
5927 ; GFX9-NEXT:    s_cselect_b32 s2, 1, 0
5928 ; GFX9-NEXT:    s_and_b32 s2, s2, 1
5929 ; GFX9-NEXT:    s_cmp_lg_u32 s2, 0
5930 ; GFX9-NEXT:    v_mov_b32_e32 v3, s16
5931 ; GFX9-NEXT:    v_mov_b32_e32 v4, s17
5932 ; GFX9-NEXT:    s_subb_u32 s2, s6, s14
5933 ; GFX9-NEXT:    v_cndmask_b32_e32 v5, v3, v1, vcc
5934 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v4, v2, vcc
5935 ; GFX9-NEXT:    v_mov_b32_e32 v1, s3
5936 ; GFX9-NEXT:    v_mov_b32_e32 v2, s18
5937 ; GFX9-NEXT:    v_mov_b32_e32 v3, s19
5938 ; GFX9-NEXT:    s_cselect_b32 s3, 1, 0
5939 ; GFX9-NEXT:    v_cndmask_b32_e32 v6, v2, v0, vcc
5940 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v3, v1, vcc
5941 ; GFX9-NEXT:    s_and_b32 s3, s3, 1
5942 ; GFX9-NEXT:    v_mov_b32_e32 v2, s4
5943 ; GFX9-NEXT:    s_cmp_lg_u32 s3, 0
5944 ; GFX9-NEXT:    v_mov_b32_e32 v3, s5
5945 ; GFX9-NEXT:    s_subb_u32 s3, s7, s15
5946 ; GFX9-NEXT:    v_mov_b32_e32 v0, s6
5947 ; GFX9-NEXT:    v_cmp_lt_u64_e32 vcc, s[0:1], v[2:3]
5948 ; GFX9-NEXT:    v_mov_b32_e32 v1, s7
5949 ; GFX9-NEXT:    s_cmp_eq_u64 s[2:3], s[6:7]
5950 ; GFX9-NEXT:    s_cselect_b32 s6, 1, 0
5951 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
5952 ; GFX9-NEXT:    v_cmp_lt_i64_e32 vcc, s[2:3], v[0:1]
5953 ; GFX9-NEXT:    s_and_b32 s4, 1, s6
5954 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
5955 ; GFX9-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s4
5956 ; GFX9-NEXT:    v_cmp_gt_u64_e64 s[4:5], s[12:13], 0
5957 ; GFX9-NEXT:    s_cmp_eq_u64 s[14:15], 0
5958 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[4:5]
5959 ; GFX9-NEXT:    v_cmp_gt_i64_e64 s[4:5], s[14:15], 0
5960 ; GFX9-NEXT:    s_cselect_b32 s6, 1, 0
5961 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
5962 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s[4:5]
5963 ; GFX9-NEXT:    s_and_b32 s4, 1, s6
5964 ; GFX9-NEXT:    s_ashr_i32 s7, s3, 31
5965 ; GFX9-NEXT:    v_cmp_ne_u32_e64 vcc, 0, s4
5966 ; GFX9-NEXT:    s_add_u32 s4, s7, 0
5967 ; GFX9-NEXT:    s_cselect_b32 s5, 1, 0
5968 ; GFX9-NEXT:    s_and_b32 s5, s5, 1
5969 ; GFX9-NEXT:    s_cmp_lg_u32 s5, 0
5970 ; GFX9-NEXT:    s_addc_u32 s5, s7, 0
5971 ; GFX9-NEXT:    s_cselect_b32 s6, 1, 0
5972 ; GFX9-NEXT:    s_and_b32 s6, s6, 1
5973 ; GFX9-NEXT:    s_cmp_lg_u32 s6, 0
5974 ; GFX9-NEXT:    s_addc_u32 s6, s7, 0
5975 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc
5976 ; GFX9-NEXT:    s_cselect_b32 s9, 1, 0
5977 ; GFX9-NEXT:    v_xor_b32_e32 v0, v1, v0
5978 ; GFX9-NEXT:    s_and_b32 s9, s9, 1
5979 ; GFX9-NEXT:    s_cmp_lg_u32 s9, 0
5980 ; GFX9-NEXT:    v_and_b32_e32 v0, 1, v0
5981 ; GFX9-NEXT:    s_addc_u32 s7, s7, s8
5982 ; GFX9-NEXT:    v_mov_b32_e32 v1, s4
5983 ; GFX9-NEXT:    v_mov_b32_e32 v2, s5
5984 ; GFX9-NEXT:    v_mov_b32_e32 v3, s0
5985 ; GFX9-NEXT:    v_mov_b32_e32 v8, s1
5986 ; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
5987 ; GFX9-NEXT:    v_cndmask_b32_e32 v0, v3, v1, vcc
5988 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v8, v2, vcc
5989 ; GFX9-NEXT:    v_mov_b32_e32 v2, s6
5990 ; GFX9-NEXT:    v_mov_b32_e32 v3, s7
5991 ; GFX9-NEXT:    v_mov_b32_e32 v8, s2
5992 ; GFX9-NEXT:    v_mov_b32_e32 v9, s3
5993 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v8, v2, vcc
5994 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v9, v3, vcc
5995 ; GFX9-NEXT:    v_readfirstlane_b32 s0, v5
5996 ; GFX9-NEXT:    v_readfirstlane_b32 s1, v4
5997 ; GFX9-NEXT:    v_readfirstlane_b32 s2, v6
5998 ; GFX9-NEXT:    v_readfirstlane_b32 s3, v7
5999 ; GFX9-NEXT:    v_readfirstlane_b32 s4, v0
6000 ; GFX9-NEXT:    v_readfirstlane_b32 s5, v1
6001 ; GFX9-NEXT:    v_readfirstlane_b32 s6, v2
6002 ; GFX9-NEXT:    v_readfirstlane_b32 s7, v3
6003 ; GFX9-NEXT:    ; return to shader part epilog
6005 ; GFX10-LABEL: s_ssubsat_v2i128:
6006 ; GFX10:       ; %bb.0:
6007 ; GFX10-NEXT:    s_sub_u32 s16, s0, s8
6008 ; GFX10-NEXT:    s_cselect_b32 s17, 1, 0
6009 ; GFX10-NEXT:    s_and_b32 s17, s17, 1
6010 ; GFX10-NEXT:    s_cmp_lg_u32 s17, 0
6011 ; GFX10-NEXT:    s_subb_u32 s17, s1, s9
6012 ; GFX10-NEXT:    s_cselect_b32 s18, 1, 0
6013 ; GFX10-NEXT:    v_cmp_lt_u64_e64 s0, s[16:17], s[0:1]
6014 ; GFX10-NEXT:    s_and_b32 s18, s18, 1
6015 ; GFX10-NEXT:    v_cmp_gt_u64_e64 s1, s[8:9], 0
6016 ; GFX10-NEXT:    s_cmp_lg_u32 s18, 0
6017 ; GFX10-NEXT:    s_subb_u32 s18, s2, s10
6018 ; GFX10-NEXT:    s_cselect_b32 s19, 1, 0
6019 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s0
6020 ; GFX10-NEXT:    s_and_b32 s19, s19, 1
6021 ; GFX10-NEXT:    s_cmp_lg_u32 s19, 0
6022 ; GFX10-NEXT:    s_subb_u32 s19, s3, s11
6023 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s0, s[18:19], s[2:3]
6024 ; GFX10-NEXT:    s_cmp_eq_u64 s[18:19], s[2:3]
6025 ; GFX10-NEXT:    v_mov_b32_e32 v3, s19
6026 ; GFX10-NEXT:    s_cselect_b32 s20, 1, 0
6027 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s0
6028 ; GFX10-NEXT:    s_and_b32 s0, 1, s20
6029 ; GFX10-NEXT:    s_cmp_eq_u64 s[10:11], 0
6030 ; GFX10-NEXT:    v_cmp_ne_u32_e64 vcc_lo, 0, s0
6031 ; GFX10-NEXT:    s_cselect_b32 s0, 1, 0
6032 ; GFX10-NEXT:    s_ashr_i32 s3, s19, 31
6033 ; GFX10-NEXT:    s_and_b32 s0, 1, s0
6034 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo
6035 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s1
6036 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s1, s[10:11], 0
6037 ; GFX10-NEXT:    v_cmp_ne_u32_e64 vcc_lo, 0, s0
6038 ; GFX10-NEXT:    s_add_u32 s0, s3, 0
6039 ; GFX10-NEXT:    s_brev_b32 s10, 1
6040 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s1
6041 ; GFX10-NEXT:    s_cselect_b32 s1, 1, 0
6042 ; GFX10-NEXT:    s_and_b32 s1, s1, 1
6043 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v2, v1, vcc_lo
6044 ; GFX10-NEXT:    s_cmp_lg_u32 s1, 0
6045 ; GFX10-NEXT:    v_mov_b32_e32 v2, s17
6046 ; GFX10-NEXT:    s_addc_u32 s1, s3, 0
6047 ; GFX10-NEXT:    s_cselect_b32 s2, 1, 0
6048 ; GFX10-NEXT:    v_xor_b32_e32 v0, v1, v0
6049 ; GFX10-NEXT:    s_and_b32 s2, s2, 1
6050 ; GFX10-NEXT:    v_mov_b32_e32 v1, s16
6051 ; GFX10-NEXT:    s_cmp_lg_u32 s2, 0
6052 ; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
6053 ; GFX10-NEXT:    s_addc_u32 s2, s3, 0
6054 ; GFX10-NEXT:    s_cselect_b32 s8, 1, 0
6055 ; GFX10-NEXT:    s_and_b32 s8, s8, 1
6056 ; GFX10-NEXT:    v_cmp_ne_u32_e32 vcc_lo, 0, v0
6057 ; GFX10-NEXT:    s_cmp_lg_u32 s8, 0
6058 ; GFX10-NEXT:    s_addc_u32 s3, s3, s10
6059 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, v1, s0, vcc_lo
6060 ; GFX10-NEXT:    s_sub_u32 s0, s4, s12
6061 ; GFX10-NEXT:    s_cselect_b32 s8, 1, 0
6062 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, v2, s1, vcc_lo
6063 ; GFX10-NEXT:    s_and_b32 s8, s8, 1
6064 ; GFX10-NEXT:    v_mov_b32_e32 v2, s18
6065 ; GFX10-NEXT:    s_cmp_lg_u32 s8, 0
6066 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, v3, s3, vcc_lo
6067 ; GFX10-NEXT:    s_subb_u32 s1, s5, s13
6068 ; GFX10-NEXT:    s_cselect_b32 s8, 1, 0
6069 ; GFX10-NEXT:    v_cmp_lt_u64_e64 s4, s[0:1], s[4:5]
6070 ; GFX10-NEXT:    s_and_b32 s8, s8, 1
6071 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s2, vcc_lo
6072 ; GFX10-NEXT:    s_cmp_lg_u32 s8, 0
6073 ; GFX10-NEXT:    v_cmp_gt_u64_e64 s3, s[12:13], 0
6074 ; GFX10-NEXT:    s_subb_u32 s8, s6, s14
6075 ; GFX10-NEXT:    s_cselect_b32 s9, 1, 0
6076 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s4
6077 ; GFX10-NEXT:    s_and_b32 s9, s9, 1
6078 ; GFX10-NEXT:    v_mov_b32_e32 v7, s8
6079 ; GFX10-NEXT:    s_cmp_lg_u32 s9, 0
6080 ; GFX10-NEXT:    s_subb_u32 s9, s7, s15
6081 ; GFX10-NEXT:    s_cmp_eq_u64 s[8:9], s[6:7]
6082 ; GFX10-NEXT:    v_cmp_lt_i64_e64 s4, s[8:9], s[6:7]
6083 ; GFX10-NEXT:    s_cselect_b32 s2, 1, 0
6084 ; GFX10-NEXT:    v_mov_b32_e32 v8, s9
6085 ; GFX10-NEXT:    s_and_b32 s2, 1, s2
6086 ; GFX10-NEXT:    s_cmp_eq_u64 s[14:15], 0
6087 ; GFX10-NEXT:    v_cmp_ne_u32_e64 vcc_lo, 0, s2
6088 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s4
6089 ; GFX10-NEXT:    s_cselect_b32 s2, 1, 0
6090 ; GFX10-NEXT:    s_ashr_i32 s5, s9, 31
6091 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v5, v4, vcc_lo
6092 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s3
6093 ; GFX10-NEXT:    v_cmp_gt_i64_e64 s3, s[14:15], 0
6094 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, 0, 1, s3
6095 ; GFX10-NEXT:    s_and_b32 s3, 1, s2
6096 ; GFX10-NEXT:    s_add_u32 s2, s5, 0
6097 ; GFX10-NEXT:    v_cmp_ne_u32_e64 vcc_lo, 0, s3
6098 ; GFX10-NEXT:    s_cselect_b32 s4, 1, 0
6099 ; GFX10-NEXT:    s_and_b32 s4, s4, 1
6100 ; GFX10-NEXT:    v_cndmask_b32_e32 v5, v6, v5, vcc_lo
6101 ; GFX10-NEXT:    s_cmp_lg_u32 s4, 0
6102 ; GFX10-NEXT:    v_mov_b32_e32 v6, s1
6103 ; GFX10-NEXT:    s_addc_u32 s3, s5, 0
6104 ; GFX10-NEXT:    s_cselect_b32 s4, 1, 0
6105 ; GFX10-NEXT:    v_xor_b32_e32 v4, v5, v4
6106 ; GFX10-NEXT:    s_and_b32 s4, s4, 1
6107 ; GFX10-NEXT:    v_mov_b32_e32 v5, s0
6108 ; GFX10-NEXT:    s_cmp_lg_u32 s4, 0
6109 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
6110 ; GFX10-NEXT:    v_and_b32_e32 v4, 1, v4
6111 ; GFX10-NEXT:    s_addc_u32 s4, s5, 0
6112 ; GFX10-NEXT:    s_cselect_b32 s6, 1, 0
6113 ; GFX10-NEXT:    s_and_b32 s6, s6, 1
6114 ; GFX10-NEXT:    v_cmp_ne_u32_e32 vcc_lo, 0, v4
6115 ; GFX10-NEXT:    s_cmp_lg_u32 s6, 0
6116 ; GFX10-NEXT:    s_addc_u32 s1, s5, s10
6117 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, v5, s2, vcc_lo
6118 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, v6, s3, vcc_lo
6119 ; GFX10-NEXT:    v_cndmask_b32_e64 v6, v7, s4, vcc_lo
6120 ; GFX10-NEXT:    v_cndmask_b32_e64 v7, v8, s1, vcc_lo
6121 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
6122 ; GFX10-NEXT:    v_readfirstlane_b32 s2, v2
6123 ; GFX10-NEXT:    v_readfirstlane_b32 s3, v3
6124 ; GFX10-NEXT:    v_readfirstlane_b32 s4, v4
6125 ; GFX10-NEXT:    v_readfirstlane_b32 s5, v5
6126 ; GFX10-NEXT:    v_readfirstlane_b32 s6, v6
6127 ; GFX10-NEXT:    v_readfirstlane_b32 s7, v7
6128 ; GFX10-NEXT:    ; return to shader part epilog
6129   %result = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %lhs, <2 x i128> %rhs)
6130   ret <2 x i128> %result
6133 declare i7 @llvm.ssub.sat.i7(i7, i7) #0
6134 declare i8 @llvm.ssub.sat.i8(i8, i8) #0
6135 declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>) #0
6136 declare <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8>, <4 x i8>) #0
6138 declare i16 @llvm.ssub.sat.i16(i16, i16) #0
6139 declare <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16>, <2 x i16>) #0
6140 declare <3 x i16> @llvm.ssub.sat.v3i16(<3 x i16>, <3 x i16>) #0
6141 declare <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16>, <4 x i16>) #0
6142 declare <5 x i16> @llvm.ssub.sat.v5i16(<5 x i16>, <5 x i16>) #0
6143 declare <6 x i16> @llvm.ssub.sat.v6i16(<6 x i16>, <6 x i16>) #0
6144 declare <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16>, <8 x i16>) #0
6146 declare i24 @llvm.ssub.sat.i24(i24, i24) #0
6148 declare i32 @llvm.ssub.sat.i32(i32, i32) #0
6149 declare <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32>, <2 x i32>) #0
6150 declare <3 x i32> @llvm.ssub.sat.v3i32(<3 x i32>, <3 x i32>) #0
6151 declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>) #0
6152 declare <5 x i32> @llvm.ssub.sat.v5i32(<5 x i32>, <5 x i32>) #0
6153 declare <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32>, <16 x i32>) #0
6155 declare i48 @llvm.ssub.sat.i48(i48, i48) #0
6157 declare i64 @llvm.ssub.sat.i64(i64, i64) #0
6158 declare <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64>, <2 x i64>) #0
6160 declare i128 @llvm.ssub.sat.i128(i128, i128) #0
6161 declare <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128>, <2 x i128>) #0
6163 attributes #0 = { nounwind readnone speculatable willreturn }