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
5---
6name: smed3_s16_vvv
7legalized: true
8regBankSelected: true
9
10body: |
11  bb.0:
12    liveins: $vgpr0, $vgpr1, $vgpr2
13
14    ; GFX8-LABEL: name: smed3_s16_vvv
15    ; GFX8: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
16    ; GFX8: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
17    ; GFX8: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
18    ; GFX8: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
19    ; GFX8: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
20    ; GFX8: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
21    ; GFX8: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
22    ; GFX8: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]]
23    ; GFX9-LABEL: name: smed3_s16_vvv
24    ; GFX9: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
25    ; GFX9: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
26    ; GFX9: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
27    ; GFX9: [[V_MED3_I16_:%[0-9]+]]:vgpr_32 = V_MED3_I16 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
28    ; GFX9: S_ENDPGM 0, implicit [[V_MED3_I16_]]
29    %0:vgpr(s32) = COPY $vgpr0
30    %1:vgpr(s32) = COPY $vgpr1
31    %2:vgpr(s32) = COPY $vgpr2
32    %3:vgpr(s16) = G_TRUNC %0
33    %4:vgpr(s16) = G_TRUNC %1
34    %5:vgpr(s16) = G_TRUNC %2
35
36    %6:vgpr(s16) = G_SMAX %3, %4
37    %7:vgpr(s16) = G_SMIN %3, %4
38    %8:vgpr(s16) = G_SMAX %7, %5
39    %9:vgpr(s16) = G_SMIN %6, %8
40
41    S_ENDPGM 0, implicit %9
42...
43
44---
45name: smed3_s16_vvv_multiuse0
46legalized: true
47regBankSelected: true
48
49body: |
50  bb.0:
51    liveins: $vgpr0, $vgpr1, $vgpr2
52
53    ; GFX8-LABEL: name: smed3_s16_vvv_multiuse0
54    ; GFX8: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
55    ; GFX8: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
56    ; GFX8: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
57    ; GFX8: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
58    ; GFX8: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
59    ; GFX8: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
60    ; GFX8: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
61    ; GFX8: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MAX_I16_e64_]]
62    ; GFX9-LABEL: name: smed3_s16_vvv_multiuse0
63    ; GFX9: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
64    ; GFX9: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
65    ; GFX9: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
66    ; GFX9: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
67    ; GFX9: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
68    ; GFX9: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
69    ; GFX9: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
70    ; GFX9: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MAX_I16_e64_]]
71    %0:vgpr(s32) = COPY $vgpr0
72    %1:vgpr(s32) = COPY $vgpr1
73    %2:vgpr(s32) = COPY $vgpr2
74    %3:vgpr(s16) = G_TRUNC %0
75    %4:vgpr(s16) = G_TRUNC %1
76    %5:vgpr(s16) = G_TRUNC %2
77
78    %6:vgpr(s16) = G_SMAX %3, %4
79    %7:vgpr(s16) = G_SMIN %3, %4
80    %8:vgpr(s16) = G_SMAX %7, %5
81    %9:vgpr(s16) = G_SMIN %6, %8
82
83    S_ENDPGM 0, implicit %9, implicit %6
84...
85
86---
87name: smed3_s16_vvv_multiuse1
88legalized: true
89regBankSelected: true
90
91body: |
92  bb.0:
93    liveins: $vgpr0, $vgpr1, $vgpr2
94
95    ; GFX8-LABEL: name: smed3_s16_vvv_multiuse1
96    ; GFX8: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
97    ; GFX8: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
98    ; GFX8: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
99    ; GFX8: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
100    ; GFX8: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
101    ; GFX8: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
102    ; GFX8: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
103    ; GFX8: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MIN_I16_e64_]]
104    ; GFX9-LABEL: name: smed3_s16_vvv_multiuse1
105    ; GFX9: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
106    ; GFX9: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
107    ; GFX9: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
108    ; GFX9: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
109    ; GFX9: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
110    ; GFX9: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
111    ; GFX9: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
112    ; GFX9: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MIN_I16_e64_]]
113    %0:vgpr(s32) = COPY $vgpr0
114    %1:vgpr(s32) = COPY $vgpr1
115    %2:vgpr(s32) = COPY $vgpr2
116    %3:vgpr(s16) = G_TRUNC %0
117    %4:vgpr(s16) = G_TRUNC %1
118    %5:vgpr(s16) = G_TRUNC %2
119
120    %6:vgpr(s16) = G_SMAX %3, %4
121    %7:vgpr(s16) = G_SMIN %3, %4
122    %8:vgpr(s16) = G_SMAX %7, %5
123    %9:vgpr(s16) = G_SMIN %6, %8
124
125    S_ENDPGM 0, implicit %9, implicit %7
126...
127
128---
129name: smed3_s16_vvv_multiuse2
130legalized: true
131regBankSelected: true
132
133body: |
134  bb.0:
135    liveins: $vgpr0, $vgpr1, $vgpr2
136
137    ; GFX8-LABEL: name: smed3_s16_vvv_multiuse2
138    ; GFX8: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
139    ; GFX8: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
140    ; GFX8: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
141    ; GFX8: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
142    ; GFX8: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
143    ; GFX8: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
144    ; GFX8: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
145    ; GFX8: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MAX_I16_e64_1]]
146    ; GFX9-LABEL: name: smed3_s16_vvv_multiuse2
147    ; GFX9: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
148    ; GFX9: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
149    ; GFX9: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
150    ; GFX9: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
151    ; GFX9: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
152    ; GFX9: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
153    ; GFX9: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
154    ; GFX9: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MAX_I16_e64_1]]
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_SMAX %3, %4
163    %7:vgpr(s16) = G_SMIN %3, %4
164    %8:vgpr(s16) = G_SMAX %7, %5
165    %9:vgpr(s16) = G_SMIN %6, %8
166
167    S_ENDPGM 0, implicit %9, implicit %8
168...
169