1# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z14 -start-before=greedy %s -o - \
2# RUN:   | FileCheck %s
3#
4# Test folding of a memory operand into an fp memory instruction.
5
6--- |
7  define void @fun0(double %arg0, double %arg1, double* %Dst) { ret void }
8  define void @fun1(double %arg0, double %arg1, double* %Dst) { ret void }
9  define void @fun2(double %arg0, double %arg1, double* %Dst) { ret void }
10  define void @fun3(double %arg0, double %arg1, double* %Dst) { ret void }
11  define void @fun4(float %arg0, float %arg1, float* %Dst) { ret void }
12  define void @fun5(float %arg0, float %arg1, float* %Dst) { ret void }
13  define void @fun6(float %arg0, float %arg1, float* %Dst) { ret void }
14  define void @fun7(float %arg0, float %arg1, float* %Dst) { ret void }
15  define void @fun8(double %arg0, double %arg1, double* %Dst) { ret void }
16  define void @fun9(double %arg0, double %arg1, double* %Dst) { ret void }
17  define void @fun10(double %arg0, double %arg1, double* %Dst) { ret void }
18  define void @fun11(double %arg0, double %arg1, double* %Dst) { ret void }
19  define void @fun12(float %arg0, float %arg1, float* %Dst) { ret void }
20  define void @fun13(float %arg0, float %arg1, float* %Dst) { ret void }
21  define void @fun14(float %arg0, float %arg1, float* %Dst) { ret void }
22  define void @fun15(float %arg0, float %arg1, float* %Dst) { ret void }
23
24...
25
26# CHECK-LABEL: fun0:
27# CHECK: madb    %f0, %f1, 160(%r15)             # 8-byte Folded Reload
28---
29name:            fun0
30alignment:       16
31tracksRegLiveness: true
32registers:
33  - { id: 0, class: fp64bit }
34  - { id: 1, class: fp64bit }
35  - { id: 2, class: addr64bit }
36  - { id: 3, class: vr64bit }
37  - { id: 4, class: fp64bit }
38liveins:
39  - { reg: '$f0d', virtual-reg: '%0' }
40  - { reg: '$f2d', virtual-reg: '%1' }
41  - { reg: '$r2d', virtual-reg: '%2' }
42frameInfo:
43  maxAlignment:    1
44machineFunctionInfo: {}
45body:             |
46  bb.0:
47    liveins: $f0d, $f2d, $r2d
48
49    %2:addr64bit = COPY $r2d
50    %1:fp64bit = COPY $f2d
51    %0:fp64bit = COPY $f0d
52    %4:fp64bit = COPY $f2d
53    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
54    %3:vr64bit = nofpexcept WFMADB %0, %1, %4, implicit $fpc
55    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
56    Return
57
58...
59
60
61# CHECK-LABEL: fun1:
62# CHECK: madb    %f0, %f1, 160(%r15)             # 8-byte Folded Reload
63---
64name:            fun1
65alignment:       16
66tracksRegLiveness: true
67registers:
68  - { id: 0, class: fp64bit }
69  - { id: 1, class: fp64bit }
70  - { id: 2, class: addr64bit }
71  - { id: 3, class: vr64bit }
72  - { id: 4, class: fp64bit }
73liveins:
74  - { reg: '$f0d', virtual-reg: '%0' }
75  - { reg: '$f2d', virtual-reg: '%1' }
76  - { reg: '$r2d', virtual-reg: '%2' }
77frameInfo:
78  maxAlignment:    1
79machineFunctionInfo: {}
80body:             |
81  bb.0:
82    liveins: $f0d, $f2d, $r2d
83
84    %2:addr64bit = COPY $r2d
85    %1:fp64bit = COPY $f2d
86    %0:fp64bit = COPY $f0d
87    %4:fp64bit = COPY $f2d
88    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
89    %3:vr64bit = nofpexcept WFMADB %1, %0, %4, implicit $fpc
90    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
91    Return
92
93...
94
95# MADB can't be used if one operand is a VR64 (and not FP64).
96# CHECK-LABEL: fun2:
97# CHECK: wfmadb  %f0, %v16, %f1, %f0
98---
99name:            fun2
100alignment:       16
101tracksRegLiveness: true
102registers:
103  - { id: 0, class: fp64bit }
104  - { id: 1, class: vr64bit }
105  - { id: 2, class: addr64bit }
106  - { id: 3, class: vr64bit }
107  - { id: 4, class: fp64bit }
108liveins:
109  - { reg: '$f0d', virtual-reg: '%0' }
110  - { reg: '$f2d', virtual-reg: '%1' }
111  - { reg: '$r2d', virtual-reg: '%2' }
112frameInfo:
113  maxAlignment:    1
114machineFunctionInfo: {}
115body:             |
116  bb.0:
117    liveins: $f0d, $f2d, $r2d
118
119    %2:addr64bit = COPY $r2d
120    %1:vr64bit = COPY $f2d
121    %0:fp64bit = COPY $f0d
122    %4:fp64bit = COPY $f2d
123    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
124    %3:vr64bit = nofpexcept WFMADB %1, %0, %4, implicit $fpc
125    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
126    Return
127
128...
129
130
131# MADB can't be used unless accumulator and result registers are the same.
132# CHECK-LABEL: fun3:
133# CHECK: wfmadb  %f0, %f0, %f1, %f2
134---
135name:            fun3
136alignment:       16
137tracksRegLiveness: true
138registers:
139  - { id: 0, class: fp64bit }
140  - { id: 1, class: fp64bit }
141  - { id: 2, class: addr64bit }
142  - { id: 3, class: vr64bit }
143  - { id: 4, class: fp64bit }
144liveins:
145  - { reg: '$f0d', virtual-reg: '%0' }
146  - { reg: '$f2d', virtual-reg: '%1' }
147  - { reg: '$r2d', virtual-reg: '%2' }
148frameInfo:
149  maxAlignment:    1
150machineFunctionInfo: {}
151body:             |
152  bb.0:
153    liveins: $f0d, $f2d, $r2d
154
155    %2:addr64bit = COPY $r2d
156    %1:fp64bit = COPY $f2d
157    %0:fp64bit = COPY $f0d
158    %4:fp64bit = COPY $f2d
159    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
160    %3:vr64bit = nofpexcept WFMADB %4, %1, %0, implicit $fpc
161    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
162    Return
163
164...
165
166
167# CHECK-LABEL: fun4:
168# CHECK: maeb    %f0, %f1, 160(%r15)             # 4-byte Folded Reload
169---
170name:            fun4
171alignment:       16
172tracksRegLiveness: true
173registers:
174  - { id: 0, class: fp32bit }
175  - { id: 1, class: fp32bit }
176  - { id: 2, class: addr64bit }
177  - { id: 3, class: vr32bit }
178  - { id: 4, class: fp32bit }
179liveins:
180  - { reg: '$f0s', virtual-reg: '%0' }
181  - { reg: '$f2s', virtual-reg: '%1' }
182  - { reg: '$r2d', virtual-reg: '%2' }
183frameInfo:
184  maxAlignment:    1
185machineFunctionInfo: {}
186body:             |
187  bb.0:
188    liveins: $f0d, $f2d, $r2d
189
190    %2:addr64bit = COPY $r2d
191    %1:fp32bit = COPY $f2s
192    %0:fp32bit = COPY $f0s
193    %4:fp32bit = COPY $f2s
194    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
195    %3:vr32bit = nofpexcept WFMASB %0, %1, %4, implicit $fpc
196    VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
197    Return
198
199...
200
201
202# CHECK-LABEL: fun5:
203# CHECK: maeb    %f0, %f1, 160(%r15)             # 4-byte Folded Reload
204---
205name:            fun5
206alignment:       16
207tracksRegLiveness: true
208registers:
209  - { id: 0, class: fp32bit }
210  - { id: 1, class: fp32bit }
211  - { id: 2, class: addr64bit }
212  - { id: 3, class: vr32bit }
213  - { id: 4, class: fp32bit }
214liveins:
215  - { reg: '$f0s', virtual-reg: '%0' }
216  - { reg: '$f2s', virtual-reg: '%1' }
217  - { reg: '$r2d', virtual-reg: '%2' }
218frameInfo:
219  maxAlignment:    1
220machineFunctionInfo: {}
221body:             |
222  bb.0:
223    liveins: $f0d, $f2d, $r2d
224
225    %2:addr64bit = COPY $r2d
226    %1:fp32bit = COPY $f2s
227    %0:fp32bit = COPY $f0s
228    %4:fp32bit = COPY $f2s
229    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
230    %3:vr32bit = nofpexcept WFMASB %1, %0, %4, implicit $fpc
231    VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
232    Return
233
234...
235
236
237# MAEB can't be used if one operand is a VR32 (and not FP32).
238# CHECK-LABEL: fun6:
239# CHECK: wfmasb  %f0, %v16, %f1, %f0
240---
241name:            fun6
242alignment:       16
243tracksRegLiveness: true
244registers:
245  - { id: 0, class: fp32bit }
246  - { id: 1, class: vr32bit }
247  - { id: 2, class: addr64bit }
248  - { id: 3, class: vr32bit }
249  - { id: 4, class: fp32bit }
250liveins:
251  - { reg: '$f0s', virtual-reg: '%0' }
252  - { reg: '$f2s', virtual-reg: '%1' }
253  - { reg: '$r2d', virtual-reg: '%2' }
254frameInfo:
255  maxAlignment:    1
256machineFunctionInfo: {}
257body:             |
258  bb.0:
259    liveins: $f0d, $f2d, $r2d
260
261    %2:addr64bit = COPY $r2d
262    %1:vr32bit = COPY $f2s
263    %0:fp32bit = COPY $f0s
264    %4:fp32bit = COPY $f2s
265    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
266    %3:vr32bit = nofpexcept WFMASB %1, %0, %4, implicit $fpc
267    VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
268    Return
269
270...
271
272
273# MAEB can't be used unless accumulator and result registers are the same.
274# CHECK-LABEL: fun7:
275# CHECK: wfmasb  %f0, %f0, %f1, %f2
276---
277name:            fun7
278alignment:       16
279tracksRegLiveness: true
280registers:
281  - { id: 0, class: fp32bit }
282  - { id: 1, class: fp32bit }
283  - { id: 2, class: addr64bit }
284  - { id: 3, class: vr32bit }
285  - { id: 4, class: fp32bit }
286liveins:
287  - { reg: '$f0s', virtual-reg: '%0' }
288  - { reg: '$f2s', virtual-reg: '%1' }
289  - { reg: '$r2d', virtual-reg: '%2' }
290frameInfo:
291  maxAlignment:    1
292machineFunctionInfo: {}
293body:             |
294  bb.0:
295    liveins: $f0d, $f2d, $r2d
296
297    %2:addr64bit = COPY $r2d
298    %1:fp32bit = COPY $f2s
299    %0:fp32bit = COPY $f0s
300    %4:fp32bit = COPY $f2s
301    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
302    %3:vr32bit = nofpexcept WFMASB %4, %1, %0, implicit $fpc
303    VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
304    Return
305
306...
307
308
309# CHECK-LABEL: fun8:
310# CHECK: msdb    %f0, %f1, 160(%r15)             # 8-byte Folded Reload
311---
312name:            fun8
313alignment:       16
314tracksRegLiveness: true
315registers:
316  - { id: 0, class: fp64bit }
317  - { id: 1, class: fp64bit }
318  - { id: 2, class: addr64bit }
319  - { id: 3, class: vr64bit }
320  - { id: 4, class: fp64bit }
321liveins:
322  - { reg: '$f0d', virtual-reg: '%0' }
323  - { reg: '$f2d', virtual-reg: '%1' }
324  - { reg: '$r2d', virtual-reg: '%2' }
325frameInfo:
326  maxAlignment:    1
327machineFunctionInfo: {}
328body:             |
329  bb.0:
330    liveins: $f0d, $f2d, $r2d
331
332    %2:addr64bit = COPY $r2d
333    %1:fp64bit = COPY $f2d
334    %0:fp64bit = COPY $f0d
335    %4:fp64bit = COPY $f2d
336    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
337    %3:vr64bit = nofpexcept WFMSDB %0, %1, %4, implicit $fpc
338    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
339    Return
340
341...
342
343
344# CHECK-LABEL: fun9:
345# CHECK: msdb    %f0, %f1, 160(%r15)             # 8-byte Folded Reload
346---
347name:            fun9
348alignment:       16
349tracksRegLiveness: true
350registers:
351  - { id: 0, class: fp64bit }
352  - { id: 1, class: fp64bit }
353  - { id: 2, class: addr64bit }
354  - { id: 3, class: vr64bit }
355  - { id: 4, class: fp64bit }
356liveins:
357  - { reg: '$f0d', virtual-reg: '%0' }
358  - { reg: '$f2d', virtual-reg: '%1' }
359  - { reg: '$r2d', virtual-reg: '%2' }
360frameInfo:
361  maxAlignment:    1
362machineFunctionInfo: {}
363body:             |
364  bb.0:
365    liveins: $f0d, $f2d, $r2d
366
367    %2:addr64bit = COPY $r2d
368    %1:fp64bit = COPY $f2d
369    %0:fp64bit = COPY $f0d
370    %4:fp64bit = COPY $f2d
371    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
372    %3:vr64bit = nofpexcept WFMSDB %1, %0, %4, implicit $fpc
373    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
374    Return
375
376...
377
378# MSDB can't be used if one operand is a VR64 (and not FP64).
379# CHECK-LABEL: fun10:
380# CHECK: wfmsdb  %f0, %v16, %f1, %f0
381---
382name:            fun10
383alignment:       16
384tracksRegLiveness: true
385registers:
386  - { id: 0, class: fp64bit }
387  - { id: 1, class: vr64bit }
388  - { id: 2, class: addr64bit }
389  - { id: 3, class: vr64bit }
390  - { id: 4, class: fp64bit }
391liveins:
392  - { reg: '$f0d', virtual-reg: '%0' }
393  - { reg: '$f2d', virtual-reg: '%1' }
394  - { reg: '$r2d', virtual-reg: '%2' }
395frameInfo:
396  maxAlignment:    1
397machineFunctionInfo: {}
398body:             |
399  bb.0:
400    liveins: $f0d, $f2d, $r2d
401
402    %2:addr64bit = COPY $r2d
403    %1:vr64bit = COPY $f2d
404    %0:fp64bit = COPY $f0d
405    %4:fp64bit = COPY $f2d
406    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
407    %3:vr64bit = nofpexcept WFMSDB %1, %0, %4, implicit $fpc
408    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
409    Return
410
411...
412
413
414# MSDB can't be used unless accumulator and result registers are the same.
415# CHECK-LABEL: fun11:
416# CHECK: wfmsdb  %f0, %f0, %f1, %f2
417---
418name:            fun11
419alignment:       16
420tracksRegLiveness: true
421registers:
422  - { id: 0, class: fp64bit }
423  - { id: 1, class: fp64bit }
424  - { id: 2, class: addr64bit }
425  - { id: 3, class: vr64bit }
426  - { id: 4, class: fp64bit }
427liveins:
428  - { reg: '$f0d', virtual-reg: '%0' }
429  - { reg: '$f2d', virtual-reg: '%1' }
430  - { reg: '$r2d', virtual-reg: '%2' }
431frameInfo:
432  maxAlignment:    1
433machineFunctionInfo: {}
434body:             |
435  bb.0:
436    liveins: $f0d, $f2d, $r2d
437
438    %2:addr64bit = COPY $r2d
439    %1:fp64bit = COPY $f2d
440    %0:fp64bit = COPY $f0d
441    %4:fp64bit = COPY $f2d
442    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
443    %3:vr64bit = nofpexcept WFMSDB %4, %1, %0, implicit $fpc
444    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
445    Return
446
447...
448
449
450# CHECK-LABEL: fun12:
451# CHECK: mseb    %f0, %f1, 160(%r15)             # 4-byte Folded Reload
452---
453name:            fun12
454alignment:       16
455tracksRegLiveness: true
456registers:
457  - { id: 0, class: fp32bit }
458  - { id: 1, class: fp32bit }
459  - { id: 2, class: addr64bit }
460  - { id: 3, class: vr32bit }
461  - { id: 4, class: fp32bit }
462liveins:
463  - { reg: '$f0s', virtual-reg: '%0' }
464  - { reg: '$f2s', virtual-reg: '%1' }
465  - { reg: '$r2d', virtual-reg: '%2' }
466frameInfo:
467  maxAlignment:    1
468machineFunctionInfo: {}
469body:             |
470  bb.0:
471    liveins: $f0d, $f2d, $r2d
472
473    %2:addr64bit = COPY $r2d
474    %1:fp32bit = COPY $f2s
475    %0:fp32bit = COPY $f0s
476    %4:fp32bit = COPY $f2s
477    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
478    %3:vr32bit = nofpexcept WFMSSB %0, %1, %4, implicit $fpc
479    VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
480    Return
481
482...
483
484
485# CHECK-LABEL: fun13:
486# CHECK: mseb    %f0, %f1, 160(%r15)             # 4-byte Folded Reload
487---
488name:            fun13
489alignment:       16
490tracksRegLiveness: true
491registers:
492  - { id: 0, class: fp32bit }
493  - { id: 1, class: fp32bit }
494  - { id: 2, class: addr64bit }
495  - { id: 3, class: vr32bit }
496  - { id: 4, class: fp32bit }
497liveins:
498  - { reg: '$f0s', virtual-reg: '%0' }
499  - { reg: '$f2s', virtual-reg: '%1' }
500  - { reg: '$r2d', virtual-reg: '%2' }
501frameInfo:
502  maxAlignment:    1
503machineFunctionInfo: {}
504body:             |
505  bb.0:
506    liveins: $f0d, $f2d, $r2d
507
508    %2:addr64bit = COPY $r2d
509    %1:fp32bit = COPY $f2s
510    %0:fp32bit = COPY $f0s
511    %4:fp32bit = COPY $f2s
512    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
513    %3:vr32bit = nofpexcept WFMSSB %1, %0, %4, implicit $fpc
514    VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
515    Return
516
517...
518
519
520# MSEB can't be used if one operand is a VR32 (and not FP32).
521# CHECK-LABEL: fun14:
522# CHECK: wfmssb  %f0, %v16, %f1, %f0
523---
524name:            fun14
525alignment:       16
526tracksRegLiveness: true
527registers:
528  - { id: 0, class: fp32bit }
529  - { id: 1, class: vr32bit }
530  - { id: 2, class: addr64bit }
531  - { id: 3, class: vr32bit }
532  - { id: 4, class: fp32bit }
533liveins:
534  - { reg: '$f0s', virtual-reg: '%0' }
535  - { reg: '$f2s', virtual-reg: '%1' }
536  - { reg: '$r2d', virtual-reg: '%2' }
537frameInfo:
538  maxAlignment:    1
539machineFunctionInfo: {}
540body:             |
541  bb.0:
542    liveins: $f0d, $f2d, $r2d
543
544    %2:addr64bit = COPY $r2d
545    %1:vr32bit = COPY $f2s
546    %0:fp32bit = COPY $f0s
547    %4:fp32bit = COPY $f2s
548    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
549    %3:vr32bit = nofpexcept WFMSSB %1, %0, %4, implicit $fpc
550    VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
551    Return
552
553...
554
555
556# MSEB can't be used unless accumulator and result registers are the same.
557# CHECK-LABEL: fun15:
558# CHECK: wfmssb  %f0, %f0, %f1, %f2
559---
560name:            fun15
561alignment:       16
562tracksRegLiveness: true
563registers:
564  - { id: 0, class: fp32bit }
565  - { id: 1, class: fp32bit }
566  - { id: 2, class: addr64bit }
567  - { id: 3, class: vr32bit }
568  - { id: 4, class: fp32bit }
569liveins:
570  - { reg: '$f0s', virtual-reg: '%0' }
571  - { reg: '$f2s', virtual-reg: '%1' }
572  - { reg: '$r2d', virtual-reg: '%2' }
573frameInfo:
574  maxAlignment:    1
575machineFunctionInfo: {}
576body:             |
577  bb.0:
578    liveins: $f0d, $f2d, $r2d
579
580    %2:addr64bit = COPY $r2d
581    %1:fp32bit = COPY $f2s
582    %0:fp32bit = COPY $f0s
583    %4:fp32bit = COPY $f2s
584    INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def dead early-clobber $f1d, 12, implicit-def dead early-clobber $f2d, 12, implicit-def dead early-clobber $f3d, 12, implicit-def dead early-clobber $f4d, 12, implicit-def dead early-clobber $f5d, 12, implicit-def dead early-clobber $f6d, 12, implicit-def dead early-clobber $f7d, 12, implicit-def dead early-clobber $f8d, 12, implicit-def dead early-clobber $f9d, 12, implicit-def dead early-clobber $f10d, 12, implicit-def dead early-clobber $f11d, 12, implicit-def dead early-clobber $f12d, 12, implicit-def dead early-clobber $f13d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f14d, 12, implicit-def dead early-clobber $f15d
585    %3:vr32bit = nofpexcept WFMSSB %4, %1, %0, implicit $fpc
586    VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
587    Return
588
589...
590