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