1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX8 %s
3# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %s
4# RUN: llc -march=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %s
5# RUN: llc -march=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %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    ; GFX9-LABEL: name: umed3_s16_vvv
28    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
29    ; GFX9-NEXT: {{  $}}
30    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
31    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
32    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
33    ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
34    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]]
35    %0:vgpr(s32) = COPY $vgpr0
36    %1:vgpr(s32) = COPY $vgpr1
37    %2:vgpr(s32) = COPY $vgpr2
38    %3:vgpr(s16) = G_TRUNC %0
39    %4:vgpr(s16) = G_TRUNC %1
40    %5:vgpr(s16) = G_TRUNC %2
41
42    %6:vgpr(s16) = G_UMAX %3, %4
43    %7:vgpr(s16) = G_UMIN %3, %4
44    %8:vgpr(s16) = G_UMAX %7, %5
45    %9:vgpr(s16) = G_UMIN %6, %8
46
47    S_ENDPGM 0, implicit %9
48...
49
50---
51name: umed3_s16_vvv_multiuse0
52legalized: true
53regBankSelected: true
54
55body: |
56  bb.0:
57    liveins: $vgpr0, $vgpr1, $vgpr2
58
59    ; GFX8-LABEL: name: umed3_s16_vvv_multiuse0
60    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
61    ; GFX8-NEXT: {{  $}}
62    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
63    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
64    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
65    ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
66    ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
67    ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
68    ; 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
69    ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MAX_U16_e64_]]
70    ; GFX9-LABEL: name: umed3_s16_vvv_multiuse0
71    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
72    ; GFX9-NEXT: {{  $}}
73    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
74    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
75    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
76    ; GFX9-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
77    ; GFX9-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
78    ; GFX9-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
79    ; GFX9-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
80    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MAX_U16_e64_]]
81    %0:vgpr(s32) = COPY $vgpr0
82    %1:vgpr(s32) = COPY $vgpr1
83    %2:vgpr(s32) = COPY $vgpr2
84    %3:vgpr(s16) = G_TRUNC %0
85    %4:vgpr(s16) = G_TRUNC %1
86    %5:vgpr(s16) = G_TRUNC %2
87
88    %6:vgpr(s16) = G_UMAX %3, %4
89    %7:vgpr(s16) = G_UMIN %3, %4
90    %8:vgpr(s16) = G_UMAX %7, %5
91    %9:vgpr(s16) = G_UMIN %6, %8
92
93    S_ENDPGM 0, implicit %9, implicit %6
94...
95
96---
97name: umed3_s16_vvv_multiuse1
98legalized: true
99regBankSelected: true
100
101body: |
102  bb.0:
103    liveins: $vgpr0, $vgpr1, $vgpr2
104
105    ; GFX8-LABEL: name: umed3_s16_vvv_multiuse1
106    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
107    ; GFX8-NEXT: {{  $}}
108    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
109    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
110    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
111    ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
112    ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
113    ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
114    ; 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
115    ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MIN_U16_e64_]]
116    ; GFX9-LABEL: name: umed3_s16_vvv_multiuse1
117    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
118    ; GFX9-NEXT: {{  $}}
119    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
120    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
121    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
122    ; GFX9-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
123    ; GFX9-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
124    ; GFX9-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
125    ; GFX9-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
126    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MIN_U16_e64_]]
127    %0:vgpr(s32) = COPY $vgpr0
128    %1:vgpr(s32) = COPY $vgpr1
129    %2:vgpr(s32) = COPY $vgpr2
130    %3:vgpr(s16) = G_TRUNC %0
131    %4:vgpr(s16) = G_TRUNC %1
132    %5:vgpr(s16) = G_TRUNC %2
133
134    %6:vgpr(s16) = G_UMAX %3, %4
135    %7:vgpr(s16) = G_UMIN %3, %4
136    %8:vgpr(s16) = G_UMAX %7, %5
137    %9:vgpr(s16) = G_UMIN %6, %8
138
139    S_ENDPGM 0, implicit %9, implicit %7
140...
141
142---
143name: umed3_s16_vvv_multiuse2
144legalized: true
145regBankSelected: true
146
147body: |
148  bb.0:
149    liveins: $vgpr0, $vgpr1, $vgpr2
150
151    ; GFX8-LABEL: name: umed3_s16_vvv_multiuse2
152    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
153    ; GFX8-NEXT: {{  $}}
154    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
155    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
156    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
157    ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
158    ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
159    ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
160    ; 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
161    ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MAX_U16_e64_1]]
162    ; GFX9-LABEL: name: umed3_s16_vvv_multiuse2
163    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
164    ; GFX9-NEXT: {{  $}}
165    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
166    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
167    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
168    ; GFX9-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec
169    ; GFX9-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec
170    ; GFX9-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec
171    ; GFX9-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
172    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MAX_U16_e64_1]]
173    %0:vgpr(s32) = COPY $vgpr0
174    %1:vgpr(s32) = COPY $vgpr1
175    %2:vgpr(s32) = COPY $vgpr2
176    %3:vgpr(s16) = G_TRUNC %0
177    %4:vgpr(s16) = G_TRUNC %1
178    %5:vgpr(s16) = G_TRUNC %2
179
180    %6:vgpr(s16) = G_UMAX %3, %4
181    %7:vgpr(s16) = G_UMIN %3, %4
182    %8:vgpr(s16) = G_UMAX %7, %5
183    %9:vgpr(s16) = G_UMIN %6, %8
184
185    S_ENDPGM 0, implicit %9, implicit %8
186...
187