590 lines · plain
1# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z14 -start-before=greedy %s -o - \2# RUN: | FileCheck %s3#4# Test folding of a memory operand into an fp memory instruction.5 6--- |7 define void @fun0(double %arg0, double %arg1, ptr %Dst) { ret void }8 define void @fun1(double %arg0, double %arg1, ptr %Dst) { ret void }9 define void @fun2(double %arg0, double %arg1, ptr %Dst) { ret void }10 define void @fun3(double %arg0, double %arg1, ptr %Dst) { ret void }11 define void @fun4(float %arg0, float %arg1, ptr %Dst) { ret void }12 define void @fun5(float %arg0, float %arg1, ptr %Dst) { ret void }13 define void @fun6(float %arg0, float %arg1, ptr %Dst) { ret void }14 define void @fun7(float %arg0, float %arg1, ptr %Dst) { ret void }15 define void @fun8(double %arg0, double %arg1, ptr %Dst) { ret void }16 define void @fun9(double %arg0, double %arg1, ptr %Dst) { ret void }17 define void @fun10(double %arg0, double %arg1, ptr %Dst) { ret void }18 define void @fun11(double %arg0, double %arg1, ptr %Dst) { ret void }19 define void @fun12(float %arg0, float %arg1, ptr %Dst) { ret void }20 define void @fun13(float %arg0, float %arg1, ptr %Dst) { ret void }21 define void @fun14(float %arg0, float %arg1, ptr %Dst) { ret void }22 define void @fun15(float %arg0, float %arg1, ptr %Dst) { ret void }23 24...25 26# CHECK-LABEL: fun0:27# CHECK: madb %f0, %f1, 160(%r15) # 8-byte Folded Reload28---29name: fun030alignment: 1631tracksRegLiveness: true32registers: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: 144machineFunctionInfo: {}45body: |46 bb.0:47 liveins: $f0d, $f2d, $r2d48 49 %2:addr64bit = COPY $r2d50 %1:fp64bit = COPY $f2d51 %0:fp64bit = COPY $f0d52 %4:fp64bit = COPY $f2d53 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 $f15d54 %3:vr64bit = nofpexcept WFMADB %0, %1, %4, implicit $fpc55 VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)56 Return57 58...59 60 61# CHECK-LABEL: fun1:62# CHECK: madb %f0, %f1, 160(%r15) # 8-byte Folded Reload63---64name: fun165alignment: 1666tracksRegLiveness: true67registers: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: 179machineFunctionInfo: {}80body: |81 bb.0:82 liveins: $f0d, $f2d, $r2d83 84 %2:addr64bit = COPY $r2d85 %1:fp64bit = COPY $f2d86 %0:fp64bit = COPY $f0d87 %4:fp64bit = COPY $f2d88 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 $f15d89 %3:vr64bit = nofpexcept WFMADB %1, %0, %4, implicit $fpc90 VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)91 Return92 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, %f098---99name: fun2100alignment: 16101tracksRegLiveness: true102registers: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: 1114machineFunctionInfo: {}115body: |116 bb.0:117 liveins: $f0d, $f2d, $r2d118 119 %2:addr64bit = COPY $r2d120 %1:vr64bit = COPY $f2d121 %0:fp64bit = COPY $f0d122 %4:fp64bit = COPY $f2d123 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 $f15d124 %3:vr64bit = nofpexcept WFMADB %1, %0, %4, implicit $fpc125 VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)126 Return127 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, %f2134---135name: fun3136alignment: 16137tracksRegLiveness: true138registers: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: 1150machineFunctionInfo: {}151body: |152 bb.0:153 liveins: $f0d, $f2d, $r2d154 155 %2:addr64bit = COPY $r2d156 %1:fp64bit = COPY $f2d157 %0:fp64bit = COPY $f0d158 %4:fp64bit = COPY $f2d159 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 $f15d160 %3:vr64bit = nofpexcept WFMADB %4, %1, %0, implicit $fpc161 VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)162 Return163 164...165 166 167# CHECK-LABEL: fun4:168# CHECK: maeb %f0, %f1, 160(%r15) # 4-byte Folded Reload169---170name: fun4171alignment: 16172tracksRegLiveness: true173registers: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: 1185machineFunctionInfo: {}186body: |187 bb.0:188 liveins: $f0d, $f2d, $r2d189 190 %2:addr64bit = COPY $r2d191 %1:fp32bit = COPY $f2s192 %0:fp32bit = COPY $f0s193 %4:fp32bit = COPY $f2s194 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 $f15d195 %3:vr32bit = nofpexcept WFMASB %0, %1, %4, implicit $fpc196 VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)197 Return198 199...200 201 202# CHECK-LABEL: fun5:203# CHECK: maeb %f0, %f1, 160(%r15) # 4-byte Folded Reload204---205name: fun5206alignment: 16207tracksRegLiveness: true208registers: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: 1220machineFunctionInfo: {}221body: |222 bb.0:223 liveins: $f0d, $f2d, $r2d224 225 %2:addr64bit = COPY $r2d226 %1:fp32bit = COPY $f2s227 %0:fp32bit = COPY $f0s228 %4:fp32bit = COPY $f2s229 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 $f15d230 %3:vr32bit = nofpexcept WFMASB %1, %0, %4, implicit $fpc231 VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)232 Return233 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, %f0240---241name: fun6242alignment: 16243tracksRegLiveness: true244registers: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: 1256machineFunctionInfo: {}257body: |258 bb.0:259 liveins: $f0d, $f2d, $r2d260 261 %2:addr64bit = COPY $r2d262 %1:vr32bit = COPY $f2s263 %0:fp32bit = COPY $f0s264 %4:fp32bit = COPY $f2s265 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 $f15d266 %3:vr32bit = nofpexcept WFMASB %1, %0, %4, implicit $fpc267 VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)268 Return269 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, %f2276---277name: fun7278alignment: 16279tracksRegLiveness: true280registers: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: 1292machineFunctionInfo: {}293body: |294 bb.0:295 liveins: $f0d, $f2d, $r2d296 297 %2:addr64bit = COPY $r2d298 %1:fp32bit = COPY $f2s299 %0:fp32bit = COPY $f0s300 %4:fp32bit = COPY $f2s301 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 $f15d302 %3:vr32bit = nofpexcept WFMASB %4, %1, %0, implicit $fpc303 VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)304 Return305 306...307 308 309# CHECK-LABEL: fun8:310# CHECK: msdb %f0, %f1, 160(%r15) # 8-byte Folded Reload311---312name: fun8313alignment: 16314tracksRegLiveness: true315registers: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: 1327machineFunctionInfo: {}328body: |329 bb.0:330 liveins: $f0d, $f2d, $r2d331 332 %2:addr64bit = COPY $r2d333 %1:fp64bit = COPY $f2d334 %0:fp64bit = COPY $f0d335 %4:fp64bit = COPY $f2d336 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 $f15d337 %3:vr64bit = nofpexcept WFMSDB %0, %1, %4, implicit $fpc338 VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)339 Return340 341...342 343 344# CHECK-LABEL: fun9:345# CHECK: msdb %f0, %f1, 160(%r15) # 8-byte Folded Reload346---347name: fun9348alignment: 16349tracksRegLiveness: true350registers: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: 1362machineFunctionInfo: {}363body: |364 bb.0:365 liveins: $f0d, $f2d, $r2d366 367 %2:addr64bit = COPY $r2d368 %1:fp64bit = COPY $f2d369 %0:fp64bit = COPY $f0d370 %4:fp64bit = COPY $f2d371 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 $f15d372 %3:vr64bit = nofpexcept WFMSDB %1, %0, %4, implicit $fpc373 VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)374 Return375 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, %f0381---382name: fun10383alignment: 16384tracksRegLiveness: true385registers: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: 1397machineFunctionInfo: {}398body: |399 bb.0:400 liveins: $f0d, $f2d, $r2d401 402 %2:addr64bit = COPY $r2d403 %1:vr64bit = COPY $f2d404 %0:fp64bit = COPY $f0d405 %4:fp64bit = COPY $f2d406 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 $f15d407 %3:vr64bit = nofpexcept WFMSDB %1, %0, %4, implicit $fpc408 VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)409 Return410 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, %f2417---418name: fun11419alignment: 16420tracksRegLiveness: true421registers: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: 1433machineFunctionInfo: {}434body: |435 bb.0:436 liveins: $f0d, $f2d, $r2d437 438 %2:addr64bit = COPY $r2d439 %1:fp64bit = COPY $f2d440 %0:fp64bit = COPY $f0d441 %4:fp64bit = COPY $f2d442 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 $f15d443 %3:vr64bit = nofpexcept WFMSDB %4, %1, %0, implicit $fpc444 VST64 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)445 Return446 447...448 449 450# CHECK-LABEL: fun12:451# CHECK: mseb %f0, %f1, 160(%r15) # 4-byte Folded Reload452---453name: fun12454alignment: 16455tracksRegLiveness: true456registers: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: 1468machineFunctionInfo: {}469body: |470 bb.0:471 liveins: $f0d, $f2d, $r2d472 473 %2:addr64bit = COPY $r2d474 %1:fp32bit = COPY $f2s475 %0:fp32bit = COPY $f0s476 %4:fp32bit = COPY $f2s477 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 $f15d478 %3:vr32bit = nofpexcept WFMSSB %0, %1, %4, implicit $fpc479 VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)480 Return481 482...483 484 485# CHECK-LABEL: fun13:486# CHECK: mseb %f0, %f1, 160(%r15) # 4-byte Folded Reload487---488name: fun13489alignment: 16490tracksRegLiveness: true491registers: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: 1503machineFunctionInfo: {}504body: |505 bb.0:506 liveins: $f0d, $f2d, $r2d507 508 %2:addr64bit = COPY $r2d509 %1:fp32bit = COPY $f2s510 %0:fp32bit = COPY $f0s511 %4:fp32bit = COPY $f2s512 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 $f15d513 %3:vr32bit = nofpexcept WFMSSB %1, %0, %4, implicit $fpc514 VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)515 Return516 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, %f0523---524name: fun14525alignment: 16526tracksRegLiveness: true527registers: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: 1539machineFunctionInfo: {}540body: |541 bb.0:542 liveins: $f0d, $f2d, $r2d543 544 %2:addr64bit = COPY $r2d545 %1:vr32bit = COPY $f2s546 %0:fp32bit = COPY $f0s547 %4:fp32bit = COPY $f2s548 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 $f15d549 %3:vr32bit = nofpexcept WFMSSB %1, %0, %4, implicit $fpc550 VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)551 Return552 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, %f2559---560name: fun15561alignment: 16562tracksRegLiveness: true563registers: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: 1575machineFunctionInfo: {}576body: |577 bb.0:578 liveins: $f0d, $f2d, $r2d579 580 %2:addr64bit = COPY $r2d581 %1:fp32bit = COPY $f2s582 %0:fp32bit = COPY $f0s583 %4:fp32bit = COPY $f2s584 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 $f15d585 %3:vr32bit = nofpexcept WFMSSB %4, %1, %0, implicit $fpc586 VST32 %3, %2, 0, $noreg :: (store (s64) into %ir.Dst)587 Return588 589...590