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(float %arg0, float %arg1, float* %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(double %arg0, double %arg1, double* %Dst) { ret void }
14  define void @fun7(double %arg0, double %arg1, double* %Dst) { ret void }
15  define void @fun8(double %arg0, double %arg1, double* %Dst) { ret void }
16  define void @fun9(float %arg0, float %arg1, float* %Dst) { ret void }
17  define void @fun10(float %arg0, float %arg1, float* %Dst) { ret void }
18  define void @fun11(float %arg0, float %arg1, float* %Dst) { ret void }
19  define void @fun12(double %arg0, double %arg1, double* %Dst) { ret void }
20  define void @fun13(double %arg0, double %arg1, double* %Dst) { ret void }
21  define void @fun14(double %arg0, double %arg1, double* %Dst) { ret void }
22  define void @fun15(float %arg0, float %arg1, float* %Dst) { ret void }
23  define void @fun16(float %arg0, float %arg1, float* %Dst) { ret void }
24  define void @fun17(float %arg0, float %arg1, float* %Dst) { ret void }
25  define void @fun18(double %arg0, double %arg1, double* %Dst) { ret void }
26  define void @fun19(double %arg0, double %arg1, double* %Dst) { ret void }
27  define void @fun20(double %arg0, double %arg1, double* %Dst) { ret void }
28  define void @fun21(float %arg0, float %arg1, float* %Dst) { ret void }
29  define void @fun22(float %arg0, float %arg1, float* %Dst) { ret void }
30  define void @fun23(float %arg0, float %arg1, float* %Dst) { ret void }
31
32...
33
34# Test with both orders of operands since some operations are commutative.
35
36# CHECK-LABEL: fun0:
37# CHECK: adb     %f0, 160(%r15)                  # 8-byte Folded Reload
38---
39name:            fun0
40alignment:       16
41tracksRegLiveness: true
42registers:
43  - { id: 0, class: fp64bit }
44  - { id: 1, class: fp64bit }
45  - { id: 2, class: addr64bit }
46  - { id: 3, class: vr64bit }
47liveins:
48  - { reg: '$f0d', virtual-reg: '%0' }
49  - { reg: '$f2d', virtual-reg: '%1' }
50  - { reg: '$r2d', virtual-reg: '%2' }
51frameInfo:
52  maxAlignment:    1
53machineFunctionInfo: {}
54body:             |
55  bb.0:
56    liveins: $f0d, $f2d, $r2d
57
58    %2:addr64bit = COPY $r2d
59    %1:fp64bit = COPY $f2d
60    %0:fp64bit = COPY $f0d
61    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
62    %3:vr64bit = nofpexcept WFADB %0, %1, implicit $fpc
63    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
64    Return
65
66...
67
68
69# CHECK-LABEL: fun1:
70# CHECK: adb     %f0, 160(%r15)                  # 8-byte Folded Reload
71---
72name:            fun1
73alignment:       16
74tracksRegLiveness: true
75registers:
76  - { id: 0, class: fp64bit }
77  - { id: 1, class: fp64bit }
78  - { id: 2, class: addr64bit }
79  - { id: 3, class: vr64bit }
80liveins:
81  - { reg: '$f0d', virtual-reg: '%0' }
82  - { reg: '$f2d', virtual-reg: '%1' }
83  - { reg: '$r2d', virtual-reg: '%2' }
84frameInfo:
85  maxAlignment:    1
86machineFunctionInfo: {}
87body:             |
88  bb.0:
89    liveins: $f0d, $f2d, $r2d
90
91    %2:addr64bit = COPY $r2d
92    %1:fp64bit = COPY $f2d
93    %0:fp64bit = COPY $f0d
94    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
95    %3:vr64bit = nofpexcept WFADB %1, %0, implicit $fpc
96    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
97    Return
98
99...
100
101# ADB can't be used if one operand is a VR64 (and not FP64).
102# CHECK-LABEL: fun2:
103# CHECK: wfadb   %f0, %v16, %f0
104---
105name:            fun2
106alignment:       16
107tracksRegLiveness: true
108registers:
109  - { id: 0, class: fp64bit }
110  - { id: 1, class: vr64bit }
111  - { id: 2, class: addr64bit }
112  - { id: 3, class: vr64bit }
113liveins:
114  - { reg: '$f0d', virtual-reg: '%0' }
115  - { reg: '$f2d', virtual-reg: '%1' }
116  - { reg: '$r2d', virtual-reg: '%2' }
117frameInfo:
118  maxAlignment:    1
119machineFunctionInfo: {}
120body:             |
121  bb.0:
122    liveins: $f0d, $f2d, $r2d
123
124    %2:addr64bit = COPY $r2d
125    %1:vr64bit = COPY $f2d
126    %0:fp64bit = COPY $f0d
127    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
128    %3:vr64bit = nofpexcept WFADB %1, %0, implicit $fpc
129    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
130    Return
131
132...
133
134
135# CHECK-LABEL: fun3:
136# CHECK: aeb     %f0, 164(%r15)                  # 4-byte Folded Reload
137---
138name:            fun3
139alignment:       16
140tracksRegLiveness: true
141registers:
142  - { id: 0, class: fp32bit }
143  - { id: 1, class: fp32bit }
144  - { id: 2, class: addr64bit }
145  - { id: 3, class: vr32bit }
146liveins:
147  - { reg: '$f0s', virtual-reg: '%0' }
148  - { reg: '$f2s', virtual-reg: '%1' }
149  - { reg: '$r2d', virtual-reg: '%2' }
150frameInfo:
151  maxAlignment:    1
152machineFunctionInfo: {}
153body:             |
154  bb.0:
155    liveins: $f0s, $f2s, $r2d
156
157    %2:addr64bit = COPY $r2d
158    %1:fp32bit = COPY $f2s
159    %0:fp32bit = COPY $f0s
160    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
161    %3:vr32bit = nofpexcept WFASB %0, %1, implicit $fpc
162    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
163    Return
164
165...
166
167
168# CHECK-LABEL: fun4:
169# CHECK: aeb     %f0, 164(%r15)                  # 4-byte Folded Reload
170---
171name:            fun4
172alignment:       16
173tracksRegLiveness: true
174registers:
175  - { id: 0, class: fp32bit }
176  - { id: 1, class: fp32bit }
177  - { id: 2, class: addr64bit }
178  - { id: 3, class: vr32bit }
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: $f0s, $f2s, $r2d
189
190    %2:addr64bit = COPY $r2d
191    %1:fp32bit = COPY $f2s
192    %0:fp32bit = COPY $f0s
193    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
194    %3:vr32bit = nofpexcept WFASB %1, %0, implicit $fpc
195    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
196    Return
197
198...
199
200
201# AEB can't be used if one operand is a VR64 (and not FP64).
202# CHECK-LABEL: fun5:
203# CHECK: wfasb   %f0, %v16, %f0
204---
205name:            fun5
206alignment:       16
207tracksRegLiveness: true
208registers:
209  - { id: 0, class: fp32bit }
210  - { id: 1, class: vr32bit }
211  - { id: 2, class: addr64bit }
212  - { id: 3, class: vr32bit }
213liveins:
214  - { reg: '$f0s', virtual-reg: '%0' }
215  - { reg: '$f2s', virtual-reg: '%1' }
216  - { reg: '$r2d', virtual-reg: '%2' }
217frameInfo:
218  maxAlignment:    1
219machineFunctionInfo: {}
220body:             |
221  bb.0:
222    liveins: $f0s, $f2s, $r2d
223
224    %2:addr64bit = COPY $r2d
225    %1:vr32bit = COPY $f2s
226    %0:fp32bit = COPY $f0s
227    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
228    %3:vr32bit = nofpexcept WFASB %1, %0, implicit $fpc
229    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
230    Return
231
232...
233
234
235# CHECK-LABEL: fun6:
236# CHECK: sdb     %f0, 160(%r15)                  # 8-byte Folded Reload
237---
238name:            fun6
239alignment:       16
240tracksRegLiveness: true
241registers:
242  - { id: 0, class: fp64bit }
243  - { id: 1, class: fp64bit }
244  - { id: 2, class: addr64bit }
245  - { id: 3, class: vr64bit }
246liveins:
247  - { reg: '$f0d', virtual-reg: '%0' }
248  - { reg: '$f2d', virtual-reg: '%1' }
249  - { reg: '$r2d', virtual-reg: '%2' }
250frameInfo:
251  maxAlignment:    1
252machineFunctionInfo: {}
253body:             |
254  bb.0:
255    liveins: $f0d, $f2d, $r2d
256
257    %2:addr64bit = COPY $r2d
258    %1:fp64bit = COPY $f2d
259    %0:fp64bit = COPY $f0d
260    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
261    %3:vr64bit = nofpexcept WFSDB %0, %1, implicit $fpc
262    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
263    Return
264
265...
266
267
268# CHECK-LABEL: fun7:
269# CHECK: wfsdb   %f0, %f1, %f0
270---
271name:            fun7
272alignment:       16
273tracksRegLiveness: true
274registers:
275  - { id: 0, class: fp64bit }
276  - { id: 1, class: fp64bit }
277  - { id: 2, class: addr64bit }
278  - { id: 3, class: vr64bit }
279liveins:
280  - { reg: '$f0d', virtual-reg: '%0' }
281  - { reg: '$f2d', virtual-reg: '%1' }
282  - { reg: '$r2d', virtual-reg: '%2' }
283frameInfo:
284  maxAlignment:    1
285machineFunctionInfo: {}
286body:             |
287  bb.0:
288    liveins: $f0d, $f2d, $r2d
289
290    %2:addr64bit = COPY $r2d
291    %1:fp64bit = COPY $f2d
292    %0:fp64bit = COPY $f0d
293    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
294    %3:vr64bit = nofpexcept WFSDB %1, %0, implicit $fpc
295    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
296    Return
297
298...
299
300# SDB can't be used if one operand is a VR64 (and not FP64).
301# CHECK-LABEL: fun8:
302# CHECK: wfsdb   %f0, %f0, %v16
303---
304name:            fun8
305alignment:       16
306tracksRegLiveness: true
307registers:
308  - { id: 0, class: fp64bit }
309  - { id: 1, class: vr64bit }
310  - { id: 2, class: addr64bit }
311  - { id: 3, class: vr64bit }
312liveins:
313  - { reg: '$f0d', virtual-reg: '%0' }
314  - { reg: '$f2d', virtual-reg: '%1' }
315  - { reg: '$r2d', virtual-reg: '%2' }
316frameInfo:
317  maxAlignment:    1
318machineFunctionInfo: {}
319body:             |
320  bb.0:
321    liveins: $f0d, $f2d, $r2d
322
323    %2:addr64bit = COPY $r2d
324    %1:vr64bit = COPY $f2d
325    %0:fp64bit = COPY $f0d
326    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
327    %3:vr64bit = nofpexcept WFSDB %0, %1, implicit $fpc
328    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
329    Return
330
331...
332
333
334# CHECK-LABEL: fun9:
335# CHECK: seb     %f0, 164(%r15)                  # 4-byte Folded Reload
336---
337name:            fun9
338alignment:       16
339tracksRegLiveness: true
340registers:
341  - { id: 0, class: fp32bit }
342  - { id: 1, class: fp32bit }
343  - { id: 2, class: addr64bit }
344  - { id: 3, class: vr32bit }
345liveins:
346  - { reg: '$f0s', virtual-reg: '%0' }
347  - { reg: '$f2s', virtual-reg: '%1' }
348  - { reg: '$r2d', virtual-reg: '%2' }
349frameInfo:
350  maxAlignment:    1
351machineFunctionInfo: {}
352body:             |
353  bb.0:
354    liveins: $f0s, $f2s, $r2d
355
356    %2:addr64bit = COPY $r2d
357    %1:fp32bit = COPY $f2s
358    %0:fp32bit = COPY $f0s
359    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
360    %3:vr32bit = nofpexcept WFSSB %0, %1, implicit $fpc
361    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
362    Return
363
364...
365
366
367# CHECK-LABEL: fun10:
368# CHECK: wfssb   %f0, %f1, %f0
369---
370name:            fun10
371alignment:       16
372tracksRegLiveness: true
373registers:
374  - { id: 0, class: fp32bit }
375  - { id: 1, class: fp32bit }
376  - { id: 2, class: addr64bit }
377  - { id: 3, class: vr32bit }
378liveins:
379  - { reg: '$f0s', virtual-reg: '%0' }
380  - { reg: '$f2s', virtual-reg: '%1' }
381  - { reg: '$r2d', virtual-reg: '%2' }
382frameInfo:
383  maxAlignment:    1
384machineFunctionInfo: {}
385body:             |
386  bb.0:
387    liveins: $f0s, $f2s, $r2d
388
389    %2:addr64bit = COPY $r2d
390    %1:fp32bit = COPY $f2s
391    %0:fp32bit = COPY $f0s
392    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
393    %3:vr32bit = nofpexcept WFSSB %1, %0, implicit $fpc
394    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
395    Return
396
397...
398
399
400# SEB can't be used if one operand is a VR32 (and not FP32).
401# CHECK-LABEL: fun11:
402# CHECK: wfssb   %f0, %f0, %v16
403---
404name:            fun11
405alignment:       16
406tracksRegLiveness: true
407registers:
408  - { id: 0, class: fp32bit }
409  - { id: 1, class: vr32bit }
410  - { id: 2, class: addr64bit }
411  - { id: 3, class: vr32bit }
412liveins:
413  - { reg: '$f0s', virtual-reg: '%0' }
414  - { reg: '$f2s', virtual-reg: '%1' }
415  - { reg: '$r2d', virtual-reg: '%2' }
416frameInfo:
417  maxAlignment:    1
418machineFunctionInfo: {}
419body:             |
420  bb.0:
421    liveins: $f0s, $f2s, $r2d
422
423    %2:addr64bit = COPY $r2d
424    %1:vr32bit = COPY $f2s
425    %0:fp32bit = COPY $f0s
426    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
427    %3:vr32bit = nofpexcept WFSSB %0, %1, implicit $fpc
428    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
429    Return
430
431...
432
433# CHECK-LABEL: fun12:
434# CHECK: ddb     %f0, 160(%r15)                  # 8-byte Folded Reload
435---
436name:            fun12
437alignment:       16
438tracksRegLiveness: true
439registers:
440  - { id: 0, class: fp64bit }
441  - { id: 1, class: fp64bit }
442  - { id: 2, class: addr64bit }
443  - { id: 3, class: vr64bit }
444liveins:
445  - { reg: '$f0d', virtual-reg: '%0' }
446  - { reg: '$f2d', virtual-reg: '%1' }
447  - { reg: '$r2d', virtual-reg: '%2' }
448frameInfo:
449  maxAlignment:    1
450machineFunctionInfo: {}
451body:             |
452  bb.0:
453    liveins: $f0d, $f2d, $r2d
454
455    %2:addr64bit = COPY $r2d
456    %1:fp64bit = COPY $f2d
457    %0:fp64bit = COPY $f0d
458    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
459    %3:vr64bit = nofpexcept WFDDB %0, %1, implicit $fpc
460    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
461    Return
462
463...
464
465
466# CHECK-LABEL: fun13:
467# CHECK: wfddb   %f0, %f1, %f0
468---
469name:            fun13
470alignment:       16
471tracksRegLiveness: true
472registers:
473  - { id: 0, class: fp64bit }
474  - { id: 1, class: fp64bit }
475  - { id: 2, class: addr64bit }
476  - { id: 3, class: vr64bit }
477liveins:
478  - { reg: '$f0d', virtual-reg: '%0' }
479  - { reg: '$f2d', virtual-reg: '%1' }
480  - { reg: '$r2d', virtual-reg: '%2' }
481frameInfo:
482  maxAlignment:    1
483machineFunctionInfo: {}
484body:             |
485  bb.0:
486    liveins: $f0d, $f2d, $r2d
487
488    %2:addr64bit = COPY $r2d
489    %1:fp64bit = COPY $f2d
490    %0:fp64bit = COPY $f0d
491    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
492    %3:vr64bit = nofpexcept WFDDB %1, %0, implicit $fpc
493    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
494    Return
495
496...
497
498# DDB can't be used if one operand is a VR64 (and not FP64).
499# CHECK-LABEL: fun14:
500# CHECK: wfddb   %f0, %f0, %v16
501---
502name:            fun14
503alignment:       16
504tracksRegLiveness: true
505registers:
506  - { id: 0, class: fp64bit }
507  - { id: 1, class: vr64bit }
508  - { id: 2, class: addr64bit }
509  - { id: 3, class: vr64bit }
510liveins:
511  - { reg: '$f0d', virtual-reg: '%0' }
512  - { reg: '$f2d', virtual-reg: '%1' }
513  - { reg: '$r2d', virtual-reg: '%2' }
514frameInfo:
515  maxAlignment:    1
516machineFunctionInfo: {}
517body:             |
518  bb.0:
519    liveins: $f0d, $f2d, $r2d
520
521    %2:addr64bit = COPY $r2d
522    %1:vr64bit = COPY $f2d
523    %0:fp64bit = COPY $f0d
524    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
525    %3:vr64bit = nofpexcept WFDDB %0, %1, implicit $fpc
526    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
527    Return
528
529...
530
531
532# CHECK-LABEL: fun15:
533# CHECK: deb     %f0, 164(%r15)                  # 4-byte Folded Reload
534---
535name:            fun15
536alignment:       16
537tracksRegLiveness: true
538registers:
539  - { id: 0, class: fp32bit }
540  - { id: 1, class: fp32bit }
541  - { id: 2, class: addr64bit }
542  - { id: 3, class: vr32bit }
543liveins:
544  - { reg: '$f0s', virtual-reg: '%0' }
545  - { reg: '$f2s', virtual-reg: '%1' }
546  - { reg: '$r2d', virtual-reg: '%2' }
547frameInfo:
548  maxAlignment:    1
549machineFunctionInfo: {}
550body:             |
551  bb.0:
552    liveins: $f0s, $f2s, $r2d
553
554    %2:addr64bit = COPY $r2d
555    %1:fp32bit = COPY $f2s
556    %0:fp32bit = COPY $f0s
557    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
558    %3:vr32bit = nofpexcept WFDSB %0, %1, implicit $fpc
559    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
560    Return
561
562...
563
564
565# CHECK-LABEL: fun16:
566# CHECK: wfdsb   %f0, %f1, %f0
567---
568name:            fun16
569alignment:       16
570tracksRegLiveness: true
571registers:
572  - { id: 0, class: fp32bit }
573  - { id: 1, class: fp32bit }
574  - { id: 2, class: addr64bit }
575  - { id: 3, class: vr32bit }
576liveins:
577  - { reg: '$f0s', virtual-reg: '%0' }
578  - { reg: '$f2s', virtual-reg: '%1' }
579  - { reg: '$r2d', virtual-reg: '%2' }
580frameInfo:
581  maxAlignment:    1
582machineFunctionInfo: {}
583body:             |
584  bb.0:
585    liveins: $f0s, $f2s, $r2d
586
587    %2:addr64bit = COPY $r2d
588    %1:fp32bit = COPY $f2s
589    %0:fp32bit = COPY $f0s
590    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
591    %3:vr32bit = nofpexcept WFDSB %1, %0, implicit $fpc
592    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
593    Return
594
595...
596
597
598# DEB can't be used if one operand is a VR32 (and not FP32).
599# CHECK-LABEL: fun17:
600# CHECK: wfdsb   %f0, %f0, %v16
601---
602name:            fun17
603alignment:       16
604tracksRegLiveness: true
605registers:
606  - { id: 0, class: fp32bit }
607  - { id: 1, class: vr32bit }
608  - { id: 2, class: addr64bit }
609  - { id: 3, class: vr32bit }
610liveins:
611  - { reg: '$f0s', virtual-reg: '%0' }
612  - { reg: '$f2s', virtual-reg: '%1' }
613  - { reg: '$r2d', virtual-reg: '%2' }
614frameInfo:
615  maxAlignment:    1
616machineFunctionInfo: {}
617body:             |
618  bb.0:
619    liveins: $f0s, $f2s, $r2d
620
621    %2:addr64bit = COPY $r2d
622    %1:vr32bit = COPY $f2s
623    %0:fp32bit = COPY $f0s
624    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
625    %3:vr32bit = nofpexcept WFDSB %0, %1, implicit $fpc
626    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
627    Return
628
629...
630
631
632# CHECK-LABEL: fun18:
633# CHECK: mdb     %f0, 160(%r15)                  # 8-byte Folded Reload
634---
635name:            fun18
636alignment:       16
637tracksRegLiveness: true
638registers:
639  - { id: 0, class: fp64bit }
640  - { id: 1, class: fp64bit }
641  - { id: 2, class: addr64bit }
642  - { id: 3, class: vr64bit }
643liveins:
644  - { reg: '$f0d', virtual-reg: '%0' }
645  - { reg: '$f2d', virtual-reg: '%1' }
646  - { reg: '$r2d', virtual-reg: '%2' }
647frameInfo:
648  maxAlignment:    1
649machineFunctionInfo: {}
650body:             |
651  bb.0:
652    liveins: $f0d, $f2d, $r2d
653
654    %2:addr64bit = COPY $r2d
655    %1:fp64bit = COPY $f2d
656    %0:fp64bit = COPY $f0d
657    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
658    %3:vr64bit = nofpexcept WFMDB %0, %1, implicit $fpc
659    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
660    Return
661
662...
663
664
665# CHECK-LABEL: fun19:
666# CHECK: mdb     %f0, 160(%r15)                  # 8-byte Folded Reload
667---
668name:            fun19
669alignment:       16
670tracksRegLiveness: true
671registers:
672  - { id: 0, class: fp64bit }
673  - { id: 1, class: fp64bit }
674  - { id: 2, class: addr64bit }
675  - { id: 3, class: vr64bit }
676liveins:
677  - { reg: '$f0d', virtual-reg: '%0' }
678  - { reg: '$f2d', virtual-reg: '%1' }
679  - { reg: '$r2d', virtual-reg: '%2' }
680frameInfo:
681  maxAlignment:    1
682machineFunctionInfo: {}
683body:             |
684  bb.0:
685    liveins: $f0d, $f2d, $r2d
686
687    %2:addr64bit = COPY $r2d
688    %1:fp64bit = COPY $f2d
689    %0:fp64bit = COPY $f0d
690    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
691    %3:vr64bit = nofpexcept WFMDB %1, %0, implicit $fpc
692    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
693    Return
694
695...
696
697# MDB can't be used if one operand is a VR64 (and not FP64).
698# CHECK-LABEL: fun20:
699# CHECK: wfmdb   %f0, %v16, %f0
700---
701name:            fun20
702alignment:       16
703tracksRegLiveness: true
704registers:
705  - { id: 0, class: fp64bit }
706  - { id: 1, class: vr64bit }
707  - { id: 2, class: addr64bit }
708  - { id: 3, class: vr64bit }
709liveins:
710  - { reg: '$f0d', virtual-reg: '%0' }
711  - { reg: '$f2d', virtual-reg: '%1' }
712  - { reg: '$r2d', virtual-reg: '%2' }
713frameInfo:
714  maxAlignment:    1
715machineFunctionInfo: {}
716body:             |
717  bb.0:
718    liveins: $f0d, $f2d, $r2d
719
720    %2:addr64bit = COPY $r2d
721    %1:vr64bit = COPY $f2d
722    %0:fp64bit = COPY $f0d
723    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
724    %3:vr64bit = nofpexcept WFMDB %1, %0, implicit $fpc
725    VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)
726    Return
727
728...
729
730
731# CHECK-LABEL: fun21:
732# CHECK: meeb    %f0, 164(%r15)                  # 4-byte Folded Reload
733---
734name:            fun21
735alignment:       16
736tracksRegLiveness: true
737registers:
738  - { id: 0, class: fp32bit }
739  - { id: 1, class: fp32bit }
740  - { id: 2, class: addr64bit }
741  - { id: 3, class: vr32bit }
742liveins:
743  - { reg: '$f0s', virtual-reg: '%0' }
744  - { reg: '$f2s', virtual-reg: '%1' }
745  - { reg: '$r2d', virtual-reg: '%2' }
746frameInfo:
747  maxAlignment:    1
748machineFunctionInfo: {}
749body:             |
750  bb.0:
751    liveins: $f0s, $f2s, $r2d
752
753    %2:addr64bit = COPY $r2d
754    %1:fp32bit = COPY $f2s
755    %0:fp32bit = COPY $f0s
756    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
757    %3:vr32bit = nofpexcept WFMSB %0, %1, implicit $fpc
758    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
759    Return
760
761...
762
763
764# CHECK-LABEL: fun22:
765# CHECK: meeb    %f0, 164(%r15)                  # 4-byte Folded Reload
766---
767name:            fun22
768alignment:       16
769tracksRegLiveness: true
770registers:
771  - { id: 0, class: fp32bit }
772  - { id: 1, class: fp32bit }
773  - { id: 2, class: addr64bit }
774  - { id: 3, class: vr32bit }
775liveins:
776  - { reg: '$f0s', virtual-reg: '%0' }
777  - { reg: '$f2s', virtual-reg: '%1' }
778  - { reg: '$r2d', virtual-reg: '%2' }
779frameInfo:
780  maxAlignment:    1
781machineFunctionInfo: {}
782body:             |
783  bb.0:
784    liveins: $f0s, $f2s, $r2d
785
786    %2:addr64bit = COPY $r2d
787    %1:fp32bit = COPY $f2s
788    %0:fp32bit = COPY $f0s
789    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
790    %3:vr32bit = nofpexcept WFMSB %1, %0, implicit $fpc
791    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
792    Return
793
794...
795
796
797# MEEB can't be used if one operand is a VR32 (and not FP32).
798# CHECK-LABEL: fun23:
799# CHECK: wfmsb   %f0, %v16, %f0
800---
801name:            fun23
802alignment:       16
803tracksRegLiveness: true
804registers:
805  - { id: 0, class: fp32bit }
806  - { id: 1, class: vr32bit }
807  - { id: 2, class: addr64bit }
808  - { id: 3, class: vr32bit }
809liveins:
810  - { reg: '$f0s', virtual-reg: '%0' }
811  - { reg: '$f2s', virtual-reg: '%1' }
812  - { reg: '$r2d', virtual-reg: '%2' }
813frameInfo:
814  maxAlignment:    1
815machineFunctionInfo: {}
816body:             |
817  bb.0:
818    liveins: $f0s, $f2s, $r2d
819
820    %2:addr64bit = COPY $r2d
821    %1:vr32bit = COPY $f2s
822    %0:fp32bit = COPY $f0s
823    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
824    %3:vr32bit = nofpexcept WFMSB %1, %0, implicit $fpc
825    VST32 %3, %2, 0, $noreg :: (store (s32) into %ir.Dst)
826    Return
827
828...
829