xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-pattern-umed3.s16.mir (revision 08db696c87fb68cc896f742202665440cee53f8c)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX8 %s
3# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %s
4# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %s
5# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX11 %s
6
7---
8name: umed3_s16_vvv
9legalized: true
10regBankSelected: true
11
12body: |
13  bb.0:
14    liveins: $vgpr0, $vgpr1, $vgpr2
15
16    ; GFX8-LABEL: name: umed3_s16_vvv
17    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
18    ; GFX8-NEXT: {{  $}}
19    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
20    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
21    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
22    ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
23    ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
24    ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
25    ; GFX8-NEXT: [[V_MIN_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[V_MAX_U16_e64_]], [[V_MAX_U16_e64_1]], implicit $exec
26    ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]]
27    ;
28    ; GFX9-LABEL: name: umed3_s16_vvv
29    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
30    ; GFX9-NEXT: {{  $}}
31    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
32    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
33    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
34    ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
35    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]]
36    ;
37    ; GFX11-LABEL: name: umed3_s16_vvv
38    ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2
39    ; GFX11-NEXT: {{  $}}
40    ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
41    ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
42    ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
43    ; GFX11-NEXT: [[V_MED3_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
44    ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_fake16_e64_]]
45    %0:vgpr(s32) = COPY $vgpr0
46    %1:vgpr(s32) = COPY $vgpr1
47    %2:vgpr(s32) = COPY $vgpr2
48    %3:vgpr(s16) = G_TRUNC %0
49    %4:vgpr(s16) = G_TRUNC %1
50    %5:vgpr(s16) = G_TRUNC %2
51
52    %6:vgpr(s16) = G_UMAX %3, %4
53    %7:vgpr(s16) = G_UMIN %3, %4
54    %8:vgpr(s16) = G_UMAX %7, %5
55    %9:vgpr(s16) = G_UMIN %6, %8
56
57    S_ENDPGM 0, implicit %9
58...
59
60---
61name: umed3_s16_vvv_multiuse0
62legalized: true
63regBankSelected: true
64
65body: |
66  bb.0:
67    liveins: $vgpr0, $vgpr1, $vgpr2
68
69    ; GFX8-LABEL: name: umed3_s16_vvv_multiuse0
70    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
71    ; GFX8-NEXT: {{  $}}
72    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
73    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
74    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
75    ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
76    ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
77    ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
78    ; GFX8-NEXT: [[V_MIN_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[V_MAX_U16_e64_]], [[V_MAX_U16_e64_1]], implicit $exec
79    ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MAX_U16_e64_]]
80    ;
81    ; GFX9-LABEL: name: umed3_s16_vvv_multiuse0
82    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
83    ; GFX9-NEXT: {{  $}}
84    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
85    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
86    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
87    ; GFX9-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
88    ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
89    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]], implicit [[V_MAX_U16_e64_]]
90    ;
91    ; GFX11-LABEL: name: umed3_s16_vvv_multiuse0
92    ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2
93    ; GFX11-NEXT: {{  $}}
94    ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
95    ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
96    ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
97    ; GFX11-NEXT: [[V_MAX_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_fake16_e64 [[COPY]], [[COPY1]], implicit $exec
98    ; GFX11-NEXT: [[V_MED3_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
99    ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_fake16_e64_]], implicit [[V_MAX_U16_fake16_e64_]]
100    %0:vgpr(s32) = COPY $vgpr0
101    %1:vgpr(s32) = COPY $vgpr1
102    %2:vgpr(s32) = COPY $vgpr2
103    %3:vgpr(s16) = G_TRUNC %0
104    %4:vgpr(s16) = G_TRUNC %1
105    %5:vgpr(s16) = G_TRUNC %2
106
107    %6:vgpr(s16) = G_UMAX %3, %4
108    %7:vgpr(s16) = G_UMIN %3, %4
109    %8:vgpr(s16) = G_UMAX %7, %5
110    %9:vgpr(s16) = G_UMIN %6, %8
111
112    S_ENDPGM 0, implicit %9, implicit %6
113...
114
115---
116name: umed3_s16_vvv_multiuse1
117legalized: true
118regBankSelected: true
119
120body: |
121  bb.0:
122    liveins: $vgpr0, $vgpr1, $vgpr2
123
124    ; GFX8-LABEL: name: umed3_s16_vvv_multiuse1
125    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
126    ; GFX8-NEXT: {{  $}}
127    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
128    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
129    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
130    ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
131    ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
132    ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
133    ; GFX8-NEXT: [[V_MIN_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[V_MAX_U16_e64_]], [[V_MAX_U16_e64_1]], implicit $exec
134    ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MIN_U16_e64_]]
135    ;
136    ; GFX9-LABEL: name: umed3_s16_vvv_multiuse1
137    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
138    ; GFX9-NEXT: {{  $}}
139    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
140    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
141    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
142    ; GFX9-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
143    ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
144    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]], implicit [[V_MIN_U16_e64_]]
145    ;
146    ; GFX11-LABEL: name: umed3_s16_vvv_multiuse1
147    ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2
148    ; GFX11-NEXT: {{  $}}
149    ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
150    ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
151    ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
152    ; GFX11-NEXT: [[V_MIN_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_fake16_e64 [[COPY]], [[COPY1]], implicit $exec
153    ; GFX11-NEXT: [[V_MED3_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
154    ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_fake16_e64_]], implicit [[V_MIN_U16_fake16_e64_]]
155    %0:vgpr(s32) = COPY $vgpr0
156    %1:vgpr(s32) = COPY $vgpr1
157    %2:vgpr(s32) = COPY $vgpr2
158    %3:vgpr(s16) = G_TRUNC %0
159    %4:vgpr(s16) = G_TRUNC %1
160    %5:vgpr(s16) = G_TRUNC %2
161
162    %6:vgpr(s16) = G_UMAX %3, %4
163    %7:vgpr(s16) = G_UMIN %3, %4
164    %8:vgpr(s16) = G_UMAX %7, %5
165    %9:vgpr(s16) = G_UMIN %6, %8
166
167    S_ENDPGM 0, implicit %9, implicit %7
168...
169
170---
171name: umed3_s16_vvv_multiuse2
172legalized: true
173regBankSelected: true
174
175body: |
176  bb.0:
177    liveins: $vgpr0, $vgpr1, $vgpr2
178
179    ; GFX8-LABEL: name: umed3_s16_vvv_multiuse2
180    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
181    ; GFX8-NEXT: {{  $}}
182    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
183    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
184    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
185    ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
186    ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
187    ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
188    ; GFX8-NEXT: [[V_MIN_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[V_MAX_U16_e64_]], [[V_MAX_U16_e64_1]], implicit $exec
189    ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MAX_U16_e64_1]]
190    ;
191    ; GFX9-LABEL: name: umed3_s16_vvv_multiuse2
192    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
193    ; GFX9-NEXT: {{  $}}
194    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
195    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
196    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
197    ; GFX9-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
198    ; GFX9-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
199    ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
200    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]], implicit [[V_MAX_U16_e64_]]
201    ;
202    ; GFX11-LABEL: name: umed3_s16_vvv_multiuse2
203    ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2
204    ; GFX11-NEXT: {{  $}}
205    ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
206    ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
207    ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
208    ; GFX11-NEXT: [[V_MIN_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_fake16_e64 [[COPY]], [[COPY1]], implicit $exec
209    ; GFX11-NEXT: [[V_MAX_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_fake16_e64 [[V_MIN_U16_fake16_e64_]], [[COPY2]], implicit $exec
210    ; GFX11-NEXT: [[V_MED3_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
211    ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_fake16_e64_]], implicit [[V_MAX_U16_fake16_e64_]]
212    %0:vgpr(s32) = COPY $vgpr0
213    %1:vgpr(s32) = COPY $vgpr1
214    %2:vgpr(s32) = COPY $vgpr2
215    %3:vgpr(s16) = G_TRUNC %0
216    %4:vgpr(s16) = G_TRUNC %1
217    %5:vgpr(s16) = G_TRUNC %2
218
219    %6:vgpr(s16) = G_UMAX %3, %4
220    %7:vgpr(s16) = G_UMIN %3, %4
221    %8:vgpr(s16) = G_UMAX %7, %5
222    %9:vgpr(s16) = G_UMIN %6, %8
223
224    S_ENDPGM 0, implicit %9, implicit %8
225...
226