1 // autogenerated from gen/S390X.rules: do not edit! 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 8 var _ = math.MinInt8 // in case not otherwise used 9 func rewriteValueS390X(v *Value, config *Config) bool { 10 switch v.Op { 11 case OpAdd16: 12 return rewriteValueS390X_OpAdd16(v, config) 13 case OpAdd32: 14 return rewriteValueS390X_OpAdd32(v, config) 15 case OpAdd32F: 16 return rewriteValueS390X_OpAdd32F(v, config) 17 case OpAdd64: 18 return rewriteValueS390X_OpAdd64(v, config) 19 case OpAdd64F: 20 return rewriteValueS390X_OpAdd64F(v, config) 21 case OpAdd8: 22 return rewriteValueS390X_OpAdd8(v, config) 23 case OpAddPtr: 24 return rewriteValueS390X_OpAddPtr(v, config) 25 case OpAddr: 26 return rewriteValueS390X_OpAddr(v, config) 27 case OpAnd16: 28 return rewriteValueS390X_OpAnd16(v, config) 29 case OpAnd32: 30 return rewriteValueS390X_OpAnd32(v, config) 31 case OpAnd64: 32 return rewriteValueS390X_OpAnd64(v, config) 33 case OpAnd8: 34 return rewriteValueS390X_OpAnd8(v, config) 35 case OpAndB: 36 return rewriteValueS390X_OpAndB(v, config) 37 case OpAtomicAdd32: 38 return rewriteValueS390X_OpAtomicAdd32(v, config) 39 case OpAtomicAdd64: 40 return rewriteValueS390X_OpAtomicAdd64(v, config) 41 case OpAtomicCompareAndSwap32: 42 return rewriteValueS390X_OpAtomicCompareAndSwap32(v, config) 43 case OpAtomicCompareAndSwap64: 44 return rewriteValueS390X_OpAtomicCompareAndSwap64(v, config) 45 case OpAtomicExchange32: 46 return rewriteValueS390X_OpAtomicExchange32(v, config) 47 case OpAtomicExchange64: 48 return rewriteValueS390X_OpAtomicExchange64(v, config) 49 case OpAtomicLoad32: 50 return rewriteValueS390X_OpAtomicLoad32(v, config) 51 case OpAtomicLoad64: 52 return rewriteValueS390X_OpAtomicLoad64(v, config) 53 case OpAtomicLoadPtr: 54 return rewriteValueS390X_OpAtomicLoadPtr(v, config) 55 case OpAtomicStore32: 56 return rewriteValueS390X_OpAtomicStore32(v, config) 57 case OpAtomicStore64: 58 return rewriteValueS390X_OpAtomicStore64(v, config) 59 case OpAtomicStorePtrNoWB: 60 return rewriteValueS390X_OpAtomicStorePtrNoWB(v, config) 61 case OpAvg64u: 62 return rewriteValueS390X_OpAvg64u(v, config) 63 case OpBswap32: 64 return rewriteValueS390X_OpBswap32(v, config) 65 case OpBswap64: 66 return rewriteValueS390X_OpBswap64(v, config) 67 case OpClosureCall: 68 return rewriteValueS390X_OpClosureCall(v, config) 69 case OpCom16: 70 return rewriteValueS390X_OpCom16(v, config) 71 case OpCom32: 72 return rewriteValueS390X_OpCom32(v, config) 73 case OpCom64: 74 return rewriteValueS390X_OpCom64(v, config) 75 case OpCom8: 76 return rewriteValueS390X_OpCom8(v, config) 77 case OpConst16: 78 return rewriteValueS390X_OpConst16(v, config) 79 case OpConst32: 80 return rewriteValueS390X_OpConst32(v, config) 81 case OpConst32F: 82 return rewriteValueS390X_OpConst32F(v, config) 83 case OpConst64: 84 return rewriteValueS390X_OpConst64(v, config) 85 case OpConst64F: 86 return rewriteValueS390X_OpConst64F(v, config) 87 case OpConst8: 88 return rewriteValueS390X_OpConst8(v, config) 89 case OpConstBool: 90 return rewriteValueS390X_OpConstBool(v, config) 91 case OpConstNil: 92 return rewriteValueS390X_OpConstNil(v, config) 93 case OpConvert: 94 return rewriteValueS390X_OpConvert(v, config) 95 case OpCtz32: 96 return rewriteValueS390X_OpCtz32(v, config) 97 case OpCtz64: 98 return rewriteValueS390X_OpCtz64(v, config) 99 case OpCvt32Fto32: 100 return rewriteValueS390X_OpCvt32Fto32(v, config) 101 case OpCvt32Fto64: 102 return rewriteValueS390X_OpCvt32Fto64(v, config) 103 case OpCvt32Fto64F: 104 return rewriteValueS390X_OpCvt32Fto64F(v, config) 105 case OpCvt32to32F: 106 return rewriteValueS390X_OpCvt32to32F(v, config) 107 case OpCvt32to64F: 108 return rewriteValueS390X_OpCvt32to64F(v, config) 109 case OpCvt64Fto32: 110 return rewriteValueS390X_OpCvt64Fto32(v, config) 111 case OpCvt64Fto32F: 112 return rewriteValueS390X_OpCvt64Fto32F(v, config) 113 case OpCvt64Fto64: 114 return rewriteValueS390X_OpCvt64Fto64(v, config) 115 case OpCvt64to32F: 116 return rewriteValueS390X_OpCvt64to32F(v, config) 117 case OpCvt64to64F: 118 return rewriteValueS390X_OpCvt64to64F(v, config) 119 case OpDeferCall: 120 return rewriteValueS390X_OpDeferCall(v, config) 121 case OpDiv16: 122 return rewriteValueS390X_OpDiv16(v, config) 123 case OpDiv16u: 124 return rewriteValueS390X_OpDiv16u(v, config) 125 case OpDiv32: 126 return rewriteValueS390X_OpDiv32(v, config) 127 case OpDiv32F: 128 return rewriteValueS390X_OpDiv32F(v, config) 129 case OpDiv32u: 130 return rewriteValueS390X_OpDiv32u(v, config) 131 case OpDiv64: 132 return rewriteValueS390X_OpDiv64(v, config) 133 case OpDiv64F: 134 return rewriteValueS390X_OpDiv64F(v, config) 135 case OpDiv64u: 136 return rewriteValueS390X_OpDiv64u(v, config) 137 case OpDiv8: 138 return rewriteValueS390X_OpDiv8(v, config) 139 case OpDiv8u: 140 return rewriteValueS390X_OpDiv8u(v, config) 141 case OpEq16: 142 return rewriteValueS390X_OpEq16(v, config) 143 case OpEq32: 144 return rewriteValueS390X_OpEq32(v, config) 145 case OpEq32F: 146 return rewriteValueS390X_OpEq32F(v, config) 147 case OpEq64: 148 return rewriteValueS390X_OpEq64(v, config) 149 case OpEq64F: 150 return rewriteValueS390X_OpEq64F(v, config) 151 case OpEq8: 152 return rewriteValueS390X_OpEq8(v, config) 153 case OpEqB: 154 return rewriteValueS390X_OpEqB(v, config) 155 case OpEqPtr: 156 return rewriteValueS390X_OpEqPtr(v, config) 157 case OpGeq16: 158 return rewriteValueS390X_OpGeq16(v, config) 159 case OpGeq16U: 160 return rewriteValueS390X_OpGeq16U(v, config) 161 case OpGeq32: 162 return rewriteValueS390X_OpGeq32(v, config) 163 case OpGeq32F: 164 return rewriteValueS390X_OpGeq32F(v, config) 165 case OpGeq32U: 166 return rewriteValueS390X_OpGeq32U(v, config) 167 case OpGeq64: 168 return rewriteValueS390X_OpGeq64(v, config) 169 case OpGeq64F: 170 return rewriteValueS390X_OpGeq64F(v, config) 171 case OpGeq64U: 172 return rewriteValueS390X_OpGeq64U(v, config) 173 case OpGeq8: 174 return rewriteValueS390X_OpGeq8(v, config) 175 case OpGeq8U: 176 return rewriteValueS390X_OpGeq8U(v, config) 177 case OpGetClosurePtr: 178 return rewriteValueS390X_OpGetClosurePtr(v, config) 179 case OpGetG: 180 return rewriteValueS390X_OpGetG(v, config) 181 case OpGoCall: 182 return rewriteValueS390X_OpGoCall(v, config) 183 case OpGreater16: 184 return rewriteValueS390X_OpGreater16(v, config) 185 case OpGreater16U: 186 return rewriteValueS390X_OpGreater16U(v, config) 187 case OpGreater32: 188 return rewriteValueS390X_OpGreater32(v, config) 189 case OpGreater32F: 190 return rewriteValueS390X_OpGreater32F(v, config) 191 case OpGreater32U: 192 return rewriteValueS390X_OpGreater32U(v, config) 193 case OpGreater64: 194 return rewriteValueS390X_OpGreater64(v, config) 195 case OpGreater64F: 196 return rewriteValueS390X_OpGreater64F(v, config) 197 case OpGreater64U: 198 return rewriteValueS390X_OpGreater64U(v, config) 199 case OpGreater8: 200 return rewriteValueS390X_OpGreater8(v, config) 201 case OpGreater8U: 202 return rewriteValueS390X_OpGreater8U(v, config) 203 case OpHmul16: 204 return rewriteValueS390X_OpHmul16(v, config) 205 case OpHmul16u: 206 return rewriteValueS390X_OpHmul16u(v, config) 207 case OpHmul32: 208 return rewriteValueS390X_OpHmul32(v, config) 209 case OpHmul32u: 210 return rewriteValueS390X_OpHmul32u(v, config) 211 case OpHmul64: 212 return rewriteValueS390X_OpHmul64(v, config) 213 case OpHmul64u: 214 return rewriteValueS390X_OpHmul64u(v, config) 215 case OpHmul8: 216 return rewriteValueS390X_OpHmul8(v, config) 217 case OpHmul8u: 218 return rewriteValueS390X_OpHmul8u(v, config) 219 case OpITab: 220 return rewriteValueS390X_OpITab(v, config) 221 case OpInterCall: 222 return rewriteValueS390X_OpInterCall(v, config) 223 case OpIsInBounds: 224 return rewriteValueS390X_OpIsInBounds(v, config) 225 case OpIsNonNil: 226 return rewriteValueS390X_OpIsNonNil(v, config) 227 case OpIsSliceInBounds: 228 return rewriteValueS390X_OpIsSliceInBounds(v, config) 229 case OpLeq16: 230 return rewriteValueS390X_OpLeq16(v, config) 231 case OpLeq16U: 232 return rewriteValueS390X_OpLeq16U(v, config) 233 case OpLeq32: 234 return rewriteValueS390X_OpLeq32(v, config) 235 case OpLeq32F: 236 return rewriteValueS390X_OpLeq32F(v, config) 237 case OpLeq32U: 238 return rewriteValueS390X_OpLeq32U(v, config) 239 case OpLeq64: 240 return rewriteValueS390X_OpLeq64(v, config) 241 case OpLeq64F: 242 return rewriteValueS390X_OpLeq64F(v, config) 243 case OpLeq64U: 244 return rewriteValueS390X_OpLeq64U(v, config) 245 case OpLeq8: 246 return rewriteValueS390X_OpLeq8(v, config) 247 case OpLeq8U: 248 return rewriteValueS390X_OpLeq8U(v, config) 249 case OpLess16: 250 return rewriteValueS390X_OpLess16(v, config) 251 case OpLess16U: 252 return rewriteValueS390X_OpLess16U(v, config) 253 case OpLess32: 254 return rewriteValueS390X_OpLess32(v, config) 255 case OpLess32F: 256 return rewriteValueS390X_OpLess32F(v, config) 257 case OpLess32U: 258 return rewriteValueS390X_OpLess32U(v, config) 259 case OpLess64: 260 return rewriteValueS390X_OpLess64(v, config) 261 case OpLess64F: 262 return rewriteValueS390X_OpLess64F(v, config) 263 case OpLess64U: 264 return rewriteValueS390X_OpLess64U(v, config) 265 case OpLess8: 266 return rewriteValueS390X_OpLess8(v, config) 267 case OpLess8U: 268 return rewriteValueS390X_OpLess8U(v, config) 269 case OpLoad: 270 return rewriteValueS390X_OpLoad(v, config) 271 case OpLrot32: 272 return rewriteValueS390X_OpLrot32(v, config) 273 case OpLrot64: 274 return rewriteValueS390X_OpLrot64(v, config) 275 case OpLsh16x16: 276 return rewriteValueS390X_OpLsh16x16(v, config) 277 case OpLsh16x32: 278 return rewriteValueS390X_OpLsh16x32(v, config) 279 case OpLsh16x64: 280 return rewriteValueS390X_OpLsh16x64(v, config) 281 case OpLsh16x8: 282 return rewriteValueS390X_OpLsh16x8(v, config) 283 case OpLsh32x16: 284 return rewriteValueS390X_OpLsh32x16(v, config) 285 case OpLsh32x32: 286 return rewriteValueS390X_OpLsh32x32(v, config) 287 case OpLsh32x64: 288 return rewriteValueS390X_OpLsh32x64(v, config) 289 case OpLsh32x8: 290 return rewriteValueS390X_OpLsh32x8(v, config) 291 case OpLsh64x16: 292 return rewriteValueS390X_OpLsh64x16(v, config) 293 case OpLsh64x32: 294 return rewriteValueS390X_OpLsh64x32(v, config) 295 case OpLsh64x64: 296 return rewriteValueS390X_OpLsh64x64(v, config) 297 case OpLsh64x8: 298 return rewriteValueS390X_OpLsh64x8(v, config) 299 case OpLsh8x16: 300 return rewriteValueS390X_OpLsh8x16(v, config) 301 case OpLsh8x32: 302 return rewriteValueS390X_OpLsh8x32(v, config) 303 case OpLsh8x64: 304 return rewriteValueS390X_OpLsh8x64(v, config) 305 case OpLsh8x8: 306 return rewriteValueS390X_OpLsh8x8(v, config) 307 case OpMod16: 308 return rewriteValueS390X_OpMod16(v, config) 309 case OpMod16u: 310 return rewriteValueS390X_OpMod16u(v, config) 311 case OpMod32: 312 return rewriteValueS390X_OpMod32(v, config) 313 case OpMod32u: 314 return rewriteValueS390X_OpMod32u(v, config) 315 case OpMod64: 316 return rewriteValueS390X_OpMod64(v, config) 317 case OpMod64u: 318 return rewriteValueS390X_OpMod64u(v, config) 319 case OpMod8: 320 return rewriteValueS390X_OpMod8(v, config) 321 case OpMod8u: 322 return rewriteValueS390X_OpMod8u(v, config) 323 case OpMove: 324 return rewriteValueS390X_OpMove(v, config) 325 case OpMul16: 326 return rewriteValueS390X_OpMul16(v, config) 327 case OpMul32: 328 return rewriteValueS390X_OpMul32(v, config) 329 case OpMul32F: 330 return rewriteValueS390X_OpMul32F(v, config) 331 case OpMul64: 332 return rewriteValueS390X_OpMul64(v, config) 333 case OpMul64F: 334 return rewriteValueS390X_OpMul64F(v, config) 335 case OpMul8: 336 return rewriteValueS390X_OpMul8(v, config) 337 case OpNeg16: 338 return rewriteValueS390X_OpNeg16(v, config) 339 case OpNeg32: 340 return rewriteValueS390X_OpNeg32(v, config) 341 case OpNeg32F: 342 return rewriteValueS390X_OpNeg32F(v, config) 343 case OpNeg64: 344 return rewriteValueS390X_OpNeg64(v, config) 345 case OpNeg64F: 346 return rewriteValueS390X_OpNeg64F(v, config) 347 case OpNeg8: 348 return rewriteValueS390X_OpNeg8(v, config) 349 case OpNeq16: 350 return rewriteValueS390X_OpNeq16(v, config) 351 case OpNeq32: 352 return rewriteValueS390X_OpNeq32(v, config) 353 case OpNeq32F: 354 return rewriteValueS390X_OpNeq32F(v, config) 355 case OpNeq64: 356 return rewriteValueS390X_OpNeq64(v, config) 357 case OpNeq64F: 358 return rewriteValueS390X_OpNeq64F(v, config) 359 case OpNeq8: 360 return rewriteValueS390X_OpNeq8(v, config) 361 case OpNeqB: 362 return rewriteValueS390X_OpNeqB(v, config) 363 case OpNeqPtr: 364 return rewriteValueS390X_OpNeqPtr(v, config) 365 case OpNilCheck: 366 return rewriteValueS390X_OpNilCheck(v, config) 367 case OpNot: 368 return rewriteValueS390X_OpNot(v, config) 369 case OpOffPtr: 370 return rewriteValueS390X_OpOffPtr(v, config) 371 case OpOr16: 372 return rewriteValueS390X_OpOr16(v, config) 373 case OpOr32: 374 return rewriteValueS390X_OpOr32(v, config) 375 case OpOr64: 376 return rewriteValueS390X_OpOr64(v, config) 377 case OpOr8: 378 return rewriteValueS390X_OpOr8(v, config) 379 case OpOrB: 380 return rewriteValueS390X_OpOrB(v, config) 381 case OpRsh16Ux16: 382 return rewriteValueS390X_OpRsh16Ux16(v, config) 383 case OpRsh16Ux32: 384 return rewriteValueS390X_OpRsh16Ux32(v, config) 385 case OpRsh16Ux64: 386 return rewriteValueS390X_OpRsh16Ux64(v, config) 387 case OpRsh16Ux8: 388 return rewriteValueS390X_OpRsh16Ux8(v, config) 389 case OpRsh16x16: 390 return rewriteValueS390X_OpRsh16x16(v, config) 391 case OpRsh16x32: 392 return rewriteValueS390X_OpRsh16x32(v, config) 393 case OpRsh16x64: 394 return rewriteValueS390X_OpRsh16x64(v, config) 395 case OpRsh16x8: 396 return rewriteValueS390X_OpRsh16x8(v, config) 397 case OpRsh32Ux16: 398 return rewriteValueS390X_OpRsh32Ux16(v, config) 399 case OpRsh32Ux32: 400 return rewriteValueS390X_OpRsh32Ux32(v, config) 401 case OpRsh32Ux64: 402 return rewriteValueS390X_OpRsh32Ux64(v, config) 403 case OpRsh32Ux8: 404 return rewriteValueS390X_OpRsh32Ux8(v, config) 405 case OpRsh32x16: 406 return rewriteValueS390X_OpRsh32x16(v, config) 407 case OpRsh32x32: 408 return rewriteValueS390X_OpRsh32x32(v, config) 409 case OpRsh32x64: 410 return rewriteValueS390X_OpRsh32x64(v, config) 411 case OpRsh32x8: 412 return rewriteValueS390X_OpRsh32x8(v, config) 413 case OpRsh64Ux16: 414 return rewriteValueS390X_OpRsh64Ux16(v, config) 415 case OpRsh64Ux32: 416 return rewriteValueS390X_OpRsh64Ux32(v, config) 417 case OpRsh64Ux64: 418 return rewriteValueS390X_OpRsh64Ux64(v, config) 419 case OpRsh64Ux8: 420 return rewriteValueS390X_OpRsh64Ux8(v, config) 421 case OpRsh64x16: 422 return rewriteValueS390X_OpRsh64x16(v, config) 423 case OpRsh64x32: 424 return rewriteValueS390X_OpRsh64x32(v, config) 425 case OpRsh64x64: 426 return rewriteValueS390X_OpRsh64x64(v, config) 427 case OpRsh64x8: 428 return rewriteValueS390X_OpRsh64x8(v, config) 429 case OpRsh8Ux16: 430 return rewriteValueS390X_OpRsh8Ux16(v, config) 431 case OpRsh8Ux32: 432 return rewriteValueS390X_OpRsh8Ux32(v, config) 433 case OpRsh8Ux64: 434 return rewriteValueS390X_OpRsh8Ux64(v, config) 435 case OpRsh8Ux8: 436 return rewriteValueS390X_OpRsh8Ux8(v, config) 437 case OpRsh8x16: 438 return rewriteValueS390X_OpRsh8x16(v, config) 439 case OpRsh8x32: 440 return rewriteValueS390X_OpRsh8x32(v, config) 441 case OpRsh8x64: 442 return rewriteValueS390X_OpRsh8x64(v, config) 443 case OpRsh8x8: 444 return rewriteValueS390X_OpRsh8x8(v, config) 445 case OpS390XADD: 446 return rewriteValueS390X_OpS390XADD(v, config) 447 case OpS390XADDW: 448 return rewriteValueS390X_OpS390XADDW(v, config) 449 case OpS390XADDWconst: 450 return rewriteValueS390X_OpS390XADDWconst(v, config) 451 case OpS390XADDconst: 452 return rewriteValueS390X_OpS390XADDconst(v, config) 453 case OpS390XAND: 454 return rewriteValueS390X_OpS390XAND(v, config) 455 case OpS390XANDW: 456 return rewriteValueS390X_OpS390XANDW(v, config) 457 case OpS390XANDWconst: 458 return rewriteValueS390X_OpS390XANDWconst(v, config) 459 case OpS390XANDconst: 460 return rewriteValueS390X_OpS390XANDconst(v, config) 461 case OpS390XCMP: 462 return rewriteValueS390X_OpS390XCMP(v, config) 463 case OpS390XCMPU: 464 return rewriteValueS390X_OpS390XCMPU(v, config) 465 case OpS390XCMPUconst: 466 return rewriteValueS390X_OpS390XCMPUconst(v, config) 467 case OpS390XCMPW: 468 return rewriteValueS390X_OpS390XCMPW(v, config) 469 case OpS390XCMPWU: 470 return rewriteValueS390X_OpS390XCMPWU(v, config) 471 case OpS390XCMPWUconst: 472 return rewriteValueS390X_OpS390XCMPWUconst(v, config) 473 case OpS390XCMPWconst: 474 return rewriteValueS390X_OpS390XCMPWconst(v, config) 475 case OpS390XCMPconst: 476 return rewriteValueS390X_OpS390XCMPconst(v, config) 477 case OpS390XFMOVDload: 478 return rewriteValueS390X_OpS390XFMOVDload(v, config) 479 case OpS390XFMOVDloadidx: 480 return rewriteValueS390X_OpS390XFMOVDloadidx(v, config) 481 case OpS390XFMOVDstore: 482 return rewriteValueS390X_OpS390XFMOVDstore(v, config) 483 case OpS390XFMOVDstoreidx: 484 return rewriteValueS390X_OpS390XFMOVDstoreidx(v, config) 485 case OpS390XFMOVSload: 486 return rewriteValueS390X_OpS390XFMOVSload(v, config) 487 case OpS390XFMOVSloadidx: 488 return rewriteValueS390X_OpS390XFMOVSloadidx(v, config) 489 case OpS390XFMOVSstore: 490 return rewriteValueS390X_OpS390XFMOVSstore(v, config) 491 case OpS390XFMOVSstoreidx: 492 return rewriteValueS390X_OpS390XFMOVSstoreidx(v, config) 493 case OpS390XMOVBZload: 494 return rewriteValueS390X_OpS390XMOVBZload(v, config) 495 case OpS390XMOVBZloadidx: 496 return rewriteValueS390X_OpS390XMOVBZloadidx(v, config) 497 case OpS390XMOVBZreg: 498 return rewriteValueS390X_OpS390XMOVBZreg(v, config) 499 case OpS390XMOVBload: 500 return rewriteValueS390X_OpS390XMOVBload(v, config) 501 case OpS390XMOVBreg: 502 return rewriteValueS390X_OpS390XMOVBreg(v, config) 503 case OpS390XMOVBstore: 504 return rewriteValueS390X_OpS390XMOVBstore(v, config) 505 case OpS390XMOVBstoreconst: 506 return rewriteValueS390X_OpS390XMOVBstoreconst(v, config) 507 case OpS390XMOVBstoreidx: 508 return rewriteValueS390X_OpS390XMOVBstoreidx(v, config) 509 case OpS390XMOVDEQ: 510 return rewriteValueS390X_OpS390XMOVDEQ(v, config) 511 case OpS390XMOVDGE: 512 return rewriteValueS390X_OpS390XMOVDGE(v, config) 513 case OpS390XMOVDGT: 514 return rewriteValueS390X_OpS390XMOVDGT(v, config) 515 case OpS390XMOVDLE: 516 return rewriteValueS390X_OpS390XMOVDLE(v, config) 517 case OpS390XMOVDLT: 518 return rewriteValueS390X_OpS390XMOVDLT(v, config) 519 case OpS390XMOVDNE: 520 return rewriteValueS390X_OpS390XMOVDNE(v, config) 521 case OpS390XMOVDaddridx: 522 return rewriteValueS390X_OpS390XMOVDaddridx(v, config) 523 case OpS390XMOVDload: 524 return rewriteValueS390X_OpS390XMOVDload(v, config) 525 case OpS390XMOVDloadidx: 526 return rewriteValueS390X_OpS390XMOVDloadidx(v, config) 527 case OpS390XMOVDreg: 528 return rewriteValueS390X_OpS390XMOVDreg(v, config) 529 case OpS390XMOVDstore: 530 return rewriteValueS390X_OpS390XMOVDstore(v, config) 531 case OpS390XMOVDstoreconst: 532 return rewriteValueS390X_OpS390XMOVDstoreconst(v, config) 533 case OpS390XMOVDstoreidx: 534 return rewriteValueS390X_OpS390XMOVDstoreidx(v, config) 535 case OpS390XMOVHBRstore: 536 return rewriteValueS390X_OpS390XMOVHBRstore(v, config) 537 case OpS390XMOVHBRstoreidx: 538 return rewriteValueS390X_OpS390XMOVHBRstoreidx(v, config) 539 case OpS390XMOVHZload: 540 return rewriteValueS390X_OpS390XMOVHZload(v, config) 541 case OpS390XMOVHZloadidx: 542 return rewriteValueS390X_OpS390XMOVHZloadidx(v, config) 543 case OpS390XMOVHZreg: 544 return rewriteValueS390X_OpS390XMOVHZreg(v, config) 545 case OpS390XMOVHload: 546 return rewriteValueS390X_OpS390XMOVHload(v, config) 547 case OpS390XMOVHreg: 548 return rewriteValueS390X_OpS390XMOVHreg(v, config) 549 case OpS390XMOVHstore: 550 return rewriteValueS390X_OpS390XMOVHstore(v, config) 551 case OpS390XMOVHstoreconst: 552 return rewriteValueS390X_OpS390XMOVHstoreconst(v, config) 553 case OpS390XMOVHstoreidx: 554 return rewriteValueS390X_OpS390XMOVHstoreidx(v, config) 555 case OpS390XMOVWBRstore: 556 return rewriteValueS390X_OpS390XMOVWBRstore(v, config) 557 case OpS390XMOVWBRstoreidx: 558 return rewriteValueS390X_OpS390XMOVWBRstoreidx(v, config) 559 case OpS390XMOVWZload: 560 return rewriteValueS390X_OpS390XMOVWZload(v, config) 561 case OpS390XMOVWZloadidx: 562 return rewriteValueS390X_OpS390XMOVWZloadidx(v, config) 563 case OpS390XMOVWZreg: 564 return rewriteValueS390X_OpS390XMOVWZreg(v, config) 565 case OpS390XMOVWload: 566 return rewriteValueS390X_OpS390XMOVWload(v, config) 567 case OpS390XMOVWreg: 568 return rewriteValueS390X_OpS390XMOVWreg(v, config) 569 case OpS390XMOVWstore: 570 return rewriteValueS390X_OpS390XMOVWstore(v, config) 571 case OpS390XMOVWstoreconst: 572 return rewriteValueS390X_OpS390XMOVWstoreconst(v, config) 573 case OpS390XMOVWstoreidx: 574 return rewriteValueS390X_OpS390XMOVWstoreidx(v, config) 575 case OpS390XMULLD: 576 return rewriteValueS390X_OpS390XMULLD(v, config) 577 case OpS390XMULLDconst: 578 return rewriteValueS390X_OpS390XMULLDconst(v, config) 579 case OpS390XMULLW: 580 return rewriteValueS390X_OpS390XMULLW(v, config) 581 case OpS390XMULLWconst: 582 return rewriteValueS390X_OpS390XMULLWconst(v, config) 583 case OpS390XNEG: 584 return rewriteValueS390X_OpS390XNEG(v, config) 585 case OpS390XNEGW: 586 return rewriteValueS390X_OpS390XNEGW(v, config) 587 case OpS390XNOT: 588 return rewriteValueS390X_OpS390XNOT(v, config) 589 case OpS390XNOTW: 590 return rewriteValueS390X_OpS390XNOTW(v, config) 591 case OpS390XOR: 592 return rewriteValueS390X_OpS390XOR(v, config) 593 case OpS390XORW: 594 return rewriteValueS390X_OpS390XORW(v, config) 595 case OpS390XORWconst: 596 return rewriteValueS390X_OpS390XORWconst(v, config) 597 case OpS390XORconst: 598 return rewriteValueS390X_OpS390XORconst(v, config) 599 case OpS390XSLD: 600 return rewriteValueS390X_OpS390XSLD(v, config) 601 case OpS390XSLW: 602 return rewriteValueS390X_OpS390XSLW(v, config) 603 case OpS390XSRAD: 604 return rewriteValueS390X_OpS390XSRAD(v, config) 605 case OpS390XSRADconst: 606 return rewriteValueS390X_OpS390XSRADconst(v, config) 607 case OpS390XSRAW: 608 return rewriteValueS390X_OpS390XSRAW(v, config) 609 case OpS390XSRAWconst: 610 return rewriteValueS390X_OpS390XSRAWconst(v, config) 611 case OpS390XSRD: 612 return rewriteValueS390X_OpS390XSRD(v, config) 613 case OpS390XSRW: 614 return rewriteValueS390X_OpS390XSRW(v, config) 615 case OpS390XSTM2: 616 return rewriteValueS390X_OpS390XSTM2(v, config) 617 case OpS390XSTMG2: 618 return rewriteValueS390X_OpS390XSTMG2(v, config) 619 case OpS390XSUB: 620 return rewriteValueS390X_OpS390XSUB(v, config) 621 case OpS390XSUBEWcarrymask: 622 return rewriteValueS390X_OpS390XSUBEWcarrymask(v, config) 623 case OpS390XSUBEcarrymask: 624 return rewriteValueS390X_OpS390XSUBEcarrymask(v, config) 625 case OpS390XSUBW: 626 return rewriteValueS390X_OpS390XSUBW(v, config) 627 case OpS390XSUBWconst: 628 return rewriteValueS390X_OpS390XSUBWconst(v, config) 629 case OpS390XSUBconst: 630 return rewriteValueS390X_OpS390XSUBconst(v, config) 631 case OpS390XXOR: 632 return rewriteValueS390X_OpS390XXOR(v, config) 633 case OpS390XXORW: 634 return rewriteValueS390X_OpS390XXORW(v, config) 635 case OpS390XXORWconst: 636 return rewriteValueS390X_OpS390XXORWconst(v, config) 637 case OpS390XXORconst: 638 return rewriteValueS390X_OpS390XXORconst(v, config) 639 case OpSelect0: 640 return rewriteValueS390X_OpSelect0(v, config) 641 case OpSelect1: 642 return rewriteValueS390X_OpSelect1(v, config) 643 case OpSignExt16to32: 644 return rewriteValueS390X_OpSignExt16to32(v, config) 645 case OpSignExt16to64: 646 return rewriteValueS390X_OpSignExt16to64(v, config) 647 case OpSignExt32to64: 648 return rewriteValueS390X_OpSignExt32to64(v, config) 649 case OpSignExt8to16: 650 return rewriteValueS390X_OpSignExt8to16(v, config) 651 case OpSignExt8to32: 652 return rewriteValueS390X_OpSignExt8to32(v, config) 653 case OpSignExt8to64: 654 return rewriteValueS390X_OpSignExt8to64(v, config) 655 case OpSlicemask: 656 return rewriteValueS390X_OpSlicemask(v, config) 657 case OpSqrt: 658 return rewriteValueS390X_OpSqrt(v, config) 659 case OpStaticCall: 660 return rewriteValueS390X_OpStaticCall(v, config) 661 case OpStore: 662 return rewriteValueS390X_OpStore(v, config) 663 case OpSub16: 664 return rewriteValueS390X_OpSub16(v, config) 665 case OpSub32: 666 return rewriteValueS390X_OpSub32(v, config) 667 case OpSub32F: 668 return rewriteValueS390X_OpSub32F(v, config) 669 case OpSub64: 670 return rewriteValueS390X_OpSub64(v, config) 671 case OpSub64F: 672 return rewriteValueS390X_OpSub64F(v, config) 673 case OpSub8: 674 return rewriteValueS390X_OpSub8(v, config) 675 case OpSubPtr: 676 return rewriteValueS390X_OpSubPtr(v, config) 677 case OpTrunc16to8: 678 return rewriteValueS390X_OpTrunc16to8(v, config) 679 case OpTrunc32to16: 680 return rewriteValueS390X_OpTrunc32to16(v, config) 681 case OpTrunc32to8: 682 return rewriteValueS390X_OpTrunc32to8(v, config) 683 case OpTrunc64to16: 684 return rewriteValueS390X_OpTrunc64to16(v, config) 685 case OpTrunc64to32: 686 return rewriteValueS390X_OpTrunc64to32(v, config) 687 case OpTrunc64to8: 688 return rewriteValueS390X_OpTrunc64to8(v, config) 689 case OpXor16: 690 return rewriteValueS390X_OpXor16(v, config) 691 case OpXor32: 692 return rewriteValueS390X_OpXor32(v, config) 693 case OpXor64: 694 return rewriteValueS390X_OpXor64(v, config) 695 case OpXor8: 696 return rewriteValueS390X_OpXor8(v, config) 697 case OpZero: 698 return rewriteValueS390X_OpZero(v, config) 699 case OpZeroExt16to32: 700 return rewriteValueS390X_OpZeroExt16to32(v, config) 701 case OpZeroExt16to64: 702 return rewriteValueS390X_OpZeroExt16to64(v, config) 703 case OpZeroExt32to64: 704 return rewriteValueS390X_OpZeroExt32to64(v, config) 705 case OpZeroExt8to16: 706 return rewriteValueS390X_OpZeroExt8to16(v, config) 707 case OpZeroExt8to32: 708 return rewriteValueS390X_OpZeroExt8to32(v, config) 709 case OpZeroExt8to64: 710 return rewriteValueS390X_OpZeroExt8to64(v, config) 711 } 712 return false 713 } 714 func rewriteValueS390X_OpAdd16(v *Value, config *Config) bool { 715 b := v.Block 716 _ = b 717 // match: (Add16 x y) 718 // cond: 719 // result: (ADDW x y) 720 for { 721 x := v.Args[0] 722 y := v.Args[1] 723 v.reset(OpS390XADDW) 724 v.AddArg(x) 725 v.AddArg(y) 726 return true 727 } 728 } 729 func rewriteValueS390X_OpAdd32(v *Value, config *Config) bool { 730 b := v.Block 731 _ = b 732 // match: (Add32 x y) 733 // cond: 734 // result: (ADDW x y) 735 for { 736 x := v.Args[0] 737 y := v.Args[1] 738 v.reset(OpS390XADDW) 739 v.AddArg(x) 740 v.AddArg(y) 741 return true 742 } 743 } 744 func rewriteValueS390X_OpAdd32F(v *Value, config *Config) bool { 745 b := v.Block 746 _ = b 747 // match: (Add32F x y) 748 // cond: 749 // result: (FADDS x y) 750 for { 751 x := v.Args[0] 752 y := v.Args[1] 753 v.reset(OpS390XFADDS) 754 v.AddArg(x) 755 v.AddArg(y) 756 return true 757 } 758 } 759 func rewriteValueS390X_OpAdd64(v *Value, config *Config) bool { 760 b := v.Block 761 _ = b 762 // match: (Add64 x y) 763 // cond: 764 // result: (ADD x y) 765 for { 766 x := v.Args[0] 767 y := v.Args[1] 768 v.reset(OpS390XADD) 769 v.AddArg(x) 770 v.AddArg(y) 771 return true 772 } 773 } 774 func rewriteValueS390X_OpAdd64F(v *Value, config *Config) bool { 775 b := v.Block 776 _ = b 777 // match: (Add64F x y) 778 // cond: 779 // result: (FADD x y) 780 for { 781 x := v.Args[0] 782 y := v.Args[1] 783 v.reset(OpS390XFADD) 784 v.AddArg(x) 785 v.AddArg(y) 786 return true 787 } 788 } 789 func rewriteValueS390X_OpAdd8(v *Value, config *Config) bool { 790 b := v.Block 791 _ = b 792 // match: (Add8 x y) 793 // cond: 794 // result: (ADDW x y) 795 for { 796 x := v.Args[0] 797 y := v.Args[1] 798 v.reset(OpS390XADDW) 799 v.AddArg(x) 800 v.AddArg(y) 801 return true 802 } 803 } 804 func rewriteValueS390X_OpAddPtr(v *Value, config *Config) bool { 805 b := v.Block 806 _ = b 807 // match: (AddPtr x y) 808 // cond: 809 // result: (ADD x y) 810 for { 811 x := v.Args[0] 812 y := v.Args[1] 813 v.reset(OpS390XADD) 814 v.AddArg(x) 815 v.AddArg(y) 816 return true 817 } 818 } 819 func rewriteValueS390X_OpAddr(v *Value, config *Config) bool { 820 b := v.Block 821 _ = b 822 // match: (Addr {sym} base) 823 // cond: 824 // result: (MOVDaddr {sym} base) 825 for { 826 sym := v.Aux 827 base := v.Args[0] 828 v.reset(OpS390XMOVDaddr) 829 v.Aux = sym 830 v.AddArg(base) 831 return true 832 } 833 } 834 func rewriteValueS390X_OpAnd16(v *Value, config *Config) bool { 835 b := v.Block 836 _ = b 837 // match: (And16 x y) 838 // cond: 839 // result: (ANDW x y) 840 for { 841 x := v.Args[0] 842 y := v.Args[1] 843 v.reset(OpS390XANDW) 844 v.AddArg(x) 845 v.AddArg(y) 846 return true 847 } 848 } 849 func rewriteValueS390X_OpAnd32(v *Value, config *Config) bool { 850 b := v.Block 851 _ = b 852 // match: (And32 x y) 853 // cond: 854 // result: (ANDW x y) 855 for { 856 x := v.Args[0] 857 y := v.Args[1] 858 v.reset(OpS390XANDW) 859 v.AddArg(x) 860 v.AddArg(y) 861 return true 862 } 863 } 864 func rewriteValueS390X_OpAnd64(v *Value, config *Config) bool { 865 b := v.Block 866 _ = b 867 // match: (And64 x y) 868 // cond: 869 // result: (AND x y) 870 for { 871 x := v.Args[0] 872 y := v.Args[1] 873 v.reset(OpS390XAND) 874 v.AddArg(x) 875 v.AddArg(y) 876 return true 877 } 878 } 879 func rewriteValueS390X_OpAnd8(v *Value, config *Config) bool { 880 b := v.Block 881 _ = b 882 // match: (And8 x y) 883 // cond: 884 // result: (ANDW x y) 885 for { 886 x := v.Args[0] 887 y := v.Args[1] 888 v.reset(OpS390XANDW) 889 v.AddArg(x) 890 v.AddArg(y) 891 return true 892 } 893 } 894 func rewriteValueS390X_OpAndB(v *Value, config *Config) bool { 895 b := v.Block 896 _ = b 897 // match: (AndB x y) 898 // cond: 899 // result: (ANDW x y) 900 for { 901 x := v.Args[0] 902 y := v.Args[1] 903 v.reset(OpS390XANDW) 904 v.AddArg(x) 905 v.AddArg(y) 906 return true 907 } 908 } 909 func rewriteValueS390X_OpAtomicAdd32(v *Value, config *Config) bool { 910 b := v.Block 911 _ = b 912 // match: (AtomicAdd32 ptr val mem) 913 // cond: 914 // result: (AddTupleFirst32 (LAA ptr val mem) val) 915 for { 916 ptr := v.Args[0] 917 val := v.Args[1] 918 mem := v.Args[2] 919 v.reset(OpS390XAddTupleFirst32) 920 v0 := b.NewValue0(v.Line, OpS390XLAA, MakeTuple(config.fe.TypeUInt32(), TypeMem)) 921 v0.AddArg(ptr) 922 v0.AddArg(val) 923 v0.AddArg(mem) 924 v.AddArg(v0) 925 v.AddArg(val) 926 return true 927 } 928 } 929 func rewriteValueS390X_OpAtomicAdd64(v *Value, config *Config) bool { 930 b := v.Block 931 _ = b 932 // match: (AtomicAdd64 ptr val mem) 933 // cond: 934 // result: (AddTupleFirst64 (LAAG ptr val mem) val) 935 for { 936 ptr := v.Args[0] 937 val := v.Args[1] 938 mem := v.Args[2] 939 v.reset(OpS390XAddTupleFirst64) 940 v0 := b.NewValue0(v.Line, OpS390XLAAG, MakeTuple(config.fe.TypeUInt64(), TypeMem)) 941 v0.AddArg(ptr) 942 v0.AddArg(val) 943 v0.AddArg(mem) 944 v.AddArg(v0) 945 v.AddArg(val) 946 return true 947 } 948 } 949 func rewriteValueS390X_OpAtomicCompareAndSwap32(v *Value, config *Config) bool { 950 b := v.Block 951 _ = b 952 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 953 // cond: 954 // result: (LoweredAtomicCas32 ptr old new_ mem) 955 for { 956 ptr := v.Args[0] 957 old := v.Args[1] 958 new_ := v.Args[2] 959 mem := v.Args[3] 960 v.reset(OpS390XLoweredAtomicCas32) 961 v.AddArg(ptr) 962 v.AddArg(old) 963 v.AddArg(new_) 964 v.AddArg(mem) 965 return true 966 } 967 } 968 func rewriteValueS390X_OpAtomicCompareAndSwap64(v *Value, config *Config) bool { 969 b := v.Block 970 _ = b 971 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 972 // cond: 973 // result: (LoweredAtomicCas64 ptr old new_ mem) 974 for { 975 ptr := v.Args[0] 976 old := v.Args[1] 977 new_ := v.Args[2] 978 mem := v.Args[3] 979 v.reset(OpS390XLoweredAtomicCas64) 980 v.AddArg(ptr) 981 v.AddArg(old) 982 v.AddArg(new_) 983 v.AddArg(mem) 984 return true 985 } 986 } 987 func rewriteValueS390X_OpAtomicExchange32(v *Value, config *Config) bool { 988 b := v.Block 989 _ = b 990 // match: (AtomicExchange32 ptr val mem) 991 // cond: 992 // result: (LoweredAtomicExchange32 ptr val mem) 993 for { 994 ptr := v.Args[0] 995 val := v.Args[1] 996 mem := v.Args[2] 997 v.reset(OpS390XLoweredAtomicExchange32) 998 v.AddArg(ptr) 999 v.AddArg(val) 1000 v.AddArg(mem) 1001 return true 1002 } 1003 } 1004 func rewriteValueS390X_OpAtomicExchange64(v *Value, config *Config) bool { 1005 b := v.Block 1006 _ = b 1007 // match: (AtomicExchange64 ptr val mem) 1008 // cond: 1009 // result: (LoweredAtomicExchange64 ptr val mem) 1010 for { 1011 ptr := v.Args[0] 1012 val := v.Args[1] 1013 mem := v.Args[2] 1014 v.reset(OpS390XLoweredAtomicExchange64) 1015 v.AddArg(ptr) 1016 v.AddArg(val) 1017 v.AddArg(mem) 1018 return true 1019 } 1020 } 1021 func rewriteValueS390X_OpAtomicLoad32(v *Value, config *Config) bool { 1022 b := v.Block 1023 _ = b 1024 // match: (AtomicLoad32 ptr mem) 1025 // cond: 1026 // result: (MOVWZatomicload ptr mem) 1027 for { 1028 ptr := v.Args[0] 1029 mem := v.Args[1] 1030 v.reset(OpS390XMOVWZatomicload) 1031 v.AddArg(ptr) 1032 v.AddArg(mem) 1033 return true 1034 } 1035 } 1036 func rewriteValueS390X_OpAtomicLoad64(v *Value, config *Config) bool { 1037 b := v.Block 1038 _ = b 1039 // match: (AtomicLoad64 ptr mem) 1040 // cond: 1041 // result: (MOVDatomicload ptr mem) 1042 for { 1043 ptr := v.Args[0] 1044 mem := v.Args[1] 1045 v.reset(OpS390XMOVDatomicload) 1046 v.AddArg(ptr) 1047 v.AddArg(mem) 1048 return true 1049 } 1050 } 1051 func rewriteValueS390X_OpAtomicLoadPtr(v *Value, config *Config) bool { 1052 b := v.Block 1053 _ = b 1054 // match: (AtomicLoadPtr ptr mem) 1055 // cond: 1056 // result: (MOVDatomicload ptr mem) 1057 for { 1058 ptr := v.Args[0] 1059 mem := v.Args[1] 1060 v.reset(OpS390XMOVDatomicload) 1061 v.AddArg(ptr) 1062 v.AddArg(mem) 1063 return true 1064 } 1065 } 1066 func rewriteValueS390X_OpAtomicStore32(v *Value, config *Config) bool { 1067 b := v.Block 1068 _ = b 1069 // match: (AtomicStore32 ptr val mem) 1070 // cond: 1071 // result: (MOVWatomicstore ptr val mem) 1072 for { 1073 ptr := v.Args[0] 1074 val := v.Args[1] 1075 mem := v.Args[2] 1076 v.reset(OpS390XMOVWatomicstore) 1077 v.AddArg(ptr) 1078 v.AddArg(val) 1079 v.AddArg(mem) 1080 return true 1081 } 1082 } 1083 func rewriteValueS390X_OpAtomicStore64(v *Value, config *Config) bool { 1084 b := v.Block 1085 _ = b 1086 // match: (AtomicStore64 ptr val mem) 1087 // cond: 1088 // result: (MOVDatomicstore ptr val mem) 1089 for { 1090 ptr := v.Args[0] 1091 val := v.Args[1] 1092 mem := v.Args[2] 1093 v.reset(OpS390XMOVDatomicstore) 1094 v.AddArg(ptr) 1095 v.AddArg(val) 1096 v.AddArg(mem) 1097 return true 1098 } 1099 } 1100 func rewriteValueS390X_OpAtomicStorePtrNoWB(v *Value, config *Config) bool { 1101 b := v.Block 1102 _ = b 1103 // match: (AtomicStorePtrNoWB ptr val mem) 1104 // cond: 1105 // result: (MOVDatomicstore ptr val mem) 1106 for { 1107 ptr := v.Args[0] 1108 val := v.Args[1] 1109 mem := v.Args[2] 1110 v.reset(OpS390XMOVDatomicstore) 1111 v.AddArg(ptr) 1112 v.AddArg(val) 1113 v.AddArg(mem) 1114 return true 1115 } 1116 } 1117 func rewriteValueS390X_OpAvg64u(v *Value, config *Config) bool { 1118 b := v.Block 1119 _ = b 1120 // match: (Avg64u <t> x y) 1121 // cond: 1122 // result: (ADD (ADD <t> (SRDconst <t> x [1]) (SRDconst <t> y [1])) (ANDconst <t> (AND <t> x y) [1])) 1123 for { 1124 t := v.Type 1125 x := v.Args[0] 1126 y := v.Args[1] 1127 v.reset(OpS390XADD) 1128 v0 := b.NewValue0(v.Line, OpS390XADD, t) 1129 v1 := b.NewValue0(v.Line, OpS390XSRDconst, t) 1130 v1.AuxInt = 1 1131 v1.AddArg(x) 1132 v0.AddArg(v1) 1133 v2 := b.NewValue0(v.Line, OpS390XSRDconst, t) 1134 v2.AuxInt = 1 1135 v2.AddArg(y) 1136 v0.AddArg(v2) 1137 v.AddArg(v0) 1138 v3 := b.NewValue0(v.Line, OpS390XANDconst, t) 1139 v3.AuxInt = 1 1140 v4 := b.NewValue0(v.Line, OpS390XAND, t) 1141 v4.AddArg(x) 1142 v4.AddArg(y) 1143 v3.AddArg(v4) 1144 v.AddArg(v3) 1145 return true 1146 } 1147 } 1148 func rewriteValueS390X_OpBswap32(v *Value, config *Config) bool { 1149 b := v.Block 1150 _ = b 1151 // match: (Bswap32 x) 1152 // cond: 1153 // result: (MOVWBR x) 1154 for { 1155 x := v.Args[0] 1156 v.reset(OpS390XMOVWBR) 1157 v.AddArg(x) 1158 return true 1159 } 1160 } 1161 func rewriteValueS390X_OpBswap64(v *Value, config *Config) bool { 1162 b := v.Block 1163 _ = b 1164 // match: (Bswap64 x) 1165 // cond: 1166 // result: (MOVDBR x) 1167 for { 1168 x := v.Args[0] 1169 v.reset(OpS390XMOVDBR) 1170 v.AddArg(x) 1171 return true 1172 } 1173 } 1174 func rewriteValueS390X_OpClosureCall(v *Value, config *Config) bool { 1175 b := v.Block 1176 _ = b 1177 // match: (ClosureCall [argwid] entry closure mem) 1178 // cond: 1179 // result: (CALLclosure [argwid] entry closure mem) 1180 for { 1181 argwid := v.AuxInt 1182 entry := v.Args[0] 1183 closure := v.Args[1] 1184 mem := v.Args[2] 1185 v.reset(OpS390XCALLclosure) 1186 v.AuxInt = argwid 1187 v.AddArg(entry) 1188 v.AddArg(closure) 1189 v.AddArg(mem) 1190 return true 1191 } 1192 } 1193 func rewriteValueS390X_OpCom16(v *Value, config *Config) bool { 1194 b := v.Block 1195 _ = b 1196 // match: (Com16 x) 1197 // cond: 1198 // result: (NOTW x) 1199 for { 1200 x := v.Args[0] 1201 v.reset(OpS390XNOTW) 1202 v.AddArg(x) 1203 return true 1204 } 1205 } 1206 func rewriteValueS390X_OpCom32(v *Value, config *Config) bool { 1207 b := v.Block 1208 _ = b 1209 // match: (Com32 x) 1210 // cond: 1211 // result: (NOTW x) 1212 for { 1213 x := v.Args[0] 1214 v.reset(OpS390XNOTW) 1215 v.AddArg(x) 1216 return true 1217 } 1218 } 1219 func rewriteValueS390X_OpCom64(v *Value, config *Config) bool { 1220 b := v.Block 1221 _ = b 1222 // match: (Com64 x) 1223 // cond: 1224 // result: (NOT x) 1225 for { 1226 x := v.Args[0] 1227 v.reset(OpS390XNOT) 1228 v.AddArg(x) 1229 return true 1230 } 1231 } 1232 func rewriteValueS390X_OpCom8(v *Value, config *Config) bool { 1233 b := v.Block 1234 _ = b 1235 // match: (Com8 x) 1236 // cond: 1237 // result: (NOTW x) 1238 for { 1239 x := v.Args[0] 1240 v.reset(OpS390XNOTW) 1241 v.AddArg(x) 1242 return true 1243 } 1244 } 1245 func rewriteValueS390X_OpConst16(v *Value, config *Config) bool { 1246 b := v.Block 1247 _ = b 1248 // match: (Const16 [val]) 1249 // cond: 1250 // result: (MOVDconst [val]) 1251 for { 1252 val := v.AuxInt 1253 v.reset(OpS390XMOVDconst) 1254 v.AuxInt = val 1255 return true 1256 } 1257 } 1258 func rewriteValueS390X_OpConst32(v *Value, config *Config) bool { 1259 b := v.Block 1260 _ = b 1261 // match: (Const32 [val]) 1262 // cond: 1263 // result: (MOVDconst [val]) 1264 for { 1265 val := v.AuxInt 1266 v.reset(OpS390XMOVDconst) 1267 v.AuxInt = val 1268 return true 1269 } 1270 } 1271 func rewriteValueS390X_OpConst32F(v *Value, config *Config) bool { 1272 b := v.Block 1273 _ = b 1274 // match: (Const32F [val]) 1275 // cond: 1276 // result: (FMOVSconst [val]) 1277 for { 1278 val := v.AuxInt 1279 v.reset(OpS390XFMOVSconst) 1280 v.AuxInt = val 1281 return true 1282 } 1283 } 1284 func rewriteValueS390X_OpConst64(v *Value, config *Config) bool { 1285 b := v.Block 1286 _ = b 1287 // match: (Const64 [val]) 1288 // cond: 1289 // result: (MOVDconst [val]) 1290 for { 1291 val := v.AuxInt 1292 v.reset(OpS390XMOVDconst) 1293 v.AuxInt = val 1294 return true 1295 } 1296 } 1297 func rewriteValueS390X_OpConst64F(v *Value, config *Config) bool { 1298 b := v.Block 1299 _ = b 1300 // match: (Const64F [val]) 1301 // cond: 1302 // result: (FMOVDconst [val]) 1303 for { 1304 val := v.AuxInt 1305 v.reset(OpS390XFMOVDconst) 1306 v.AuxInt = val 1307 return true 1308 } 1309 } 1310 func rewriteValueS390X_OpConst8(v *Value, config *Config) bool { 1311 b := v.Block 1312 _ = b 1313 // match: (Const8 [val]) 1314 // cond: 1315 // result: (MOVDconst [val]) 1316 for { 1317 val := v.AuxInt 1318 v.reset(OpS390XMOVDconst) 1319 v.AuxInt = val 1320 return true 1321 } 1322 } 1323 func rewriteValueS390X_OpConstBool(v *Value, config *Config) bool { 1324 b := v.Block 1325 _ = b 1326 // match: (ConstBool [b]) 1327 // cond: 1328 // result: (MOVDconst [b]) 1329 for { 1330 b := v.AuxInt 1331 v.reset(OpS390XMOVDconst) 1332 v.AuxInt = b 1333 return true 1334 } 1335 } 1336 func rewriteValueS390X_OpConstNil(v *Value, config *Config) bool { 1337 b := v.Block 1338 _ = b 1339 // match: (ConstNil) 1340 // cond: 1341 // result: (MOVDconst [0]) 1342 for { 1343 v.reset(OpS390XMOVDconst) 1344 v.AuxInt = 0 1345 return true 1346 } 1347 } 1348 func rewriteValueS390X_OpConvert(v *Value, config *Config) bool { 1349 b := v.Block 1350 _ = b 1351 // match: (Convert <t> x mem) 1352 // cond: 1353 // result: (MOVDconvert <t> x mem) 1354 for { 1355 t := v.Type 1356 x := v.Args[0] 1357 mem := v.Args[1] 1358 v.reset(OpS390XMOVDconvert) 1359 v.Type = t 1360 v.AddArg(x) 1361 v.AddArg(mem) 1362 return true 1363 } 1364 } 1365 func rewriteValueS390X_OpCtz32(v *Value, config *Config) bool { 1366 b := v.Block 1367 _ = b 1368 // match: (Ctz32 <t> x) 1369 // cond: 1370 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1371 for { 1372 t := v.Type 1373 x := v.Args[0] 1374 v.reset(OpS390XSUB) 1375 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1376 v0.AuxInt = 64 1377 v.AddArg(v0) 1378 v1 := b.NewValue0(v.Line, OpS390XFLOGR, config.fe.TypeUInt64()) 1379 v2 := b.NewValue0(v.Line, OpS390XMOVWZreg, config.fe.TypeUInt64()) 1380 v3 := b.NewValue0(v.Line, OpS390XANDW, t) 1381 v4 := b.NewValue0(v.Line, OpS390XSUBWconst, t) 1382 v4.AuxInt = 1 1383 v4.AddArg(x) 1384 v3.AddArg(v4) 1385 v5 := b.NewValue0(v.Line, OpS390XNOTW, t) 1386 v5.AddArg(x) 1387 v3.AddArg(v5) 1388 v2.AddArg(v3) 1389 v1.AddArg(v2) 1390 v.AddArg(v1) 1391 return true 1392 } 1393 } 1394 func rewriteValueS390X_OpCtz64(v *Value, config *Config) bool { 1395 b := v.Block 1396 _ = b 1397 // match: (Ctz64 <t> x) 1398 // cond: 1399 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1400 for { 1401 t := v.Type 1402 x := v.Args[0] 1403 v.reset(OpS390XSUB) 1404 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1405 v0.AuxInt = 64 1406 v.AddArg(v0) 1407 v1 := b.NewValue0(v.Line, OpS390XFLOGR, config.fe.TypeUInt64()) 1408 v2 := b.NewValue0(v.Line, OpS390XAND, t) 1409 v3 := b.NewValue0(v.Line, OpS390XSUBconst, t) 1410 v3.AuxInt = 1 1411 v3.AddArg(x) 1412 v2.AddArg(v3) 1413 v4 := b.NewValue0(v.Line, OpS390XNOT, t) 1414 v4.AddArg(x) 1415 v2.AddArg(v4) 1416 v1.AddArg(v2) 1417 v.AddArg(v1) 1418 return true 1419 } 1420 } 1421 func rewriteValueS390X_OpCvt32Fto32(v *Value, config *Config) bool { 1422 b := v.Block 1423 _ = b 1424 // match: (Cvt32Fto32 x) 1425 // cond: 1426 // result: (CFEBRA x) 1427 for { 1428 x := v.Args[0] 1429 v.reset(OpS390XCFEBRA) 1430 v.AddArg(x) 1431 return true 1432 } 1433 } 1434 func rewriteValueS390X_OpCvt32Fto64(v *Value, config *Config) bool { 1435 b := v.Block 1436 _ = b 1437 // match: (Cvt32Fto64 x) 1438 // cond: 1439 // result: (CGEBRA x) 1440 for { 1441 x := v.Args[0] 1442 v.reset(OpS390XCGEBRA) 1443 v.AddArg(x) 1444 return true 1445 } 1446 } 1447 func rewriteValueS390X_OpCvt32Fto64F(v *Value, config *Config) bool { 1448 b := v.Block 1449 _ = b 1450 // match: (Cvt32Fto64F x) 1451 // cond: 1452 // result: (LDEBR x) 1453 for { 1454 x := v.Args[0] 1455 v.reset(OpS390XLDEBR) 1456 v.AddArg(x) 1457 return true 1458 } 1459 } 1460 func rewriteValueS390X_OpCvt32to32F(v *Value, config *Config) bool { 1461 b := v.Block 1462 _ = b 1463 // match: (Cvt32to32F x) 1464 // cond: 1465 // result: (CEFBRA x) 1466 for { 1467 x := v.Args[0] 1468 v.reset(OpS390XCEFBRA) 1469 v.AddArg(x) 1470 return true 1471 } 1472 } 1473 func rewriteValueS390X_OpCvt32to64F(v *Value, config *Config) bool { 1474 b := v.Block 1475 _ = b 1476 // match: (Cvt32to64F x) 1477 // cond: 1478 // result: (CDFBRA x) 1479 for { 1480 x := v.Args[0] 1481 v.reset(OpS390XCDFBRA) 1482 v.AddArg(x) 1483 return true 1484 } 1485 } 1486 func rewriteValueS390X_OpCvt64Fto32(v *Value, config *Config) bool { 1487 b := v.Block 1488 _ = b 1489 // match: (Cvt64Fto32 x) 1490 // cond: 1491 // result: (CFDBRA x) 1492 for { 1493 x := v.Args[0] 1494 v.reset(OpS390XCFDBRA) 1495 v.AddArg(x) 1496 return true 1497 } 1498 } 1499 func rewriteValueS390X_OpCvt64Fto32F(v *Value, config *Config) bool { 1500 b := v.Block 1501 _ = b 1502 // match: (Cvt64Fto32F x) 1503 // cond: 1504 // result: (LEDBR x) 1505 for { 1506 x := v.Args[0] 1507 v.reset(OpS390XLEDBR) 1508 v.AddArg(x) 1509 return true 1510 } 1511 } 1512 func rewriteValueS390X_OpCvt64Fto64(v *Value, config *Config) bool { 1513 b := v.Block 1514 _ = b 1515 // match: (Cvt64Fto64 x) 1516 // cond: 1517 // result: (CGDBRA x) 1518 for { 1519 x := v.Args[0] 1520 v.reset(OpS390XCGDBRA) 1521 v.AddArg(x) 1522 return true 1523 } 1524 } 1525 func rewriteValueS390X_OpCvt64to32F(v *Value, config *Config) bool { 1526 b := v.Block 1527 _ = b 1528 // match: (Cvt64to32F x) 1529 // cond: 1530 // result: (CEGBRA x) 1531 for { 1532 x := v.Args[0] 1533 v.reset(OpS390XCEGBRA) 1534 v.AddArg(x) 1535 return true 1536 } 1537 } 1538 func rewriteValueS390X_OpCvt64to64F(v *Value, config *Config) bool { 1539 b := v.Block 1540 _ = b 1541 // match: (Cvt64to64F x) 1542 // cond: 1543 // result: (CDGBRA x) 1544 for { 1545 x := v.Args[0] 1546 v.reset(OpS390XCDGBRA) 1547 v.AddArg(x) 1548 return true 1549 } 1550 } 1551 func rewriteValueS390X_OpDeferCall(v *Value, config *Config) bool { 1552 b := v.Block 1553 _ = b 1554 // match: (DeferCall [argwid] mem) 1555 // cond: 1556 // result: (CALLdefer [argwid] mem) 1557 for { 1558 argwid := v.AuxInt 1559 mem := v.Args[0] 1560 v.reset(OpS390XCALLdefer) 1561 v.AuxInt = argwid 1562 v.AddArg(mem) 1563 return true 1564 } 1565 } 1566 func rewriteValueS390X_OpDiv16(v *Value, config *Config) bool { 1567 b := v.Block 1568 _ = b 1569 // match: (Div16 x y) 1570 // cond: 1571 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1572 for { 1573 x := v.Args[0] 1574 y := v.Args[1] 1575 v.reset(OpS390XDIVW) 1576 v0 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 1577 v0.AddArg(x) 1578 v.AddArg(v0) 1579 v1 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 1580 v1.AddArg(y) 1581 v.AddArg(v1) 1582 return true 1583 } 1584 } 1585 func rewriteValueS390X_OpDiv16u(v *Value, config *Config) bool { 1586 b := v.Block 1587 _ = b 1588 // match: (Div16u x y) 1589 // cond: 1590 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1591 for { 1592 x := v.Args[0] 1593 y := v.Args[1] 1594 v.reset(OpS390XDIVWU) 1595 v0 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 1596 v0.AddArg(x) 1597 v.AddArg(v0) 1598 v1 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 1599 v1.AddArg(y) 1600 v.AddArg(v1) 1601 return true 1602 } 1603 } 1604 func rewriteValueS390X_OpDiv32(v *Value, config *Config) bool { 1605 b := v.Block 1606 _ = b 1607 // match: (Div32 x y) 1608 // cond: 1609 // result: (DIVW (MOVWreg x) y) 1610 for { 1611 x := v.Args[0] 1612 y := v.Args[1] 1613 v.reset(OpS390XDIVW) 1614 v0 := b.NewValue0(v.Line, OpS390XMOVWreg, config.fe.TypeInt64()) 1615 v0.AddArg(x) 1616 v.AddArg(v0) 1617 v.AddArg(y) 1618 return true 1619 } 1620 } 1621 func rewriteValueS390X_OpDiv32F(v *Value, config *Config) bool { 1622 b := v.Block 1623 _ = b 1624 // match: (Div32F x y) 1625 // cond: 1626 // result: (FDIVS x y) 1627 for { 1628 x := v.Args[0] 1629 y := v.Args[1] 1630 v.reset(OpS390XFDIVS) 1631 v.AddArg(x) 1632 v.AddArg(y) 1633 return true 1634 } 1635 } 1636 func rewriteValueS390X_OpDiv32u(v *Value, config *Config) bool { 1637 b := v.Block 1638 _ = b 1639 // match: (Div32u x y) 1640 // cond: 1641 // result: (DIVWU (MOVWZreg x) y) 1642 for { 1643 x := v.Args[0] 1644 y := v.Args[1] 1645 v.reset(OpS390XDIVWU) 1646 v0 := b.NewValue0(v.Line, OpS390XMOVWZreg, config.fe.TypeUInt64()) 1647 v0.AddArg(x) 1648 v.AddArg(v0) 1649 v.AddArg(y) 1650 return true 1651 } 1652 } 1653 func rewriteValueS390X_OpDiv64(v *Value, config *Config) bool { 1654 b := v.Block 1655 _ = b 1656 // match: (Div64 x y) 1657 // cond: 1658 // result: (DIVD x y) 1659 for { 1660 x := v.Args[0] 1661 y := v.Args[1] 1662 v.reset(OpS390XDIVD) 1663 v.AddArg(x) 1664 v.AddArg(y) 1665 return true 1666 } 1667 } 1668 func rewriteValueS390X_OpDiv64F(v *Value, config *Config) bool { 1669 b := v.Block 1670 _ = b 1671 // match: (Div64F x y) 1672 // cond: 1673 // result: (FDIV x y) 1674 for { 1675 x := v.Args[0] 1676 y := v.Args[1] 1677 v.reset(OpS390XFDIV) 1678 v.AddArg(x) 1679 v.AddArg(y) 1680 return true 1681 } 1682 } 1683 func rewriteValueS390X_OpDiv64u(v *Value, config *Config) bool { 1684 b := v.Block 1685 _ = b 1686 // match: (Div64u x y) 1687 // cond: 1688 // result: (DIVDU x y) 1689 for { 1690 x := v.Args[0] 1691 y := v.Args[1] 1692 v.reset(OpS390XDIVDU) 1693 v.AddArg(x) 1694 v.AddArg(y) 1695 return true 1696 } 1697 } 1698 func rewriteValueS390X_OpDiv8(v *Value, config *Config) bool { 1699 b := v.Block 1700 _ = b 1701 // match: (Div8 x y) 1702 // cond: 1703 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1704 for { 1705 x := v.Args[0] 1706 y := v.Args[1] 1707 v.reset(OpS390XDIVW) 1708 v0 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 1709 v0.AddArg(x) 1710 v.AddArg(v0) 1711 v1 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 1712 v1.AddArg(y) 1713 v.AddArg(v1) 1714 return true 1715 } 1716 } 1717 func rewriteValueS390X_OpDiv8u(v *Value, config *Config) bool { 1718 b := v.Block 1719 _ = b 1720 // match: (Div8u x y) 1721 // cond: 1722 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1723 for { 1724 x := v.Args[0] 1725 y := v.Args[1] 1726 v.reset(OpS390XDIVWU) 1727 v0 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 1728 v0.AddArg(x) 1729 v.AddArg(v0) 1730 v1 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 1731 v1.AddArg(y) 1732 v.AddArg(v1) 1733 return true 1734 } 1735 } 1736 func rewriteValueS390X_OpEq16(v *Value, config *Config) bool { 1737 b := v.Block 1738 _ = b 1739 // match: (Eq16 x y) 1740 // cond: 1741 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1742 for { 1743 x := v.Args[0] 1744 y := v.Args[1] 1745 v.reset(OpS390XMOVDEQ) 1746 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1747 v0.AuxInt = 0 1748 v.AddArg(v0) 1749 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1750 v1.AuxInt = 1 1751 v.AddArg(v1) 1752 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 1753 v3 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 1754 v3.AddArg(x) 1755 v2.AddArg(v3) 1756 v4 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 1757 v4.AddArg(y) 1758 v2.AddArg(v4) 1759 v.AddArg(v2) 1760 return true 1761 } 1762 } 1763 func rewriteValueS390X_OpEq32(v *Value, config *Config) bool { 1764 b := v.Block 1765 _ = b 1766 // match: (Eq32 x y) 1767 // cond: 1768 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1769 for { 1770 x := v.Args[0] 1771 y := v.Args[1] 1772 v.reset(OpS390XMOVDEQ) 1773 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1774 v0.AuxInt = 0 1775 v.AddArg(v0) 1776 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1777 v1.AuxInt = 1 1778 v.AddArg(v1) 1779 v2 := b.NewValue0(v.Line, OpS390XCMPW, TypeFlags) 1780 v2.AddArg(x) 1781 v2.AddArg(y) 1782 v.AddArg(v2) 1783 return true 1784 } 1785 } 1786 func rewriteValueS390X_OpEq32F(v *Value, config *Config) bool { 1787 b := v.Block 1788 _ = b 1789 // match: (Eq32F x y) 1790 // cond: 1791 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1792 for { 1793 x := v.Args[0] 1794 y := v.Args[1] 1795 v.reset(OpS390XMOVDEQ) 1796 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1797 v0.AuxInt = 0 1798 v.AddArg(v0) 1799 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1800 v1.AuxInt = 1 1801 v.AddArg(v1) 1802 v2 := b.NewValue0(v.Line, OpS390XFCMPS, TypeFlags) 1803 v2.AddArg(x) 1804 v2.AddArg(y) 1805 v.AddArg(v2) 1806 return true 1807 } 1808 } 1809 func rewriteValueS390X_OpEq64(v *Value, config *Config) bool { 1810 b := v.Block 1811 _ = b 1812 // match: (Eq64 x y) 1813 // cond: 1814 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1815 for { 1816 x := v.Args[0] 1817 y := v.Args[1] 1818 v.reset(OpS390XMOVDEQ) 1819 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1820 v0.AuxInt = 0 1821 v.AddArg(v0) 1822 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1823 v1.AuxInt = 1 1824 v.AddArg(v1) 1825 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 1826 v2.AddArg(x) 1827 v2.AddArg(y) 1828 v.AddArg(v2) 1829 return true 1830 } 1831 } 1832 func rewriteValueS390X_OpEq64F(v *Value, config *Config) bool { 1833 b := v.Block 1834 _ = b 1835 // match: (Eq64F x y) 1836 // cond: 1837 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1838 for { 1839 x := v.Args[0] 1840 y := v.Args[1] 1841 v.reset(OpS390XMOVDEQ) 1842 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1843 v0.AuxInt = 0 1844 v.AddArg(v0) 1845 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1846 v1.AuxInt = 1 1847 v.AddArg(v1) 1848 v2 := b.NewValue0(v.Line, OpS390XFCMP, TypeFlags) 1849 v2.AddArg(x) 1850 v2.AddArg(y) 1851 v.AddArg(v2) 1852 return true 1853 } 1854 } 1855 func rewriteValueS390X_OpEq8(v *Value, config *Config) bool { 1856 b := v.Block 1857 _ = b 1858 // match: (Eq8 x y) 1859 // cond: 1860 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1861 for { 1862 x := v.Args[0] 1863 y := v.Args[1] 1864 v.reset(OpS390XMOVDEQ) 1865 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1866 v0.AuxInt = 0 1867 v.AddArg(v0) 1868 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1869 v1.AuxInt = 1 1870 v.AddArg(v1) 1871 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 1872 v3 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 1873 v3.AddArg(x) 1874 v2.AddArg(v3) 1875 v4 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 1876 v4.AddArg(y) 1877 v2.AddArg(v4) 1878 v.AddArg(v2) 1879 return true 1880 } 1881 } 1882 func rewriteValueS390X_OpEqB(v *Value, config *Config) bool { 1883 b := v.Block 1884 _ = b 1885 // match: (EqB x y) 1886 // cond: 1887 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1888 for { 1889 x := v.Args[0] 1890 y := v.Args[1] 1891 v.reset(OpS390XMOVDEQ) 1892 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1893 v0.AuxInt = 0 1894 v.AddArg(v0) 1895 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1896 v1.AuxInt = 1 1897 v.AddArg(v1) 1898 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 1899 v3 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 1900 v3.AddArg(x) 1901 v2.AddArg(v3) 1902 v4 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 1903 v4.AddArg(y) 1904 v2.AddArg(v4) 1905 v.AddArg(v2) 1906 return true 1907 } 1908 } 1909 func rewriteValueS390X_OpEqPtr(v *Value, config *Config) bool { 1910 b := v.Block 1911 _ = b 1912 // match: (EqPtr x y) 1913 // cond: 1914 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1915 for { 1916 x := v.Args[0] 1917 y := v.Args[1] 1918 v.reset(OpS390XMOVDEQ) 1919 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1920 v0.AuxInt = 0 1921 v.AddArg(v0) 1922 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1923 v1.AuxInt = 1 1924 v.AddArg(v1) 1925 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 1926 v2.AddArg(x) 1927 v2.AddArg(y) 1928 v.AddArg(v2) 1929 return true 1930 } 1931 } 1932 func rewriteValueS390X_OpGeq16(v *Value, config *Config) bool { 1933 b := v.Block 1934 _ = b 1935 // match: (Geq16 x y) 1936 // cond: 1937 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1938 for { 1939 x := v.Args[0] 1940 y := v.Args[1] 1941 v.reset(OpS390XMOVDGE) 1942 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1943 v0.AuxInt = 0 1944 v.AddArg(v0) 1945 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1946 v1.AuxInt = 1 1947 v.AddArg(v1) 1948 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 1949 v3 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 1950 v3.AddArg(x) 1951 v2.AddArg(v3) 1952 v4 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 1953 v4.AddArg(y) 1954 v2.AddArg(v4) 1955 v.AddArg(v2) 1956 return true 1957 } 1958 } 1959 func rewriteValueS390X_OpGeq16U(v *Value, config *Config) bool { 1960 b := v.Block 1961 _ = b 1962 // match: (Geq16U x y) 1963 // cond: 1964 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 1965 for { 1966 x := v.Args[0] 1967 y := v.Args[1] 1968 v.reset(OpS390XMOVDGE) 1969 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1970 v0.AuxInt = 0 1971 v.AddArg(v0) 1972 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1973 v1.AuxInt = 1 1974 v.AddArg(v1) 1975 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 1976 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 1977 v3.AddArg(x) 1978 v2.AddArg(v3) 1979 v4 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 1980 v4.AddArg(y) 1981 v2.AddArg(v4) 1982 v.AddArg(v2) 1983 return true 1984 } 1985 } 1986 func rewriteValueS390X_OpGeq32(v *Value, config *Config) bool { 1987 b := v.Block 1988 _ = b 1989 // match: (Geq32 x y) 1990 // cond: 1991 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1992 for { 1993 x := v.Args[0] 1994 y := v.Args[1] 1995 v.reset(OpS390XMOVDGE) 1996 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 1997 v0.AuxInt = 0 1998 v.AddArg(v0) 1999 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2000 v1.AuxInt = 1 2001 v.AddArg(v1) 2002 v2 := b.NewValue0(v.Line, OpS390XCMPW, TypeFlags) 2003 v2.AddArg(x) 2004 v2.AddArg(y) 2005 v.AddArg(v2) 2006 return true 2007 } 2008 } 2009 func rewriteValueS390X_OpGeq32F(v *Value, config *Config) bool { 2010 b := v.Block 2011 _ = b 2012 // match: (Geq32F x y) 2013 // cond: 2014 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2015 for { 2016 x := v.Args[0] 2017 y := v.Args[1] 2018 v.reset(OpS390XMOVDGEnoinv) 2019 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2020 v0.AuxInt = 0 2021 v.AddArg(v0) 2022 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2023 v1.AuxInt = 1 2024 v.AddArg(v1) 2025 v2 := b.NewValue0(v.Line, OpS390XFCMPS, TypeFlags) 2026 v2.AddArg(x) 2027 v2.AddArg(y) 2028 v.AddArg(v2) 2029 return true 2030 } 2031 } 2032 func rewriteValueS390X_OpGeq32U(v *Value, config *Config) bool { 2033 b := v.Block 2034 _ = b 2035 // match: (Geq32U x y) 2036 // cond: 2037 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2038 for { 2039 x := v.Args[0] 2040 y := v.Args[1] 2041 v.reset(OpS390XMOVDGE) 2042 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2043 v0.AuxInt = 0 2044 v.AddArg(v0) 2045 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2046 v1.AuxInt = 1 2047 v.AddArg(v1) 2048 v2 := b.NewValue0(v.Line, OpS390XCMPWU, TypeFlags) 2049 v2.AddArg(x) 2050 v2.AddArg(y) 2051 v.AddArg(v2) 2052 return true 2053 } 2054 } 2055 func rewriteValueS390X_OpGeq64(v *Value, config *Config) bool { 2056 b := v.Block 2057 _ = b 2058 // match: (Geq64 x y) 2059 // cond: 2060 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2061 for { 2062 x := v.Args[0] 2063 y := v.Args[1] 2064 v.reset(OpS390XMOVDGE) 2065 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2066 v0.AuxInt = 0 2067 v.AddArg(v0) 2068 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2069 v1.AuxInt = 1 2070 v.AddArg(v1) 2071 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2072 v2.AddArg(x) 2073 v2.AddArg(y) 2074 v.AddArg(v2) 2075 return true 2076 } 2077 } 2078 func rewriteValueS390X_OpGeq64F(v *Value, config *Config) bool { 2079 b := v.Block 2080 _ = b 2081 // match: (Geq64F x y) 2082 // cond: 2083 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2084 for { 2085 x := v.Args[0] 2086 y := v.Args[1] 2087 v.reset(OpS390XMOVDGEnoinv) 2088 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2089 v0.AuxInt = 0 2090 v.AddArg(v0) 2091 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2092 v1.AuxInt = 1 2093 v.AddArg(v1) 2094 v2 := b.NewValue0(v.Line, OpS390XFCMP, TypeFlags) 2095 v2.AddArg(x) 2096 v2.AddArg(y) 2097 v.AddArg(v2) 2098 return true 2099 } 2100 } 2101 func rewriteValueS390X_OpGeq64U(v *Value, config *Config) bool { 2102 b := v.Block 2103 _ = b 2104 // match: (Geq64U x y) 2105 // cond: 2106 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2107 for { 2108 x := v.Args[0] 2109 y := v.Args[1] 2110 v.reset(OpS390XMOVDGE) 2111 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2112 v0.AuxInt = 0 2113 v.AddArg(v0) 2114 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2115 v1.AuxInt = 1 2116 v.AddArg(v1) 2117 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2118 v2.AddArg(x) 2119 v2.AddArg(y) 2120 v.AddArg(v2) 2121 return true 2122 } 2123 } 2124 func rewriteValueS390X_OpGeq8(v *Value, config *Config) bool { 2125 b := v.Block 2126 _ = b 2127 // match: (Geq8 x y) 2128 // cond: 2129 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2130 for { 2131 x := v.Args[0] 2132 y := v.Args[1] 2133 v.reset(OpS390XMOVDGE) 2134 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2135 v0.AuxInt = 0 2136 v.AddArg(v0) 2137 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2138 v1.AuxInt = 1 2139 v.AddArg(v1) 2140 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2141 v3 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 2142 v3.AddArg(x) 2143 v2.AddArg(v3) 2144 v4 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 2145 v4.AddArg(y) 2146 v2.AddArg(v4) 2147 v.AddArg(v2) 2148 return true 2149 } 2150 } 2151 func rewriteValueS390X_OpGeq8U(v *Value, config *Config) bool { 2152 b := v.Block 2153 _ = b 2154 // match: (Geq8U x y) 2155 // cond: 2156 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2157 for { 2158 x := v.Args[0] 2159 y := v.Args[1] 2160 v.reset(OpS390XMOVDGE) 2161 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2162 v0.AuxInt = 0 2163 v.AddArg(v0) 2164 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2165 v1.AuxInt = 1 2166 v.AddArg(v1) 2167 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2168 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 2169 v3.AddArg(x) 2170 v2.AddArg(v3) 2171 v4 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 2172 v4.AddArg(y) 2173 v2.AddArg(v4) 2174 v.AddArg(v2) 2175 return true 2176 } 2177 } 2178 func rewriteValueS390X_OpGetClosurePtr(v *Value, config *Config) bool { 2179 b := v.Block 2180 _ = b 2181 // match: (GetClosurePtr) 2182 // cond: 2183 // result: (LoweredGetClosurePtr) 2184 for { 2185 v.reset(OpS390XLoweredGetClosurePtr) 2186 return true 2187 } 2188 } 2189 func rewriteValueS390X_OpGetG(v *Value, config *Config) bool { 2190 b := v.Block 2191 _ = b 2192 // match: (GetG mem) 2193 // cond: 2194 // result: (LoweredGetG mem) 2195 for { 2196 mem := v.Args[0] 2197 v.reset(OpS390XLoweredGetG) 2198 v.AddArg(mem) 2199 return true 2200 } 2201 } 2202 func rewriteValueS390X_OpGoCall(v *Value, config *Config) bool { 2203 b := v.Block 2204 _ = b 2205 // match: (GoCall [argwid] mem) 2206 // cond: 2207 // result: (CALLgo [argwid] mem) 2208 for { 2209 argwid := v.AuxInt 2210 mem := v.Args[0] 2211 v.reset(OpS390XCALLgo) 2212 v.AuxInt = argwid 2213 v.AddArg(mem) 2214 return true 2215 } 2216 } 2217 func rewriteValueS390X_OpGreater16(v *Value, config *Config) bool { 2218 b := v.Block 2219 _ = b 2220 // match: (Greater16 x y) 2221 // cond: 2222 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2223 for { 2224 x := v.Args[0] 2225 y := v.Args[1] 2226 v.reset(OpS390XMOVDGT) 2227 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2228 v0.AuxInt = 0 2229 v.AddArg(v0) 2230 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2231 v1.AuxInt = 1 2232 v.AddArg(v1) 2233 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2234 v3 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 2235 v3.AddArg(x) 2236 v2.AddArg(v3) 2237 v4 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 2238 v4.AddArg(y) 2239 v2.AddArg(v4) 2240 v.AddArg(v2) 2241 return true 2242 } 2243 } 2244 func rewriteValueS390X_OpGreater16U(v *Value, config *Config) bool { 2245 b := v.Block 2246 _ = b 2247 // match: (Greater16U x y) 2248 // cond: 2249 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2250 for { 2251 x := v.Args[0] 2252 y := v.Args[1] 2253 v.reset(OpS390XMOVDGT) 2254 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2255 v0.AuxInt = 0 2256 v.AddArg(v0) 2257 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2258 v1.AuxInt = 1 2259 v.AddArg(v1) 2260 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2261 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 2262 v3.AddArg(x) 2263 v2.AddArg(v3) 2264 v4 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 2265 v4.AddArg(y) 2266 v2.AddArg(v4) 2267 v.AddArg(v2) 2268 return true 2269 } 2270 } 2271 func rewriteValueS390X_OpGreater32(v *Value, config *Config) bool { 2272 b := v.Block 2273 _ = b 2274 // match: (Greater32 x y) 2275 // cond: 2276 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2277 for { 2278 x := v.Args[0] 2279 y := v.Args[1] 2280 v.reset(OpS390XMOVDGT) 2281 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2282 v0.AuxInt = 0 2283 v.AddArg(v0) 2284 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2285 v1.AuxInt = 1 2286 v.AddArg(v1) 2287 v2 := b.NewValue0(v.Line, OpS390XCMPW, TypeFlags) 2288 v2.AddArg(x) 2289 v2.AddArg(y) 2290 v.AddArg(v2) 2291 return true 2292 } 2293 } 2294 func rewriteValueS390X_OpGreater32F(v *Value, config *Config) bool { 2295 b := v.Block 2296 _ = b 2297 // match: (Greater32F x y) 2298 // cond: 2299 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2300 for { 2301 x := v.Args[0] 2302 y := v.Args[1] 2303 v.reset(OpS390XMOVDGTnoinv) 2304 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2305 v0.AuxInt = 0 2306 v.AddArg(v0) 2307 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2308 v1.AuxInt = 1 2309 v.AddArg(v1) 2310 v2 := b.NewValue0(v.Line, OpS390XFCMPS, TypeFlags) 2311 v2.AddArg(x) 2312 v2.AddArg(y) 2313 v.AddArg(v2) 2314 return true 2315 } 2316 } 2317 func rewriteValueS390X_OpGreater32U(v *Value, config *Config) bool { 2318 b := v.Block 2319 _ = b 2320 // match: (Greater32U x y) 2321 // cond: 2322 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2323 for { 2324 x := v.Args[0] 2325 y := v.Args[1] 2326 v.reset(OpS390XMOVDGT) 2327 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2328 v0.AuxInt = 0 2329 v.AddArg(v0) 2330 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2331 v1.AuxInt = 1 2332 v.AddArg(v1) 2333 v2 := b.NewValue0(v.Line, OpS390XCMPWU, TypeFlags) 2334 v2.AddArg(x) 2335 v2.AddArg(y) 2336 v.AddArg(v2) 2337 return true 2338 } 2339 } 2340 func rewriteValueS390X_OpGreater64(v *Value, config *Config) bool { 2341 b := v.Block 2342 _ = b 2343 // match: (Greater64 x y) 2344 // cond: 2345 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2346 for { 2347 x := v.Args[0] 2348 y := v.Args[1] 2349 v.reset(OpS390XMOVDGT) 2350 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2351 v0.AuxInt = 0 2352 v.AddArg(v0) 2353 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2354 v1.AuxInt = 1 2355 v.AddArg(v1) 2356 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2357 v2.AddArg(x) 2358 v2.AddArg(y) 2359 v.AddArg(v2) 2360 return true 2361 } 2362 } 2363 func rewriteValueS390X_OpGreater64F(v *Value, config *Config) bool { 2364 b := v.Block 2365 _ = b 2366 // match: (Greater64F x y) 2367 // cond: 2368 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2369 for { 2370 x := v.Args[0] 2371 y := v.Args[1] 2372 v.reset(OpS390XMOVDGTnoinv) 2373 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2374 v0.AuxInt = 0 2375 v.AddArg(v0) 2376 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2377 v1.AuxInt = 1 2378 v.AddArg(v1) 2379 v2 := b.NewValue0(v.Line, OpS390XFCMP, TypeFlags) 2380 v2.AddArg(x) 2381 v2.AddArg(y) 2382 v.AddArg(v2) 2383 return true 2384 } 2385 } 2386 func rewriteValueS390X_OpGreater64U(v *Value, config *Config) bool { 2387 b := v.Block 2388 _ = b 2389 // match: (Greater64U x y) 2390 // cond: 2391 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2392 for { 2393 x := v.Args[0] 2394 y := v.Args[1] 2395 v.reset(OpS390XMOVDGT) 2396 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2397 v0.AuxInt = 0 2398 v.AddArg(v0) 2399 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2400 v1.AuxInt = 1 2401 v.AddArg(v1) 2402 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2403 v2.AddArg(x) 2404 v2.AddArg(y) 2405 v.AddArg(v2) 2406 return true 2407 } 2408 } 2409 func rewriteValueS390X_OpGreater8(v *Value, config *Config) bool { 2410 b := v.Block 2411 _ = b 2412 // match: (Greater8 x y) 2413 // cond: 2414 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2415 for { 2416 x := v.Args[0] 2417 y := v.Args[1] 2418 v.reset(OpS390XMOVDGT) 2419 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2420 v0.AuxInt = 0 2421 v.AddArg(v0) 2422 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2423 v1.AuxInt = 1 2424 v.AddArg(v1) 2425 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2426 v3 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 2427 v3.AddArg(x) 2428 v2.AddArg(v3) 2429 v4 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 2430 v4.AddArg(y) 2431 v2.AddArg(v4) 2432 v.AddArg(v2) 2433 return true 2434 } 2435 } 2436 func rewriteValueS390X_OpGreater8U(v *Value, config *Config) bool { 2437 b := v.Block 2438 _ = b 2439 // match: (Greater8U x y) 2440 // cond: 2441 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2442 for { 2443 x := v.Args[0] 2444 y := v.Args[1] 2445 v.reset(OpS390XMOVDGT) 2446 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2447 v0.AuxInt = 0 2448 v.AddArg(v0) 2449 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2450 v1.AuxInt = 1 2451 v.AddArg(v1) 2452 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2453 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 2454 v3.AddArg(x) 2455 v2.AddArg(v3) 2456 v4 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 2457 v4.AddArg(y) 2458 v2.AddArg(v4) 2459 v.AddArg(v2) 2460 return true 2461 } 2462 } 2463 func rewriteValueS390X_OpHmul16(v *Value, config *Config) bool { 2464 b := v.Block 2465 _ = b 2466 // match: (Hmul16 x y) 2467 // cond: 2468 // result: (SRDconst [16] (MULLW (MOVHreg x) (MOVHreg y))) 2469 for { 2470 x := v.Args[0] 2471 y := v.Args[1] 2472 v.reset(OpS390XSRDconst) 2473 v.AuxInt = 16 2474 v0 := b.NewValue0(v.Line, OpS390XMULLW, config.fe.TypeInt32()) 2475 v1 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 2476 v1.AddArg(x) 2477 v0.AddArg(v1) 2478 v2 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 2479 v2.AddArg(y) 2480 v0.AddArg(v2) 2481 v.AddArg(v0) 2482 return true 2483 } 2484 } 2485 func rewriteValueS390X_OpHmul16u(v *Value, config *Config) bool { 2486 b := v.Block 2487 _ = b 2488 // match: (Hmul16u x y) 2489 // cond: 2490 // result: (SRDconst [16] (MULLW (MOVHZreg x) (MOVHZreg y))) 2491 for { 2492 x := v.Args[0] 2493 y := v.Args[1] 2494 v.reset(OpS390XSRDconst) 2495 v.AuxInt = 16 2496 v0 := b.NewValue0(v.Line, OpS390XMULLW, config.fe.TypeInt32()) 2497 v1 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 2498 v1.AddArg(x) 2499 v0.AddArg(v1) 2500 v2 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 2501 v2.AddArg(y) 2502 v0.AddArg(v2) 2503 v.AddArg(v0) 2504 return true 2505 } 2506 } 2507 func rewriteValueS390X_OpHmul32(v *Value, config *Config) bool { 2508 b := v.Block 2509 _ = b 2510 // match: (Hmul32 x y) 2511 // cond: 2512 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2513 for { 2514 x := v.Args[0] 2515 y := v.Args[1] 2516 v.reset(OpS390XSRDconst) 2517 v.AuxInt = 32 2518 v0 := b.NewValue0(v.Line, OpS390XMULLD, config.fe.TypeInt64()) 2519 v1 := b.NewValue0(v.Line, OpS390XMOVWreg, config.fe.TypeInt64()) 2520 v1.AddArg(x) 2521 v0.AddArg(v1) 2522 v2 := b.NewValue0(v.Line, OpS390XMOVWreg, config.fe.TypeInt64()) 2523 v2.AddArg(y) 2524 v0.AddArg(v2) 2525 v.AddArg(v0) 2526 return true 2527 } 2528 } 2529 func rewriteValueS390X_OpHmul32u(v *Value, config *Config) bool { 2530 b := v.Block 2531 _ = b 2532 // match: (Hmul32u x y) 2533 // cond: 2534 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2535 for { 2536 x := v.Args[0] 2537 y := v.Args[1] 2538 v.reset(OpS390XSRDconst) 2539 v.AuxInt = 32 2540 v0 := b.NewValue0(v.Line, OpS390XMULLD, config.fe.TypeInt64()) 2541 v1 := b.NewValue0(v.Line, OpS390XMOVWZreg, config.fe.TypeUInt64()) 2542 v1.AddArg(x) 2543 v0.AddArg(v1) 2544 v2 := b.NewValue0(v.Line, OpS390XMOVWZreg, config.fe.TypeUInt64()) 2545 v2.AddArg(y) 2546 v0.AddArg(v2) 2547 v.AddArg(v0) 2548 return true 2549 } 2550 } 2551 func rewriteValueS390X_OpHmul64(v *Value, config *Config) bool { 2552 b := v.Block 2553 _ = b 2554 // match: (Hmul64 x y) 2555 // cond: 2556 // result: (MULHD x y) 2557 for { 2558 x := v.Args[0] 2559 y := v.Args[1] 2560 v.reset(OpS390XMULHD) 2561 v.AddArg(x) 2562 v.AddArg(y) 2563 return true 2564 } 2565 } 2566 func rewriteValueS390X_OpHmul64u(v *Value, config *Config) bool { 2567 b := v.Block 2568 _ = b 2569 // match: (Hmul64u x y) 2570 // cond: 2571 // result: (MULHDU x y) 2572 for { 2573 x := v.Args[0] 2574 y := v.Args[1] 2575 v.reset(OpS390XMULHDU) 2576 v.AddArg(x) 2577 v.AddArg(y) 2578 return true 2579 } 2580 } 2581 func rewriteValueS390X_OpHmul8(v *Value, config *Config) bool { 2582 b := v.Block 2583 _ = b 2584 // match: (Hmul8 x y) 2585 // cond: 2586 // result: (SRDconst [8] (MULLW (MOVBreg x) (MOVBreg y))) 2587 for { 2588 x := v.Args[0] 2589 y := v.Args[1] 2590 v.reset(OpS390XSRDconst) 2591 v.AuxInt = 8 2592 v0 := b.NewValue0(v.Line, OpS390XMULLW, config.fe.TypeInt32()) 2593 v1 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 2594 v1.AddArg(x) 2595 v0.AddArg(v1) 2596 v2 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 2597 v2.AddArg(y) 2598 v0.AddArg(v2) 2599 v.AddArg(v0) 2600 return true 2601 } 2602 } 2603 func rewriteValueS390X_OpHmul8u(v *Value, config *Config) bool { 2604 b := v.Block 2605 _ = b 2606 // match: (Hmul8u x y) 2607 // cond: 2608 // result: (SRDconst [8] (MULLW (MOVBZreg x) (MOVBZreg y))) 2609 for { 2610 x := v.Args[0] 2611 y := v.Args[1] 2612 v.reset(OpS390XSRDconst) 2613 v.AuxInt = 8 2614 v0 := b.NewValue0(v.Line, OpS390XMULLW, config.fe.TypeInt32()) 2615 v1 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 2616 v1.AddArg(x) 2617 v0.AddArg(v1) 2618 v2 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 2619 v2.AddArg(y) 2620 v0.AddArg(v2) 2621 v.AddArg(v0) 2622 return true 2623 } 2624 } 2625 func rewriteValueS390X_OpITab(v *Value, config *Config) bool { 2626 b := v.Block 2627 _ = b 2628 // match: (ITab (Load ptr mem)) 2629 // cond: 2630 // result: (MOVDload ptr mem) 2631 for { 2632 v_0 := v.Args[0] 2633 if v_0.Op != OpLoad { 2634 break 2635 } 2636 ptr := v_0.Args[0] 2637 mem := v_0.Args[1] 2638 v.reset(OpS390XMOVDload) 2639 v.AddArg(ptr) 2640 v.AddArg(mem) 2641 return true 2642 } 2643 return false 2644 } 2645 func rewriteValueS390X_OpInterCall(v *Value, config *Config) bool { 2646 b := v.Block 2647 _ = b 2648 // match: (InterCall [argwid] entry mem) 2649 // cond: 2650 // result: (CALLinter [argwid] entry mem) 2651 for { 2652 argwid := v.AuxInt 2653 entry := v.Args[0] 2654 mem := v.Args[1] 2655 v.reset(OpS390XCALLinter) 2656 v.AuxInt = argwid 2657 v.AddArg(entry) 2658 v.AddArg(mem) 2659 return true 2660 } 2661 } 2662 func rewriteValueS390X_OpIsInBounds(v *Value, config *Config) bool { 2663 b := v.Block 2664 _ = b 2665 // match: (IsInBounds idx len) 2666 // cond: 2667 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2668 for { 2669 idx := v.Args[0] 2670 len := v.Args[1] 2671 v.reset(OpS390XMOVDLT) 2672 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2673 v0.AuxInt = 0 2674 v.AddArg(v0) 2675 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2676 v1.AuxInt = 1 2677 v.AddArg(v1) 2678 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2679 v2.AddArg(idx) 2680 v2.AddArg(len) 2681 v.AddArg(v2) 2682 return true 2683 } 2684 } 2685 func rewriteValueS390X_OpIsNonNil(v *Value, config *Config) bool { 2686 b := v.Block 2687 _ = b 2688 // match: (IsNonNil p) 2689 // cond: 2690 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2691 for { 2692 p := v.Args[0] 2693 v.reset(OpS390XMOVDNE) 2694 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2695 v0.AuxInt = 0 2696 v.AddArg(v0) 2697 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2698 v1.AuxInt = 1 2699 v.AddArg(v1) 2700 v2 := b.NewValue0(v.Line, OpS390XCMPconst, TypeFlags) 2701 v2.AuxInt = 0 2702 v2.AddArg(p) 2703 v.AddArg(v2) 2704 return true 2705 } 2706 } 2707 func rewriteValueS390X_OpIsSliceInBounds(v *Value, config *Config) bool { 2708 b := v.Block 2709 _ = b 2710 // match: (IsSliceInBounds idx len) 2711 // cond: 2712 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2713 for { 2714 idx := v.Args[0] 2715 len := v.Args[1] 2716 v.reset(OpS390XMOVDLE) 2717 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2718 v0.AuxInt = 0 2719 v.AddArg(v0) 2720 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2721 v1.AuxInt = 1 2722 v.AddArg(v1) 2723 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2724 v2.AddArg(idx) 2725 v2.AddArg(len) 2726 v.AddArg(v2) 2727 return true 2728 } 2729 } 2730 func rewriteValueS390X_OpLeq16(v *Value, config *Config) bool { 2731 b := v.Block 2732 _ = b 2733 // match: (Leq16 x y) 2734 // cond: 2735 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2736 for { 2737 x := v.Args[0] 2738 y := v.Args[1] 2739 v.reset(OpS390XMOVDLE) 2740 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2741 v0.AuxInt = 0 2742 v.AddArg(v0) 2743 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2744 v1.AuxInt = 1 2745 v.AddArg(v1) 2746 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2747 v3 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 2748 v3.AddArg(x) 2749 v2.AddArg(v3) 2750 v4 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 2751 v4.AddArg(y) 2752 v2.AddArg(v4) 2753 v.AddArg(v2) 2754 return true 2755 } 2756 } 2757 func rewriteValueS390X_OpLeq16U(v *Value, config *Config) bool { 2758 b := v.Block 2759 _ = b 2760 // match: (Leq16U x y) 2761 // cond: 2762 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2763 for { 2764 x := v.Args[0] 2765 y := v.Args[1] 2766 v.reset(OpS390XMOVDLE) 2767 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2768 v0.AuxInt = 0 2769 v.AddArg(v0) 2770 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2771 v1.AuxInt = 1 2772 v.AddArg(v1) 2773 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2774 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 2775 v3.AddArg(x) 2776 v2.AddArg(v3) 2777 v4 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 2778 v4.AddArg(y) 2779 v2.AddArg(v4) 2780 v.AddArg(v2) 2781 return true 2782 } 2783 } 2784 func rewriteValueS390X_OpLeq32(v *Value, config *Config) bool { 2785 b := v.Block 2786 _ = b 2787 // match: (Leq32 x y) 2788 // cond: 2789 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2790 for { 2791 x := v.Args[0] 2792 y := v.Args[1] 2793 v.reset(OpS390XMOVDLE) 2794 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2795 v0.AuxInt = 0 2796 v.AddArg(v0) 2797 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2798 v1.AuxInt = 1 2799 v.AddArg(v1) 2800 v2 := b.NewValue0(v.Line, OpS390XCMPW, TypeFlags) 2801 v2.AddArg(x) 2802 v2.AddArg(y) 2803 v.AddArg(v2) 2804 return true 2805 } 2806 } 2807 func rewriteValueS390X_OpLeq32F(v *Value, config *Config) bool { 2808 b := v.Block 2809 _ = b 2810 // match: (Leq32F x y) 2811 // cond: 2812 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2813 for { 2814 x := v.Args[0] 2815 y := v.Args[1] 2816 v.reset(OpS390XMOVDGEnoinv) 2817 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2818 v0.AuxInt = 0 2819 v.AddArg(v0) 2820 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2821 v1.AuxInt = 1 2822 v.AddArg(v1) 2823 v2 := b.NewValue0(v.Line, OpS390XFCMPS, TypeFlags) 2824 v2.AddArg(y) 2825 v2.AddArg(x) 2826 v.AddArg(v2) 2827 return true 2828 } 2829 } 2830 func rewriteValueS390X_OpLeq32U(v *Value, config *Config) bool { 2831 b := v.Block 2832 _ = b 2833 // match: (Leq32U x y) 2834 // cond: 2835 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2836 for { 2837 x := v.Args[0] 2838 y := v.Args[1] 2839 v.reset(OpS390XMOVDLE) 2840 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2841 v0.AuxInt = 0 2842 v.AddArg(v0) 2843 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2844 v1.AuxInt = 1 2845 v.AddArg(v1) 2846 v2 := b.NewValue0(v.Line, OpS390XCMPWU, TypeFlags) 2847 v2.AddArg(x) 2848 v2.AddArg(y) 2849 v.AddArg(v2) 2850 return true 2851 } 2852 } 2853 func rewriteValueS390X_OpLeq64(v *Value, config *Config) bool { 2854 b := v.Block 2855 _ = b 2856 // match: (Leq64 x y) 2857 // cond: 2858 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2859 for { 2860 x := v.Args[0] 2861 y := v.Args[1] 2862 v.reset(OpS390XMOVDLE) 2863 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2864 v0.AuxInt = 0 2865 v.AddArg(v0) 2866 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2867 v1.AuxInt = 1 2868 v.AddArg(v1) 2869 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2870 v2.AddArg(x) 2871 v2.AddArg(y) 2872 v.AddArg(v2) 2873 return true 2874 } 2875 } 2876 func rewriteValueS390X_OpLeq64F(v *Value, config *Config) bool { 2877 b := v.Block 2878 _ = b 2879 // match: (Leq64F x y) 2880 // cond: 2881 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2882 for { 2883 x := v.Args[0] 2884 y := v.Args[1] 2885 v.reset(OpS390XMOVDGEnoinv) 2886 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2887 v0.AuxInt = 0 2888 v.AddArg(v0) 2889 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2890 v1.AuxInt = 1 2891 v.AddArg(v1) 2892 v2 := b.NewValue0(v.Line, OpS390XFCMP, TypeFlags) 2893 v2.AddArg(y) 2894 v2.AddArg(x) 2895 v.AddArg(v2) 2896 return true 2897 } 2898 } 2899 func rewriteValueS390X_OpLeq64U(v *Value, config *Config) bool { 2900 b := v.Block 2901 _ = b 2902 // match: (Leq64U x y) 2903 // cond: 2904 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2905 for { 2906 x := v.Args[0] 2907 y := v.Args[1] 2908 v.reset(OpS390XMOVDLE) 2909 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2910 v0.AuxInt = 0 2911 v.AddArg(v0) 2912 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2913 v1.AuxInt = 1 2914 v.AddArg(v1) 2915 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2916 v2.AddArg(x) 2917 v2.AddArg(y) 2918 v.AddArg(v2) 2919 return true 2920 } 2921 } 2922 func rewriteValueS390X_OpLeq8(v *Value, config *Config) bool { 2923 b := v.Block 2924 _ = b 2925 // match: (Leq8 x y) 2926 // cond: 2927 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2928 for { 2929 x := v.Args[0] 2930 y := v.Args[1] 2931 v.reset(OpS390XMOVDLE) 2932 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2933 v0.AuxInt = 0 2934 v.AddArg(v0) 2935 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2936 v1.AuxInt = 1 2937 v.AddArg(v1) 2938 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2939 v3 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 2940 v3.AddArg(x) 2941 v2.AddArg(v3) 2942 v4 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 2943 v4.AddArg(y) 2944 v2.AddArg(v4) 2945 v.AddArg(v2) 2946 return true 2947 } 2948 } 2949 func rewriteValueS390X_OpLeq8U(v *Value, config *Config) bool { 2950 b := v.Block 2951 _ = b 2952 // match: (Leq8U x y) 2953 // cond: 2954 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2955 for { 2956 x := v.Args[0] 2957 y := v.Args[1] 2958 v.reset(OpS390XMOVDLE) 2959 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2960 v0.AuxInt = 0 2961 v.AddArg(v0) 2962 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2963 v1.AuxInt = 1 2964 v.AddArg(v1) 2965 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 2966 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 2967 v3.AddArg(x) 2968 v2.AddArg(v3) 2969 v4 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 2970 v4.AddArg(y) 2971 v2.AddArg(v4) 2972 v.AddArg(v2) 2973 return true 2974 } 2975 } 2976 func rewriteValueS390X_OpLess16(v *Value, config *Config) bool { 2977 b := v.Block 2978 _ = b 2979 // match: (Less16 x y) 2980 // cond: 2981 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2982 for { 2983 x := v.Args[0] 2984 y := v.Args[1] 2985 v.reset(OpS390XMOVDLT) 2986 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2987 v0.AuxInt = 0 2988 v.AddArg(v0) 2989 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 2990 v1.AuxInt = 1 2991 v.AddArg(v1) 2992 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 2993 v3 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 2994 v3.AddArg(x) 2995 v2.AddArg(v3) 2996 v4 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 2997 v4.AddArg(y) 2998 v2.AddArg(v4) 2999 v.AddArg(v2) 3000 return true 3001 } 3002 } 3003 func rewriteValueS390X_OpLess16U(v *Value, config *Config) bool { 3004 b := v.Block 3005 _ = b 3006 // match: (Less16U x y) 3007 // cond: 3008 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 3009 for { 3010 x := v.Args[0] 3011 y := v.Args[1] 3012 v.reset(OpS390XMOVDLT) 3013 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3014 v0.AuxInt = 0 3015 v.AddArg(v0) 3016 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3017 v1.AuxInt = 1 3018 v.AddArg(v1) 3019 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 3020 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 3021 v3.AddArg(x) 3022 v2.AddArg(v3) 3023 v4 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 3024 v4.AddArg(y) 3025 v2.AddArg(v4) 3026 v.AddArg(v2) 3027 return true 3028 } 3029 } 3030 func rewriteValueS390X_OpLess32(v *Value, config *Config) bool { 3031 b := v.Block 3032 _ = b 3033 // match: (Less32 x y) 3034 // cond: 3035 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 3036 for { 3037 x := v.Args[0] 3038 y := v.Args[1] 3039 v.reset(OpS390XMOVDLT) 3040 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3041 v0.AuxInt = 0 3042 v.AddArg(v0) 3043 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3044 v1.AuxInt = 1 3045 v.AddArg(v1) 3046 v2 := b.NewValue0(v.Line, OpS390XCMPW, TypeFlags) 3047 v2.AddArg(x) 3048 v2.AddArg(y) 3049 v.AddArg(v2) 3050 return true 3051 } 3052 } 3053 func rewriteValueS390X_OpLess32F(v *Value, config *Config) bool { 3054 b := v.Block 3055 _ = b 3056 // match: (Less32F x y) 3057 // cond: 3058 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 3059 for { 3060 x := v.Args[0] 3061 y := v.Args[1] 3062 v.reset(OpS390XMOVDGTnoinv) 3063 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3064 v0.AuxInt = 0 3065 v.AddArg(v0) 3066 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3067 v1.AuxInt = 1 3068 v.AddArg(v1) 3069 v2 := b.NewValue0(v.Line, OpS390XFCMPS, TypeFlags) 3070 v2.AddArg(y) 3071 v2.AddArg(x) 3072 v.AddArg(v2) 3073 return true 3074 } 3075 } 3076 func rewriteValueS390X_OpLess32U(v *Value, config *Config) bool { 3077 b := v.Block 3078 _ = b 3079 // match: (Less32U x y) 3080 // cond: 3081 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 3082 for { 3083 x := v.Args[0] 3084 y := v.Args[1] 3085 v.reset(OpS390XMOVDLT) 3086 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3087 v0.AuxInt = 0 3088 v.AddArg(v0) 3089 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3090 v1.AuxInt = 1 3091 v.AddArg(v1) 3092 v2 := b.NewValue0(v.Line, OpS390XCMPWU, TypeFlags) 3093 v2.AddArg(x) 3094 v2.AddArg(y) 3095 v.AddArg(v2) 3096 return true 3097 } 3098 } 3099 func rewriteValueS390X_OpLess64(v *Value, config *Config) bool { 3100 b := v.Block 3101 _ = b 3102 // match: (Less64 x y) 3103 // cond: 3104 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3105 for { 3106 x := v.Args[0] 3107 y := v.Args[1] 3108 v.reset(OpS390XMOVDLT) 3109 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3110 v0.AuxInt = 0 3111 v.AddArg(v0) 3112 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3113 v1.AuxInt = 1 3114 v.AddArg(v1) 3115 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 3116 v2.AddArg(x) 3117 v2.AddArg(y) 3118 v.AddArg(v2) 3119 return true 3120 } 3121 } 3122 func rewriteValueS390X_OpLess64F(v *Value, config *Config) bool { 3123 b := v.Block 3124 _ = b 3125 // match: (Less64F x y) 3126 // cond: 3127 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3128 for { 3129 x := v.Args[0] 3130 y := v.Args[1] 3131 v.reset(OpS390XMOVDGTnoinv) 3132 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3133 v0.AuxInt = 0 3134 v.AddArg(v0) 3135 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3136 v1.AuxInt = 1 3137 v.AddArg(v1) 3138 v2 := b.NewValue0(v.Line, OpS390XFCMP, TypeFlags) 3139 v2.AddArg(y) 3140 v2.AddArg(x) 3141 v.AddArg(v2) 3142 return true 3143 } 3144 } 3145 func rewriteValueS390X_OpLess64U(v *Value, config *Config) bool { 3146 b := v.Block 3147 _ = b 3148 // match: (Less64U x y) 3149 // cond: 3150 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3151 for { 3152 x := v.Args[0] 3153 y := v.Args[1] 3154 v.reset(OpS390XMOVDLT) 3155 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3156 v0.AuxInt = 0 3157 v.AddArg(v0) 3158 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3159 v1.AuxInt = 1 3160 v.AddArg(v1) 3161 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 3162 v2.AddArg(x) 3163 v2.AddArg(y) 3164 v.AddArg(v2) 3165 return true 3166 } 3167 } 3168 func rewriteValueS390X_OpLess8(v *Value, config *Config) bool { 3169 b := v.Block 3170 _ = b 3171 // match: (Less8 x y) 3172 // cond: 3173 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 3174 for { 3175 x := v.Args[0] 3176 y := v.Args[1] 3177 v.reset(OpS390XMOVDLT) 3178 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3179 v0.AuxInt = 0 3180 v.AddArg(v0) 3181 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3182 v1.AuxInt = 1 3183 v.AddArg(v1) 3184 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 3185 v3 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 3186 v3.AddArg(x) 3187 v2.AddArg(v3) 3188 v4 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 3189 v4.AddArg(y) 3190 v2.AddArg(v4) 3191 v.AddArg(v2) 3192 return true 3193 } 3194 } 3195 func rewriteValueS390X_OpLess8U(v *Value, config *Config) bool { 3196 b := v.Block 3197 _ = b 3198 // match: (Less8U x y) 3199 // cond: 3200 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 3201 for { 3202 x := v.Args[0] 3203 y := v.Args[1] 3204 v.reset(OpS390XMOVDLT) 3205 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3206 v0.AuxInt = 0 3207 v.AddArg(v0) 3208 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 3209 v1.AuxInt = 1 3210 v.AddArg(v1) 3211 v2 := b.NewValue0(v.Line, OpS390XCMPU, TypeFlags) 3212 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 3213 v3.AddArg(x) 3214 v2.AddArg(v3) 3215 v4 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 3216 v4.AddArg(y) 3217 v2.AddArg(v4) 3218 v.AddArg(v2) 3219 return true 3220 } 3221 } 3222 func rewriteValueS390X_OpLoad(v *Value, config *Config) bool { 3223 b := v.Block 3224 _ = b 3225 // match: (Load <t> ptr mem) 3226 // cond: (is64BitInt(t) || isPtr(t)) 3227 // result: (MOVDload ptr mem) 3228 for { 3229 t := v.Type 3230 ptr := v.Args[0] 3231 mem := v.Args[1] 3232 if !(is64BitInt(t) || isPtr(t)) { 3233 break 3234 } 3235 v.reset(OpS390XMOVDload) 3236 v.AddArg(ptr) 3237 v.AddArg(mem) 3238 return true 3239 } 3240 // match: (Load <t> ptr mem) 3241 // cond: is32BitInt(t) && isSigned(t) 3242 // result: (MOVWload ptr mem) 3243 for { 3244 t := v.Type 3245 ptr := v.Args[0] 3246 mem := v.Args[1] 3247 if !(is32BitInt(t) && isSigned(t)) { 3248 break 3249 } 3250 v.reset(OpS390XMOVWload) 3251 v.AddArg(ptr) 3252 v.AddArg(mem) 3253 return true 3254 } 3255 // match: (Load <t> ptr mem) 3256 // cond: is32BitInt(t) && !isSigned(t) 3257 // result: (MOVWZload ptr mem) 3258 for { 3259 t := v.Type 3260 ptr := v.Args[0] 3261 mem := v.Args[1] 3262 if !(is32BitInt(t) && !isSigned(t)) { 3263 break 3264 } 3265 v.reset(OpS390XMOVWZload) 3266 v.AddArg(ptr) 3267 v.AddArg(mem) 3268 return true 3269 } 3270 // match: (Load <t> ptr mem) 3271 // cond: is16BitInt(t) && isSigned(t) 3272 // result: (MOVHload ptr mem) 3273 for { 3274 t := v.Type 3275 ptr := v.Args[0] 3276 mem := v.Args[1] 3277 if !(is16BitInt(t) && isSigned(t)) { 3278 break 3279 } 3280 v.reset(OpS390XMOVHload) 3281 v.AddArg(ptr) 3282 v.AddArg(mem) 3283 return true 3284 } 3285 // match: (Load <t> ptr mem) 3286 // cond: is16BitInt(t) && !isSigned(t) 3287 // result: (MOVHZload ptr mem) 3288 for { 3289 t := v.Type 3290 ptr := v.Args[0] 3291 mem := v.Args[1] 3292 if !(is16BitInt(t) && !isSigned(t)) { 3293 break 3294 } 3295 v.reset(OpS390XMOVHZload) 3296 v.AddArg(ptr) 3297 v.AddArg(mem) 3298 return true 3299 } 3300 // match: (Load <t> ptr mem) 3301 // cond: is8BitInt(t) && isSigned(t) 3302 // result: (MOVBload ptr mem) 3303 for { 3304 t := v.Type 3305 ptr := v.Args[0] 3306 mem := v.Args[1] 3307 if !(is8BitInt(t) && isSigned(t)) { 3308 break 3309 } 3310 v.reset(OpS390XMOVBload) 3311 v.AddArg(ptr) 3312 v.AddArg(mem) 3313 return true 3314 } 3315 // match: (Load <t> ptr mem) 3316 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3317 // result: (MOVBZload ptr mem) 3318 for { 3319 t := v.Type 3320 ptr := v.Args[0] 3321 mem := v.Args[1] 3322 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3323 break 3324 } 3325 v.reset(OpS390XMOVBZload) 3326 v.AddArg(ptr) 3327 v.AddArg(mem) 3328 return true 3329 } 3330 // match: (Load <t> ptr mem) 3331 // cond: is32BitFloat(t) 3332 // result: (FMOVSload ptr mem) 3333 for { 3334 t := v.Type 3335 ptr := v.Args[0] 3336 mem := v.Args[1] 3337 if !(is32BitFloat(t)) { 3338 break 3339 } 3340 v.reset(OpS390XFMOVSload) 3341 v.AddArg(ptr) 3342 v.AddArg(mem) 3343 return true 3344 } 3345 // match: (Load <t> ptr mem) 3346 // cond: is64BitFloat(t) 3347 // result: (FMOVDload ptr mem) 3348 for { 3349 t := v.Type 3350 ptr := v.Args[0] 3351 mem := v.Args[1] 3352 if !(is64BitFloat(t)) { 3353 break 3354 } 3355 v.reset(OpS390XFMOVDload) 3356 v.AddArg(ptr) 3357 v.AddArg(mem) 3358 return true 3359 } 3360 return false 3361 } 3362 func rewriteValueS390X_OpLrot32(v *Value, config *Config) bool { 3363 b := v.Block 3364 _ = b 3365 // match: (Lrot32 <t> x [c]) 3366 // cond: 3367 // result: (RLLconst <t> [c&31] x) 3368 for { 3369 t := v.Type 3370 c := v.AuxInt 3371 x := v.Args[0] 3372 v.reset(OpS390XRLLconst) 3373 v.Type = t 3374 v.AuxInt = c & 31 3375 v.AddArg(x) 3376 return true 3377 } 3378 } 3379 func rewriteValueS390X_OpLrot64(v *Value, config *Config) bool { 3380 b := v.Block 3381 _ = b 3382 // match: (Lrot64 <t> x [c]) 3383 // cond: 3384 // result: (RLLGconst <t> [c&63] x) 3385 for { 3386 t := v.Type 3387 c := v.AuxInt 3388 x := v.Args[0] 3389 v.reset(OpS390XRLLGconst) 3390 v.Type = t 3391 v.AuxInt = c & 63 3392 v.AddArg(x) 3393 return true 3394 } 3395 } 3396 func rewriteValueS390X_OpLsh16x16(v *Value, config *Config) bool { 3397 b := v.Block 3398 _ = b 3399 // match: (Lsh16x16 <t> x y) 3400 // cond: 3401 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3402 for { 3403 t := v.Type 3404 x := v.Args[0] 3405 y := v.Args[1] 3406 v.reset(OpS390XANDW) 3407 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3408 v0.AddArg(x) 3409 v0.AddArg(y) 3410 v.AddArg(v0) 3411 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3412 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3413 v2.AuxInt = 31 3414 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 3415 v3.AddArg(y) 3416 v2.AddArg(v3) 3417 v1.AddArg(v2) 3418 v.AddArg(v1) 3419 return true 3420 } 3421 } 3422 func rewriteValueS390X_OpLsh16x32(v *Value, config *Config) bool { 3423 b := v.Block 3424 _ = b 3425 // match: (Lsh16x32 <t> x y) 3426 // cond: 3427 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3428 for { 3429 t := v.Type 3430 x := v.Args[0] 3431 y := v.Args[1] 3432 v.reset(OpS390XANDW) 3433 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3434 v0.AddArg(x) 3435 v0.AddArg(y) 3436 v.AddArg(v0) 3437 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3438 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3439 v2.AuxInt = 31 3440 v2.AddArg(y) 3441 v1.AddArg(v2) 3442 v.AddArg(v1) 3443 return true 3444 } 3445 } 3446 func rewriteValueS390X_OpLsh16x64(v *Value, config *Config) bool { 3447 b := v.Block 3448 _ = b 3449 // match: (Lsh16x64 <t> x y) 3450 // cond: 3451 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3452 for { 3453 t := v.Type 3454 x := v.Args[0] 3455 y := v.Args[1] 3456 v.reset(OpS390XANDW) 3457 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3458 v0.AddArg(x) 3459 v0.AddArg(y) 3460 v.AddArg(v0) 3461 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3462 v2 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 3463 v2.AuxInt = 31 3464 v2.AddArg(y) 3465 v1.AddArg(v2) 3466 v.AddArg(v1) 3467 return true 3468 } 3469 } 3470 func rewriteValueS390X_OpLsh16x8(v *Value, config *Config) bool { 3471 b := v.Block 3472 _ = b 3473 // match: (Lsh16x8 <t> x y) 3474 // cond: 3475 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3476 for { 3477 t := v.Type 3478 x := v.Args[0] 3479 y := v.Args[1] 3480 v.reset(OpS390XANDW) 3481 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3482 v0.AddArg(x) 3483 v0.AddArg(y) 3484 v.AddArg(v0) 3485 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3486 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3487 v2.AuxInt = 31 3488 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 3489 v3.AddArg(y) 3490 v2.AddArg(v3) 3491 v1.AddArg(v2) 3492 v.AddArg(v1) 3493 return true 3494 } 3495 } 3496 func rewriteValueS390X_OpLsh32x16(v *Value, config *Config) bool { 3497 b := v.Block 3498 _ = b 3499 // match: (Lsh32x16 <t> x y) 3500 // cond: 3501 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3502 for { 3503 t := v.Type 3504 x := v.Args[0] 3505 y := v.Args[1] 3506 v.reset(OpS390XANDW) 3507 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3508 v0.AddArg(x) 3509 v0.AddArg(y) 3510 v.AddArg(v0) 3511 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3512 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3513 v2.AuxInt = 31 3514 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 3515 v3.AddArg(y) 3516 v2.AddArg(v3) 3517 v1.AddArg(v2) 3518 v.AddArg(v1) 3519 return true 3520 } 3521 } 3522 func rewriteValueS390X_OpLsh32x32(v *Value, config *Config) bool { 3523 b := v.Block 3524 _ = b 3525 // match: (Lsh32x32 <t> x y) 3526 // cond: 3527 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3528 for { 3529 t := v.Type 3530 x := v.Args[0] 3531 y := v.Args[1] 3532 v.reset(OpS390XANDW) 3533 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3534 v0.AddArg(x) 3535 v0.AddArg(y) 3536 v.AddArg(v0) 3537 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3538 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3539 v2.AuxInt = 31 3540 v2.AddArg(y) 3541 v1.AddArg(v2) 3542 v.AddArg(v1) 3543 return true 3544 } 3545 } 3546 func rewriteValueS390X_OpLsh32x64(v *Value, config *Config) bool { 3547 b := v.Block 3548 _ = b 3549 // match: (Lsh32x64 <t> x y) 3550 // cond: 3551 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3552 for { 3553 t := v.Type 3554 x := v.Args[0] 3555 y := v.Args[1] 3556 v.reset(OpS390XANDW) 3557 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3558 v0.AddArg(x) 3559 v0.AddArg(y) 3560 v.AddArg(v0) 3561 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3562 v2 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 3563 v2.AuxInt = 31 3564 v2.AddArg(y) 3565 v1.AddArg(v2) 3566 v.AddArg(v1) 3567 return true 3568 } 3569 } 3570 func rewriteValueS390X_OpLsh32x8(v *Value, config *Config) bool { 3571 b := v.Block 3572 _ = b 3573 // match: (Lsh32x8 <t> x y) 3574 // cond: 3575 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3576 for { 3577 t := v.Type 3578 x := v.Args[0] 3579 y := v.Args[1] 3580 v.reset(OpS390XANDW) 3581 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3582 v0.AddArg(x) 3583 v0.AddArg(y) 3584 v.AddArg(v0) 3585 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3586 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3587 v2.AuxInt = 31 3588 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 3589 v3.AddArg(y) 3590 v2.AddArg(v3) 3591 v1.AddArg(v2) 3592 v.AddArg(v1) 3593 return true 3594 } 3595 } 3596 func rewriteValueS390X_OpLsh64x16(v *Value, config *Config) bool { 3597 b := v.Block 3598 _ = b 3599 // match: (Lsh64x16 <t> x y) 3600 // cond: 3601 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 3602 for { 3603 t := v.Type 3604 x := v.Args[0] 3605 y := v.Args[1] 3606 v.reset(OpS390XAND) 3607 v0 := b.NewValue0(v.Line, OpS390XSLD, t) 3608 v0.AddArg(x) 3609 v0.AddArg(y) 3610 v.AddArg(v0) 3611 v1 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, t) 3612 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3613 v2.AuxInt = 63 3614 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 3615 v3.AddArg(y) 3616 v2.AddArg(v3) 3617 v1.AddArg(v2) 3618 v.AddArg(v1) 3619 return true 3620 } 3621 } 3622 func rewriteValueS390X_OpLsh64x32(v *Value, config *Config) bool { 3623 b := v.Block 3624 _ = b 3625 // match: (Lsh64x32 <t> x y) 3626 // cond: 3627 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 3628 for { 3629 t := v.Type 3630 x := v.Args[0] 3631 y := v.Args[1] 3632 v.reset(OpS390XAND) 3633 v0 := b.NewValue0(v.Line, OpS390XSLD, t) 3634 v0.AddArg(x) 3635 v0.AddArg(y) 3636 v.AddArg(v0) 3637 v1 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, t) 3638 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3639 v2.AuxInt = 63 3640 v2.AddArg(y) 3641 v1.AddArg(v2) 3642 v.AddArg(v1) 3643 return true 3644 } 3645 } 3646 func rewriteValueS390X_OpLsh64x64(v *Value, config *Config) bool { 3647 b := v.Block 3648 _ = b 3649 // match: (Lsh64x64 <t> x y) 3650 // cond: 3651 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 3652 for { 3653 t := v.Type 3654 x := v.Args[0] 3655 y := v.Args[1] 3656 v.reset(OpS390XAND) 3657 v0 := b.NewValue0(v.Line, OpS390XSLD, t) 3658 v0.AddArg(x) 3659 v0.AddArg(y) 3660 v.AddArg(v0) 3661 v1 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, t) 3662 v2 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 3663 v2.AuxInt = 63 3664 v2.AddArg(y) 3665 v1.AddArg(v2) 3666 v.AddArg(v1) 3667 return true 3668 } 3669 } 3670 func rewriteValueS390X_OpLsh64x8(v *Value, config *Config) bool { 3671 b := v.Block 3672 _ = b 3673 // match: (Lsh64x8 <t> x y) 3674 // cond: 3675 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 3676 for { 3677 t := v.Type 3678 x := v.Args[0] 3679 y := v.Args[1] 3680 v.reset(OpS390XAND) 3681 v0 := b.NewValue0(v.Line, OpS390XSLD, t) 3682 v0.AddArg(x) 3683 v0.AddArg(y) 3684 v.AddArg(v0) 3685 v1 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, t) 3686 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3687 v2.AuxInt = 63 3688 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 3689 v3.AddArg(y) 3690 v2.AddArg(v3) 3691 v1.AddArg(v2) 3692 v.AddArg(v1) 3693 return true 3694 } 3695 } 3696 func rewriteValueS390X_OpLsh8x16(v *Value, config *Config) bool { 3697 b := v.Block 3698 _ = b 3699 // match: (Lsh8x16 <t> x y) 3700 // cond: 3701 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3702 for { 3703 t := v.Type 3704 x := v.Args[0] 3705 y := v.Args[1] 3706 v.reset(OpS390XANDW) 3707 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3708 v0.AddArg(x) 3709 v0.AddArg(y) 3710 v.AddArg(v0) 3711 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3712 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3713 v2.AuxInt = 31 3714 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 3715 v3.AddArg(y) 3716 v2.AddArg(v3) 3717 v1.AddArg(v2) 3718 v.AddArg(v1) 3719 return true 3720 } 3721 } 3722 func rewriteValueS390X_OpLsh8x32(v *Value, config *Config) bool { 3723 b := v.Block 3724 _ = b 3725 // match: (Lsh8x32 <t> x y) 3726 // cond: 3727 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3728 for { 3729 t := v.Type 3730 x := v.Args[0] 3731 y := v.Args[1] 3732 v.reset(OpS390XANDW) 3733 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3734 v0.AddArg(x) 3735 v0.AddArg(y) 3736 v.AddArg(v0) 3737 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3738 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3739 v2.AuxInt = 31 3740 v2.AddArg(y) 3741 v1.AddArg(v2) 3742 v.AddArg(v1) 3743 return true 3744 } 3745 } 3746 func rewriteValueS390X_OpLsh8x64(v *Value, config *Config) bool { 3747 b := v.Block 3748 _ = b 3749 // match: (Lsh8x64 <t> x y) 3750 // cond: 3751 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3752 for { 3753 t := v.Type 3754 x := v.Args[0] 3755 y := v.Args[1] 3756 v.reset(OpS390XANDW) 3757 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3758 v0.AddArg(x) 3759 v0.AddArg(y) 3760 v.AddArg(v0) 3761 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3762 v2 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 3763 v2.AuxInt = 31 3764 v2.AddArg(y) 3765 v1.AddArg(v2) 3766 v.AddArg(v1) 3767 return true 3768 } 3769 } 3770 func rewriteValueS390X_OpLsh8x8(v *Value, config *Config) bool { 3771 b := v.Block 3772 _ = b 3773 // match: (Lsh8x8 <t> x y) 3774 // cond: 3775 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3776 for { 3777 t := v.Type 3778 x := v.Args[0] 3779 y := v.Args[1] 3780 v.reset(OpS390XANDW) 3781 v0 := b.NewValue0(v.Line, OpS390XSLW, t) 3782 v0.AddArg(x) 3783 v0.AddArg(y) 3784 v.AddArg(v0) 3785 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 3786 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 3787 v2.AuxInt = 31 3788 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 3789 v3.AddArg(y) 3790 v2.AddArg(v3) 3791 v1.AddArg(v2) 3792 v.AddArg(v1) 3793 return true 3794 } 3795 } 3796 func rewriteValueS390X_OpMod16(v *Value, config *Config) bool { 3797 b := v.Block 3798 _ = b 3799 // match: (Mod16 x y) 3800 // cond: 3801 // result: (MODW (MOVHreg x) (MOVHreg y)) 3802 for { 3803 x := v.Args[0] 3804 y := v.Args[1] 3805 v.reset(OpS390XMODW) 3806 v0 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 3807 v0.AddArg(x) 3808 v.AddArg(v0) 3809 v1 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 3810 v1.AddArg(y) 3811 v.AddArg(v1) 3812 return true 3813 } 3814 } 3815 func rewriteValueS390X_OpMod16u(v *Value, config *Config) bool { 3816 b := v.Block 3817 _ = b 3818 // match: (Mod16u x y) 3819 // cond: 3820 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 3821 for { 3822 x := v.Args[0] 3823 y := v.Args[1] 3824 v.reset(OpS390XMODWU) 3825 v0 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 3826 v0.AddArg(x) 3827 v.AddArg(v0) 3828 v1 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 3829 v1.AddArg(y) 3830 v.AddArg(v1) 3831 return true 3832 } 3833 } 3834 func rewriteValueS390X_OpMod32(v *Value, config *Config) bool { 3835 b := v.Block 3836 _ = b 3837 // match: (Mod32 x y) 3838 // cond: 3839 // result: (MODW (MOVWreg x) y) 3840 for { 3841 x := v.Args[0] 3842 y := v.Args[1] 3843 v.reset(OpS390XMODW) 3844 v0 := b.NewValue0(v.Line, OpS390XMOVWreg, config.fe.TypeInt64()) 3845 v0.AddArg(x) 3846 v.AddArg(v0) 3847 v.AddArg(y) 3848 return true 3849 } 3850 } 3851 func rewriteValueS390X_OpMod32u(v *Value, config *Config) bool { 3852 b := v.Block 3853 _ = b 3854 // match: (Mod32u x y) 3855 // cond: 3856 // result: (MODWU (MOVWZreg x) y) 3857 for { 3858 x := v.Args[0] 3859 y := v.Args[1] 3860 v.reset(OpS390XMODWU) 3861 v0 := b.NewValue0(v.Line, OpS390XMOVWZreg, config.fe.TypeUInt64()) 3862 v0.AddArg(x) 3863 v.AddArg(v0) 3864 v.AddArg(y) 3865 return true 3866 } 3867 } 3868 func rewriteValueS390X_OpMod64(v *Value, config *Config) bool { 3869 b := v.Block 3870 _ = b 3871 // match: (Mod64 x y) 3872 // cond: 3873 // result: (MODD x y) 3874 for { 3875 x := v.Args[0] 3876 y := v.Args[1] 3877 v.reset(OpS390XMODD) 3878 v.AddArg(x) 3879 v.AddArg(y) 3880 return true 3881 } 3882 } 3883 func rewriteValueS390X_OpMod64u(v *Value, config *Config) bool { 3884 b := v.Block 3885 _ = b 3886 // match: (Mod64u x y) 3887 // cond: 3888 // result: (MODDU x y) 3889 for { 3890 x := v.Args[0] 3891 y := v.Args[1] 3892 v.reset(OpS390XMODDU) 3893 v.AddArg(x) 3894 v.AddArg(y) 3895 return true 3896 } 3897 } 3898 func rewriteValueS390X_OpMod8(v *Value, config *Config) bool { 3899 b := v.Block 3900 _ = b 3901 // match: (Mod8 x y) 3902 // cond: 3903 // result: (MODW (MOVBreg x) (MOVBreg y)) 3904 for { 3905 x := v.Args[0] 3906 y := v.Args[1] 3907 v.reset(OpS390XMODW) 3908 v0 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 3909 v0.AddArg(x) 3910 v.AddArg(v0) 3911 v1 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 3912 v1.AddArg(y) 3913 v.AddArg(v1) 3914 return true 3915 } 3916 } 3917 func rewriteValueS390X_OpMod8u(v *Value, config *Config) bool { 3918 b := v.Block 3919 _ = b 3920 // match: (Mod8u x y) 3921 // cond: 3922 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 3923 for { 3924 x := v.Args[0] 3925 y := v.Args[1] 3926 v.reset(OpS390XMODWU) 3927 v0 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 3928 v0.AddArg(x) 3929 v.AddArg(v0) 3930 v1 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 3931 v1.AddArg(y) 3932 v.AddArg(v1) 3933 return true 3934 } 3935 } 3936 func rewriteValueS390X_OpMove(v *Value, config *Config) bool { 3937 b := v.Block 3938 _ = b 3939 // match: (Move [s] _ _ mem) 3940 // cond: SizeAndAlign(s).Size() == 0 3941 // result: mem 3942 for { 3943 s := v.AuxInt 3944 mem := v.Args[2] 3945 if !(SizeAndAlign(s).Size() == 0) { 3946 break 3947 } 3948 v.reset(OpCopy) 3949 v.Type = mem.Type 3950 v.AddArg(mem) 3951 return true 3952 } 3953 // match: (Move [s] dst src mem) 3954 // cond: SizeAndAlign(s).Size() == 1 3955 // result: (MOVBstore dst (MOVBZload src mem) mem) 3956 for { 3957 s := v.AuxInt 3958 dst := v.Args[0] 3959 src := v.Args[1] 3960 mem := v.Args[2] 3961 if !(SizeAndAlign(s).Size() == 1) { 3962 break 3963 } 3964 v.reset(OpS390XMOVBstore) 3965 v.AddArg(dst) 3966 v0 := b.NewValue0(v.Line, OpS390XMOVBZload, config.fe.TypeUInt8()) 3967 v0.AddArg(src) 3968 v0.AddArg(mem) 3969 v.AddArg(v0) 3970 v.AddArg(mem) 3971 return true 3972 } 3973 // match: (Move [s] dst src mem) 3974 // cond: SizeAndAlign(s).Size() == 2 3975 // result: (MOVHstore dst (MOVHZload src mem) mem) 3976 for { 3977 s := v.AuxInt 3978 dst := v.Args[0] 3979 src := v.Args[1] 3980 mem := v.Args[2] 3981 if !(SizeAndAlign(s).Size() == 2) { 3982 break 3983 } 3984 v.reset(OpS390XMOVHstore) 3985 v.AddArg(dst) 3986 v0 := b.NewValue0(v.Line, OpS390XMOVHZload, config.fe.TypeUInt16()) 3987 v0.AddArg(src) 3988 v0.AddArg(mem) 3989 v.AddArg(v0) 3990 v.AddArg(mem) 3991 return true 3992 } 3993 // match: (Move [s] dst src mem) 3994 // cond: SizeAndAlign(s).Size() == 4 3995 // result: (MOVWstore dst (MOVWZload src mem) mem) 3996 for { 3997 s := v.AuxInt 3998 dst := v.Args[0] 3999 src := v.Args[1] 4000 mem := v.Args[2] 4001 if !(SizeAndAlign(s).Size() == 4) { 4002 break 4003 } 4004 v.reset(OpS390XMOVWstore) 4005 v.AddArg(dst) 4006 v0 := b.NewValue0(v.Line, OpS390XMOVWZload, config.fe.TypeUInt32()) 4007 v0.AddArg(src) 4008 v0.AddArg(mem) 4009 v.AddArg(v0) 4010 v.AddArg(mem) 4011 return true 4012 } 4013 // match: (Move [s] dst src mem) 4014 // cond: SizeAndAlign(s).Size() == 8 4015 // result: (MOVDstore dst (MOVDload src mem) mem) 4016 for { 4017 s := v.AuxInt 4018 dst := v.Args[0] 4019 src := v.Args[1] 4020 mem := v.Args[2] 4021 if !(SizeAndAlign(s).Size() == 8) { 4022 break 4023 } 4024 v.reset(OpS390XMOVDstore) 4025 v.AddArg(dst) 4026 v0 := b.NewValue0(v.Line, OpS390XMOVDload, config.fe.TypeUInt64()) 4027 v0.AddArg(src) 4028 v0.AddArg(mem) 4029 v.AddArg(v0) 4030 v.AddArg(mem) 4031 return true 4032 } 4033 // match: (Move [s] dst src mem) 4034 // cond: SizeAndAlign(s).Size() == 16 4035 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 4036 for { 4037 s := v.AuxInt 4038 dst := v.Args[0] 4039 src := v.Args[1] 4040 mem := v.Args[2] 4041 if !(SizeAndAlign(s).Size() == 16) { 4042 break 4043 } 4044 v.reset(OpS390XMOVDstore) 4045 v.AuxInt = 8 4046 v.AddArg(dst) 4047 v0 := b.NewValue0(v.Line, OpS390XMOVDload, config.fe.TypeUInt64()) 4048 v0.AuxInt = 8 4049 v0.AddArg(src) 4050 v0.AddArg(mem) 4051 v.AddArg(v0) 4052 v1 := b.NewValue0(v.Line, OpS390XMOVDstore, TypeMem) 4053 v1.AddArg(dst) 4054 v2 := b.NewValue0(v.Line, OpS390XMOVDload, config.fe.TypeUInt64()) 4055 v2.AddArg(src) 4056 v2.AddArg(mem) 4057 v1.AddArg(v2) 4058 v1.AddArg(mem) 4059 v.AddArg(v1) 4060 return true 4061 } 4062 // match: (Move [s] dst src mem) 4063 // cond: SizeAndAlign(s).Size() == 24 4064 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 4065 for { 4066 s := v.AuxInt 4067 dst := v.Args[0] 4068 src := v.Args[1] 4069 mem := v.Args[2] 4070 if !(SizeAndAlign(s).Size() == 24) { 4071 break 4072 } 4073 v.reset(OpS390XMOVDstore) 4074 v.AuxInt = 16 4075 v.AddArg(dst) 4076 v0 := b.NewValue0(v.Line, OpS390XMOVDload, config.fe.TypeUInt64()) 4077 v0.AuxInt = 16 4078 v0.AddArg(src) 4079 v0.AddArg(mem) 4080 v.AddArg(v0) 4081 v1 := b.NewValue0(v.Line, OpS390XMOVDstore, TypeMem) 4082 v1.AuxInt = 8 4083 v1.AddArg(dst) 4084 v2 := b.NewValue0(v.Line, OpS390XMOVDload, config.fe.TypeUInt64()) 4085 v2.AuxInt = 8 4086 v2.AddArg(src) 4087 v2.AddArg(mem) 4088 v1.AddArg(v2) 4089 v3 := b.NewValue0(v.Line, OpS390XMOVDstore, TypeMem) 4090 v3.AddArg(dst) 4091 v4 := b.NewValue0(v.Line, OpS390XMOVDload, config.fe.TypeUInt64()) 4092 v4.AddArg(src) 4093 v4.AddArg(mem) 4094 v3.AddArg(v4) 4095 v3.AddArg(mem) 4096 v1.AddArg(v3) 4097 v.AddArg(v1) 4098 return true 4099 } 4100 // match: (Move [s] dst src mem) 4101 // cond: SizeAndAlign(s).Size() == 3 4102 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 4103 for { 4104 s := v.AuxInt 4105 dst := v.Args[0] 4106 src := v.Args[1] 4107 mem := v.Args[2] 4108 if !(SizeAndAlign(s).Size() == 3) { 4109 break 4110 } 4111 v.reset(OpS390XMOVBstore) 4112 v.AuxInt = 2 4113 v.AddArg(dst) 4114 v0 := b.NewValue0(v.Line, OpS390XMOVBZload, config.fe.TypeUInt8()) 4115 v0.AuxInt = 2 4116 v0.AddArg(src) 4117 v0.AddArg(mem) 4118 v.AddArg(v0) 4119 v1 := b.NewValue0(v.Line, OpS390XMOVHstore, TypeMem) 4120 v1.AddArg(dst) 4121 v2 := b.NewValue0(v.Line, OpS390XMOVHZload, config.fe.TypeUInt16()) 4122 v2.AddArg(src) 4123 v2.AddArg(mem) 4124 v1.AddArg(v2) 4125 v1.AddArg(mem) 4126 v.AddArg(v1) 4127 return true 4128 } 4129 // match: (Move [s] dst src mem) 4130 // cond: SizeAndAlign(s).Size() == 5 4131 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4132 for { 4133 s := v.AuxInt 4134 dst := v.Args[0] 4135 src := v.Args[1] 4136 mem := v.Args[2] 4137 if !(SizeAndAlign(s).Size() == 5) { 4138 break 4139 } 4140 v.reset(OpS390XMOVBstore) 4141 v.AuxInt = 4 4142 v.AddArg(dst) 4143 v0 := b.NewValue0(v.Line, OpS390XMOVBZload, config.fe.TypeUInt8()) 4144 v0.AuxInt = 4 4145 v0.AddArg(src) 4146 v0.AddArg(mem) 4147 v.AddArg(v0) 4148 v1 := b.NewValue0(v.Line, OpS390XMOVWstore, TypeMem) 4149 v1.AddArg(dst) 4150 v2 := b.NewValue0(v.Line, OpS390XMOVWZload, config.fe.TypeUInt32()) 4151 v2.AddArg(src) 4152 v2.AddArg(mem) 4153 v1.AddArg(v2) 4154 v1.AddArg(mem) 4155 v.AddArg(v1) 4156 return true 4157 } 4158 // match: (Move [s] dst src mem) 4159 // cond: SizeAndAlign(s).Size() == 6 4160 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4161 for { 4162 s := v.AuxInt 4163 dst := v.Args[0] 4164 src := v.Args[1] 4165 mem := v.Args[2] 4166 if !(SizeAndAlign(s).Size() == 6) { 4167 break 4168 } 4169 v.reset(OpS390XMOVHstore) 4170 v.AuxInt = 4 4171 v.AddArg(dst) 4172 v0 := b.NewValue0(v.Line, OpS390XMOVHZload, config.fe.TypeUInt16()) 4173 v0.AuxInt = 4 4174 v0.AddArg(src) 4175 v0.AddArg(mem) 4176 v.AddArg(v0) 4177 v1 := b.NewValue0(v.Line, OpS390XMOVWstore, TypeMem) 4178 v1.AddArg(dst) 4179 v2 := b.NewValue0(v.Line, OpS390XMOVWZload, config.fe.TypeUInt32()) 4180 v2.AddArg(src) 4181 v2.AddArg(mem) 4182 v1.AddArg(v2) 4183 v1.AddArg(mem) 4184 v.AddArg(v1) 4185 return true 4186 } 4187 // match: (Move [s] dst src mem) 4188 // cond: SizeAndAlign(s).Size() == 7 4189 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4190 for { 4191 s := v.AuxInt 4192 dst := v.Args[0] 4193 src := v.Args[1] 4194 mem := v.Args[2] 4195 if !(SizeAndAlign(s).Size() == 7) { 4196 break 4197 } 4198 v.reset(OpS390XMOVBstore) 4199 v.AuxInt = 6 4200 v.AddArg(dst) 4201 v0 := b.NewValue0(v.Line, OpS390XMOVBZload, config.fe.TypeUInt8()) 4202 v0.AuxInt = 6 4203 v0.AddArg(src) 4204 v0.AddArg(mem) 4205 v.AddArg(v0) 4206 v1 := b.NewValue0(v.Line, OpS390XMOVHstore, TypeMem) 4207 v1.AuxInt = 4 4208 v1.AddArg(dst) 4209 v2 := b.NewValue0(v.Line, OpS390XMOVHZload, config.fe.TypeUInt16()) 4210 v2.AuxInt = 4 4211 v2.AddArg(src) 4212 v2.AddArg(mem) 4213 v1.AddArg(v2) 4214 v3 := b.NewValue0(v.Line, OpS390XMOVWstore, TypeMem) 4215 v3.AddArg(dst) 4216 v4 := b.NewValue0(v.Line, OpS390XMOVWZload, config.fe.TypeUInt32()) 4217 v4.AddArg(src) 4218 v4.AddArg(mem) 4219 v3.AddArg(v4) 4220 v3.AddArg(mem) 4221 v1.AddArg(v3) 4222 v.AddArg(v1) 4223 return true 4224 } 4225 // match: (Move [s] dst src mem) 4226 // cond: SizeAndAlign(s).Size() > 0 && SizeAndAlign(s).Size() <= 256 4227 // result: (MVC [makeValAndOff(SizeAndAlign(s).Size(), 0)] dst src mem) 4228 for { 4229 s := v.AuxInt 4230 dst := v.Args[0] 4231 src := v.Args[1] 4232 mem := v.Args[2] 4233 if !(SizeAndAlign(s).Size() > 0 && SizeAndAlign(s).Size() <= 256) { 4234 break 4235 } 4236 v.reset(OpS390XMVC) 4237 v.AuxInt = makeValAndOff(SizeAndAlign(s).Size(), 0) 4238 v.AddArg(dst) 4239 v.AddArg(src) 4240 v.AddArg(mem) 4241 return true 4242 } 4243 // match: (Move [s] dst src mem) 4244 // cond: SizeAndAlign(s).Size() > 256 && SizeAndAlign(s).Size() <= 512 4245 // result: (MVC [makeValAndOff(SizeAndAlign(s).Size()-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4246 for { 4247 s := v.AuxInt 4248 dst := v.Args[0] 4249 src := v.Args[1] 4250 mem := v.Args[2] 4251 if !(SizeAndAlign(s).Size() > 256 && SizeAndAlign(s).Size() <= 512) { 4252 break 4253 } 4254 v.reset(OpS390XMVC) 4255 v.AuxInt = makeValAndOff(SizeAndAlign(s).Size()-256, 256) 4256 v.AddArg(dst) 4257 v.AddArg(src) 4258 v0 := b.NewValue0(v.Line, OpS390XMVC, TypeMem) 4259 v0.AuxInt = makeValAndOff(256, 0) 4260 v0.AddArg(dst) 4261 v0.AddArg(src) 4262 v0.AddArg(mem) 4263 v.AddArg(v0) 4264 return true 4265 } 4266 // match: (Move [s] dst src mem) 4267 // cond: SizeAndAlign(s).Size() > 512 && SizeAndAlign(s).Size() <= 768 4268 // result: (MVC [makeValAndOff(SizeAndAlign(s).Size()-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4269 for { 4270 s := v.AuxInt 4271 dst := v.Args[0] 4272 src := v.Args[1] 4273 mem := v.Args[2] 4274 if !(SizeAndAlign(s).Size() > 512 && SizeAndAlign(s).Size() <= 768) { 4275 break 4276 } 4277 v.reset(OpS390XMVC) 4278 v.AuxInt = makeValAndOff(SizeAndAlign(s).Size()-512, 512) 4279 v.AddArg(dst) 4280 v.AddArg(src) 4281 v0 := b.NewValue0(v.Line, OpS390XMVC, TypeMem) 4282 v0.AuxInt = makeValAndOff(256, 256) 4283 v0.AddArg(dst) 4284 v0.AddArg(src) 4285 v1 := b.NewValue0(v.Line, OpS390XMVC, TypeMem) 4286 v1.AuxInt = makeValAndOff(256, 0) 4287 v1.AddArg(dst) 4288 v1.AddArg(src) 4289 v1.AddArg(mem) 4290 v0.AddArg(v1) 4291 v.AddArg(v0) 4292 return true 4293 } 4294 // match: (Move [s] dst src mem) 4295 // cond: SizeAndAlign(s).Size() > 768 && SizeAndAlign(s).Size() <= 1024 4296 // result: (MVC [makeValAndOff(SizeAndAlign(s).Size()-768, 768)] dst src (MVC [makeValAndOff(256, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))) 4297 for { 4298 s := v.AuxInt 4299 dst := v.Args[0] 4300 src := v.Args[1] 4301 mem := v.Args[2] 4302 if !(SizeAndAlign(s).Size() > 768 && SizeAndAlign(s).Size() <= 1024) { 4303 break 4304 } 4305 v.reset(OpS390XMVC) 4306 v.AuxInt = makeValAndOff(SizeAndAlign(s).Size()-768, 768) 4307 v.AddArg(dst) 4308 v.AddArg(src) 4309 v0 := b.NewValue0(v.Line, OpS390XMVC, TypeMem) 4310 v0.AuxInt = makeValAndOff(256, 512) 4311 v0.AddArg(dst) 4312 v0.AddArg(src) 4313 v1 := b.NewValue0(v.Line, OpS390XMVC, TypeMem) 4314 v1.AuxInt = makeValAndOff(256, 256) 4315 v1.AddArg(dst) 4316 v1.AddArg(src) 4317 v2 := b.NewValue0(v.Line, OpS390XMVC, TypeMem) 4318 v2.AuxInt = makeValAndOff(256, 0) 4319 v2.AddArg(dst) 4320 v2.AddArg(src) 4321 v2.AddArg(mem) 4322 v1.AddArg(v2) 4323 v0.AddArg(v1) 4324 v.AddArg(v0) 4325 return true 4326 } 4327 // match: (Move [s] dst src mem) 4328 // cond: SizeAndAlign(s).Size() > 1024 4329 // result: (LoweredMove [SizeAndAlign(s).Size()%256] dst src (ADDconst <src.Type> src [(SizeAndAlign(s).Size()/256)*256]) mem) 4330 for { 4331 s := v.AuxInt 4332 dst := v.Args[0] 4333 src := v.Args[1] 4334 mem := v.Args[2] 4335 if !(SizeAndAlign(s).Size() > 1024) { 4336 break 4337 } 4338 v.reset(OpS390XLoweredMove) 4339 v.AuxInt = SizeAndAlign(s).Size() % 256 4340 v.AddArg(dst) 4341 v.AddArg(src) 4342 v0 := b.NewValue0(v.Line, OpS390XADDconst, src.Type) 4343 v0.AuxInt = (SizeAndAlign(s).Size() / 256) * 256 4344 v0.AddArg(src) 4345 v.AddArg(v0) 4346 v.AddArg(mem) 4347 return true 4348 } 4349 return false 4350 } 4351 func rewriteValueS390X_OpMul16(v *Value, config *Config) bool { 4352 b := v.Block 4353 _ = b 4354 // match: (Mul16 x y) 4355 // cond: 4356 // result: (MULLW x y) 4357 for { 4358 x := v.Args[0] 4359 y := v.Args[1] 4360 v.reset(OpS390XMULLW) 4361 v.AddArg(x) 4362 v.AddArg(y) 4363 return true 4364 } 4365 } 4366 func rewriteValueS390X_OpMul32(v *Value, config *Config) bool { 4367 b := v.Block 4368 _ = b 4369 // match: (Mul32 x y) 4370 // cond: 4371 // result: (MULLW x y) 4372 for { 4373 x := v.Args[0] 4374 y := v.Args[1] 4375 v.reset(OpS390XMULLW) 4376 v.AddArg(x) 4377 v.AddArg(y) 4378 return true 4379 } 4380 } 4381 func rewriteValueS390X_OpMul32F(v *Value, config *Config) bool { 4382 b := v.Block 4383 _ = b 4384 // match: (Mul32F x y) 4385 // cond: 4386 // result: (FMULS x y) 4387 for { 4388 x := v.Args[0] 4389 y := v.Args[1] 4390 v.reset(OpS390XFMULS) 4391 v.AddArg(x) 4392 v.AddArg(y) 4393 return true 4394 } 4395 } 4396 func rewriteValueS390X_OpMul64(v *Value, config *Config) bool { 4397 b := v.Block 4398 _ = b 4399 // match: (Mul64 x y) 4400 // cond: 4401 // result: (MULLD x y) 4402 for { 4403 x := v.Args[0] 4404 y := v.Args[1] 4405 v.reset(OpS390XMULLD) 4406 v.AddArg(x) 4407 v.AddArg(y) 4408 return true 4409 } 4410 } 4411 func rewriteValueS390X_OpMul64F(v *Value, config *Config) bool { 4412 b := v.Block 4413 _ = b 4414 // match: (Mul64F x y) 4415 // cond: 4416 // result: (FMUL x y) 4417 for { 4418 x := v.Args[0] 4419 y := v.Args[1] 4420 v.reset(OpS390XFMUL) 4421 v.AddArg(x) 4422 v.AddArg(y) 4423 return true 4424 } 4425 } 4426 func rewriteValueS390X_OpMul8(v *Value, config *Config) bool { 4427 b := v.Block 4428 _ = b 4429 // match: (Mul8 x y) 4430 // cond: 4431 // result: (MULLW x y) 4432 for { 4433 x := v.Args[0] 4434 y := v.Args[1] 4435 v.reset(OpS390XMULLW) 4436 v.AddArg(x) 4437 v.AddArg(y) 4438 return true 4439 } 4440 } 4441 func rewriteValueS390X_OpNeg16(v *Value, config *Config) bool { 4442 b := v.Block 4443 _ = b 4444 // match: (Neg16 x) 4445 // cond: 4446 // result: (NEGW (MOVHreg x)) 4447 for { 4448 x := v.Args[0] 4449 v.reset(OpS390XNEGW) 4450 v0 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 4451 v0.AddArg(x) 4452 v.AddArg(v0) 4453 return true 4454 } 4455 } 4456 func rewriteValueS390X_OpNeg32(v *Value, config *Config) bool { 4457 b := v.Block 4458 _ = b 4459 // match: (Neg32 x) 4460 // cond: 4461 // result: (NEGW x) 4462 for { 4463 x := v.Args[0] 4464 v.reset(OpS390XNEGW) 4465 v.AddArg(x) 4466 return true 4467 } 4468 } 4469 func rewriteValueS390X_OpNeg32F(v *Value, config *Config) bool { 4470 b := v.Block 4471 _ = b 4472 // match: (Neg32F x) 4473 // cond: 4474 // result: (FNEGS x) 4475 for { 4476 x := v.Args[0] 4477 v.reset(OpS390XFNEGS) 4478 v.AddArg(x) 4479 return true 4480 } 4481 } 4482 func rewriteValueS390X_OpNeg64(v *Value, config *Config) bool { 4483 b := v.Block 4484 _ = b 4485 // match: (Neg64 x) 4486 // cond: 4487 // result: (NEG x) 4488 for { 4489 x := v.Args[0] 4490 v.reset(OpS390XNEG) 4491 v.AddArg(x) 4492 return true 4493 } 4494 } 4495 func rewriteValueS390X_OpNeg64F(v *Value, config *Config) bool { 4496 b := v.Block 4497 _ = b 4498 // match: (Neg64F x) 4499 // cond: 4500 // result: (FNEG x) 4501 for { 4502 x := v.Args[0] 4503 v.reset(OpS390XFNEG) 4504 v.AddArg(x) 4505 return true 4506 } 4507 } 4508 func rewriteValueS390X_OpNeg8(v *Value, config *Config) bool { 4509 b := v.Block 4510 _ = b 4511 // match: (Neg8 x) 4512 // cond: 4513 // result: (NEGW (MOVBreg x)) 4514 for { 4515 x := v.Args[0] 4516 v.reset(OpS390XNEGW) 4517 v0 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 4518 v0.AddArg(x) 4519 v.AddArg(v0) 4520 return true 4521 } 4522 } 4523 func rewriteValueS390X_OpNeq16(v *Value, config *Config) bool { 4524 b := v.Block 4525 _ = b 4526 // match: (Neq16 x y) 4527 // cond: 4528 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 4529 for { 4530 x := v.Args[0] 4531 y := v.Args[1] 4532 v.reset(OpS390XMOVDNE) 4533 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4534 v0.AuxInt = 0 4535 v.AddArg(v0) 4536 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4537 v1.AuxInt = 1 4538 v.AddArg(v1) 4539 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 4540 v3 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 4541 v3.AddArg(x) 4542 v2.AddArg(v3) 4543 v4 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 4544 v4.AddArg(y) 4545 v2.AddArg(v4) 4546 v.AddArg(v2) 4547 return true 4548 } 4549 } 4550 func rewriteValueS390X_OpNeq32(v *Value, config *Config) bool { 4551 b := v.Block 4552 _ = b 4553 // match: (Neq32 x y) 4554 // cond: 4555 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 4556 for { 4557 x := v.Args[0] 4558 y := v.Args[1] 4559 v.reset(OpS390XMOVDNE) 4560 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4561 v0.AuxInt = 0 4562 v.AddArg(v0) 4563 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4564 v1.AuxInt = 1 4565 v.AddArg(v1) 4566 v2 := b.NewValue0(v.Line, OpS390XCMPW, TypeFlags) 4567 v2.AddArg(x) 4568 v2.AddArg(y) 4569 v.AddArg(v2) 4570 return true 4571 } 4572 } 4573 func rewriteValueS390X_OpNeq32F(v *Value, config *Config) bool { 4574 b := v.Block 4575 _ = b 4576 // match: (Neq32F x y) 4577 // cond: 4578 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 4579 for { 4580 x := v.Args[0] 4581 y := v.Args[1] 4582 v.reset(OpS390XMOVDNE) 4583 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4584 v0.AuxInt = 0 4585 v.AddArg(v0) 4586 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4587 v1.AuxInt = 1 4588 v.AddArg(v1) 4589 v2 := b.NewValue0(v.Line, OpS390XFCMPS, TypeFlags) 4590 v2.AddArg(x) 4591 v2.AddArg(y) 4592 v.AddArg(v2) 4593 return true 4594 } 4595 } 4596 func rewriteValueS390X_OpNeq64(v *Value, config *Config) bool { 4597 b := v.Block 4598 _ = b 4599 // match: (Neq64 x y) 4600 // cond: 4601 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4602 for { 4603 x := v.Args[0] 4604 y := v.Args[1] 4605 v.reset(OpS390XMOVDNE) 4606 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4607 v0.AuxInt = 0 4608 v.AddArg(v0) 4609 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4610 v1.AuxInt = 1 4611 v.AddArg(v1) 4612 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 4613 v2.AddArg(x) 4614 v2.AddArg(y) 4615 v.AddArg(v2) 4616 return true 4617 } 4618 } 4619 func rewriteValueS390X_OpNeq64F(v *Value, config *Config) bool { 4620 b := v.Block 4621 _ = b 4622 // match: (Neq64F x y) 4623 // cond: 4624 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 4625 for { 4626 x := v.Args[0] 4627 y := v.Args[1] 4628 v.reset(OpS390XMOVDNE) 4629 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4630 v0.AuxInt = 0 4631 v.AddArg(v0) 4632 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4633 v1.AuxInt = 1 4634 v.AddArg(v1) 4635 v2 := b.NewValue0(v.Line, OpS390XFCMP, TypeFlags) 4636 v2.AddArg(x) 4637 v2.AddArg(y) 4638 v.AddArg(v2) 4639 return true 4640 } 4641 } 4642 func rewriteValueS390X_OpNeq8(v *Value, config *Config) bool { 4643 b := v.Block 4644 _ = b 4645 // match: (Neq8 x y) 4646 // cond: 4647 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4648 for { 4649 x := v.Args[0] 4650 y := v.Args[1] 4651 v.reset(OpS390XMOVDNE) 4652 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4653 v0.AuxInt = 0 4654 v.AddArg(v0) 4655 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4656 v1.AuxInt = 1 4657 v.AddArg(v1) 4658 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 4659 v3 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 4660 v3.AddArg(x) 4661 v2.AddArg(v3) 4662 v4 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 4663 v4.AddArg(y) 4664 v2.AddArg(v4) 4665 v.AddArg(v2) 4666 return true 4667 } 4668 } 4669 func rewriteValueS390X_OpNeqB(v *Value, config *Config) bool { 4670 b := v.Block 4671 _ = b 4672 // match: (NeqB x y) 4673 // cond: 4674 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4675 for { 4676 x := v.Args[0] 4677 y := v.Args[1] 4678 v.reset(OpS390XMOVDNE) 4679 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4680 v0.AuxInt = 0 4681 v.AddArg(v0) 4682 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4683 v1.AuxInt = 1 4684 v.AddArg(v1) 4685 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 4686 v3 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 4687 v3.AddArg(x) 4688 v2.AddArg(v3) 4689 v4 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 4690 v4.AddArg(y) 4691 v2.AddArg(v4) 4692 v.AddArg(v2) 4693 return true 4694 } 4695 } 4696 func rewriteValueS390X_OpNeqPtr(v *Value, config *Config) bool { 4697 b := v.Block 4698 _ = b 4699 // match: (NeqPtr x y) 4700 // cond: 4701 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4702 for { 4703 x := v.Args[0] 4704 y := v.Args[1] 4705 v.reset(OpS390XMOVDNE) 4706 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4707 v0.AuxInt = 0 4708 v.AddArg(v0) 4709 v1 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4710 v1.AuxInt = 1 4711 v.AddArg(v1) 4712 v2 := b.NewValue0(v.Line, OpS390XCMP, TypeFlags) 4713 v2.AddArg(x) 4714 v2.AddArg(y) 4715 v.AddArg(v2) 4716 return true 4717 } 4718 } 4719 func rewriteValueS390X_OpNilCheck(v *Value, config *Config) bool { 4720 b := v.Block 4721 _ = b 4722 // match: (NilCheck ptr mem) 4723 // cond: 4724 // result: (LoweredNilCheck ptr mem) 4725 for { 4726 ptr := v.Args[0] 4727 mem := v.Args[1] 4728 v.reset(OpS390XLoweredNilCheck) 4729 v.AddArg(ptr) 4730 v.AddArg(mem) 4731 return true 4732 } 4733 } 4734 func rewriteValueS390X_OpNot(v *Value, config *Config) bool { 4735 b := v.Block 4736 _ = b 4737 // match: (Not x) 4738 // cond: 4739 // result: (XORWconst [1] x) 4740 for { 4741 x := v.Args[0] 4742 v.reset(OpS390XXORWconst) 4743 v.AuxInt = 1 4744 v.AddArg(x) 4745 return true 4746 } 4747 } 4748 func rewriteValueS390X_OpOffPtr(v *Value, config *Config) bool { 4749 b := v.Block 4750 _ = b 4751 // match: (OffPtr [off] ptr:(SP)) 4752 // cond: 4753 // result: (MOVDaddr [off] ptr) 4754 for { 4755 off := v.AuxInt 4756 ptr := v.Args[0] 4757 if ptr.Op != OpSP { 4758 break 4759 } 4760 v.reset(OpS390XMOVDaddr) 4761 v.AuxInt = off 4762 v.AddArg(ptr) 4763 return true 4764 } 4765 // match: (OffPtr [off] ptr) 4766 // cond: is32Bit(off) 4767 // result: (ADDconst [off] ptr) 4768 for { 4769 off := v.AuxInt 4770 ptr := v.Args[0] 4771 if !(is32Bit(off)) { 4772 break 4773 } 4774 v.reset(OpS390XADDconst) 4775 v.AuxInt = off 4776 v.AddArg(ptr) 4777 return true 4778 } 4779 // match: (OffPtr [off] ptr) 4780 // cond: 4781 // result: (ADD (MOVDconst [off]) ptr) 4782 for { 4783 off := v.AuxInt 4784 ptr := v.Args[0] 4785 v.reset(OpS390XADD) 4786 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 4787 v0.AuxInt = off 4788 v.AddArg(v0) 4789 v.AddArg(ptr) 4790 return true 4791 } 4792 } 4793 func rewriteValueS390X_OpOr16(v *Value, config *Config) bool { 4794 b := v.Block 4795 _ = b 4796 // match: (Or16 x y) 4797 // cond: 4798 // result: (ORW x y) 4799 for { 4800 x := v.Args[0] 4801 y := v.Args[1] 4802 v.reset(OpS390XORW) 4803 v.AddArg(x) 4804 v.AddArg(y) 4805 return true 4806 } 4807 } 4808 func rewriteValueS390X_OpOr32(v *Value, config *Config) bool { 4809 b := v.Block 4810 _ = b 4811 // match: (Or32 x y) 4812 // cond: 4813 // result: (ORW x y) 4814 for { 4815 x := v.Args[0] 4816 y := v.Args[1] 4817 v.reset(OpS390XORW) 4818 v.AddArg(x) 4819 v.AddArg(y) 4820 return true 4821 } 4822 } 4823 func rewriteValueS390X_OpOr64(v *Value, config *Config) bool { 4824 b := v.Block 4825 _ = b 4826 // match: (Or64 x y) 4827 // cond: 4828 // result: (OR x y) 4829 for { 4830 x := v.Args[0] 4831 y := v.Args[1] 4832 v.reset(OpS390XOR) 4833 v.AddArg(x) 4834 v.AddArg(y) 4835 return true 4836 } 4837 } 4838 func rewriteValueS390X_OpOr8(v *Value, config *Config) bool { 4839 b := v.Block 4840 _ = b 4841 // match: (Or8 x y) 4842 // cond: 4843 // result: (ORW x y) 4844 for { 4845 x := v.Args[0] 4846 y := v.Args[1] 4847 v.reset(OpS390XORW) 4848 v.AddArg(x) 4849 v.AddArg(y) 4850 return true 4851 } 4852 } 4853 func rewriteValueS390X_OpOrB(v *Value, config *Config) bool { 4854 b := v.Block 4855 _ = b 4856 // match: (OrB x y) 4857 // cond: 4858 // result: (ORW x y) 4859 for { 4860 x := v.Args[0] 4861 y := v.Args[1] 4862 v.reset(OpS390XORW) 4863 v.AddArg(x) 4864 v.AddArg(y) 4865 return true 4866 } 4867 } 4868 func rewriteValueS390X_OpRsh16Ux16(v *Value, config *Config) bool { 4869 b := v.Block 4870 _ = b 4871 // match: (Rsh16Ux16 <t> x y) 4872 // cond: 4873 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [15]))) 4874 for { 4875 t := v.Type 4876 x := v.Args[0] 4877 y := v.Args[1] 4878 v.reset(OpS390XANDW) 4879 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 4880 v1 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 4881 v1.AddArg(x) 4882 v0.AddArg(v1) 4883 v0.AddArg(y) 4884 v.AddArg(v0) 4885 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 4886 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 4887 v3.AuxInt = 15 4888 v4 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 4889 v4.AddArg(y) 4890 v3.AddArg(v4) 4891 v2.AddArg(v3) 4892 v.AddArg(v2) 4893 return true 4894 } 4895 } 4896 func rewriteValueS390X_OpRsh16Ux32(v *Value, config *Config) bool { 4897 b := v.Block 4898 _ = b 4899 // match: (Rsh16Ux32 <t> x y) 4900 // cond: 4901 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [15]))) 4902 for { 4903 t := v.Type 4904 x := v.Args[0] 4905 y := v.Args[1] 4906 v.reset(OpS390XANDW) 4907 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 4908 v1 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 4909 v1.AddArg(x) 4910 v0.AddArg(v1) 4911 v0.AddArg(y) 4912 v.AddArg(v0) 4913 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 4914 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 4915 v3.AuxInt = 15 4916 v3.AddArg(y) 4917 v2.AddArg(v3) 4918 v.AddArg(v2) 4919 return true 4920 } 4921 } 4922 func rewriteValueS390X_OpRsh16Ux64(v *Value, config *Config) bool { 4923 b := v.Block 4924 _ = b 4925 // match: (Rsh16Ux64 <t> x y) 4926 // cond: 4927 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [15]))) 4928 for { 4929 t := v.Type 4930 x := v.Args[0] 4931 y := v.Args[1] 4932 v.reset(OpS390XANDW) 4933 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 4934 v1 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 4935 v1.AddArg(x) 4936 v0.AddArg(v1) 4937 v0.AddArg(y) 4938 v.AddArg(v0) 4939 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 4940 v3 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 4941 v3.AuxInt = 15 4942 v3.AddArg(y) 4943 v2.AddArg(v3) 4944 v.AddArg(v2) 4945 return true 4946 } 4947 } 4948 func rewriteValueS390X_OpRsh16Ux8(v *Value, config *Config) bool { 4949 b := v.Block 4950 _ = b 4951 // match: (Rsh16Ux8 <t> x y) 4952 // cond: 4953 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [15]))) 4954 for { 4955 t := v.Type 4956 x := v.Args[0] 4957 y := v.Args[1] 4958 v.reset(OpS390XANDW) 4959 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 4960 v1 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 4961 v1.AddArg(x) 4962 v0.AddArg(v1) 4963 v0.AddArg(y) 4964 v.AddArg(v0) 4965 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 4966 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 4967 v3.AuxInt = 15 4968 v4 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 4969 v4.AddArg(y) 4970 v3.AddArg(v4) 4971 v2.AddArg(v3) 4972 v.AddArg(v2) 4973 return true 4974 } 4975 } 4976 func rewriteValueS390X_OpRsh16x16(v *Value, config *Config) bool { 4977 b := v.Block 4978 _ = b 4979 // match: (Rsh16x16 <t> x y) 4980 // cond: 4981 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [15]))))) 4982 for { 4983 t := v.Type 4984 x := v.Args[0] 4985 y := v.Args[1] 4986 v.reset(OpS390XSRAW) 4987 v.Type = t 4988 v0 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 4989 v0.AddArg(x) 4990 v.AddArg(v0) 4991 v1 := b.NewValue0(v.Line, OpS390XORW, y.Type) 4992 v1.AddArg(y) 4993 v2 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 4994 v3 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 4995 v4 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 4996 v4.AuxInt = 15 4997 v5 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 4998 v5.AddArg(y) 4999 v4.AddArg(v5) 5000 v3.AddArg(v4) 5001 v2.AddArg(v3) 5002 v1.AddArg(v2) 5003 v.AddArg(v1) 5004 return true 5005 } 5006 } 5007 func rewriteValueS390X_OpRsh16x32(v *Value, config *Config) bool { 5008 b := v.Block 5009 _ = b 5010 // match: (Rsh16x32 <t> x y) 5011 // cond: 5012 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [15]))))) 5013 for { 5014 t := v.Type 5015 x := v.Args[0] 5016 y := v.Args[1] 5017 v.reset(OpS390XSRAW) 5018 v.Type = t 5019 v0 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 5020 v0.AddArg(x) 5021 v.AddArg(v0) 5022 v1 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5023 v1.AddArg(y) 5024 v2 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5025 v3 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5026 v4 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5027 v4.AuxInt = 15 5028 v4.AddArg(y) 5029 v3.AddArg(v4) 5030 v2.AddArg(v3) 5031 v1.AddArg(v2) 5032 v.AddArg(v1) 5033 return true 5034 } 5035 } 5036 func rewriteValueS390X_OpRsh16x64(v *Value, config *Config) bool { 5037 b := v.Block 5038 _ = b 5039 // match: (Rsh16x64 <t> x y) 5040 // cond: 5041 // result: (SRAW <t> (MOVHreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [15]))))) 5042 for { 5043 t := v.Type 5044 x := v.Args[0] 5045 y := v.Args[1] 5046 v.reset(OpS390XSRAW) 5047 v.Type = t 5048 v0 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 5049 v0.AddArg(x) 5050 v.AddArg(v0) 5051 v1 := b.NewValue0(v.Line, OpS390XOR, y.Type) 5052 v1.AddArg(y) 5053 v2 := b.NewValue0(v.Line, OpS390XNOT, y.Type) 5054 v3 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, y.Type) 5055 v4 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 5056 v4.AuxInt = 15 5057 v4.AddArg(y) 5058 v3.AddArg(v4) 5059 v2.AddArg(v3) 5060 v1.AddArg(v2) 5061 v.AddArg(v1) 5062 return true 5063 } 5064 } 5065 func rewriteValueS390X_OpRsh16x8(v *Value, config *Config) bool { 5066 b := v.Block 5067 _ = b 5068 // match: (Rsh16x8 <t> x y) 5069 // cond: 5070 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [15]))))) 5071 for { 5072 t := v.Type 5073 x := v.Args[0] 5074 y := v.Args[1] 5075 v.reset(OpS390XSRAW) 5076 v.Type = t 5077 v0 := b.NewValue0(v.Line, OpS390XMOVHreg, config.fe.TypeInt64()) 5078 v0.AddArg(x) 5079 v.AddArg(v0) 5080 v1 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5081 v1.AddArg(y) 5082 v2 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5083 v3 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5084 v4 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5085 v4.AuxInt = 15 5086 v5 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5087 v5.AddArg(y) 5088 v4.AddArg(v5) 5089 v3.AddArg(v4) 5090 v2.AddArg(v3) 5091 v1.AddArg(v2) 5092 v.AddArg(v1) 5093 return true 5094 } 5095 } 5096 func rewriteValueS390X_OpRsh32Ux16(v *Value, config *Config) bool { 5097 b := v.Block 5098 _ = b 5099 // match: (Rsh32Ux16 <t> x y) 5100 // cond: 5101 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 5102 for { 5103 t := v.Type 5104 x := v.Args[0] 5105 y := v.Args[1] 5106 v.reset(OpS390XANDW) 5107 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 5108 v0.AddArg(x) 5109 v0.AddArg(y) 5110 v.AddArg(v0) 5111 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 5112 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5113 v2.AuxInt = 31 5114 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 5115 v3.AddArg(y) 5116 v2.AddArg(v3) 5117 v1.AddArg(v2) 5118 v.AddArg(v1) 5119 return true 5120 } 5121 } 5122 func rewriteValueS390X_OpRsh32Ux32(v *Value, config *Config) bool { 5123 b := v.Block 5124 _ = b 5125 // match: (Rsh32Ux32 <t> x y) 5126 // cond: 5127 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 5128 for { 5129 t := v.Type 5130 x := v.Args[0] 5131 y := v.Args[1] 5132 v.reset(OpS390XANDW) 5133 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 5134 v0.AddArg(x) 5135 v0.AddArg(y) 5136 v.AddArg(v0) 5137 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 5138 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5139 v2.AuxInt = 31 5140 v2.AddArg(y) 5141 v1.AddArg(v2) 5142 v.AddArg(v1) 5143 return true 5144 } 5145 } 5146 func rewriteValueS390X_OpRsh32Ux64(v *Value, config *Config) bool { 5147 b := v.Block 5148 _ = b 5149 // match: (Rsh32Ux64 <t> x y) 5150 // cond: 5151 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 5152 for { 5153 t := v.Type 5154 x := v.Args[0] 5155 y := v.Args[1] 5156 v.reset(OpS390XANDW) 5157 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 5158 v0.AddArg(x) 5159 v0.AddArg(y) 5160 v.AddArg(v0) 5161 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 5162 v2 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 5163 v2.AuxInt = 31 5164 v2.AddArg(y) 5165 v1.AddArg(v2) 5166 v.AddArg(v1) 5167 return true 5168 } 5169 } 5170 func rewriteValueS390X_OpRsh32Ux8(v *Value, config *Config) bool { 5171 b := v.Block 5172 _ = b 5173 // match: (Rsh32Ux8 <t> x y) 5174 // cond: 5175 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 5176 for { 5177 t := v.Type 5178 x := v.Args[0] 5179 y := v.Args[1] 5180 v.reset(OpS390XANDW) 5181 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 5182 v0.AddArg(x) 5183 v0.AddArg(y) 5184 v.AddArg(v0) 5185 v1 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 5186 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5187 v2.AuxInt = 31 5188 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5189 v3.AddArg(y) 5190 v2.AddArg(v3) 5191 v1.AddArg(v2) 5192 v.AddArg(v1) 5193 return true 5194 } 5195 } 5196 func rewriteValueS390X_OpRsh32x16(v *Value, config *Config) bool { 5197 b := v.Block 5198 _ = b 5199 // match: (Rsh32x16 <t> x y) 5200 // cond: 5201 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [31]))))) 5202 for { 5203 t := v.Type 5204 x := v.Args[0] 5205 y := v.Args[1] 5206 v.reset(OpS390XSRAW) 5207 v.Type = t 5208 v.AddArg(x) 5209 v0 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5210 v0.AddArg(y) 5211 v1 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5212 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5213 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5214 v3.AuxInt = 31 5215 v4 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 5216 v4.AddArg(y) 5217 v3.AddArg(v4) 5218 v2.AddArg(v3) 5219 v1.AddArg(v2) 5220 v0.AddArg(v1) 5221 v.AddArg(v0) 5222 return true 5223 } 5224 } 5225 func rewriteValueS390X_OpRsh32x32(v *Value, config *Config) bool { 5226 b := v.Block 5227 _ = b 5228 // match: (Rsh32x32 <t> x y) 5229 // cond: 5230 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [31]))))) 5231 for { 5232 t := v.Type 5233 x := v.Args[0] 5234 y := v.Args[1] 5235 v.reset(OpS390XSRAW) 5236 v.Type = t 5237 v.AddArg(x) 5238 v0 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5239 v0.AddArg(y) 5240 v1 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5241 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5242 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5243 v3.AuxInt = 31 5244 v3.AddArg(y) 5245 v2.AddArg(v3) 5246 v1.AddArg(v2) 5247 v0.AddArg(v1) 5248 v.AddArg(v0) 5249 return true 5250 } 5251 } 5252 func rewriteValueS390X_OpRsh32x64(v *Value, config *Config) bool { 5253 b := v.Block 5254 _ = b 5255 // match: (Rsh32x64 <t> x y) 5256 // cond: 5257 // result: (SRAW <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [31]))))) 5258 for { 5259 t := v.Type 5260 x := v.Args[0] 5261 y := v.Args[1] 5262 v.reset(OpS390XSRAW) 5263 v.Type = t 5264 v.AddArg(x) 5265 v0 := b.NewValue0(v.Line, OpS390XOR, y.Type) 5266 v0.AddArg(y) 5267 v1 := b.NewValue0(v.Line, OpS390XNOT, y.Type) 5268 v2 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, y.Type) 5269 v3 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 5270 v3.AuxInt = 31 5271 v3.AddArg(y) 5272 v2.AddArg(v3) 5273 v1.AddArg(v2) 5274 v0.AddArg(v1) 5275 v.AddArg(v0) 5276 return true 5277 } 5278 } 5279 func rewriteValueS390X_OpRsh32x8(v *Value, config *Config) bool { 5280 b := v.Block 5281 _ = b 5282 // match: (Rsh32x8 <t> x y) 5283 // cond: 5284 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [31]))))) 5285 for { 5286 t := v.Type 5287 x := v.Args[0] 5288 y := v.Args[1] 5289 v.reset(OpS390XSRAW) 5290 v.Type = t 5291 v.AddArg(x) 5292 v0 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5293 v0.AddArg(y) 5294 v1 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5295 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5296 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5297 v3.AuxInt = 31 5298 v4 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5299 v4.AddArg(y) 5300 v3.AddArg(v4) 5301 v2.AddArg(v3) 5302 v1.AddArg(v2) 5303 v0.AddArg(v1) 5304 v.AddArg(v0) 5305 return true 5306 } 5307 } 5308 func rewriteValueS390X_OpRsh64Ux16(v *Value, config *Config) bool { 5309 b := v.Block 5310 _ = b 5311 // match: (Rsh64Ux16 <t> x y) 5312 // cond: 5313 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 5314 for { 5315 t := v.Type 5316 x := v.Args[0] 5317 y := v.Args[1] 5318 v.reset(OpS390XAND) 5319 v0 := b.NewValue0(v.Line, OpS390XSRD, t) 5320 v0.AddArg(x) 5321 v0.AddArg(y) 5322 v.AddArg(v0) 5323 v1 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, t) 5324 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5325 v2.AuxInt = 63 5326 v3 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 5327 v3.AddArg(y) 5328 v2.AddArg(v3) 5329 v1.AddArg(v2) 5330 v.AddArg(v1) 5331 return true 5332 } 5333 } 5334 func rewriteValueS390X_OpRsh64Ux32(v *Value, config *Config) bool { 5335 b := v.Block 5336 _ = b 5337 // match: (Rsh64Ux32 <t> x y) 5338 // cond: 5339 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 5340 for { 5341 t := v.Type 5342 x := v.Args[0] 5343 y := v.Args[1] 5344 v.reset(OpS390XAND) 5345 v0 := b.NewValue0(v.Line, OpS390XSRD, t) 5346 v0.AddArg(x) 5347 v0.AddArg(y) 5348 v.AddArg(v0) 5349 v1 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, t) 5350 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5351 v2.AuxInt = 63 5352 v2.AddArg(y) 5353 v1.AddArg(v2) 5354 v.AddArg(v1) 5355 return true 5356 } 5357 } 5358 func rewriteValueS390X_OpRsh64Ux64(v *Value, config *Config) bool { 5359 b := v.Block 5360 _ = b 5361 // match: (Rsh64Ux64 <t> x y) 5362 // cond: 5363 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 5364 for { 5365 t := v.Type 5366 x := v.Args[0] 5367 y := v.Args[1] 5368 v.reset(OpS390XAND) 5369 v0 := b.NewValue0(v.Line, OpS390XSRD, t) 5370 v0.AddArg(x) 5371 v0.AddArg(y) 5372 v.AddArg(v0) 5373 v1 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, t) 5374 v2 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 5375 v2.AuxInt = 63 5376 v2.AddArg(y) 5377 v1.AddArg(v2) 5378 v.AddArg(v1) 5379 return true 5380 } 5381 } 5382 func rewriteValueS390X_OpRsh64Ux8(v *Value, config *Config) bool { 5383 b := v.Block 5384 _ = b 5385 // match: (Rsh64Ux8 <t> x y) 5386 // cond: 5387 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 5388 for { 5389 t := v.Type 5390 x := v.Args[0] 5391 y := v.Args[1] 5392 v.reset(OpS390XAND) 5393 v0 := b.NewValue0(v.Line, OpS390XSRD, t) 5394 v0.AddArg(x) 5395 v0.AddArg(y) 5396 v.AddArg(v0) 5397 v1 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, t) 5398 v2 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5399 v2.AuxInt = 63 5400 v3 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5401 v3.AddArg(y) 5402 v2.AddArg(v3) 5403 v1.AddArg(v2) 5404 v.AddArg(v1) 5405 return true 5406 } 5407 } 5408 func rewriteValueS390X_OpRsh64x16(v *Value, config *Config) bool { 5409 b := v.Block 5410 _ = b 5411 // match: (Rsh64x16 <t> x y) 5412 // cond: 5413 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [63]))))) 5414 for { 5415 t := v.Type 5416 x := v.Args[0] 5417 y := v.Args[1] 5418 v.reset(OpS390XSRAD) 5419 v.Type = t 5420 v.AddArg(x) 5421 v0 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5422 v0.AddArg(y) 5423 v1 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5424 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5425 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5426 v3.AuxInt = 63 5427 v4 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 5428 v4.AddArg(y) 5429 v3.AddArg(v4) 5430 v2.AddArg(v3) 5431 v1.AddArg(v2) 5432 v0.AddArg(v1) 5433 v.AddArg(v0) 5434 return true 5435 } 5436 } 5437 func rewriteValueS390X_OpRsh64x32(v *Value, config *Config) bool { 5438 b := v.Block 5439 _ = b 5440 // match: (Rsh64x32 <t> x y) 5441 // cond: 5442 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [63]))))) 5443 for { 5444 t := v.Type 5445 x := v.Args[0] 5446 y := v.Args[1] 5447 v.reset(OpS390XSRAD) 5448 v.Type = t 5449 v.AddArg(x) 5450 v0 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5451 v0.AddArg(y) 5452 v1 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5453 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5454 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5455 v3.AuxInt = 63 5456 v3.AddArg(y) 5457 v2.AddArg(v3) 5458 v1.AddArg(v2) 5459 v0.AddArg(v1) 5460 v.AddArg(v0) 5461 return true 5462 } 5463 } 5464 func rewriteValueS390X_OpRsh64x64(v *Value, config *Config) bool { 5465 b := v.Block 5466 _ = b 5467 // match: (Rsh64x64 <t> x y) 5468 // cond: 5469 // result: (SRAD <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [63]))))) 5470 for { 5471 t := v.Type 5472 x := v.Args[0] 5473 y := v.Args[1] 5474 v.reset(OpS390XSRAD) 5475 v.Type = t 5476 v.AddArg(x) 5477 v0 := b.NewValue0(v.Line, OpS390XOR, y.Type) 5478 v0.AddArg(y) 5479 v1 := b.NewValue0(v.Line, OpS390XNOT, y.Type) 5480 v2 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, y.Type) 5481 v3 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 5482 v3.AuxInt = 63 5483 v3.AddArg(y) 5484 v2.AddArg(v3) 5485 v1.AddArg(v2) 5486 v0.AddArg(v1) 5487 v.AddArg(v0) 5488 return true 5489 } 5490 } 5491 func rewriteValueS390X_OpRsh64x8(v *Value, config *Config) bool { 5492 b := v.Block 5493 _ = b 5494 // match: (Rsh64x8 <t> x y) 5495 // cond: 5496 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [63]))))) 5497 for { 5498 t := v.Type 5499 x := v.Args[0] 5500 y := v.Args[1] 5501 v.reset(OpS390XSRAD) 5502 v.Type = t 5503 v.AddArg(x) 5504 v0 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5505 v0.AddArg(y) 5506 v1 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5507 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5508 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5509 v3.AuxInt = 63 5510 v4 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5511 v4.AddArg(y) 5512 v3.AddArg(v4) 5513 v2.AddArg(v3) 5514 v1.AddArg(v2) 5515 v0.AddArg(v1) 5516 v.AddArg(v0) 5517 return true 5518 } 5519 } 5520 func rewriteValueS390X_OpRsh8Ux16(v *Value, config *Config) bool { 5521 b := v.Block 5522 _ = b 5523 // match: (Rsh8Ux16 <t> x y) 5524 // cond: 5525 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [7]))) 5526 for { 5527 t := v.Type 5528 x := v.Args[0] 5529 y := v.Args[1] 5530 v.reset(OpS390XANDW) 5531 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 5532 v1 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5533 v1.AddArg(x) 5534 v0.AddArg(v1) 5535 v0.AddArg(y) 5536 v.AddArg(v0) 5537 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 5538 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5539 v3.AuxInt = 7 5540 v4 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 5541 v4.AddArg(y) 5542 v3.AddArg(v4) 5543 v2.AddArg(v3) 5544 v.AddArg(v2) 5545 return true 5546 } 5547 } 5548 func rewriteValueS390X_OpRsh8Ux32(v *Value, config *Config) bool { 5549 b := v.Block 5550 _ = b 5551 // match: (Rsh8Ux32 <t> x y) 5552 // cond: 5553 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [7]))) 5554 for { 5555 t := v.Type 5556 x := v.Args[0] 5557 y := v.Args[1] 5558 v.reset(OpS390XANDW) 5559 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 5560 v1 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5561 v1.AddArg(x) 5562 v0.AddArg(v1) 5563 v0.AddArg(y) 5564 v.AddArg(v0) 5565 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 5566 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5567 v3.AuxInt = 7 5568 v3.AddArg(y) 5569 v2.AddArg(v3) 5570 v.AddArg(v2) 5571 return true 5572 } 5573 } 5574 func rewriteValueS390X_OpRsh8Ux64(v *Value, config *Config) bool { 5575 b := v.Block 5576 _ = b 5577 // match: (Rsh8Ux64 <t> x y) 5578 // cond: 5579 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [7]))) 5580 for { 5581 t := v.Type 5582 x := v.Args[0] 5583 y := v.Args[1] 5584 v.reset(OpS390XANDW) 5585 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 5586 v1 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5587 v1.AddArg(x) 5588 v0.AddArg(v1) 5589 v0.AddArg(y) 5590 v.AddArg(v0) 5591 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 5592 v3 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 5593 v3.AuxInt = 7 5594 v3.AddArg(y) 5595 v2.AddArg(v3) 5596 v.AddArg(v2) 5597 return true 5598 } 5599 } 5600 func rewriteValueS390X_OpRsh8Ux8(v *Value, config *Config) bool { 5601 b := v.Block 5602 _ = b 5603 // match: (Rsh8Ux8 <t> x y) 5604 // cond: 5605 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [7]))) 5606 for { 5607 t := v.Type 5608 x := v.Args[0] 5609 y := v.Args[1] 5610 v.reset(OpS390XANDW) 5611 v0 := b.NewValue0(v.Line, OpS390XSRW, t) 5612 v1 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5613 v1.AddArg(x) 5614 v0.AddArg(v1) 5615 v0.AddArg(y) 5616 v.AddArg(v0) 5617 v2 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, t) 5618 v3 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5619 v3.AuxInt = 7 5620 v4 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5621 v4.AddArg(y) 5622 v3.AddArg(v4) 5623 v2.AddArg(v3) 5624 v.AddArg(v2) 5625 return true 5626 } 5627 } 5628 func rewriteValueS390X_OpRsh8x16(v *Value, config *Config) bool { 5629 b := v.Block 5630 _ = b 5631 // match: (Rsh8x16 <t> x y) 5632 // cond: 5633 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [7]))))) 5634 for { 5635 t := v.Type 5636 x := v.Args[0] 5637 y := v.Args[1] 5638 v.reset(OpS390XSRAW) 5639 v.Type = t 5640 v0 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 5641 v0.AddArg(x) 5642 v.AddArg(v0) 5643 v1 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5644 v1.AddArg(y) 5645 v2 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5646 v3 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5647 v4 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5648 v4.AuxInt = 7 5649 v5 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 5650 v5.AddArg(y) 5651 v4.AddArg(v5) 5652 v3.AddArg(v4) 5653 v2.AddArg(v3) 5654 v1.AddArg(v2) 5655 v.AddArg(v1) 5656 return true 5657 } 5658 } 5659 func rewriteValueS390X_OpRsh8x32(v *Value, config *Config) bool { 5660 b := v.Block 5661 _ = b 5662 // match: (Rsh8x32 <t> x y) 5663 // cond: 5664 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [7]))))) 5665 for { 5666 t := v.Type 5667 x := v.Args[0] 5668 y := v.Args[1] 5669 v.reset(OpS390XSRAW) 5670 v.Type = t 5671 v0 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 5672 v0.AddArg(x) 5673 v.AddArg(v0) 5674 v1 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5675 v1.AddArg(y) 5676 v2 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5677 v3 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5678 v4 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5679 v4.AuxInt = 7 5680 v4.AddArg(y) 5681 v3.AddArg(v4) 5682 v2.AddArg(v3) 5683 v1.AddArg(v2) 5684 v.AddArg(v1) 5685 return true 5686 } 5687 } 5688 func rewriteValueS390X_OpRsh8x64(v *Value, config *Config) bool { 5689 b := v.Block 5690 _ = b 5691 // match: (Rsh8x64 <t> x y) 5692 // cond: 5693 // result: (SRAW <t> (MOVBreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [7]))))) 5694 for { 5695 t := v.Type 5696 x := v.Args[0] 5697 y := v.Args[1] 5698 v.reset(OpS390XSRAW) 5699 v.Type = t 5700 v0 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 5701 v0.AddArg(x) 5702 v.AddArg(v0) 5703 v1 := b.NewValue0(v.Line, OpS390XOR, y.Type) 5704 v1.AddArg(y) 5705 v2 := b.NewValue0(v.Line, OpS390XNOT, y.Type) 5706 v3 := b.NewValue0(v.Line, OpS390XSUBEcarrymask, y.Type) 5707 v4 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 5708 v4.AuxInt = 7 5709 v4.AddArg(y) 5710 v3.AddArg(v4) 5711 v2.AddArg(v3) 5712 v1.AddArg(v2) 5713 v.AddArg(v1) 5714 return true 5715 } 5716 } 5717 func rewriteValueS390X_OpRsh8x8(v *Value, config *Config) bool { 5718 b := v.Block 5719 _ = b 5720 // match: (Rsh8x8 <t> x y) 5721 // cond: 5722 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [7]))))) 5723 for { 5724 t := v.Type 5725 x := v.Args[0] 5726 y := v.Args[1] 5727 v.reset(OpS390XSRAW) 5728 v.Type = t 5729 v0 := b.NewValue0(v.Line, OpS390XMOVBreg, config.fe.TypeInt64()) 5730 v0.AddArg(x) 5731 v.AddArg(v0) 5732 v1 := b.NewValue0(v.Line, OpS390XORW, y.Type) 5733 v1.AddArg(y) 5734 v2 := b.NewValue0(v.Line, OpS390XNOTW, y.Type) 5735 v3 := b.NewValue0(v.Line, OpS390XSUBEWcarrymask, y.Type) 5736 v4 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 5737 v4.AuxInt = 7 5738 v5 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 5739 v5.AddArg(y) 5740 v4.AddArg(v5) 5741 v3.AddArg(v4) 5742 v2.AddArg(v3) 5743 v1.AddArg(v2) 5744 v.AddArg(v1) 5745 return true 5746 } 5747 } 5748 func rewriteValueS390X_OpS390XADD(v *Value, config *Config) bool { 5749 b := v.Block 5750 _ = b 5751 // match: (ADD x (MOVDconst [c])) 5752 // cond: is32Bit(c) 5753 // result: (ADDconst [c] x) 5754 for { 5755 x := v.Args[0] 5756 v_1 := v.Args[1] 5757 if v_1.Op != OpS390XMOVDconst { 5758 break 5759 } 5760 c := v_1.AuxInt 5761 if !(is32Bit(c)) { 5762 break 5763 } 5764 v.reset(OpS390XADDconst) 5765 v.AuxInt = c 5766 v.AddArg(x) 5767 return true 5768 } 5769 // match: (ADD (MOVDconst [c]) x) 5770 // cond: is32Bit(c) 5771 // result: (ADDconst [c] x) 5772 for { 5773 v_0 := v.Args[0] 5774 if v_0.Op != OpS390XMOVDconst { 5775 break 5776 } 5777 c := v_0.AuxInt 5778 x := v.Args[1] 5779 if !(is32Bit(c)) { 5780 break 5781 } 5782 v.reset(OpS390XADDconst) 5783 v.AuxInt = c 5784 v.AddArg(x) 5785 return true 5786 } 5787 // match: (ADD x (MOVDaddr [c] {s} y)) 5788 // cond: x.Op != OpSB && y.Op != OpSB 5789 // result: (MOVDaddridx [c] {s} x y) 5790 for { 5791 x := v.Args[0] 5792 v_1 := v.Args[1] 5793 if v_1.Op != OpS390XMOVDaddr { 5794 break 5795 } 5796 c := v_1.AuxInt 5797 s := v_1.Aux 5798 y := v_1.Args[0] 5799 if !(x.Op != OpSB && y.Op != OpSB) { 5800 break 5801 } 5802 v.reset(OpS390XMOVDaddridx) 5803 v.AuxInt = c 5804 v.Aux = s 5805 v.AddArg(x) 5806 v.AddArg(y) 5807 return true 5808 } 5809 // match: (ADD (MOVDaddr [c] {s} x) y) 5810 // cond: x.Op != OpSB && y.Op != OpSB 5811 // result: (MOVDaddridx [c] {s} x y) 5812 for { 5813 v_0 := v.Args[0] 5814 if v_0.Op != OpS390XMOVDaddr { 5815 break 5816 } 5817 c := v_0.AuxInt 5818 s := v_0.Aux 5819 x := v_0.Args[0] 5820 y := v.Args[1] 5821 if !(x.Op != OpSB && y.Op != OpSB) { 5822 break 5823 } 5824 v.reset(OpS390XMOVDaddridx) 5825 v.AuxInt = c 5826 v.Aux = s 5827 v.AddArg(x) 5828 v.AddArg(y) 5829 return true 5830 } 5831 // match: (ADD x (NEG y)) 5832 // cond: 5833 // result: (SUB x y) 5834 for { 5835 x := v.Args[0] 5836 v_1 := v.Args[1] 5837 if v_1.Op != OpS390XNEG { 5838 break 5839 } 5840 y := v_1.Args[0] 5841 v.reset(OpS390XSUB) 5842 v.AddArg(x) 5843 v.AddArg(y) 5844 return true 5845 } 5846 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 5847 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 5848 // result: (ADDload <t> [off] {sym} x ptr mem) 5849 for { 5850 t := v.Type 5851 x := v.Args[0] 5852 g := v.Args[1] 5853 if g.Op != OpS390XMOVDload { 5854 break 5855 } 5856 off := g.AuxInt 5857 sym := g.Aux 5858 ptr := g.Args[0] 5859 mem := g.Args[1] 5860 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 5861 break 5862 } 5863 v.reset(OpS390XADDload) 5864 v.Type = t 5865 v.AuxInt = off 5866 v.Aux = sym 5867 v.AddArg(x) 5868 v.AddArg(ptr) 5869 v.AddArg(mem) 5870 return true 5871 } 5872 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 5873 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 5874 // result: (ADDload <t> [off] {sym} x ptr mem) 5875 for { 5876 t := v.Type 5877 g := v.Args[0] 5878 if g.Op != OpS390XMOVDload { 5879 break 5880 } 5881 off := g.AuxInt 5882 sym := g.Aux 5883 ptr := g.Args[0] 5884 mem := g.Args[1] 5885 x := v.Args[1] 5886 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 5887 break 5888 } 5889 v.reset(OpS390XADDload) 5890 v.Type = t 5891 v.AuxInt = off 5892 v.Aux = sym 5893 v.AddArg(x) 5894 v.AddArg(ptr) 5895 v.AddArg(mem) 5896 return true 5897 } 5898 return false 5899 } 5900 func rewriteValueS390X_OpS390XADDW(v *Value, config *Config) bool { 5901 b := v.Block 5902 _ = b 5903 // match: (ADDW x (MOVDconst [c])) 5904 // cond: 5905 // result: (ADDWconst [c] x) 5906 for { 5907 x := v.Args[0] 5908 v_1 := v.Args[1] 5909 if v_1.Op != OpS390XMOVDconst { 5910 break 5911 } 5912 c := v_1.AuxInt 5913 v.reset(OpS390XADDWconst) 5914 v.AuxInt = c 5915 v.AddArg(x) 5916 return true 5917 } 5918 // match: (ADDW (MOVDconst [c]) x) 5919 // cond: 5920 // result: (ADDWconst [c] x) 5921 for { 5922 v_0 := v.Args[0] 5923 if v_0.Op != OpS390XMOVDconst { 5924 break 5925 } 5926 c := v_0.AuxInt 5927 x := v.Args[1] 5928 v.reset(OpS390XADDWconst) 5929 v.AuxInt = c 5930 v.AddArg(x) 5931 return true 5932 } 5933 // match: (ADDW x (NEGW y)) 5934 // cond: 5935 // result: (SUBW x y) 5936 for { 5937 x := v.Args[0] 5938 v_1 := v.Args[1] 5939 if v_1.Op != OpS390XNEGW { 5940 break 5941 } 5942 y := v_1.Args[0] 5943 v.reset(OpS390XSUBW) 5944 v.AddArg(x) 5945 v.AddArg(y) 5946 return true 5947 } 5948 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 5949 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 5950 // result: (ADDWload <t> [off] {sym} x ptr mem) 5951 for { 5952 t := v.Type 5953 x := v.Args[0] 5954 g := v.Args[1] 5955 if g.Op != OpS390XMOVWload { 5956 break 5957 } 5958 off := g.AuxInt 5959 sym := g.Aux 5960 ptr := g.Args[0] 5961 mem := g.Args[1] 5962 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 5963 break 5964 } 5965 v.reset(OpS390XADDWload) 5966 v.Type = t 5967 v.AuxInt = off 5968 v.Aux = sym 5969 v.AddArg(x) 5970 v.AddArg(ptr) 5971 v.AddArg(mem) 5972 return true 5973 } 5974 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 5975 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 5976 // result: (ADDWload <t> [off] {sym} x ptr mem) 5977 for { 5978 t := v.Type 5979 g := v.Args[0] 5980 if g.Op != OpS390XMOVWload { 5981 break 5982 } 5983 off := g.AuxInt 5984 sym := g.Aux 5985 ptr := g.Args[0] 5986 mem := g.Args[1] 5987 x := v.Args[1] 5988 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 5989 break 5990 } 5991 v.reset(OpS390XADDWload) 5992 v.Type = t 5993 v.AuxInt = off 5994 v.Aux = sym 5995 v.AddArg(x) 5996 v.AddArg(ptr) 5997 v.AddArg(mem) 5998 return true 5999 } 6000 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6001 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 6002 // result: (ADDWload <t> [off] {sym} x ptr mem) 6003 for { 6004 t := v.Type 6005 x := v.Args[0] 6006 g := v.Args[1] 6007 if g.Op != OpS390XMOVWZload { 6008 break 6009 } 6010 off := g.AuxInt 6011 sym := g.Aux 6012 ptr := g.Args[0] 6013 mem := g.Args[1] 6014 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 6015 break 6016 } 6017 v.reset(OpS390XADDWload) 6018 v.Type = t 6019 v.AuxInt = off 6020 v.Aux = sym 6021 v.AddArg(x) 6022 v.AddArg(ptr) 6023 v.AddArg(mem) 6024 return true 6025 } 6026 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6027 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 6028 // result: (ADDWload <t> [off] {sym} x ptr mem) 6029 for { 6030 t := v.Type 6031 g := v.Args[0] 6032 if g.Op != OpS390XMOVWZload { 6033 break 6034 } 6035 off := g.AuxInt 6036 sym := g.Aux 6037 ptr := g.Args[0] 6038 mem := g.Args[1] 6039 x := v.Args[1] 6040 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 6041 break 6042 } 6043 v.reset(OpS390XADDWload) 6044 v.Type = t 6045 v.AuxInt = off 6046 v.Aux = sym 6047 v.AddArg(x) 6048 v.AddArg(ptr) 6049 v.AddArg(mem) 6050 return true 6051 } 6052 return false 6053 } 6054 func rewriteValueS390X_OpS390XADDWconst(v *Value, config *Config) bool { 6055 b := v.Block 6056 _ = b 6057 // match: (ADDWconst [c] x) 6058 // cond: int32(c)==0 6059 // result: x 6060 for { 6061 c := v.AuxInt 6062 x := v.Args[0] 6063 if !(int32(c) == 0) { 6064 break 6065 } 6066 v.reset(OpCopy) 6067 v.Type = x.Type 6068 v.AddArg(x) 6069 return true 6070 } 6071 // match: (ADDWconst [c] (MOVDconst [d])) 6072 // cond: 6073 // result: (MOVDconst [int64(int32(c+d))]) 6074 for { 6075 c := v.AuxInt 6076 v_0 := v.Args[0] 6077 if v_0.Op != OpS390XMOVDconst { 6078 break 6079 } 6080 d := v_0.AuxInt 6081 v.reset(OpS390XMOVDconst) 6082 v.AuxInt = int64(int32(c + d)) 6083 return true 6084 } 6085 // match: (ADDWconst [c] (ADDWconst [d] x)) 6086 // cond: 6087 // result: (ADDWconst [int64(int32(c+d))] x) 6088 for { 6089 c := v.AuxInt 6090 v_0 := v.Args[0] 6091 if v_0.Op != OpS390XADDWconst { 6092 break 6093 } 6094 d := v_0.AuxInt 6095 x := v_0.Args[0] 6096 v.reset(OpS390XADDWconst) 6097 v.AuxInt = int64(int32(c + d)) 6098 v.AddArg(x) 6099 return true 6100 } 6101 return false 6102 } 6103 func rewriteValueS390X_OpS390XADDconst(v *Value, config *Config) bool { 6104 b := v.Block 6105 _ = b 6106 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 6107 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 6108 // result: (MOVDaddr [c+d] {s} x) 6109 for { 6110 c := v.AuxInt 6111 v_0 := v.Args[0] 6112 if v_0.Op != OpS390XMOVDaddr { 6113 break 6114 } 6115 d := v_0.AuxInt 6116 s := v_0.Aux 6117 x := v_0.Args[0] 6118 if x.Op != OpSB { 6119 break 6120 } 6121 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 6122 break 6123 } 6124 v.reset(OpS390XMOVDaddr) 6125 v.AuxInt = c + d 6126 v.Aux = s 6127 v.AddArg(x) 6128 return true 6129 } 6130 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 6131 // cond: x.Op != OpSB && is20Bit(c+d) 6132 // result: (MOVDaddr [c+d] {s} x) 6133 for { 6134 c := v.AuxInt 6135 v_0 := v.Args[0] 6136 if v_0.Op != OpS390XMOVDaddr { 6137 break 6138 } 6139 d := v_0.AuxInt 6140 s := v_0.Aux 6141 x := v_0.Args[0] 6142 if !(x.Op != OpSB && is20Bit(c+d)) { 6143 break 6144 } 6145 v.reset(OpS390XMOVDaddr) 6146 v.AuxInt = c + d 6147 v.Aux = s 6148 v.AddArg(x) 6149 return true 6150 } 6151 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 6152 // cond: is20Bit(c+d) 6153 // result: (MOVDaddridx [c+d] {s} x y) 6154 for { 6155 c := v.AuxInt 6156 v_0 := v.Args[0] 6157 if v_0.Op != OpS390XMOVDaddridx { 6158 break 6159 } 6160 d := v_0.AuxInt 6161 s := v_0.Aux 6162 x := v_0.Args[0] 6163 y := v_0.Args[1] 6164 if !(is20Bit(c + d)) { 6165 break 6166 } 6167 v.reset(OpS390XMOVDaddridx) 6168 v.AuxInt = c + d 6169 v.Aux = s 6170 v.AddArg(x) 6171 v.AddArg(y) 6172 return true 6173 } 6174 // match: (ADDconst [0] x) 6175 // cond: 6176 // result: x 6177 for { 6178 if v.AuxInt != 0 { 6179 break 6180 } 6181 x := v.Args[0] 6182 v.reset(OpCopy) 6183 v.Type = x.Type 6184 v.AddArg(x) 6185 return true 6186 } 6187 // match: (ADDconst [c] (MOVDconst [d])) 6188 // cond: 6189 // result: (MOVDconst [c+d]) 6190 for { 6191 c := v.AuxInt 6192 v_0 := v.Args[0] 6193 if v_0.Op != OpS390XMOVDconst { 6194 break 6195 } 6196 d := v_0.AuxInt 6197 v.reset(OpS390XMOVDconst) 6198 v.AuxInt = c + d 6199 return true 6200 } 6201 // match: (ADDconst [c] (ADDconst [d] x)) 6202 // cond: is32Bit(c+d) 6203 // result: (ADDconst [c+d] x) 6204 for { 6205 c := v.AuxInt 6206 v_0 := v.Args[0] 6207 if v_0.Op != OpS390XADDconst { 6208 break 6209 } 6210 d := v_0.AuxInt 6211 x := v_0.Args[0] 6212 if !(is32Bit(c + d)) { 6213 break 6214 } 6215 v.reset(OpS390XADDconst) 6216 v.AuxInt = c + d 6217 v.AddArg(x) 6218 return true 6219 } 6220 return false 6221 } 6222 func rewriteValueS390X_OpS390XAND(v *Value, config *Config) bool { 6223 b := v.Block 6224 _ = b 6225 // match: (AND x (MOVDconst [c])) 6226 // cond: is32Bit(c) && c < 0 6227 // result: (ANDconst [c] x) 6228 for { 6229 x := v.Args[0] 6230 v_1 := v.Args[1] 6231 if v_1.Op != OpS390XMOVDconst { 6232 break 6233 } 6234 c := v_1.AuxInt 6235 if !(is32Bit(c) && c < 0) { 6236 break 6237 } 6238 v.reset(OpS390XANDconst) 6239 v.AuxInt = c 6240 v.AddArg(x) 6241 return true 6242 } 6243 // match: (AND (MOVDconst [c]) x) 6244 // cond: is32Bit(c) && c < 0 6245 // result: (ANDconst [c] x) 6246 for { 6247 v_0 := v.Args[0] 6248 if v_0.Op != OpS390XMOVDconst { 6249 break 6250 } 6251 c := v_0.AuxInt 6252 x := v.Args[1] 6253 if !(is32Bit(c) && c < 0) { 6254 break 6255 } 6256 v.reset(OpS390XANDconst) 6257 v.AuxInt = c 6258 v.AddArg(x) 6259 return true 6260 } 6261 // match: (AND (MOVDconst [0xFF]) x) 6262 // cond: 6263 // result: (MOVBZreg x) 6264 for { 6265 v_0 := v.Args[0] 6266 if v_0.Op != OpS390XMOVDconst { 6267 break 6268 } 6269 if v_0.AuxInt != 0xFF { 6270 break 6271 } 6272 x := v.Args[1] 6273 v.reset(OpS390XMOVBZreg) 6274 v.AddArg(x) 6275 return true 6276 } 6277 // match: (AND x (MOVDconst [0xFF])) 6278 // cond: 6279 // result: (MOVBZreg x) 6280 for { 6281 x := v.Args[0] 6282 v_1 := v.Args[1] 6283 if v_1.Op != OpS390XMOVDconst { 6284 break 6285 } 6286 if v_1.AuxInt != 0xFF { 6287 break 6288 } 6289 v.reset(OpS390XMOVBZreg) 6290 v.AddArg(x) 6291 return true 6292 } 6293 // match: (AND (MOVDconst [0xFFFF]) x) 6294 // cond: 6295 // result: (MOVHZreg x) 6296 for { 6297 v_0 := v.Args[0] 6298 if v_0.Op != OpS390XMOVDconst { 6299 break 6300 } 6301 if v_0.AuxInt != 0xFFFF { 6302 break 6303 } 6304 x := v.Args[1] 6305 v.reset(OpS390XMOVHZreg) 6306 v.AddArg(x) 6307 return true 6308 } 6309 // match: (AND x (MOVDconst [0xFFFF])) 6310 // cond: 6311 // result: (MOVHZreg x) 6312 for { 6313 x := v.Args[0] 6314 v_1 := v.Args[1] 6315 if v_1.Op != OpS390XMOVDconst { 6316 break 6317 } 6318 if v_1.AuxInt != 0xFFFF { 6319 break 6320 } 6321 v.reset(OpS390XMOVHZreg) 6322 v.AddArg(x) 6323 return true 6324 } 6325 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 6326 // cond: 6327 // result: (MOVWZreg x) 6328 for { 6329 v_0 := v.Args[0] 6330 if v_0.Op != OpS390XMOVDconst { 6331 break 6332 } 6333 if v_0.AuxInt != 0xFFFFFFFF { 6334 break 6335 } 6336 x := v.Args[1] 6337 v.reset(OpS390XMOVWZreg) 6338 v.AddArg(x) 6339 return true 6340 } 6341 // match: (AND x (MOVDconst [0xFFFFFFFF])) 6342 // cond: 6343 // result: (MOVWZreg x) 6344 for { 6345 x := v.Args[0] 6346 v_1 := v.Args[1] 6347 if v_1.Op != OpS390XMOVDconst { 6348 break 6349 } 6350 if v_1.AuxInt != 0xFFFFFFFF { 6351 break 6352 } 6353 v.reset(OpS390XMOVWZreg) 6354 v.AddArg(x) 6355 return true 6356 } 6357 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 6358 // cond: 6359 // result: (MOVDconst [c&d]) 6360 for { 6361 v_0 := v.Args[0] 6362 if v_0.Op != OpS390XMOVDconst { 6363 break 6364 } 6365 c := v_0.AuxInt 6366 v_1 := v.Args[1] 6367 if v_1.Op != OpS390XMOVDconst { 6368 break 6369 } 6370 d := v_1.AuxInt 6371 v.reset(OpS390XMOVDconst) 6372 v.AuxInt = c & d 6373 return true 6374 } 6375 // match: (AND x x) 6376 // cond: 6377 // result: x 6378 for { 6379 x := v.Args[0] 6380 if x != v.Args[1] { 6381 break 6382 } 6383 v.reset(OpCopy) 6384 v.Type = x.Type 6385 v.AddArg(x) 6386 return true 6387 } 6388 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6389 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 6390 // result: (ANDload <t> [off] {sym} x ptr mem) 6391 for { 6392 t := v.Type 6393 x := v.Args[0] 6394 g := v.Args[1] 6395 if g.Op != OpS390XMOVDload { 6396 break 6397 } 6398 off := g.AuxInt 6399 sym := g.Aux 6400 ptr := g.Args[0] 6401 mem := g.Args[1] 6402 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 6403 break 6404 } 6405 v.reset(OpS390XANDload) 6406 v.Type = t 6407 v.AuxInt = off 6408 v.Aux = sym 6409 v.AddArg(x) 6410 v.AddArg(ptr) 6411 v.AddArg(mem) 6412 return true 6413 } 6414 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6415 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 6416 // result: (ANDload <t> [off] {sym} x ptr mem) 6417 for { 6418 t := v.Type 6419 g := v.Args[0] 6420 if g.Op != OpS390XMOVDload { 6421 break 6422 } 6423 off := g.AuxInt 6424 sym := g.Aux 6425 ptr := g.Args[0] 6426 mem := g.Args[1] 6427 x := v.Args[1] 6428 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 6429 break 6430 } 6431 v.reset(OpS390XANDload) 6432 v.Type = t 6433 v.AuxInt = off 6434 v.Aux = sym 6435 v.AddArg(x) 6436 v.AddArg(ptr) 6437 v.AddArg(mem) 6438 return true 6439 } 6440 return false 6441 } 6442 func rewriteValueS390X_OpS390XANDW(v *Value, config *Config) bool { 6443 b := v.Block 6444 _ = b 6445 // match: (ANDW x (MOVDconst [c])) 6446 // cond: 6447 // result: (ANDWconst [c] x) 6448 for { 6449 x := v.Args[0] 6450 v_1 := v.Args[1] 6451 if v_1.Op != OpS390XMOVDconst { 6452 break 6453 } 6454 c := v_1.AuxInt 6455 v.reset(OpS390XANDWconst) 6456 v.AuxInt = c 6457 v.AddArg(x) 6458 return true 6459 } 6460 // match: (ANDW (MOVDconst [c]) x) 6461 // cond: 6462 // result: (ANDWconst [c] x) 6463 for { 6464 v_0 := v.Args[0] 6465 if v_0.Op != OpS390XMOVDconst { 6466 break 6467 } 6468 c := v_0.AuxInt 6469 x := v.Args[1] 6470 v.reset(OpS390XANDWconst) 6471 v.AuxInt = c 6472 v.AddArg(x) 6473 return true 6474 } 6475 // match: (ANDW x x) 6476 // cond: 6477 // result: x 6478 for { 6479 x := v.Args[0] 6480 if x != v.Args[1] { 6481 break 6482 } 6483 v.reset(OpCopy) 6484 v.Type = x.Type 6485 v.AddArg(x) 6486 return true 6487 } 6488 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6489 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 6490 // result: (ANDWload <t> [off] {sym} x ptr mem) 6491 for { 6492 t := v.Type 6493 x := v.Args[0] 6494 g := v.Args[1] 6495 if g.Op != OpS390XMOVWload { 6496 break 6497 } 6498 off := g.AuxInt 6499 sym := g.Aux 6500 ptr := g.Args[0] 6501 mem := g.Args[1] 6502 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 6503 break 6504 } 6505 v.reset(OpS390XANDWload) 6506 v.Type = t 6507 v.AuxInt = off 6508 v.Aux = sym 6509 v.AddArg(x) 6510 v.AddArg(ptr) 6511 v.AddArg(mem) 6512 return true 6513 } 6514 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6515 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 6516 // result: (ANDWload <t> [off] {sym} x ptr mem) 6517 for { 6518 t := v.Type 6519 g := v.Args[0] 6520 if g.Op != OpS390XMOVWload { 6521 break 6522 } 6523 off := g.AuxInt 6524 sym := g.Aux 6525 ptr := g.Args[0] 6526 mem := g.Args[1] 6527 x := v.Args[1] 6528 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 6529 break 6530 } 6531 v.reset(OpS390XANDWload) 6532 v.Type = t 6533 v.AuxInt = off 6534 v.Aux = sym 6535 v.AddArg(x) 6536 v.AddArg(ptr) 6537 v.AddArg(mem) 6538 return true 6539 } 6540 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6541 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 6542 // result: (ANDWload <t> [off] {sym} x ptr mem) 6543 for { 6544 t := v.Type 6545 x := v.Args[0] 6546 g := v.Args[1] 6547 if g.Op != OpS390XMOVWZload { 6548 break 6549 } 6550 off := g.AuxInt 6551 sym := g.Aux 6552 ptr := g.Args[0] 6553 mem := g.Args[1] 6554 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 6555 break 6556 } 6557 v.reset(OpS390XANDWload) 6558 v.Type = t 6559 v.AuxInt = off 6560 v.Aux = sym 6561 v.AddArg(x) 6562 v.AddArg(ptr) 6563 v.AddArg(mem) 6564 return true 6565 } 6566 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6567 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 6568 // result: (ANDWload <t> [off] {sym} x ptr mem) 6569 for { 6570 t := v.Type 6571 g := v.Args[0] 6572 if g.Op != OpS390XMOVWZload { 6573 break 6574 } 6575 off := g.AuxInt 6576 sym := g.Aux 6577 ptr := g.Args[0] 6578 mem := g.Args[1] 6579 x := v.Args[1] 6580 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 6581 break 6582 } 6583 v.reset(OpS390XANDWload) 6584 v.Type = t 6585 v.AuxInt = off 6586 v.Aux = sym 6587 v.AddArg(x) 6588 v.AddArg(ptr) 6589 v.AddArg(mem) 6590 return true 6591 } 6592 return false 6593 } 6594 func rewriteValueS390X_OpS390XANDWconst(v *Value, config *Config) bool { 6595 b := v.Block 6596 _ = b 6597 // match: (ANDWconst [c] (ANDWconst [d] x)) 6598 // cond: 6599 // result: (ANDWconst [c & d] x) 6600 for { 6601 c := v.AuxInt 6602 v_0 := v.Args[0] 6603 if v_0.Op != OpS390XANDWconst { 6604 break 6605 } 6606 d := v_0.AuxInt 6607 x := v_0.Args[0] 6608 v.reset(OpS390XANDWconst) 6609 v.AuxInt = c & d 6610 v.AddArg(x) 6611 return true 6612 } 6613 // match: (ANDWconst [0xFF] x) 6614 // cond: 6615 // result: (MOVBZreg x) 6616 for { 6617 if v.AuxInt != 0xFF { 6618 break 6619 } 6620 x := v.Args[0] 6621 v.reset(OpS390XMOVBZreg) 6622 v.AddArg(x) 6623 return true 6624 } 6625 // match: (ANDWconst [0xFFFF] x) 6626 // cond: 6627 // result: (MOVHZreg x) 6628 for { 6629 if v.AuxInt != 0xFFFF { 6630 break 6631 } 6632 x := v.Args[0] 6633 v.reset(OpS390XMOVHZreg) 6634 v.AddArg(x) 6635 return true 6636 } 6637 // match: (ANDWconst [c] _) 6638 // cond: int32(c)==0 6639 // result: (MOVDconst [0]) 6640 for { 6641 c := v.AuxInt 6642 if !(int32(c) == 0) { 6643 break 6644 } 6645 v.reset(OpS390XMOVDconst) 6646 v.AuxInt = 0 6647 return true 6648 } 6649 // match: (ANDWconst [c] x) 6650 // cond: int32(c)==-1 6651 // result: x 6652 for { 6653 c := v.AuxInt 6654 x := v.Args[0] 6655 if !(int32(c) == -1) { 6656 break 6657 } 6658 v.reset(OpCopy) 6659 v.Type = x.Type 6660 v.AddArg(x) 6661 return true 6662 } 6663 // match: (ANDWconst [c] (MOVDconst [d])) 6664 // cond: 6665 // result: (MOVDconst [c&d]) 6666 for { 6667 c := v.AuxInt 6668 v_0 := v.Args[0] 6669 if v_0.Op != OpS390XMOVDconst { 6670 break 6671 } 6672 d := v_0.AuxInt 6673 v.reset(OpS390XMOVDconst) 6674 v.AuxInt = c & d 6675 return true 6676 } 6677 return false 6678 } 6679 func rewriteValueS390X_OpS390XANDconst(v *Value, config *Config) bool { 6680 b := v.Block 6681 _ = b 6682 // match: (ANDconst [c] (ANDconst [d] x)) 6683 // cond: 6684 // result: (ANDconst [c & d] x) 6685 for { 6686 c := v.AuxInt 6687 v_0 := v.Args[0] 6688 if v_0.Op != OpS390XANDconst { 6689 break 6690 } 6691 d := v_0.AuxInt 6692 x := v_0.Args[0] 6693 v.reset(OpS390XANDconst) 6694 v.AuxInt = c & d 6695 v.AddArg(x) 6696 return true 6697 } 6698 // match: (ANDconst [0] _) 6699 // cond: 6700 // result: (MOVDconst [0]) 6701 for { 6702 if v.AuxInt != 0 { 6703 break 6704 } 6705 v.reset(OpS390XMOVDconst) 6706 v.AuxInt = 0 6707 return true 6708 } 6709 // match: (ANDconst [-1] x) 6710 // cond: 6711 // result: x 6712 for { 6713 if v.AuxInt != -1 { 6714 break 6715 } 6716 x := v.Args[0] 6717 v.reset(OpCopy) 6718 v.Type = x.Type 6719 v.AddArg(x) 6720 return true 6721 } 6722 // match: (ANDconst [c] (MOVDconst [d])) 6723 // cond: 6724 // result: (MOVDconst [c&d]) 6725 for { 6726 c := v.AuxInt 6727 v_0 := v.Args[0] 6728 if v_0.Op != OpS390XMOVDconst { 6729 break 6730 } 6731 d := v_0.AuxInt 6732 v.reset(OpS390XMOVDconst) 6733 v.AuxInt = c & d 6734 return true 6735 } 6736 return false 6737 } 6738 func rewriteValueS390X_OpS390XCMP(v *Value, config *Config) bool { 6739 b := v.Block 6740 _ = b 6741 // match: (CMP x (MOVDconst [c])) 6742 // cond: is32Bit(c) 6743 // result: (CMPconst x [c]) 6744 for { 6745 x := v.Args[0] 6746 v_1 := v.Args[1] 6747 if v_1.Op != OpS390XMOVDconst { 6748 break 6749 } 6750 c := v_1.AuxInt 6751 if !(is32Bit(c)) { 6752 break 6753 } 6754 v.reset(OpS390XCMPconst) 6755 v.AuxInt = c 6756 v.AddArg(x) 6757 return true 6758 } 6759 // match: (CMP (MOVDconst [c]) x) 6760 // cond: is32Bit(c) 6761 // result: (InvertFlags (CMPconst x [c])) 6762 for { 6763 v_0 := v.Args[0] 6764 if v_0.Op != OpS390XMOVDconst { 6765 break 6766 } 6767 c := v_0.AuxInt 6768 x := v.Args[1] 6769 if !(is32Bit(c)) { 6770 break 6771 } 6772 v.reset(OpS390XInvertFlags) 6773 v0 := b.NewValue0(v.Line, OpS390XCMPconst, TypeFlags) 6774 v0.AuxInt = c 6775 v0.AddArg(x) 6776 v.AddArg(v0) 6777 return true 6778 } 6779 return false 6780 } 6781 func rewriteValueS390X_OpS390XCMPU(v *Value, config *Config) bool { 6782 b := v.Block 6783 _ = b 6784 // match: (CMPU x (MOVDconst [c])) 6785 // cond: is32Bit(c) 6786 // result: (CMPUconst x [int64(uint32(c))]) 6787 for { 6788 x := v.Args[0] 6789 v_1 := v.Args[1] 6790 if v_1.Op != OpS390XMOVDconst { 6791 break 6792 } 6793 c := v_1.AuxInt 6794 if !(is32Bit(c)) { 6795 break 6796 } 6797 v.reset(OpS390XCMPUconst) 6798 v.AuxInt = int64(uint32(c)) 6799 v.AddArg(x) 6800 return true 6801 } 6802 // match: (CMPU (MOVDconst [c]) x) 6803 // cond: is32Bit(c) 6804 // result: (InvertFlags (CMPUconst x [int64(uint32(c))])) 6805 for { 6806 v_0 := v.Args[0] 6807 if v_0.Op != OpS390XMOVDconst { 6808 break 6809 } 6810 c := v_0.AuxInt 6811 x := v.Args[1] 6812 if !(is32Bit(c)) { 6813 break 6814 } 6815 v.reset(OpS390XInvertFlags) 6816 v0 := b.NewValue0(v.Line, OpS390XCMPUconst, TypeFlags) 6817 v0.AuxInt = int64(uint32(c)) 6818 v0.AddArg(x) 6819 v.AddArg(v0) 6820 return true 6821 } 6822 return false 6823 } 6824 func rewriteValueS390X_OpS390XCMPUconst(v *Value, config *Config) bool { 6825 b := v.Block 6826 _ = b 6827 // match: (CMPUconst (MOVDconst [x]) [y]) 6828 // cond: uint64(x)==uint64(y) 6829 // result: (FlagEQ) 6830 for { 6831 y := v.AuxInt 6832 v_0 := v.Args[0] 6833 if v_0.Op != OpS390XMOVDconst { 6834 break 6835 } 6836 x := v_0.AuxInt 6837 if !(uint64(x) == uint64(y)) { 6838 break 6839 } 6840 v.reset(OpS390XFlagEQ) 6841 return true 6842 } 6843 // match: (CMPUconst (MOVDconst [x]) [y]) 6844 // cond: uint64(x)<uint64(y) 6845 // result: (FlagLT) 6846 for { 6847 y := v.AuxInt 6848 v_0 := v.Args[0] 6849 if v_0.Op != OpS390XMOVDconst { 6850 break 6851 } 6852 x := v_0.AuxInt 6853 if !(uint64(x) < uint64(y)) { 6854 break 6855 } 6856 v.reset(OpS390XFlagLT) 6857 return true 6858 } 6859 // match: (CMPUconst (MOVDconst [x]) [y]) 6860 // cond: uint64(x)>uint64(y) 6861 // result: (FlagGT) 6862 for { 6863 y := v.AuxInt 6864 v_0 := v.Args[0] 6865 if v_0.Op != OpS390XMOVDconst { 6866 break 6867 } 6868 x := v_0.AuxInt 6869 if !(uint64(x) > uint64(y)) { 6870 break 6871 } 6872 v.reset(OpS390XFlagGT) 6873 return true 6874 } 6875 return false 6876 } 6877 func rewriteValueS390X_OpS390XCMPW(v *Value, config *Config) bool { 6878 b := v.Block 6879 _ = b 6880 // match: (CMPW x (MOVDconst [c])) 6881 // cond: 6882 // result: (CMPWconst x [c]) 6883 for { 6884 x := v.Args[0] 6885 v_1 := v.Args[1] 6886 if v_1.Op != OpS390XMOVDconst { 6887 break 6888 } 6889 c := v_1.AuxInt 6890 v.reset(OpS390XCMPWconst) 6891 v.AuxInt = c 6892 v.AddArg(x) 6893 return true 6894 } 6895 // match: (CMPW (MOVDconst [c]) x) 6896 // cond: 6897 // result: (InvertFlags (CMPWconst x [c])) 6898 for { 6899 v_0 := v.Args[0] 6900 if v_0.Op != OpS390XMOVDconst { 6901 break 6902 } 6903 c := v_0.AuxInt 6904 x := v.Args[1] 6905 v.reset(OpS390XInvertFlags) 6906 v0 := b.NewValue0(v.Line, OpS390XCMPWconst, TypeFlags) 6907 v0.AuxInt = c 6908 v0.AddArg(x) 6909 v.AddArg(v0) 6910 return true 6911 } 6912 return false 6913 } 6914 func rewriteValueS390X_OpS390XCMPWU(v *Value, config *Config) bool { 6915 b := v.Block 6916 _ = b 6917 // match: (CMPWU x (MOVDconst [c])) 6918 // cond: 6919 // result: (CMPWUconst x [int64(uint32(c))]) 6920 for { 6921 x := v.Args[0] 6922 v_1 := v.Args[1] 6923 if v_1.Op != OpS390XMOVDconst { 6924 break 6925 } 6926 c := v_1.AuxInt 6927 v.reset(OpS390XCMPWUconst) 6928 v.AuxInt = int64(uint32(c)) 6929 v.AddArg(x) 6930 return true 6931 } 6932 // match: (CMPWU (MOVDconst [c]) x) 6933 // cond: 6934 // result: (InvertFlags (CMPWUconst x [int64(uint32(c))])) 6935 for { 6936 v_0 := v.Args[0] 6937 if v_0.Op != OpS390XMOVDconst { 6938 break 6939 } 6940 c := v_0.AuxInt 6941 x := v.Args[1] 6942 v.reset(OpS390XInvertFlags) 6943 v0 := b.NewValue0(v.Line, OpS390XCMPWUconst, TypeFlags) 6944 v0.AuxInt = int64(uint32(c)) 6945 v0.AddArg(x) 6946 v.AddArg(v0) 6947 return true 6948 } 6949 return false 6950 } 6951 func rewriteValueS390X_OpS390XCMPWUconst(v *Value, config *Config) bool { 6952 b := v.Block 6953 _ = b 6954 // match: (CMPWUconst (MOVDconst [x]) [y]) 6955 // cond: uint32(x)==uint32(y) 6956 // result: (FlagEQ) 6957 for { 6958 y := v.AuxInt 6959 v_0 := v.Args[0] 6960 if v_0.Op != OpS390XMOVDconst { 6961 break 6962 } 6963 x := v_0.AuxInt 6964 if !(uint32(x) == uint32(y)) { 6965 break 6966 } 6967 v.reset(OpS390XFlagEQ) 6968 return true 6969 } 6970 // match: (CMPWUconst (MOVDconst [x]) [y]) 6971 // cond: uint32(x)<uint32(y) 6972 // result: (FlagLT) 6973 for { 6974 y := v.AuxInt 6975 v_0 := v.Args[0] 6976 if v_0.Op != OpS390XMOVDconst { 6977 break 6978 } 6979 x := v_0.AuxInt 6980 if !(uint32(x) < uint32(y)) { 6981 break 6982 } 6983 v.reset(OpS390XFlagLT) 6984 return true 6985 } 6986 // match: (CMPWUconst (MOVDconst [x]) [y]) 6987 // cond: uint32(x)>uint32(y) 6988 // result: (FlagGT) 6989 for { 6990 y := v.AuxInt 6991 v_0 := v.Args[0] 6992 if v_0.Op != OpS390XMOVDconst { 6993 break 6994 } 6995 x := v_0.AuxInt 6996 if !(uint32(x) > uint32(y)) { 6997 break 6998 } 6999 v.reset(OpS390XFlagGT) 7000 return true 7001 } 7002 return false 7003 } 7004 func rewriteValueS390X_OpS390XCMPWconst(v *Value, config *Config) bool { 7005 b := v.Block 7006 _ = b 7007 // match: (CMPWconst (MOVDconst [x]) [y]) 7008 // cond: int32(x)==int32(y) 7009 // result: (FlagEQ) 7010 for { 7011 y := v.AuxInt 7012 v_0 := v.Args[0] 7013 if v_0.Op != OpS390XMOVDconst { 7014 break 7015 } 7016 x := v_0.AuxInt 7017 if !(int32(x) == int32(y)) { 7018 break 7019 } 7020 v.reset(OpS390XFlagEQ) 7021 return true 7022 } 7023 // match: (CMPWconst (MOVDconst [x]) [y]) 7024 // cond: int32(x)<int32(y) 7025 // result: (FlagLT) 7026 for { 7027 y := v.AuxInt 7028 v_0 := v.Args[0] 7029 if v_0.Op != OpS390XMOVDconst { 7030 break 7031 } 7032 x := v_0.AuxInt 7033 if !(int32(x) < int32(y)) { 7034 break 7035 } 7036 v.reset(OpS390XFlagLT) 7037 return true 7038 } 7039 // match: (CMPWconst (MOVDconst [x]) [y]) 7040 // cond: int32(x)>int32(y) 7041 // result: (FlagGT) 7042 for { 7043 y := v.AuxInt 7044 v_0 := v.Args[0] 7045 if v_0.Op != OpS390XMOVDconst { 7046 break 7047 } 7048 x := v_0.AuxInt 7049 if !(int32(x) > int32(y)) { 7050 break 7051 } 7052 v.reset(OpS390XFlagGT) 7053 return true 7054 } 7055 // match: (CMPWconst (SRWconst _ [c]) [n]) 7056 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 7057 // result: (FlagLT) 7058 for { 7059 n := v.AuxInt 7060 v_0 := v.Args[0] 7061 if v_0.Op != OpS390XSRWconst { 7062 break 7063 } 7064 c := v_0.AuxInt 7065 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 7066 break 7067 } 7068 v.reset(OpS390XFlagLT) 7069 return true 7070 } 7071 // match: (CMPWconst (ANDWconst _ [m]) [n]) 7072 // cond: 0 <= int32(m) && int32(m) < int32(n) 7073 // result: (FlagLT) 7074 for { 7075 n := v.AuxInt 7076 v_0 := v.Args[0] 7077 if v_0.Op != OpS390XANDWconst { 7078 break 7079 } 7080 m := v_0.AuxInt 7081 if !(0 <= int32(m) && int32(m) < int32(n)) { 7082 break 7083 } 7084 v.reset(OpS390XFlagLT) 7085 return true 7086 } 7087 return false 7088 } 7089 func rewriteValueS390X_OpS390XCMPconst(v *Value, config *Config) bool { 7090 b := v.Block 7091 _ = b 7092 // match: (CMPconst (MOVDconst [x]) [y]) 7093 // cond: x==y 7094 // result: (FlagEQ) 7095 for { 7096 y := v.AuxInt 7097 v_0 := v.Args[0] 7098 if v_0.Op != OpS390XMOVDconst { 7099 break 7100 } 7101 x := v_0.AuxInt 7102 if !(x == y) { 7103 break 7104 } 7105 v.reset(OpS390XFlagEQ) 7106 return true 7107 } 7108 // match: (CMPconst (MOVDconst [x]) [y]) 7109 // cond: x<y 7110 // result: (FlagLT) 7111 for { 7112 y := v.AuxInt 7113 v_0 := v.Args[0] 7114 if v_0.Op != OpS390XMOVDconst { 7115 break 7116 } 7117 x := v_0.AuxInt 7118 if !(x < y) { 7119 break 7120 } 7121 v.reset(OpS390XFlagLT) 7122 return true 7123 } 7124 // match: (CMPconst (MOVDconst [x]) [y]) 7125 // cond: x>y 7126 // result: (FlagGT) 7127 for { 7128 y := v.AuxInt 7129 v_0 := v.Args[0] 7130 if v_0.Op != OpS390XMOVDconst { 7131 break 7132 } 7133 x := v_0.AuxInt 7134 if !(x > y) { 7135 break 7136 } 7137 v.reset(OpS390XFlagGT) 7138 return true 7139 } 7140 // match: (CMPconst (MOVBZreg _) [c]) 7141 // cond: 0xFF < c 7142 // result: (FlagLT) 7143 for { 7144 c := v.AuxInt 7145 v_0 := v.Args[0] 7146 if v_0.Op != OpS390XMOVBZreg { 7147 break 7148 } 7149 if !(0xFF < c) { 7150 break 7151 } 7152 v.reset(OpS390XFlagLT) 7153 return true 7154 } 7155 // match: (CMPconst (MOVHZreg _) [c]) 7156 // cond: 0xFFFF < c 7157 // result: (FlagLT) 7158 for { 7159 c := v.AuxInt 7160 v_0 := v.Args[0] 7161 if v_0.Op != OpS390XMOVHZreg { 7162 break 7163 } 7164 if !(0xFFFF < c) { 7165 break 7166 } 7167 v.reset(OpS390XFlagLT) 7168 return true 7169 } 7170 // match: (CMPconst (MOVWZreg _) [c]) 7171 // cond: 0xFFFFFFFF < c 7172 // result: (FlagLT) 7173 for { 7174 c := v.AuxInt 7175 v_0 := v.Args[0] 7176 if v_0.Op != OpS390XMOVWZreg { 7177 break 7178 } 7179 if !(0xFFFFFFFF < c) { 7180 break 7181 } 7182 v.reset(OpS390XFlagLT) 7183 return true 7184 } 7185 // match: (CMPconst (SRDconst _ [c]) [n]) 7186 // cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n) 7187 // result: (FlagLT) 7188 for { 7189 n := v.AuxInt 7190 v_0 := v.Args[0] 7191 if v_0.Op != OpS390XSRDconst { 7192 break 7193 } 7194 c := v_0.AuxInt 7195 if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) { 7196 break 7197 } 7198 v.reset(OpS390XFlagLT) 7199 return true 7200 } 7201 // match: (CMPconst (ANDconst _ [m]) [n]) 7202 // cond: 0 <= m && m < n 7203 // result: (FlagLT) 7204 for { 7205 n := v.AuxInt 7206 v_0 := v.Args[0] 7207 if v_0.Op != OpS390XANDconst { 7208 break 7209 } 7210 m := v_0.AuxInt 7211 if !(0 <= m && m < n) { 7212 break 7213 } 7214 v.reset(OpS390XFlagLT) 7215 return true 7216 } 7217 return false 7218 } 7219 func rewriteValueS390X_OpS390XFMOVDload(v *Value, config *Config) bool { 7220 b := v.Block 7221 _ = b 7222 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 7223 // cond: is20Bit(off1+off2) 7224 // result: (FMOVDload [off1+off2] {sym} ptr mem) 7225 for { 7226 off1 := v.AuxInt 7227 sym := v.Aux 7228 v_0 := v.Args[0] 7229 if v_0.Op != OpS390XADDconst { 7230 break 7231 } 7232 off2 := v_0.AuxInt 7233 ptr := v_0.Args[0] 7234 mem := v.Args[1] 7235 if !(is20Bit(off1 + off2)) { 7236 break 7237 } 7238 v.reset(OpS390XFMOVDload) 7239 v.AuxInt = off1 + off2 7240 v.Aux = sym 7241 v.AddArg(ptr) 7242 v.AddArg(mem) 7243 return true 7244 } 7245 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 7246 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7247 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 7248 for { 7249 off1 := v.AuxInt 7250 sym1 := v.Aux 7251 v_0 := v.Args[0] 7252 if v_0.Op != OpS390XMOVDaddr { 7253 break 7254 } 7255 off2 := v_0.AuxInt 7256 sym2 := v_0.Aux 7257 base := v_0.Args[0] 7258 mem := v.Args[1] 7259 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7260 break 7261 } 7262 v.reset(OpS390XFMOVDload) 7263 v.AuxInt = off1 + off2 7264 v.Aux = mergeSym(sym1, sym2) 7265 v.AddArg(base) 7266 v.AddArg(mem) 7267 return true 7268 } 7269 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 7270 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7271 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 7272 for { 7273 off1 := v.AuxInt 7274 sym1 := v.Aux 7275 v_0 := v.Args[0] 7276 if v_0.Op != OpS390XMOVDaddridx { 7277 break 7278 } 7279 off2 := v_0.AuxInt 7280 sym2 := v_0.Aux 7281 ptr := v_0.Args[0] 7282 idx := v_0.Args[1] 7283 mem := v.Args[1] 7284 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7285 break 7286 } 7287 v.reset(OpS390XFMOVDloadidx) 7288 v.AuxInt = off1 + off2 7289 v.Aux = mergeSym(sym1, sym2) 7290 v.AddArg(ptr) 7291 v.AddArg(idx) 7292 v.AddArg(mem) 7293 return true 7294 } 7295 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 7296 // cond: ptr.Op != OpSB 7297 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 7298 for { 7299 off := v.AuxInt 7300 sym := v.Aux 7301 v_0 := v.Args[0] 7302 if v_0.Op != OpS390XADD { 7303 break 7304 } 7305 ptr := v_0.Args[0] 7306 idx := v_0.Args[1] 7307 mem := v.Args[1] 7308 if !(ptr.Op != OpSB) { 7309 break 7310 } 7311 v.reset(OpS390XFMOVDloadidx) 7312 v.AuxInt = off 7313 v.Aux = sym 7314 v.AddArg(ptr) 7315 v.AddArg(idx) 7316 v.AddArg(mem) 7317 return true 7318 } 7319 return false 7320 } 7321 func rewriteValueS390X_OpS390XFMOVDloadidx(v *Value, config *Config) bool { 7322 b := v.Block 7323 _ = b 7324 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 7325 // cond: 7326 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 7327 for { 7328 c := v.AuxInt 7329 sym := v.Aux 7330 v_0 := v.Args[0] 7331 if v_0.Op != OpS390XADDconst { 7332 break 7333 } 7334 d := v_0.AuxInt 7335 ptr := v_0.Args[0] 7336 idx := v.Args[1] 7337 mem := v.Args[2] 7338 v.reset(OpS390XFMOVDloadidx) 7339 v.AuxInt = c + d 7340 v.Aux = sym 7341 v.AddArg(ptr) 7342 v.AddArg(idx) 7343 v.AddArg(mem) 7344 return true 7345 } 7346 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 7347 // cond: 7348 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 7349 for { 7350 c := v.AuxInt 7351 sym := v.Aux 7352 ptr := v.Args[0] 7353 v_1 := v.Args[1] 7354 if v_1.Op != OpS390XADDconst { 7355 break 7356 } 7357 d := v_1.AuxInt 7358 idx := v_1.Args[0] 7359 mem := v.Args[2] 7360 v.reset(OpS390XFMOVDloadidx) 7361 v.AuxInt = c + d 7362 v.Aux = sym 7363 v.AddArg(ptr) 7364 v.AddArg(idx) 7365 v.AddArg(mem) 7366 return true 7367 } 7368 return false 7369 } 7370 func rewriteValueS390X_OpS390XFMOVDstore(v *Value, config *Config) bool { 7371 b := v.Block 7372 _ = b 7373 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7374 // cond: is20Bit(off1+off2) 7375 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 7376 for { 7377 off1 := v.AuxInt 7378 sym := v.Aux 7379 v_0 := v.Args[0] 7380 if v_0.Op != OpS390XADDconst { 7381 break 7382 } 7383 off2 := v_0.AuxInt 7384 ptr := v_0.Args[0] 7385 val := v.Args[1] 7386 mem := v.Args[2] 7387 if !(is20Bit(off1 + off2)) { 7388 break 7389 } 7390 v.reset(OpS390XFMOVDstore) 7391 v.AuxInt = off1 + off2 7392 v.Aux = sym 7393 v.AddArg(ptr) 7394 v.AddArg(val) 7395 v.AddArg(mem) 7396 return true 7397 } 7398 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 7399 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7400 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 7401 for { 7402 off1 := v.AuxInt 7403 sym1 := v.Aux 7404 v_0 := v.Args[0] 7405 if v_0.Op != OpS390XMOVDaddr { 7406 break 7407 } 7408 off2 := v_0.AuxInt 7409 sym2 := v_0.Aux 7410 base := v_0.Args[0] 7411 val := v.Args[1] 7412 mem := v.Args[2] 7413 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7414 break 7415 } 7416 v.reset(OpS390XFMOVDstore) 7417 v.AuxInt = off1 + off2 7418 v.Aux = mergeSym(sym1, sym2) 7419 v.AddArg(base) 7420 v.AddArg(val) 7421 v.AddArg(mem) 7422 return true 7423 } 7424 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 7425 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7426 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 7427 for { 7428 off1 := v.AuxInt 7429 sym1 := v.Aux 7430 v_0 := v.Args[0] 7431 if v_0.Op != OpS390XMOVDaddridx { 7432 break 7433 } 7434 off2 := v_0.AuxInt 7435 sym2 := v_0.Aux 7436 ptr := v_0.Args[0] 7437 idx := v_0.Args[1] 7438 val := v.Args[1] 7439 mem := v.Args[2] 7440 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7441 break 7442 } 7443 v.reset(OpS390XFMOVDstoreidx) 7444 v.AuxInt = off1 + off2 7445 v.Aux = mergeSym(sym1, sym2) 7446 v.AddArg(ptr) 7447 v.AddArg(idx) 7448 v.AddArg(val) 7449 v.AddArg(mem) 7450 return true 7451 } 7452 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 7453 // cond: ptr.Op != OpSB 7454 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 7455 for { 7456 off := v.AuxInt 7457 sym := v.Aux 7458 v_0 := v.Args[0] 7459 if v_0.Op != OpS390XADD { 7460 break 7461 } 7462 ptr := v_0.Args[0] 7463 idx := v_0.Args[1] 7464 val := v.Args[1] 7465 mem := v.Args[2] 7466 if !(ptr.Op != OpSB) { 7467 break 7468 } 7469 v.reset(OpS390XFMOVDstoreidx) 7470 v.AuxInt = off 7471 v.Aux = sym 7472 v.AddArg(ptr) 7473 v.AddArg(idx) 7474 v.AddArg(val) 7475 v.AddArg(mem) 7476 return true 7477 } 7478 return false 7479 } 7480 func rewriteValueS390X_OpS390XFMOVDstoreidx(v *Value, config *Config) bool { 7481 b := v.Block 7482 _ = b 7483 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 7484 // cond: 7485 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 7486 for { 7487 c := v.AuxInt 7488 sym := v.Aux 7489 v_0 := v.Args[0] 7490 if v_0.Op != OpS390XADDconst { 7491 break 7492 } 7493 d := v_0.AuxInt 7494 ptr := v_0.Args[0] 7495 idx := v.Args[1] 7496 val := v.Args[2] 7497 mem := v.Args[3] 7498 v.reset(OpS390XFMOVDstoreidx) 7499 v.AuxInt = c + d 7500 v.Aux = sym 7501 v.AddArg(ptr) 7502 v.AddArg(idx) 7503 v.AddArg(val) 7504 v.AddArg(mem) 7505 return true 7506 } 7507 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 7508 // cond: 7509 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 7510 for { 7511 c := v.AuxInt 7512 sym := v.Aux 7513 ptr := v.Args[0] 7514 v_1 := v.Args[1] 7515 if v_1.Op != OpS390XADDconst { 7516 break 7517 } 7518 d := v_1.AuxInt 7519 idx := v_1.Args[0] 7520 val := v.Args[2] 7521 mem := v.Args[3] 7522 v.reset(OpS390XFMOVDstoreidx) 7523 v.AuxInt = c + d 7524 v.Aux = sym 7525 v.AddArg(ptr) 7526 v.AddArg(idx) 7527 v.AddArg(val) 7528 v.AddArg(mem) 7529 return true 7530 } 7531 return false 7532 } 7533 func rewriteValueS390X_OpS390XFMOVSload(v *Value, config *Config) bool { 7534 b := v.Block 7535 _ = b 7536 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 7537 // cond: is20Bit(off1+off2) 7538 // result: (FMOVSload [off1+off2] {sym} ptr mem) 7539 for { 7540 off1 := v.AuxInt 7541 sym := v.Aux 7542 v_0 := v.Args[0] 7543 if v_0.Op != OpS390XADDconst { 7544 break 7545 } 7546 off2 := v_0.AuxInt 7547 ptr := v_0.Args[0] 7548 mem := v.Args[1] 7549 if !(is20Bit(off1 + off2)) { 7550 break 7551 } 7552 v.reset(OpS390XFMOVSload) 7553 v.AuxInt = off1 + off2 7554 v.Aux = sym 7555 v.AddArg(ptr) 7556 v.AddArg(mem) 7557 return true 7558 } 7559 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 7560 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7561 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 7562 for { 7563 off1 := v.AuxInt 7564 sym1 := v.Aux 7565 v_0 := v.Args[0] 7566 if v_0.Op != OpS390XMOVDaddr { 7567 break 7568 } 7569 off2 := v_0.AuxInt 7570 sym2 := v_0.Aux 7571 base := v_0.Args[0] 7572 mem := v.Args[1] 7573 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7574 break 7575 } 7576 v.reset(OpS390XFMOVSload) 7577 v.AuxInt = off1 + off2 7578 v.Aux = mergeSym(sym1, sym2) 7579 v.AddArg(base) 7580 v.AddArg(mem) 7581 return true 7582 } 7583 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 7584 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7585 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 7586 for { 7587 off1 := v.AuxInt 7588 sym1 := v.Aux 7589 v_0 := v.Args[0] 7590 if v_0.Op != OpS390XMOVDaddridx { 7591 break 7592 } 7593 off2 := v_0.AuxInt 7594 sym2 := v_0.Aux 7595 ptr := v_0.Args[0] 7596 idx := v_0.Args[1] 7597 mem := v.Args[1] 7598 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7599 break 7600 } 7601 v.reset(OpS390XFMOVSloadidx) 7602 v.AuxInt = off1 + off2 7603 v.Aux = mergeSym(sym1, sym2) 7604 v.AddArg(ptr) 7605 v.AddArg(idx) 7606 v.AddArg(mem) 7607 return true 7608 } 7609 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 7610 // cond: ptr.Op != OpSB 7611 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 7612 for { 7613 off := v.AuxInt 7614 sym := v.Aux 7615 v_0 := v.Args[0] 7616 if v_0.Op != OpS390XADD { 7617 break 7618 } 7619 ptr := v_0.Args[0] 7620 idx := v_0.Args[1] 7621 mem := v.Args[1] 7622 if !(ptr.Op != OpSB) { 7623 break 7624 } 7625 v.reset(OpS390XFMOVSloadidx) 7626 v.AuxInt = off 7627 v.Aux = sym 7628 v.AddArg(ptr) 7629 v.AddArg(idx) 7630 v.AddArg(mem) 7631 return true 7632 } 7633 return false 7634 } 7635 func rewriteValueS390X_OpS390XFMOVSloadidx(v *Value, config *Config) bool { 7636 b := v.Block 7637 _ = b 7638 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 7639 // cond: 7640 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 7641 for { 7642 c := v.AuxInt 7643 sym := v.Aux 7644 v_0 := v.Args[0] 7645 if v_0.Op != OpS390XADDconst { 7646 break 7647 } 7648 d := v_0.AuxInt 7649 ptr := v_0.Args[0] 7650 idx := v.Args[1] 7651 mem := v.Args[2] 7652 v.reset(OpS390XFMOVSloadidx) 7653 v.AuxInt = c + d 7654 v.Aux = sym 7655 v.AddArg(ptr) 7656 v.AddArg(idx) 7657 v.AddArg(mem) 7658 return true 7659 } 7660 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 7661 // cond: 7662 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 7663 for { 7664 c := v.AuxInt 7665 sym := v.Aux 7666 ptr := v.Args[0] 7667 v_1 := v.Args[1] 7668 if v_1.Op != OpS390XADDconst { 7669 break 7670 } 7671 d := v_1.AuxInt 7672 idx := v_1.Args[0] 7673 mem := v.Args[2] 7674 v.reset(OpS390XFMOVSloadidx) 7675 v.AuxInt = c + d 7676 v.Aux = sym 7677 v.AddArg(ptr) 7678 v.AddArg(idx) 7679 v.AddArg(mem) 7680 return true 7681 } 7682 return false 7683 } 7684 func rewriteValueS390X_OpS390XFMOVSstore(v *Value, config *Config) bool { 7685 b := v.Block 7686 _ = b 7687 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7688 // cond: is20Bit(off1+off2) 7689 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 7690 for { 7691 off1 := v.AuxInt 7692 sym := v.Aux 7693 v_0 := v.Args[0] 7694 if v_0.Op != OpS390XADDconst { 7695 break 7696 } 7697 off2 := v_0.AuxInt 7698 ptr := v_0.Args[0] 7699 val := v.Args[1] 7700 mem := v.Args[2] 7701 if !(is20Bit(off1 + off2)) { 7702 break 7703 } 7704 v.reset(OpS390XFMOVSstore) 7705 v.AuxInt = off1 + off2 7706 v.Aux = sym 7707 v.AddArg(ptr) 7708 v.AddArg(val) 7709 v.AddArg(mem) 7710 return true 7711 } 7712 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 7713 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7714 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 7715 for { 7716 off1 := v.AuxInt 7717 sym1 := v.Aux 7718 v_0 := v.Args[0] 7719 if v_0.Op != OpS390XMOVDaddr { 7720 break 7721 } 7722 off2 := v_0.AuxInt 7723 sym2 := v_0.Aux 7724 base := v_0.Args[0] 7725 val := v.Args[1] 7726 mem := v.Args[2] 7727 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7728 break 7729 } 7730 v.reset(OpS390XFMOVSstore) 7731 v.AuxInt = off1 + off2 7732 v.Aux = mergeSym(sym1, sym2) 7733 v.AddArg(base) 7734 v.AddArg(val) 7735 v.AddArg(mem) 7736 return true 7737 } 7738 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 7739 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7740 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 7741 for { 7742 off1 := v.AuxInt 7743 sym1 := v.Aux 7744 v_0 := v.Args[0] 7745 if v_0.Op != OpS390XMOVDaddridx { 7746 break 7747 } 7748 off2 := v_0.AuxInt 7749 sym2 := v_0.Aux 7750 ptr := v_0.Args[0] 7751 idx := v_0.Args[1] 7752 val := v.Args[1] 7753 mem := v.Args[2] 7754 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7755 break 7756 } 7757 v.reset(OpS390XFMOVSstoreidx) 7758 v.AuxInt = off1 + off2 7759 v.Aux = mergeSym(sym1, sym2) 7760 v.AddArg(ptr) 7761 v.AddArg(idx) 7762 v.AddArg(val) 7763 v.AddArg(mem) 7764 return true 7765 } 7766 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 7767 // cond: ptr.Op != OpSB 7768 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 7769 for { 7770 off := v.AuxInt 7771 sym := v.Aux 7772 v_0 := v.Args[0] 7773 if v_0.Op != OpS390XADD { 7774 break 7775 } 7776 ptr := v_0.Args[0] 7777 idx := v_0.Args[1] 7778 val := v.Args[1] 7779 mem := v.Args[2] 7780 if !(ptr.Op != OpSB) { 7781 break 7782 } 7783 v.reset(OpS390XFMOVSstoreidx) 7784 v.AuxInt = off 7785 v.Aux = sym 7786 v.AddArg(ptr) 7787 v.AddArg(idx) 7788 v.AddArg(val) 7789 v.AddArg(mem) 7790 return true 7791 } 7792 return false 7793 } 7794 func rewriteValueS390X_OpS390XFMOVSstoreidx(v *Value, config *Config) bool { 7795 b := v.Block 7796 _ = b 7797 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 7798 // cond: 7799 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 7800 for { 7801 c := v.AuxInt 7802 sym := v.Aux 7803 v_0 := v.Args[0] 7804 if v_0.Op != OpS390XADDconst { 7805 break 7806 } 7807 d := v_0.AuxInt 7808 ptr := v_0.Args[0] 7809 idx := v.Args[1] 7810 val := v.Args[2] 7811 mem := v.Args[3] 7812 v.reset(OpS390XFMOVSstoreidx) 7813 v.AuxInt = c + d 7814 v.Aux = sym 7815 v.AddArg(ptr) 7816 v.AddArg(idx) 7817 v.AddArg(val) 7818 v.AddArg(mem) 7819 return true 7820 } 7821 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 7822 // cond: 7823 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 7824 for { 7825 c := v.AuxInt 7826 sym := v.Aux 7827 ptr := v.Args[0] 7828 v_1 := v.Args[1] 7829 if v_1.Op != OpS390XADDconst { 7830 break 7831 } 7832 d := v_1.AuxInt 7833 idx := v_1.Args[0] 7834 val := v.Args[2] 7835 mem := v.Args[3] 7836 v.reset(OpS390XFMOVSstoreidx) 7837 v.AuxInt = c + d 7838 v.Aux = sym 7839 v.AddArg(ptr) 7840 v.AddArg(idx) 7841 v.AddArg(val) 7842 v.AddArg(mem) 7843 return true 7844 } 7845 return false 7846 } 7847 func rewriteValueS390X_OpS390XMOVBZload(v *Value, config *Config) bool { 7848 b := v.Block 7849 _ = b 7850 // match: (MOVBZload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 7851 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7852 // result: (MOVDreg x) 7853 for { 7854 off := v.AuxInt 7855 sym := v.Aux 7856 ptr := v.Args[0] 7857 v_1 := v.Args[1] 7858 if v_1.Op != OpS390XMOVBstore { 7859 break 7860 } 7861 off2 := v_1.AuxInt 7862 sym2 := v_1.Aux 7863 ptr2 := v_1.Args[0] 7864 x := v_1.Args[1] 7865 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7866 break 7867 } 7868 v.reset(OpS390XMOVDreg) 7869 v.AddArg(x) 7870 return true 7871 } 7872 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 7873 // cond: is20Bit(off1+off2) 7874 // result: (MOVBZload [off1+off2] {sym} ptr mem) 7875 for { 7876 off1 := v.AuxInt 7877 sym := v.Aux 7878 v_0 := v.Args[0] 7879 if v_0.Op != OpS390XADDconst { 7880 break 7881 } 7882 off2 := v_0.AuxInt 7883 ptr := v_0.Args[0] 7884 mem := v.Args[1] 7885 if !(is20Bit(off1 + off2)) { 7886 break 7887 } 7888 v.reset(OpS390XMOVBZload) 7889 v.AuxInt = off1 + off2 7890 v.Aux = sym 7891 v.AddArg(ptr) 7892 v.AddArg(mem) 7893 return true 7894 } 7895 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 7896 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7897 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 7898 for { 7899 off1 := v.AuxInt 7900 sym1 := v.Aux 7901 v_0 := v.Args[0] 7902 if v_0.Op != OpS390XMOVDaddr { 7903 break 7904 } 7905 off2 := v_0.AuxInt 7906 sym2 := v_0.Aux 7907 base := v_0.Args[0] 7908 mem := v.Args[1] 7909 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7910 break 7911 } 7912 v.reset(OpS390XMOVBZload) 7913 v.AuxInt = off1 + off2 7914 v.Aux = mergeSym(sym1, sym2) 7915 v.AddArg(base) 7916 v.AddArg(mem) 7917 return true 7918 } 7919 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 7920 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7921 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 7922 for { 7923 off1 := v.AuxInt 7924 sym1 := v.Aux 7925 v_0 := v.Args[0] 7926 if v_0.Op != OpS390XMOVDaddridx { 7927 break 7928 } 7929 off2 := v_0.AuxInt 7930 sym2 := v_0.Aux 7931 ptr := v_0.Args[0] 7932 idx := v_0.Args[1] 7933 mem := v.Args[1] 7934 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7935 break 7936 } 7937 v.reset(OpS390XMOVBZloadidx) 7938 v.AuxInt = off1 + off2 7939 v.Aux = mergeSym(sym1, sym2) 7940 v.AddArg(ptr) 7941 v.AddArg(idx) 7942 v.AddArg(mem) 7943 return true 7944 } 7945 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 7946 // cond: ptr.Op != OpSB 7947 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 7948 for { 7949 off := v.AuxInt 7950 sym := v.Aux 7951 v_0 := v.Args[0] 7952 if v_0.Op != OpS390XADD { 7953 break 7954 } 7955 ptr := v_0.Args[0] 7956 idx := v_0.Args[1] 7957 mem := v.Args[1] 7958 if !(ptr.Op != OpSB) { 7959 break 7960 } 7961 v.reset(OpS390XMOVBZloadidx) 7962 v.AuxInt = off 7963 v.Aux = sym 7964 v.AddArg(ptr) 7965 v.AddArg(idx) 7966 v.AddArg(mem) 7967 return true 7968 } 7969 return false 7970 } 7971 func rewriteValueS390X_OpS390XMOVBZloadidx(v *Value, config *Config) bool { 7972 b := v.Block 7973 _ = b 7974 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 7975 // cond: 7976 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 7977 for { 7978 c := v.AuxInt 7979 sym := v.Aux 7980 v_0 := v.Args[0] 7981 if v_0.Op != OpS390XADDconst { 7982 break 7983 } 7984 d := v_0.AuxInt 7985 ptr := v_0.Args[0] 7986 idx := v.Args[1] 7987 mem := v.Args[2] 7988 v.reset(OpS390XMOVBZloadidx) 7989 v.AuxInt = c + d 7990 v.Aux = sym 7991 v.AddArg(ptr) 7992 v.AddArg(idx) 7993 v.AddArg(mem) 7994 return true 7995 } 7996 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 7997 // cond: 7998 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 7999 for { 8000 c := v.AuxInt 8001 sym := v.Aux 8002 ptr := v.Args[0] 8003 v_1 := v.Args[1] 8004 if v_1.Op != OpS390XADDconst { 8005 break 8006 } 8007 d := v_1.AuxInt 8008 idx := v_1.Args[0] 8009 mem := v.Args[2] 8010 v.reset(OpS390XMOVBZloadidx) 8011 v.AuxInt = c + d 8012 v.Aux = sym 8013 v.AddArg(ptr) 8014 v.AddArg(idx) 8015 v.AddArg(mem) 8016 return true 8017 } 8018 return false 8019 } 8020 func rewriteValueS390X_OpS390XMOVBZreg(v *Value, config *Config) bool { 8021 b := v.Block 8022 _ = b 8023 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 8024 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8025 // result: (MOVDreg x) 8026 for { 8027 x := v.Args[0] 8028 if x.Op != OpS390XMOVDLT { 8029 break 8030 } 8031 x_0 := x.Args[0] 8032 if x_0.Op != OpS390XMOVDconst { 8033 break 8034 } 8035 c := x_0.AuxInt 8036 x_1 := x.Args[1] 8037 if x_1.Op != OpS390XMOVDconst { 8038 break 8039 } 8040 d := x_1.AuxInt 8041 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8042 break 8043 } 8044 v.reset(OpS390XMOVDreg) 8045 v.AddArg(x) 8046 return true 8047 } 8048 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 8049 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8050 // result: (MOVDreg x) 8051 for { 8052 x := v.Args[0] 8053 if x.Op != OpS390XMOVDLE { 8054 break 8055 } 8056 x_0 := x.Args[0] 8057 if x_0.Op != OpS390XMOVDconst { 8058 break 8059 } 8060 c := x_0.AuxInt 8061 x_1 := x.Args[1] 8062 if x_1.Op != OpS390XMOVDconst { 8063 break 8064 } 8065 d := x_1.AuxInt 8066 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8067 break 8068 } 8069 v.reset(OpS390XMOVDreg) 8070 v.AddArg(x) 8071 return true 8072 } 8073 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 8074 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8075 // result: (MOVDreg x) 8076 for { 8077 x := v.Args[0] 8078 if x.Op != OpS390XMOVDGT { 8079 break 8080 } 8081 x_0 := x.Args[0] 8082 if x_0.Op != OpS390XMOVDconst { 8083 break 8084 } 8085 c := x_0.AuxInt 8086 x_1 := x.Args[1] 8087 if x_1.Op != OpS390XMOVDconst { 8088 break 8089 } 8090 d := x_1.AuxInt 8091 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8092 break 8093 } 8094 v.reset(OpS390XMOVDreg) 8095 v.AddArg(x) 8096 return true 8097 } 8098 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 8099 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8100 // result: (MOVDreg x) 8101 for { 8102 x := v.Args[0] 8103 if x.Op != OpS390XMOVDGE { 8104 break 8105 } 8106 x_0 := x.Args[0] 8107 if x_0.Op != OpS390XMOVDconst { 8108 break 8109 } 8110 c := x_0.AuxInt 8111 x_1 := x.Args[1] 8112 if x_1.Op != OpS390XMOVDconst { 8113 break 8114 } 8115 d := x_1.AuxInt 8116 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8117 break 8118 } 8119 v.reset(OpS390XMOVDreg) 8120 v.AddArg(x) 8121 return true 8122 } 8123 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 8124 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8125 // result: (MOVDreg x) 8126 for { 8127 x := v.Args[0] 8128 if x.Op != OpS390XMOVDEQ { 8129 break 8130 } 8131 x_0 := x.Args[0] 8132 if x_0.Op != OpS390XMOVDconst { 8133 break 8134 } 8135 c := x_0.AuxInt 8136 x_1 := x.Args[1] 8137 if x_1.Op != OpS390XMOVDconst { 8138 break 8139 } 8140 d := x_1.AuxInt 8141 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8142 break 8143 } 8144 v.reset(OpS390XMOVDreg) 8145 v.AddArg(x) 8146 return true 8147 } 8148 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 8149 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8150 // result: (MOVDreg x) 8151 for { 8152 x := v.Args[0] 8153 if x.Op != OpS390XMOVDNE { 8154 break 8155 } 8156 x_0 := x.Args[0] 8157 if x_0.Op != OpS390XMOVDconst { 8158 break 8159 } 8160 c := x_0.AuxInt 8161 x_1 := x.Args[1] 8162 if x_1.Op != OpS390XMOVDconst { 8163 break 8164 } 8165 d := x_1.AuxInt 8166 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8167 break 8168 } 8169 v.reset(OpS390XMOVDreg) 8170 v.AddArg(x) 8171 return true 8172 } 8173 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 8174 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8175 // result: (MOVDreg x) 8176 for { 8177 x := v.Args[0] 8178 if x.Op != OpS390XMOVDGTnoinv { 8179 break 8180 } 8181 x_0 := x.Args[0] 8182 if x_0.Op != OpS390XMOVDconst { 8183 break 8184 } 8185 c := x_0.AuxInt 8186 x_1 := x.Args[1] 8187 if x_1.Op != OpS390XMOVDconst { 8188 break 8189 } 8190 d := x_1.AuxInt 8191 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8192 break 8193 } 8194 v.reset(OpS390XMOVDreg) 8195 v.AddArg(x) 8196 return true 8197 } 8198 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 8199 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8200 // result: (MOVDreg x) 8201 for { 8202 x := v.Args[0] 8203 if x.Op != OpS390XMOVDGEnoinv { 8204 break 8205 } 8206 x_0 := x.Args[0] 8207 if x_0.Op != OpS390XMOVDconst { 8208 break 8209 } 8210 c := x_0.AuxInt 8211 x_1 := x.Args[1] 8212 if x_1.Op != OpS390XMOVDconst { 8213 break 8214 } 8215 d := x_1.AuxInt 8216 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8217 break 8218 } 8219 v.reset(OpS390XMOVDreg) 8220 v.AddArg(x) 8221 return true 8222 } 8223 // match: (MOVBZreg x:(MOVBZload _ _)) 8224 // cond: 8225 // result: (MOVDreg x) 8226 for { 8227 x := v.Args[0] 8228 if x.Op != OpS390XMOVBZload { 8229 break 8230 } 8231 v.reset(OpS390XMOVDreg) 8232 v.AddArg(x) 8233 return true 8234 } 8235 // match: (MOVBZreg x:(Arg <t>)) 8236 // cond: is8BitInt(t) && !isSigned(t) 8237 // result: (MOVDreg x) 8238 for { 8239 x := v.Args[0] 8240 if x.Op != OpArg { 8241 break 8242 } 8243 t := x.Type 8244 if !(is8BitInt(t) && !isSigned(t)) { 8245 break 8246 } 8247 v.reset(OpS390XMOVDreg) 8248 v.AddArg(x) 8249 return true 8250 } 8251 // match: (MOVBZreg x:(MOVBZreg _)) 8252 // cond: 8253 // result: (MOVDreg x) 8254 for { 8255 x := v.Args[0] 8256 if x.Op != OpS390XMOVBZreg { 8257 break 8258 } 8259 v.reset(OpS390XMOVDreg) 8260 v.AddArg(x) 8261 return true 8262 } 8263 // match: (MOVBZreg (MOVDconst [c])) 8264 // cond: 8265 // result: (MOVDconst [int64(uint8(c))]) 8266 for { 8267 v_0 := v.Args[0] 8268 if v_0.Op != OpS390XMOVDconst { 8269 break 8270 } 8271 c := v_0.AuxInt 8272 v.reset(OpS390XMOVDconst) 8273 v.AuxInt = int64(uint8(c)) 8274 return true 8275 } 8276 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 8277 // cond: x.Uses == 1 && clobber(x) 8278 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 8279 for { 8280 x := v.Args[0] 8281 if x.Op != OpS390XMOVBZload { 8282 break 8283 } 8284 off := x.AuxInt 8285 sym := x.Aux 8286 ptr := x.Args[0] 8287 mem := x.Args[1] 8288 if !(x.Uses == 1 && clobber(x)) { 8289 break 8290 } 8291 b = x.Block 8292 v0 := b.NewValue0(v.Line, OpS390XMOVBZload, v.Type) 8293 v.reset(OpCopy) 8294 v.AddArg(v0) 8295 v0.AuxInt = off 8296 v0.Aux = sym 8297 v0.AddArg(ptr) 8298 v0.AddArg(mem) 8299 return true 8300 } 8301 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 8302 // cond: x.Uses == 1 && clobber(x) 8303 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 8304 for { 8305 x := v.Args[0] 8306 if x.Op != OpS390XMOVBZloadidx { 8307 break 8308 } 8309 off := x.AuxInt 8310 sym := x.Aux 8311 ptr := x.Args[0] 8312 idx := x.Args[1] 8313 mem := x.Args[2] 8314 if !(x.Uses == 1 && clobber(x)) { 8315 break 8316 } 8317 b = x.Block 8318 v0 := b.NewValue0(v.Line, OpS390XMOVBZloadidx, v.Type) 8319 v.reset(OpCopy) 8320 v.AddArg(v0) 8321 v0.AuxInt = off 8322 v0.Aux = sym 8323 v0.AddArg(ptr) 8324 v0.AddArg(idx) 8325 v0.AddArg(mem) 8326 return true 8327 } 8328 return false 8329 } 8330 func rewriteValueS390X_OpS390XMOVBload(v *Value, config *Config) bool { 8331 b := v.Block 8332 _ = b 8333 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 8334 // cond: is20Bit(off1+off2) 8335 // result: (MOVBload [off1+off2] {sym} ptr mem) 8336 for { 8337 off1 := v.AuxInt 8338 sym := v.Aux 8339 v_0 := v.Args[0] 8340 if v_0.Op != OpS390XADDconst { 8341 break 8342 } 8343 off2 := v_0.AuxInt 8344 ptr := v_0.Args[0] 8345 mem := v.Args[1] 8346 if !(is20Bit(off1 + off2)) { 8347 break 8348 } 8349 v.reset(OpS390XMOVBload) 8350 v.AuxInt = off1 + off2 8351 v.Aux = sym 8352 v.AddArg(ptr) 8353 v.AddArg(mem) 8354 return true 8355 } 8356 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8357 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8358 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8359 for { 8360 off1 := v.AuxInt 8361 sym1 := v.Aux 8362 v_0 := v.Args[0] 8363 if v_0.Op != OpS390XMOVDaddr { 8364 break 8365 } 8366 off2 := v_0.AuxInt 8367 sym2 := v_0.Aux 8368 base := v_0.Args[0] 8369 mem := v.Args[1] 8370 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8371 break 8372 } 8373 v.reset(OpS390XMOVBload) 8374 v.AuxInt = off1 + off2 8375 v.Aux = mergeSym(sym1, sym2) 8376 v.AddArg(base) 8377 v.AddArg(mem) 8378 return true 8379 } 8380 return false 8381 } 8382 func rewriteValueS390X_OpS390XMOVBreg(v *Value, config *Config) bool { 8383 b := v.Block 8384 _ = b 8385 // match: (MOVBreg x:(MOVBload _ _)) 8386 // cond: 8387 // result: (MOVDreg x) 8388 for { 8389 x := v.Args[0] 8390 if x.Op != OpS390XMOVBload { 8391 break 8392 } 8393 v.reset(OpS390XMOVDreg) 8394 v.AddArg(x) 8395 return true 8396 } 8397 // match: (MOVBreg x:(Arg <t>)) 8398 // cond: is8BitInt(t) && isSigned(t) 8399 // result: (MOVDreg x) 8400 for { 8401 x := v.Args[0] 8402 if x.Op != OpArg { 8403 break 8404 } 8405 t := x.Type 8406 if !(is8BitInt(t) && isSigned(t)) { 8407 break 8408 } 8409 v.reset(OpS390XMOVDreg) 8410 v.AddArg(x) 8411 return true 8412 } 8413 // match: (MOVBreg x:(MOVBreg _)) 8414 // cond: 8415 // result: (MOVDreg x) 8416 for { 8417 x := v.Args[0] 8418 if x.Op != OpS390XMOVBreg { 8419 break 8420 } 8421 v.reset(OpS390XMOVDreg) 8422 v.AddArg(x) 8423 return true 8424 } 8425 // match: (MOVBreg (MOVDconst [c])) 8426 // cond: 8427 // result: (MOVDconst [int64(int8(c))]) 8428 for { 8429 v_0 := v.Args[0] 8430 if v_0.Op != OpS390XMOVDconst { 8431 break 8432 } 8433 c := v_0.AuxInt 8434 v.reset(OpS390XMOVDconst) 8435 v.AuxInt = int64(int8(c)) 8436 return true 8437 } 8438 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 8439 // cond: x.Uses == 1 && clobber(x) 8440 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 8441 for { 8442 x := v.Args[0] 8443 if x.Op != OpS390XMOVBZload { 8444 break 8445 } 8446 off := x.AuxInt 8447 sym := x.Aux 8448 ptr := x.Args[0] 8449 mem := x.Args[1] 8450 if !(x.Uses == 1 && clobber(x)) { 8451 break 8452 } 8453 b = x.Block 8454 v0 := b.NewValue0(v.Line, OpS390XMOVBload, v.Type) 8455 v.reset(OpCopy) 8456 v.AddArg(v0) 8457 v0.AuxInt = off 8458 v0.Aux = sym 8459 v0.AddArg(ptr) 8460 v0.AddArg(mem) 8461 return true 8462 } 8463 return false 8464 } 8465 func rewriteValueS390X_OpS390XMOVBstore(v *Value, config *Config) bool { 8466 b := v.Block 8467 _ = b 8468 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 8469 // cond: 8470 // result: (MOVBstore [off] {sym} ptr x mem) 8471 for { 8472 off := v.AuxInt 8473 sym := v.Aux 8474 ptr := v.Args[0] 8475 v_1 := v.Args[1] 8476 if v_1.Op != OpS390XMOVBreg { 8477 break 8478 } 8479 x := v_1.Args[0] 8480 mem := v.Args[2] 8481 v.reset(OpS390XMOVBstore) 8482 v.AuxInt = off 8483 v.Aux = sym 8484 v.AddArg(ptr) 8485 v.AddArg(x) 8486 v.AddArg(mem) 8487 return true 8488 } 8489 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 8490 // cond: 8491 // result: (MOVBstore [off] {sym} ptr x mem) 8492 for { 8493 off := v.AuxInt 8494 sym := v.Aux 8495 ptr := v.Args[0] 8496 v_1 := v.Args[1] 8497 if v_1.Op != OpS390XMOVBZreg { 8498 break 8499 } 8500 x := v_1.Args[0] 8501 mem := v.Args[2] 8502 v.reset(OpS390XMOVBstore) 8503 v.AuxInt = off 8504 v.Aux = sym 8505 v.AddArg(ptr) 8506 v.AddArg(x) 8507 v.AddArg(mem) 8508 return true 8509 } 8510 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8511 // cond: is20Bit(off1+off2) 8512 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 8513 for { 8514 off1 := v.AuxInt 8515 sym := v.Aux 8516 v_0 := v.Args[0] 8517 if v_0.Op != OpS390XADDconst { 8518 break 8519 } 8520 off2 := v_0.AuxInt 8521 ptr := v_0.Args[0] 8522 val := v.Args[1] 8523 mem := v.Args[2] 8524 if !(is20Bit(off1 + off2)) { 8525 break 8526 } 8527 v.reset(OpS390XMOVBstore) 8528 v.AuxInt = off1 + off2 8529 v.Aux = sym 8530 v.AddArg(ptr) 8531 v.AddArg(val) 8532 v.AddArg(mem) 8533 return true 8534 } 8535 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 8536 // cond: validOff(off) && ptr.Op != OpSB 8537 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 8538 for { 8539 off := v.AuxInt 8540 sym := v.Aux 8541 ptr := v.Args[0] 8542 v_1 := v.Args[1] 8543 if v_1.Op != OpS390XMOVDconst { 8544 break 8545 } 8546 c := v_1.AuxInt 8547 mem := v.Args[2] 8548 if !(validOff(off) && ptr.Op != OpSB) { 8549 break 8550 } 8551 v.reset(OpS390XMOVBstoreconst) 8552 v.AuxInt = makeValAndOff(int64(int8(c)), off) 8553 v.Aux = sym 8554 v.AddArg(ptr) 8555 v.AddArg(mem) 8556 return true 8557 } 8558 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8559 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8560 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8561 for { 8562 off1 := v.AuxInt 8563 sym1 := v.Aux 8564 v_0 := v.Args[0] 8565 if v_0.Op != OpS390XMOVDaddr { 8566 break 8567 } 8568 off2 := v_0.AuxInt 8569 sym2 := v_0.Aux 8570 base := v_0.Args[0] 8571 val := v.Args[1] 8572 mem := v.Args[2] 8573 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8574 break 8575 } 8576 v.reset(OpS390XMOVBstore) 8577 v.AuxInt = off1 + off2 8578 v.Aux = mergeSym(sym1, sym2) 8579 v.AddArg(base) 8580 v.AddArg(val) 8581 v.AddArg(mem) 8582 return true 8583 } 8584 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8585 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8586 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8587 for { 8588 off1 := v.AuxInt 8589 sym1 := v.Aux 8590 v_0 := v.Args[0] 8591 if v_0.Op != OpS390XMOVDaddridx { 8592 break 8593 } 8594 off2 := v_0.AuxInt 8595 sym2 := v_0.Aux 8596 ptr := v_0.Args[0] 8597 idx := v_0.Args[1] 8598 val := v.Args[1] 8599 mem := v.Args[2] 8600 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8601 break 8602 } 8603 v.reset(OpS390XMOVBstoreidx) 8604 v.AuxInt = off1 + off2 8605 v.Aux = mergeSym(sym1, sym2) 8606 v.AddArg(ptr) 8607 v.AddArg(idx) 8608 v.AddArg(val) 8609 v.AddArg(mem) 8610 return true 8611 } 8612 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 8613 // cond: ptr.Op != OpSB 8614 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 8615 for { 8616 off := v.AuxInt 8617 sym := v.Aux 8618 v_0 := v.Args[0] 8619 if v_0.Op != OpS390XADD { 8620 break 8621 } 8622 ptr := v_0.Args[0] 8623 idx := v_0.Args[1] 8624 val := v.Args[1] 8625 mem := v.Args[2] 8626 if !(ptr.Op != OpSB) { 8627 break 8628 } 8629 v.reset(OpS390XMOVBstoreidx) 8630 v.AuxInt = off 8631 v.Aux = sym 8632 v.AddArg(ptr) 8633 v.AddArg(idx) 8634 v.AddArg(val) 8635 v.AddArg(mem) 8636 return true 8637 } 8638 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 8639 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 8640 // result: (MOVHstore [i-1] {s} p w mem) 8641 for { 8642 i := v.AuxInt 8643 s := v.Aux 8644 p := v.Args[0] 8645 w := v.Args[1] 8646 x := v.Args[2] 8647 if x.Op != OpS390XMOVBstore { 8648 break 8649 } 8650 if x.AuxInt != i-1 { 8651 break 8652 } 8653 if x.Aux != s { 8654 break 8655 } 8656 if p != x.Args[0] { 8657 break 8658 } 8659 x_1 := x.Args[1] 8660 if x_1.Op != OpS390XSRDconst { 8661 break 8662 } 8663 if x_1.AuxInt != 8 { 8664 break 8665 } 8666 if w != x_1.Args[0] { 8667 break 8668 } 8669 mem := x.Args[2] 8670 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 8671 break 8672 } 8673 v.reset(OpS390XMOVHstore) 8674 v.AuxInt = i - 1 8675 v.Aux = s 8676 v.AddArg(p) 8677 v.AddArg(w) 8678 v.AddArg(mem) 8679 return true 8680 } 8681 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 8682 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 8683 // result: (MOVHstore [i-1] {s} p w0 mem) 8684 for { 8685 i := v.AuxInt 8686 s := v.Aux 8687 p := v.Args[0] 8688 w0 := v.Args[1] 8689 if w0.Op != OpS390XSRDconst { 8690 break 8691 } 8692 j := w0.AuxInt 8693 w := w0.Args[0] 8694 x := v.Args[2] 8695 if x.Op != OpS390XMOVBstore { 8696 break 8697 } 8698 if x.AuxInt != i-1 { 8699 break 8700 } 8701 if x.Aux != s { 8702 break 8703 } 8704 if p != x.Args[0] { 8705 break 8706 } 8707 x_1 := x.Args[1] 8708 if x_1.Op != OpS390XSRDconst { 8709 break 8710 } 8711 if x_1.AuxInt != j+8 { 8712 break 8713 } 8714 if w != x_1.Args[0] { 8715 break 8716 } 8717 mem := x.Args[2] 8718 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 8719 break 8720 } 8721 v.reset(OpS390XMOVHstore) 8722 v.AuxInt = i - 1 8723 v.Aux = s 8724 v.AddArg(p) 8725 v.AddArg(w0) 8726 v.AddArg(mem) 8727 return true 8728 } 8729 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 8730 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 8731 // result: (MOVHstore [i-1] {s} p w mem) 8732 for { 8733 i := v.AuxInt 8734 s := v.Aux 8735 p := v.Args[0] 8736 w := v.Args[1] 8737 x := v.Args[2] 8738 if x.Op != OpS390XMOVBstore { 8739 break 8740 } 8741 if x.AuxInt != i-1 { 8742 break 8743 } 8744 if x.Aux != s { 8745 break 8746 } 8747 if p != x.Args[0] { 8748 break 8749 } 8750 x_1 := x.Args[1] 8751 if x_1.Op != OpS390XSRWconst { 8752 break 8753 } 8754 if x_1.AuxInt != 8 { 8755 break 8756 } 8757 if w != x_1.Args[0] { 8758 break 8759 } 8760 mem := x.Args[2] 8761 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 8762 break 8763 } 8764 v.reset(OpS390XMOVHstore) 8765 v.AuxInt = i - 1 8766 v.Aux = s 8767 v.AddArg(p) 8768 v.AddArg(w) 8769 v.AddArg(mem) 8770 return true 8771 } 8772 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 8773 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 8774 // result: (MOVHstore [i-1] {s} p w0 mem) 8775 for { 8776 i := v.AuxInt 8777 s := v.Aux 8778 p := v.Args[0] 8779 w0 := v.Args[1] 8780 if w0.Op != OpS390XSRWconst { 8781 break 8782 } 8783 j := w0.AuxInt 8784 w := w0.Args[0] 8785 x := v.Args[2] 8786 if x.Op != OpS390XMOVBstore { 8787 break 8788 } 8789 if x.AuxInt != i-1 { 8790 break 8791 } 8792 if x.Aux != s { 8793 break 8794 } 8795 if p != x.Args[0] { 8796 break 8797 } 8798 x_1 := x.Args[1] 8799 if x_1.Op != OpS390XSRWconst { 8800 break 8801 } 8802 if x_1.AuxInt != j+8 { 8803 break 8804 } 8805 if w != x_1.Args[0] { 8806 break 8807 } 8808 mem := x.Args[2] 8809 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 8810 break 8811 } 8812 v.reset(OpS390XMOVHstore) 8813 v.AuxInt = i - 1 8814 v.Aux = s 8815 v.AddArg(p) 8816 v.AddArg(w0) 8817 v.AddArg(mem) 8818 return true 8819 } 8820 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 8821 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 8822 // result: (MOVHBRstore [i-1] {s} p w mem) 8823 for { 8824 i := v.AuxInt 8825 s := v.Aux 8826 p := v.Args[0] 8827 v_1 := v.Args[1] 8828 if v_1.Op != OpS390XSRDconst { 8829 break 8830 } 8831 if v_1.AuxInt != 8 { 8832 break 8833 } 8834 w := v_1.Args[0] 8835 x := v.Args[2] 8836 if x.Op != OpS390XMOVBstore { 8837 break 8838 } 8839 if x.AuxInt != i-1 { 8840 break 8841 } 8842 if x.Aux != s { 8843 break 8844 } 8845 if p != x.Args[0] { 8846 break 8847 } 8848 if w != x.Args[1] { 8849 break 8850 } 8851 mem := x.Args[2] 8852 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 8853 break 8854 } 8855 v.reset(OpS390XMOVHBRstore) 8856 v.AuxInt = i - 1 8857 v.Aux = s 8858 v.AddArg(p) 8859 v.AddArg(w) 8860 v.AddArg(mem) 8861 return true 8862 } 8863 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 8864 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 8865 // result: (MOVHBRstore [i-1] {s} p w0 mem) 8866 for { 8867 i := v.AuxInt 8868 s := v.Aux 8869 p := v.Args[0] 8870 v_1 := v.Args[1] 8871 if v_1.Op != OpS390XSRDconst { 8872 break 8873 } 8874 j := v_1.AuxInt 8875 w := v_1.Args[0] 8876 x := v.Args[2] 8877 if x.Op != OpS390XMOVBstore { 8878 break 8879 } 8880 if x.AuxInt != i-1 { 8881 break 8882 } 8883 if x.Aux != s { 8884 break 8885 } 8886 if p != x.Args[0] { 8887 break 8888 } 8889 w0 := x.Args[1] 8890 if w0.Op != OpS390XSRDconst { 8891 break 8892 } 8893 if w0.AuxInt != j-8 { 8894 break 8895 } 8896 if w != w0.Args[0] { 8897 break 8898 } 8899 mem := x.Args[2] 8900 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 8901 break 8902 } 8903 v.reset(OpS390XMOVHBRstore) 8904 v.AuxInt = i - 1 8905 v.Aux = s 8906 v.AddArg(p) 8907 v.AddArg(w0) 8908 v.AddArg(mem) 8909 return true 8910 } 8911 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 8912 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 8913 // result: (MOVHBRstore [i-1] {s} p w mem) 8914 for { 8915 i := v.AuxInt 8916 s := v.Aux 8917 p := v.Args[0] 8918 v_1 := v.Args[1] 8919 if v_1.Op != OpS390XSRWconst { 8920 break 8921 } 8922 if v_1.AuxInt != 8 { 8923 break 8924 } 8925 w := v_1.Args[0] 8926 x := v.Args[2] 8927 if x.Op != OpS390XMOVBstore { 8928 break 8929 } 8930 if x.AuxInt != i-1 { 8931 break 8932 } 8933 if x.Aux != s { 8934 break 8935 } 8936 if p != x.Args[0] { 8937 break 8938 } 8939 if w != x.Args[1] { 8940 break 8941 } 8942 mem := x.Args[2] 8943 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 8944 break 8945 } 8946 v.reset(OpS390XMOVHBRstore) 8947 v.AuxInt = i - 1 8948 v.Aux = s 8949 v.AddArg(p) 8950 v.AddArg(w) 8951 v.AddArg(mem) 8952 return true 8953 } 8954 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 8955 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 8956 // result: (MOVHBRstore [i-1] {s} p w0 mem) 8957 for { 8958 i := v.AuxInt 8959 s := v.Aux 8960 p := v.Args[0] 8961 v_1 := v.Args[1] 8962 if v_1.Op != OpS390XSRWconst { 8963 break 8964 } 8965 j := v_1.AuxInt 8966 w := v_1.Args[0] 8967 x := v.Args[2] 8968 if x.Op != OpS390XMOVBstore { 8969 break 8970 } 8971 if x.AuxInt != i-1 { 8972 break 8973 } 8974 if x.Aux != s { 8975 break 8976 } 8977 if p != x.Args[0] { 8978 break 8979 } 8980 w0 := x.Args[1] 8981 if w0.Op != OpS390XSRWconst { 8982 break 8983 } 8984 if w0.AuxInt != j-8 { 8985 break 8986 } 8987 if w != w0.Args[0] { 8988 break 8989 } 8990 mem := x.Args[2] 8991 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 8992 break 8993 } 8994 v.reset(OpS390XMOVHBRstore) 8995 v.AuxInt = i - 1 8996 v.Aux = s 8997 v.AddArg(p) 8998 v.AddArg(w0) 8999 v.AddArg(mem) 9000 return true 9001 } 9002 return false 9003 } 9004 func rewriteValueS390X_OpS390XMOVBstoreconst(v *Value, config *Config) bool { 9005 b := v.Block 9006 _ = b 9007 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 9008 // cond: ValAndOff(sc).canAdd(off) 9009 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 9010 for { 9011 sc := v.AuxInt 9012 s := v.Aux 9013 v_0 := v.Args[0] 9014 if v_0.Op != OpS390XADDconst { 9015 break 9016 } 9017 off := v_0.AuxInt 9018 ptr := v_0.Args[0] 9019 mem := v.Args[1] 9020 if !(ValAndOff(sc).canAdd(off)) { 9021 break 9022 } 9023 v.reset(OpS390XMOVBstoreconst) 9024 v.AuxInt = ValAndOff(sc).add(off) 9025 v.Aux = s 9026 v.AddArg(ptr) 9027 v.AddArg(mem) 9028 return true 9029 } 9030 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 9031 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 9032 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 9033 for { 9034 sc := v.AuxInt 9035 sym1 := v.Aux 9036 v_0 := v.Args[0] 9037 if v_0.Op != OpS390XMOVDaddr { 9038 break 9039 } 9040 off := v_0.AuxInt 9041 sym2 := v_0.Aux 9042 ptr := v_0.Args[0] 9043 mem := v.Args[1] 9044 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 9045 break 9046 } 9047 v.reset(OpS390XMOVBstoreconst) 9048 v.AuxInt = ValAndOff(sc).add(off) 9049 v.Aux = mergeSym(sym1, sym2) 9050 v.AddArg(ptr) 9051 v.AddArg(mem) 9052 return true 9053 } 9054 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 9055 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 9056 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 9057 for { 9058 c := v.AuxInt 9059 s := v.Aux 9060 p := v.Args[0] 9061 x := v.Args[1] 9062 if x.Op != OpS390XMOVBstoreconst { 9063 break 9064 } 9065 a := x.AuxInt 9066 if x.Aux != s { 9067 break 9068 } 9069 if p != x.Args[0] { 9070 break 9071 } 9072 mem := x.Args[1] 9073 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 9074 break 9075 } 9076 v.reset(OpS390XMOVHstoreconst) 9077 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 9078 v.Aux = s 9079 v.AddArg(p) 9080 v.AddArg(mem) 9081 return true 9082 } 9083 return false 9084 } 9085 func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value, config *Config) bool { 9086 b := v.Block 9087 _ = b 9088 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 9089 // cond: 9090 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9091 for { 9092 c := v.AuxInt 9093 sym := v.Aux 9094 v_0 := v.Args[0] 9095 if v_0.Op != OpS390XADDconst { 9096 break 9097 } 9098 d := v_0.AuxInt 9099 ptr := v_0.Args[0] 9100 idx := v.Args[1] 9101 val := v.Args[2] 9102 mem := v.Args[3] 9103 v.reset(OpS390XMOVBstoreidx) 9104 v.AuxInt = c + d 9105 v.Aux = sym 9106 v.AddArg(ptr) 9107 v.AddArg(idx) 9108 v.AddArg(val) 9109 v.AddArg(mem) 9110 return true 9111 } 9112 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 9113 // cond: 9114 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9115 for { 9116 c := v.AuxInt 9117 sym := v.Aux 9118 ptr := v.Args[0] 9119 v_1 := v.Args[1] 9120 if v_1.Op != OpS390XADDconst { 9121 break 9122 } 9123 d := v_1.AuxInt 9124 idx := v_1.Args[0] 9125 val := v.Args[2] 9126 mem := v.Args[3] 9127 v.reset(OpS390XMOVBstoreidx) 9128 v.AuxInt = c + d 9129 v.Aux = sym 9130 v.AddArg(ptr) 9131 v.AddArg(idx) 9132 v.AddArg(val) 9133 v.AddArg(mem) 9134 return true 9135 } 9136 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 9137 // cond: x.Uses == 1 && clobber(x) 9138 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9139 for { 9140 i := v.AuxInt 9141 s := v.Aux 9142 p := v.Args[0] 9143 idx := v.Args[1] 9144 w := v.Args[2] 9145 x := v.Args[3] 9146 if x.Op != OpS390XMOVBstoreidx { 9147 break 9148 } 9149 if x.AuxInt != i-1 { 9150 break 9151 } 9152 if x.Aux != s { 9153 break 9154 } 9155 if p != x.Args[0] { 9156 break 9157 } 9158 if idx != x.Args[1] { 9159 break 9160 } 9161 x_2 := x.Args[2] 9162 if x_2.Op != OpS390XSRDconst { 9163 break 9164 } 9165 if x_2.AuxInt != 8 { 9166 break 9167 } 9168 if w != x_2.Args[0] { 9169 break 9170 } 9171 mem := x.Args[3] 9172 if !(x.Uses == 1 && clobber(x)) { 9173 break 9174 } 9175 v.reset(OpS390XMOVHstoreidx) 9176 v.AuxInt = i - 1 9177 v.Aux = s 9178 v.AddArg(p) 9179 v.AddArg(idx) 9180 v.AddArg(w) 9181 v.AddArg(mem) 9182 return true 9183 } 9184 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 9185 // cond: x.Uses == 1 && clobber(x) 9186 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 9187 for { 9188 i := v.AuxInt 9189 s := v.Aux 9190 p := v.Args[0] 9191 idx := v.Args[1] 9192 w0 := v.Args[2] 9193 if w0.Op != OpS390XSRDconst { 9194 break 9195 } 9196 j := w0.AuxInt 9197 w := w0.Args[0] 9198 x := v.Args[3] 9199 if x.Op != OpS390XMOVBstoreidx { 9200 break 9201 } 9202 if x.AuxInt != i-1 { 9203 break 9204 } 9205 if x.Aux != s { 9206 break 9207 } 9208 if p != x.Args[0] { 9209 break 9210 } 9211 if idx != x.Args[1] { 9212 break 9213 } 9214 x_2 := x.Args[2] 9215 if x_2.Op != OpS390XSRDconst { 9216 break 9217 } 9218 if x_2.AuxInt != j+8 { 9219 break 9220 } 9221 if w != x_2.Args[0] { 9222 break 9223 } 9224 mem := x.Args[3] 9225 if !(x.Uses == 1 && clobber(x)) { 9226 break 9227 } 9228 v.reset(OpS390XMOVHstoreidx) 9229 v.AuxInt = i - 1 9230 v.Aux = s 9231 v.AddArg(p) 9232 v.AddArg(idx) 9233 v.AddArg(w0) 9234 v.AddArg(mem) 9235 return true 9236 } 9237 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 9238 // cond: x.Uses == 1 && clobber(x) 9239 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9240 for { 9241 i := v.AuxInt 9242 s := v.Aux 9243 p := v.Args[0] 9244 idx := v.Args[1] 9245 w := v.Args[2] 9246 x := v.Args[3] 9247 if x.Op != OpS390XMOVBstoreidx { 9248 break 9249 } 9250 if x.AuxInt != i-1 { 9251 break 9252 } 9253 if x.Aux != s { 9254 break 9255 } 9256 if p != x.Args[0] { 9257 break 9258 } 9259 if idx != x.Args[1] { 9260 break 9261 } 9262 x_2 := x.Args[2] 9263 if x_2.Op != OpS390XSRWconst { 9264 break 9265 } 9266 if x_2.AuxInt != 8 { 9267 break 9268 } 9269 if w != x_2.Args[0] { 9270 break 9271 } 9272 mem := x.Args[3] 9273 if !(x.Uses == 1 && clobber(x)) { 9274 break 9275 } 9276 v.reset(OpS390XMOVHstoreidx) 9277 v.AuxInt = i - 1 9278 v.Aux = s 9279 v.AddArg(p) 9280 v.AddArg(idx) 9281 v.AddArg(w) 9282 v.AddArg(mem) 9283 return true 9284 } 9285 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 9286 // cond: x.Uses == 1 && clobber(x) 9287 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 9288 for { 9289 i := v.AuxInt 9290 s := v.Aux 9291 p := v.Args[0] 9292 idx := v.Args[1] 9293 w0 := v.Args[2] 9294 if w0.Op != OpS390XSRWconst { 9295 break 9296 } 9297 j := w0.AuxInt 9298 w := w0.Args[0] 9299 x := v.Args[3] 9300 if x.Op != OpS390XMOVBstoreidx { 9301 break 9302 } 9303 if x.AuxInt != i-1 { 9304 break 9305 } 9306 if x.Aux != s { 9307 break 9308 } 9309 if p != x.Args[0] { 9310 break 9311 } 9312 if idx != x.Args[1] { 9313 break 9314 } 9315 x_2 := x.Args[2] 9316 if x_2.Op != OpS390XSRWconst { 9317 break 9318 } 9319 if x_2.AuxInt != j+8 { 9320 break 9321 } 9322 if w != x_2.Args[0] { 9323 break 9324 } 9325 mem := x.Args[3] 9326 if !(x.Uses == 1 && clobber(x)) { 9327 break 9328 } 9329 v.reset(OpS390XMOVHstoreidx) 9330 v.AuxInt = i - 1 9331 v.Aux = s 9332 v.AddArg(p) 9333 v.AddArg(idx) 9334 v.AddArg(w0) 9335 v.AddArg(mem) 9336 return true 9337 } 9338 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 9339 // cond: x.Uses == 1 && clobber(x) 9340 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 9341 for { 9342 i := v.AuxInt 9343 s := v.Aux 9344 p := v.Args[0] 9345 idx := v.Args[1] 9346 v_2 := v.Args[2] 9347 if v_2.Op != OpS390XSRDconst { 9348 break 9349 } 9350 if v_2.AuxInt != 8 { 9351 break 9352 } 9353 w := v_2.Args[0] 9354 x := v.Args[3] 9355 if x.Op != OpS390XMOVBstoreidx { 9356 break 9357 } 9358 if x.AuxInt != i-1 { 9359 break 9360 } 9361 if x.Aux != s { 9362 break 9363 } 9364 if p != x.Args[0] { 9365 break 9366 } 9367 if idx != x.Args[1] { 9368 break 9369 } 9370 if w != x.Args[2] { 9371 break 9372 } 9373 mem := x.Args[3] 9374 if !(x.Uses == 1 && clobber(x)) { 9375 break 9376 } 9377 v.reset(OpS390XMOVHBRstoreidx) 9378 v.AuxInt = i - 1 9379 v.Aux = s 9380 v.AddArg(p) 9381 v.AddArg(idx) 9382 v.AddArg(w) 9383 v.AddArg(mem) 9384 return true 9385 } 9386 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 9387 // cond: x.Uses == 1 && clobber(x) 9388 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 9389 for { 9390 i := v.AuxInt 9391 s := v.Aux 9392 p := v.Args[0] 9393 idx := v.Args[1] 9394 v_2 := v.Args[2] 9395 if v_2.Op != OpS390XSRDconst { 9396 break 9397 } 9398 j := v_2.AuxInt 9399 w := v_2.Args[0] 9400 x := v.Args[3] 9401 if x.Op != OpS390XMOVBstoreidx { 9402 break 9403 } 9404 if x.AuxInt != i-1 { 9405 break 9406 } 9407 if x.Aux != s { 9408 break 9409 } 9410 if p != x.Args[0] { 9411 break 9412 } 9413 if idx != x.Args[1] { 9414 break 9415 } 9416 w0 := x.Args[2] 9417 if w0.Op != OpS390XSRDconst { 9418 break 9419 } 9420 if w0.AuxInt != j-8 { 9421 break 9422 } 9423 if w != w0.Args[0] { 9424 break 9425 } 9426 mem := x.Args[3] 9427 if !(x.Uses == 1 && clobber(x)) { 9428 break 9429 } 9430 v.reset(OpS390XMOVHBRstoreidx) 9431 v.AuxInt = i - 1 9432 v.Aux = s 9433 v.AddArg(p) 9434 v.AddArg(idx) 9435 v.AddArg(w0) 9436 v.AddArg(mem) 9437 return true 9438 } 9439 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 9440 // cond: x.Uses == 1 && clobber(x) 9441 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 9442 for { 9443 i := v.AuxInt 9444 s := v.Aux 9445 p := v.Args[0] 9446 idx := v.Args[1] 9447 v_2 := v.Args[2] 9448 if v_2.Op != OpS390XSRWconst { 9449 break 9450 } 9451 if v_2.AuxInt != 8 { 9452 break 9453 } 9454 w := v_2.Args[0] 9455 x := v.Args[3] 9456 if x.Op != OpS390XMOVBstoreidx { 9457 break 9458 } 9459 if x.AuxInt != i-1 { 9460 break 9461 } 9462 if x.Aux != s { 9463 break 9464 } 9465 if p != x.Args[0] { 9466 break 9467 } 9468 if idx != x.Args[1] { 9469 break 9470 } 9471 if w != x.Args[2] { 9472 break 9473 } 9474 mem := x.Args[3] 9475 if !(x.Uses == 1 && clobber(x)) { 9476 break 9477 } 9478 v.reset(OpS390XMOVHBRstoreidx) 9479 v.AuxInt = i - 1 9480 v.Aux = s 9481 v.AddArg(p) 9482 v.AddArg(idx) 9483 v.AddArg(w) 9484 v.AddArg(mem) 9485 return true 9486 } 9487 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 9488 // cond: x.Uses == 1 && clobber(x) 9489 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 9490 for { 9491 i := v.AuxInt 9492 s := v.Aux 9493 p := v.Args[0] 9494 idx := v.Args[1] 9495 v_2 := v.Args[2] 9496 if v_2.Op != OpS390XSRWconst { 9497 break 9498 } 9499 j := v_2.AuxInt 9500 w := v_2.Args[0] 9501 x := v.Args[3] 9502 if x.Op != OpS390XMOVBstoreidx { 9503 break 9504 } 9505 if x.AuxInt != i-1 { 9506 break 9507 } 9508 if x.Aux != s { 9509 break 9510 } 9511 if p != x.Args[0] { 9512 break 9513 } 9514 if idx != x.Args[1] { 9515 break 9516 } 9517 w0 := x.Args[2] 9518 if w0.Op != OpS390XSRWconst { 9519 break 9520 } 9521 if w0.AuxInt != j-8 { 9522 break 9523 } 9524 if w != w0.Args[0] { 9525 break 9526 } 9527 mem := x.Args[3] 9528 if !(x.Uses == 1 && clobber(x)) { 9529 break 9530 } 9531 v.reset(OpS390XMOVHBRstoreidx) 9532 v.AuxInt = i - 1 9533 v.Aux = s 9534 v.AddArg(p) 9535 v.AddArg(idx) 9536 v.AddArg(w0) 9537 v.AddArg(mem) 9538 return true 9539 } 9540 return false 9541 } 9542 func rewriteValueS390X_OpS390XMOVDEQ(v *Value, config *Config) bool { 9543 b := v.Block 9544 _ = b 9545 // match: (MOVDEQ x y (InvertFlags cmp)) 9546 // cond: 9547 // result: (MOVDEQ x y cmp) 9548 for { 9549 x := v.Args[0] 9550 y := v.Args[1] 9551 v_2 := v.Args[2] 9552 if v_2.Op != OpS390XInvertFlags { 9553 break 9554 } 9555 cmp := v_2.Args[0] 9556 v.reset(OpS390XMOVDEQ) 9557 v.AddArg(x) 9558 v.AddArg(y) 9559 v.AddArg(cmp) 9560 return true 9561 } 9562 // match: (MOVDEQ _ x (FlagEQ)) 9563 // cond: 9564 // result: x 9565 for { 9566 x := v.Args[1] 9567 v_2 := v.Args[2] 9568 if v_2.Op != OpS390XFlagEQ { 9569 break 9570 } 9571 v.reset(OpCopy) 9572 v.Type = x.Type 9573 v.AddArg(x) 9574 return true 9575 } 9576 // match: (MOVDEQ y _ (FlagLT)) 9577 // cond: 9578 // result: y 9579 for { 9580 y := v.Args[0] 9581 v_2 := v.Args[2] 9582 if v_2.Op != OpS390XFlagLT { 9583 break 9584 } 9585 v.reset(OpCopy) 9586 v.Type = y.Type 9587 v.AddArg(y) 9588 return true 9589 } 9590 // match: (MOVDEQ y _ (FlagGT)) 9591 // cond: 9592 // result: y 9593 for { 9594 y := v.Args[0] 9595 v_2 := v.Args[2] 9596 if v_2.Op != OpS390XFlagGT { 9597 break 9598 } 9599 v.reset(OpCopy) 9600 v.Type = y.Type 9601 v.AddArg(y) 9602 return true 9603 } 9604 return false 9605 } 9606 func rewriteValueS390X_OpS390XMOVDGE(v *Value, config *Config) bool { 9607 b := v.Block 9608 _ = b 9609 // match: (MOVDGE x y (InvertFlags cmp)) 9610 // cond: 9611 // result: (MOVDLE x y cmp) 9612 for { 9613 x := v.Args[0] 9614 y := v.Args[1] 9615 v_2 := v.Args[2] 9616 if v_2.Op != OpS390XInvertFlags { 9617 break 9618 } 9619 cmp := v_2.Args[0] 9620 v.reset(OpS390XMOVDLE) 9621 v.AddArg(x) 9622 v.AddArg(y) 9623 v.AddArg(cmp) 9624 return true 9625 } 9626 // match: (MOVDGE _ x (FlagEQ)) 9627 // cond: 9628 // result: x 9629 for { 9630 x := v.Args[1] 9631 v_2 := v.Args[2] 9632 if v_2.Op != OpS390XFlagEQ { 9633 break 9634 } 9635 v.reset(OpCopy) 9636 v.Type = x.Type 9637 v.AddArg(x) 9638 return true 9639 } 9640 // match: (MOVDGE y _ (FlagLT)) 9641 // cond: 9642 // result: y 9643 for { 9644 y := v.Args[0] 9645 v_2 := v.Args[2] 9646 if v_2.Op != OpS390XFlagLT { 9647 break 9648 } 9649 v.reset(OpCopy) 9650 v.Type = y.Type 9651 v.AddArg(y) 9652 return true 9653 } 9654 // match: (MOVDGE _ x (FlagGT)) 9655 // cond: 9656 // result: x 9657 for { 9658 x := v.Args[1] 9659 v_2 := v.Args[2] 9660 if v_2.Op != OpS390XFlagGT { 9661 break 9662 } 9663 v.reset(OpCopy) 9664 v.Type = x.Type 9665 v.AddArg(x) 9666 return true 9667 } 9668 return false 9669 } 9670 func rewriteValueS390X_OpS390XMOVDGT(v *Value, config *Config) bool { 9671 b := v.Block 9672 _ = b 9673 // match: (MOVDGT x y (InvertFlags cmp)) 9674 // cond: 9675 // result: (MOVDLT x y cmp) 9676 for { 9677 x := v.Args[0] 9678 y := v.Args[1] 9679 v_2 := v.Args[2] 9680 if v_2.Op != OpS390XInvertFlags { 9681 break 9682 } 9683 cmp := v_2.Args[0] 9684 v.reset(OpS390XMOVDLT) 9685 v.AddArg(x) 9686 v.AddArg(y) 9687 v.AddArg(cmp) 9688 return true 9689 } 9690 // match: (MOVDGT y _ (FlagEQ)) 9691 // cond: 9692 // result: y 9693 for { 9694 y := v.Args[0] 9695 v_2 := v.Args[2] 9696 if v_2.Op != OpS390XFlagEQ { 9697 break 9698 } 9699 v.reset(OpCopy) 9700 v.Type = y.Type 9701 v.AddArg(y) 9702 return true 9703 } 9704 // match: (MOVDGT y _ (FlagLT)) 9705 // cond: 9706 // result: y 9707 for { 9708 y := v.Args[0] 9709 v_2 := v.Args[2] 9710 if v_2.Op != OpS390XFlagLT { 9711 break 9712 } 9713 v.reset(OpCopy) 9714 v.Type = y.Type 9715 v.AddArg(y) 9716 return true 9717 } 9718 // match: (MOVDGT _ x (FlagGT)) 9719 // cond: 9720 // result: x 9721 for { 9722 x := v.Args[1] 9723 v_2 := v.Args[2] 9724 if v_2.Op != OpS390XFlagGT { 9725 break 9726 } 9727 v.reset(OpCopy) 9728 v.Type = x.Type 9729 v.AddArg(x) 9730 return true 9731 } 9732 return false 9733 } 9734 func rewriteValueS390X_OpS390XMOVDLE(v *Value, config *Config) bool { 9735 b := v.Block 9736 _ = b 9737 // match: (MOVDLE x y (InvertFlags cmp)) 9738 // cond: 9739 // result: (MOVDGE x y cmp) 9740 for { 9741 x := v.Args[0] 9742 y := v.Args[1] 9743 v_2 := v.Args[2] 9744 if v_2.Op != OpS390XInvertFlags { 9745 break 9746 } 9747 cmp := v_2.Args[0] 9748 v.reset(OpS390XMOVDGE) 9749 v.AddArg(x) 9750 v.AddArg(y) 9751 v.AddArg(cmp) 9752 return true 9753 } 9754 // match: (MOVDLE _ x (FlagEQ)) 9755 // cond: 9756 // result: x 9757 for { 9758 x := v.Args[1] 9759 v_2 := v.Args[2] 9760 if v_2.Op != OpS390XFlagEQ { 9761 break 9762 } 9763 v.reset(OpCopy) 9764 v.Type = x.Type 9765 v.AddArg(x) 9766 return true 9767 } 9768 // match: (MOVDLE _ x (FlagLT)) 9769 // cond: 9770 // result: x 9771 for { 9772 x := v.Args[1] 9773 v_2 := v.Args[2] 9774 if v_2.Op != OpS390XFlagLT { 9775 break 9776 } 9777 v.reset(OpCopy) 9778 v.Type = x.Type 9779 v.AddArg(x) 9780 return true 9781 } 9782 // match: (MOVDLE y _ (FlagGT)) 9783 // cond: 9784 // result: y 9785 for { 9786 y := v.Args[0] 9787 v_2 := v.Args[2] 9788 if v_2.Op != OpS390XFlagGT { 9789 break 9790 } 9791 v.reset(OpCopy) 9792 v.Type = y.Type 9793 v.AddArg(y) 9794 return true 9795 } 9796 return false 9797 } 9798 func rewriteValueS390X_OpS390XMOVDLT(v *Value, config *Config) bool { 9799 b := v.Block 9800 _ = b 9801 // match: (MOVDLT x y (InvertFlags cmp)) 9802 // cond: 9803 // result: (MOVDGT x y cmp) 9804 for { 9805 x := v.Args[0] 9806 y := v.Args[1] 9807 v_2 := v.Args[2] 9808 if v_2.Op != OpS390XInvertFlags { 9809 break 9810 } 9811 cmp := v_2.Args[0] 9812 v.reset(OpS390XMOVDGT) 9813 v.AddArg(x) 9814 v.AddArg(y) 9815 v.AddArg(cmp) 9816 return true 9817 } 9818 // match: (MOVDLT y _ (FlagEQ)) 9819 // cond: 9820 // result: y 9821 for { 9822 y := v.Args[0] 9823 v_2 := v.Args[2] 9824 if v_2.Op != OpS390XFlagEQ { 9825 break 9826 } 9827 v.reset(OpCopy) 9828 v.Type = y.Type 9829 v.AddArg(y) 9830 return true 9831 } 9832 // match: (MOVDLT _ x (FlagLT)) 9833 // cond: 9834 // result: x 9835 for { 9836 x := v.Args[1] 9837 v_2 := v.Args[2] 9838 if v_2.Op != OpS390XFlagLT { 9839 break 9840 } 9841 v.reset(OpCopy) 9842 v.Type = x.Type 9843 v.AddArg(x) 9844 return true 9845 } 9846 // match: (MOVDLT y _ (FlagGT)) 9847 // cond: 9848 // result: y 9849 for { 9850 y := v.Args[0] 9851 v_2 := v.Args[2] 9852 if v_2.Op != OpS390XFlagGT { 9853 break 9854 } 9855 v.reset(OpCopy) 9856 v.Type = y.Type 9857 v.AddArg(y) 9858 return true 9859 } 9860 return false 9861 } 9862 func rewriteValueS390X_OpS390XMOVDNE(v *Value, config *Config) bool { 9863 b := v.Block 9864 _ = b 9865 // match: (MOVDNE x y (InvertFlags cmp)) 9866 // cond: 9867 // result: (MOVDNE x y cmp) 9868 for { 9869 x := v.Args[0] 9870 y := v.Args[1] 9871 v_2 := v.Args[2] 9872 if v_2.Op != OpS390XInvertFlags { 9873 break 9874 } 9875 cmp := v_2.Args[0] 9876 v.reset(OpS390XMOVDNE) 9877 v.AddArg(x) 9878 v.AddArg(y) 9879 v.AddArg(cmp) 9880 return true 9881 } 9882 // match: (MOVDNE y _ (FlagEQ)) 9883 // cond: 9884 // result: y 9885 for { 9886 y := v.Args[0] 9887 v_2 := v.Args[2] 9888 if v_2.Op != OpS390XFlagEQ { 9889 break 9890 } 9891 v.reset(OpCopy) 9892 v.Type = y.Type 9893 v.AddArg(y) 9894 return true 9895 } 9896 // match: (MOVDNE _ x (FlagLT)) 9897 // cond: 9898 // result: x 9899 for { 9900 x := v.Args[1] 9901 v_2 := v.Args[2] 9902 if v_2.Op != OpS390XFlagLT { 9903 break 9904 } 9905 v.reset(OpCopy) 9906 v.Type = x.Type 9907 v.AddArg(x) 9908 return true 9909 } 9910 // match: (MOVDNE _ x (FlagGT)) 9911 // cond: 9912 // result: x 9913 for { 9914 x := v.Args[1] 9915 v_2 := v.Args[2] 9916 if v_2.Op != OpS390XFlagGT { 9917 break 9918 } 9919 v.reset(OpCopy) 9920 v.Type = x.Type 9921 v.AddArg(x) 9922 return true 9923 } 9924 return false 9925 } 9926 func rewriteValueS390X_OpS390XMOVDaddridx(v *Value, config *Config) bool { 9927 b := v.Block 9928 _ = b 9929 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 9930 // cond: is20Bit(c+d) && x.Op != OpSB 9931 // result: (MOVDaddridx [c+d] {s} x y) 9932 for { 9933 c := v.AuxInt 9934 s := v.Aux 9935 v_0 := v.Args[0] 9936 if v_0.Op != OpS390XADDconst { 9937 break 9938 } 9939 d := v_0.AuxInt 9940 x := v_0.Args[0] 9941 y := v.Args[1] 9942 if !(is20Bit(c+d) && x.Op != OpSB) { 9943 break 9944 } 9945 v.reset(OpS390XMOVDaddridx) 9946 v.AuxInt = c + d 9947 v.Aux = s 9948 v.AddArg(x) 9949 v.AddArg(y) 9950 return true 9951 } 9952 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 9953 // cond: is20Bit(c+d) && y.Op != OpSB 9954 // result: (MOVDaddridx [c+d] {s} x y) 9955 for { 9956 c := v.AuxInt 9957 s := v.Aux 9958 x := v.Args[0] 9959 v_1 := v.Args[1] 9960 if v_1.Op != OpS390XADDconst { 9961 break 9962 } 9963 d := v_1.AuxInt 9964 y := v_1.Args[0] 9965 if !(is20Bit(c+d) && y.Op != OpSB) { 9966 break 9967 } 9968 v.reset(OpS390XMOVDaddridx) 9969 v.AuxInt = c + d 9970 v.Aux = s 9971 v.AddArg(x) 9972 v.AddArg(y) 9973 return true 9974 } 9975 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 9976 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 9977 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 9978 for { 9979 off1 := v.AuxInt 9980 sym1 := v.Aux 9981 v_0 := v.Args[0] 9982 if v_0.Op != OpS390XMOVDaddr { 9983 break 9984 } 9985 off2 := v_0.AuxInt 9986 sym2 := v_0.Aux 9987 x := v_0.Args[0] 9988 y := v.Args[1] 9989 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 9990 break 9991 } 9992 v.reset(OpS390XMOVDaddridx) 9993 v.AuxInt = off1 + off2 9994 v.Aux = mergeSym(sym1, sym2) 9995 v.AddArg(x) 9996 v.AddArg(y) 9997 return true 9998 } 9999 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 10000 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 10001 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 10002 for { 10003 off1 := v.AuxInt 10004 sym1 := v.Aux 10005 x := v.Args[0] 10006 v_1 := v.Args[1] 10007 if v_1.Op != OpS390XMOVDaddr { 10008 break 10009 } 10010 off2 := v_1.AuxInt 10011 sym2 := v_1.Aux 10012 y := v_1.Args[0] 10013 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 10014 break 10015 } 10016 v.reset(OpS390XMOVDaddridx) 10017 v.AuxInt = off1 + off2 10018 v.Aux = mergeSym(sym1, sym2) 10019 v.AddArg(x) 10020 v.AddArg(y) 10021 return true 10022 } 10023 return false 10024 } 10025 func rewriteValueS390X_OpS390XMOVDload(v *Value, config *Config) bool { 10026 b := v.Block 10027 _ = b 10028 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 10029 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 10030 // result: (MOVDreg x) 10031 for { 10032 off := v.AuxInt 10033 sym := v.Aux 10034 ptr := v.Args[0] 10035 v_1 := v.Args[1] 10036 if v_1.Op != OpS390XMOVDstore { 10037 break 10038 } 10039 off2 := v_1.AuxInt 10040 sym2 := v_1.Aux 10041 ptr2 := v_1.Args[0] 10042 x := v_1.Args[1] 10043 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 10044 break 10045 } 10046 v.reset(OpS390XMOVDreg) 10047 v.AddArg(x) 10048 return true 10049 } 10050 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 10051 // cond: is20Bit(off1+off2) 10052 // result: (MOVDload [off1+off2] {sym} ptr mem) 10053 for { 10054 off1 := v.AuxInt 10055 sym := v.Aux 10056 v_0 := v.Args[0] 10057 if v_0.Op != OpS390XADDconst { 10058 break 10059 } 10060 off2 := v_0.AuxInt 10061 ptr := v_0.Args[0] 10062 mem := v.Args[1] 10063 if !(is20Bit(off1 + off2)) { 10064 break 10065 } 10066 v.reset(OpS390XMOVDload) 10067 v.AuxInt = off1 + off2 10068 v.Aux = sym 10069 v.AddArg(ptr) 10070 v.AddArg(mem) 10071 return true 10072 } 10073 // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 10074 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10075 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 10076 for { 10077 off1 := v.AuxInt 10078 sym1 := v.Aux 10079 v_0 := v.Args[0] 10080 if v_0.Op != OpS390XMOVDaddr { 10081 break 10082 } 10083 off2 := v_0.AuxInt 10084 sym2 := v_0.Aux 10085 base := v_0.Args[0] 10086 mem := v.Args[1] 10087 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10088 break 10089 } 10090 v.reset(OpS390XMOVDload) 10091 v.AuxInt = off1 + off2 10092 v.Aux = mergeSym(sym1, sym2) 10093 v.AddArg(base) 10094 v.AddArg(mem) 10095 return true 10096 } 10097 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 10098 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10099 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 10100 for { 10101 off1 := v.AuxInt 10102 sym1 := v.Aux 10103 v_0 := v.Args[0] 10104 if v_0.Op != OpS390XMOVDaddridx { 10105 break 10106 } 10107 off2 := v_0.AuxInt 10108 sym2 := v_0.Aux 10109 ptr := v_0.Args[0] 10110 idx := v_0.Args[1] 10111 mem := v.Args[1] 10112 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10113 break 10114 } 10115 v.reset(OpS390XMOVDloadidx) 10116 v.AuxInt = off1 + off2 10117 v.Aux = mergeSym(sym1, sym2) 10118 v.AddArg(ptr) 10119 v.AddArg(idx) 10120 v.AddArg(mem) 10121 return true 10122 } 10123 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 10124 // cond: ptr.Op != OpSB 10125 // result: (MOVDloadidx [off] {sym} ptr idx mem) 10126 for { 10127 off := v.AuxInt 10128 sym := v.Aux 10129 v_0 := v.Args[0] 10130 if v_0.Op != OpS390XADD { 10131 break 10132 } 10133 ptr := v_0.Args[0] 10134 idx := v_0.Args[1] 10135 mem := v.Args[1] 10136 if !(ptr.Op != OpSB) { 10137 break 10138 } 10139 v.reset(OpS390XMOVDloadidx) 10140 v.AuxInt = off 10141 v.Aux = sym 10142 v.AddArg(ptr) 10143 v.AddArg(idx) 10144 v.AddArg(mem) 10145 return true 10146 } 10147 return false 10148 } 10149 func rewriteValueS390X_OpS390XMOVDloadidx(v *Value, config *Config) bool { 10150 b := v.Block 10151 _ = b 10152 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 10153 // cond: 10154 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 10155 for { 10156 c := v.AuxInt 10157 sym := v.Aux 10158 v_0 := v.Args[0] 10159 if v_0.Op != OpS390XADDconst { 10160 break 10161 } 10162 d := v_0.AuxInt 10163 ptr := v_0.Args[0] 10164 idx := v.Args[1] 10165 mem := v.Args[2] 10166 v.reset(OpS390XMOVDloadidx) 10167 v.AuxInt = c + d 10168 v.Aux = sym 10169 v.AddArg(ptr) 10170 v.AddArg(idx) 10171 v.AddArg(mem) 10172 return true 10173 } 10174 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 10175 // cond: 10176 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 10177 for { 10178 c := v.AuxInt 10179 sym := v.Aux 10180 ptr := v.Args[0] 10181 v_1 := v.Args[1] 10182 if v_1.Op != OpS390XADDconst { 10183 break 10184 } 10185 d := v_1.AuxInt 10186 idx := v_1.Args[0] 10187 mem := v.Args[2] 10188 v.reset(OpS390XMOVDloadidx) 10189 v.AuxInt = c + d 10190 v.Aux = sym 10191 v.AddArg(ptr) 10192 v.AddArg(idx) 10193 v.AddArg(mem) 10194 return true 10195 } 10196 return false 10197 } 10198 func rewriteValueS390X_OpS390XMOVDreg(v *Value, config *Config) bool { 10199 b := v.Block 10200 _ = b 10201 // match: (MOVDreg x) 10202 // cond: x.Uses == 1 10203 // result: (MOVDnop x) 10204 for { 10205 x := v.Args[0] 10206 if !(x.Uses == 1) { 10207 break 10208 } 10209 v.reset(OpS390XMOVDnop) 10210 v.AddArg(x) 10211 return true 10212 } 10213 return false 10214 } 10215 func rewriteValueS390X_OpS390XMOVDstore(v *Value, config *Config) bool { 10216 b := v.Block 10217 _ = b 10218 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 10219 // cond: is20Bit(off1+off2) 10220 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 10221 for { 10222 off1 := v.AuxInt 10223 sym := v.Aux 10224 v_0 := v.Args[0] 10225 if v_0.Op != OpS390XADDconst { 10226 break 10227 } 10228 off2 := v_0.AuxInt 10229 ptr := v_0.Args[0] 10230 val := v.Args[1] 10231 mem := v.Args[2] 10232 if !(is20Bit(off1 + off2)) { 10233 break 10234 } 10235 v.reset(OpS390XMOVDstore) 10236 v.AuxInt = off1 + off2 10237 v.Aux = sym 10238 v.AddArg(ptr) 10239 v.AddArg(val) 10240 v.AddArg(mem) 10241 return true 10242 } 10243 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 10244 // cond: validValAndOff(c,off) && int64(int16(c)) == c && ptr.Op != OpSB 10245 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 10246 for { 10247 off := v.AuxInt 10248 sym := v.Aux 10249 ptr := v.Args[0] 10250 v_1 := v.Args[1] 10251 if v_1.Op != OpS390XMOVDconst { 10252 break 10253 } 10254 c := v_1.AuxInt 10255 mem := v.Args[2] 10256 if !(validValAndOff(c, off) && int64(int16(c)) == c && ptr.Op != OpSB) { 10257 break 10258 } 10259 v.reset(OpS390XMOVDstoreconst) 10260 v.AuxInt = makeValAndOff(c, off) 10261 v.Aux = sym 10262 v.AddArg(ptr) 10263 v.AddArg(mem) 10264 return true 10265 } 10266 // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 10267 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10268 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 10269 for { 10270 off1 := v.AuxInt 10271 sym1 := v.Aux 10272 v_0 := v.Args[0] 10273 if v_0.Op != OpS390XMOVDaddr { 10274 break 10275 } 10276 off2 := v_0.AuxInt 10277 sym2 := v_0.Aux 10278 base := v_0.Args[0] 10279 val := v.Args[1] 10280 mem := v.Args[2] 10281 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10282 break 10283 } 10284 v.reset(OpS390XMOVDstore) 10285 v.AuxInt = off1 + off2 10286 v.Aux = mergeSym(sym1, sym2) 10287 v.AddArg(base) 10288 v.AddArg(val) 10289 v.AddArg(mem) 10290 return true 10291 } 10292 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 10293 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 10294 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 10295 for { 10296 off1 := v.AuxInt 10297 sym1 := v.Aux 10298 v_0 := v.Args[0] 10299 if v_0.Op != OpS390XMOVDaddridx { 10300 break 10301 } 10302 off2 := v_0.AuxInt 10303 sym2 := v_0.Aux 10304 ptr := v_0.Args[0] 10305 idx := v_0.Args[1] 10306 val := v.Args[1] 10307 mem := v.Args[2] 10308 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 10309 break 10310 } 10311 v.reset(OpS390XMOVDstoreidx) 10312 v.AuxInt = off1 + off2 10313 v.Aux = mergeSym(sym1, sym2) 10314 v.AddArg(ptr) 10315 v.AddArg(idx) 10316 v.AddArg(val) 10317 v.AddArg(mem) 10318 return true 10319 } 10320 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 10321 // cond: ptr.Op != OpSB 10322 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 10323 for { 10324 off := v.AuxInt 10325 sym := v.Aux 10326 v_0 := v.Args[0] 10327 if v_0.Op != OpS390XADD { 10328 break 10329 } 10330 ptr := v_0.Args[0] 10331 idx := v_0.Args[1] 10332 val := v.Args[1] 10333 mem := v.Args[2] 10334 if !(ptr.Op != OpSB) { 10335 break 10336 } 10337 v.reset(OpS390XMOVDstoreidx) 10338 v.AuxInt = off 10339 v.Aux = sym 10340 v.AddArg(ptr) 10341 v.AddArg(idx) 10342 v.AddArg(val) 10343 v.AddArg(mem) 10344 return true 10345 } 10346 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 10347 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 10348 // result: (STMG2 [i-8] {s} p w0 w1 mem) 10349 for { 10350 i := v.AuxInt 10351 s := v.Aux 10352 p := v.Args[0] 10353 w1 := v.Args[1] 10354 x := v.Args[2] 10355 if x.Op != OpS390XMOVDstore { 10356 break 10357 } 10358 if x.AuxInt != i-8 { 10359 break 10360 } 10361 if x.Aux != s { 10362 break 10363 } 10364 if p != x.Args[0] { 10365 break 10366 } 10367 w0 := x.Args[1] 10368 mem := x.Args[2] 10369 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 10370 break 10371 } 10372 v.reset(OpS390XSTMG2) 10373 v.AuxInt = i - 8 10374 v.Aux = s 10375 v.AddArg(p) 10376 v.AddArg(w0) 10377 v.AddArg(w1) 10378 v.AddArg(mem) 10379 return true 10380 } 10381 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 10382 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 10383 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 10384 for { 10385 i := v.AuxInt 10386 s := v.Aux 10387 p := v.Args[0] 10388 w2 := v.Args[1] 10389 x := v.Args[2] 10390 if x.Op != OpS390XSTMG2 { 10391 break 10392 } 10393 if x.AuxInt != i-16 { 10394 break 10395 } 10396 if x.Aux != s { 10397 break 10398 } 10399 if p != x.Args[0] { 10400 break 10401 } 10402 w0 := x.Args[1] 10403 w1 := x.Args[2] 10404 mem := x.Args[3] 10405 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 10406 break 10407 } 10408 v.reset(OpS390XSTMG3) 10409 v.AuxInt = i - 16 10410 v.Aux = s 10411 v.AddArg(p) 10412 v.AddArg(w0) 10413 v.AddArg(w1) 10414 v.AddArg(w2) 10415 v.AddArg(mem) 10416 return true 10417 } 10418 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 10419 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 10420 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 10421 for { 10422 i := v.AuxInt 10423 s := v.Aux 10424 p := v.Args[0] 10425 w3 := v.Args[1] 10426 x := v.Args[2] 10427 if x.Op != OpS390XSTMG3 { 10428 break 10429 } 10430 if x.AuxInt != i-24 { 10431 break 10432 } 10433 if x.Aux != s { 10434 break 10435 } 10436 if p != x.Args[0] { 10437 break 10438 } 10439 w0 := x.Args[1] 10440 w1 := x.Args[2] 10441 w2 := x.Args[3] 10442 mem := x.Args[4] 10443 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 10444 break 10445 } 10446 v.reset(OpS390XSTMG4) 10447 v.AuxInt = i - 24 10448 v.Aux = s 10449 v.AddArg(p) 10450 v.AddArg(w0) 10451 v.AddArg(w1) 10452 v.AddArg(w2) 10453 v.AddArg(w3) 10454 v.AddArg(mem) 10455 return true 10456 } 10457 return false 10458 } 10459 func rewriteValueS390X_OpS390XMOVDstoreconst(v *Value, config *Config) bool { 10460 b := v.Block 10461 _ = b 10462 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 10463 // cond: ValAndOff(sc).canAdd(off) 10464 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 10465 for { 10466 sc := v.AuxInt 10467 s := v.Aux 10468 v_0 := v.Args[0] 10469 if v_0.Op != OpS390XADDconst { 10470 break 10471 } 10472 off := v_0.AuxInt 10473 ptr := v_0.Args[0] 10474 mem := v.Args[1] 10475 if !(ValAndOff(sc).canAdd(off)) { 10476 break 10477 } 10478 v.reset(OpS390XMOVDstoreconst) 10479 v.AuxInt = ValAndOff(sc).add(off) 10480 v.Aux = s 10481 v.AddArg(ptr) 10482 v.AddArg(mem) 10483 return true 10484 } 10485 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 10486 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 10487 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 10488 for { 10489 sc := v.AuxInt 10490 sym1 := v.Aux 10491 v_0 := v.Args[0] 10492 if v_0.Op != OpS390XMOVDaddr { 10493 break 10494 } 10495 off := v_0.AuxInt 10496 sym2 := v_0.Aux 10497 ptr := v_0.Args[0] 10498 mem := v.Args[1] 10499 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 10500 break 10501 } 10502 v.reset(OpS390XMOVDstoreconst) 10503 v.AuxInt = ValAndOff(sc).add(off) 10504 v.Aux = mergeSym(sym1, sym2) 10505 v.AddArg(ptr) 10506 v.AddArg(mem) 10507 return true 10508 } 10509 return false 10510 } 10511 func rewriteValueS390X_OpS390XMOVDstoreidx(v *Value, config *Config) bool { 10512 b := v.Block 10513 _ = b 10514 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 10515 // cond: 10516 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 10517 for { 10518 c := v.AuxInt 10519 sym := v.Aux 10520 v_0 := v.Args[0] 10521 if v_0.Op != OpS390XADDconst { 10522 break 10523 } 10524 d := v_0.AuxInt 10525 ptr := v_0.Args[0] 10526 idx := v.Args[1] 10527 val := v.Args[2] 10528 mem := v.Args[3] 10529 v.reset(OpS390XMOVDstoreidx) 10530 v.AuxInt = c + d 10531 v.Aux = sym 10532 v.AddArg(ptr) 10533 v.AddArg(idx) 10534 v.AddArg(val) 10535 v.AddArg(mem) 10536 return true 10537 } 10538 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 10539 // cond: 10540 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 10541 for { 10542 c := v.AuxInt 10543 sym := v.Aux 10544 ptr := v.Args[0] 10545 v_1 := v.Args[1] 10546 if v_1.Op != OpS390XADDconst { 10547 break 10548 } 10549 d := v_1.AuxInt 10550 idx := v_1.Args[0] 10551 val := v.Args[2] 10552 mem := v.Args[3] 10553 v.reset(OpS390XMOVDstoreidx) 10554 v.AuxInt = c + d 10555 v.Aux = sym 10556 v.AddArg(ptr) 10557 v.AddArg(idx) 10558 v.AddArg(val) 10559 v.AddArg(mem) 10560 return true 10561 } 10562 return false 10563 } 10564 func rewriteValueS390X_OpS390XMOVHBRstore(v *Value, config *Config) bool { 10565 b := v.Block 10566 _ = b 10567 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 10568 // cond: x.Uses == 1 && clobber(x) 10569 // result: (MOVWBRstore [i-2] {s} p w mem) 10570 for { 10571 i := v.AuxInt 10572 s := v.Aux 10573 p := v.Args[0] 10574 v_1 := v.Args[1] 10575 if v_1.Op != OpS390XSRDconst { 10576 break 10577 } 10578 if v_1.AuxInt != 16 { 10579 break 10580 } 10581 w := v_1.Args[0] 10582 x := v.Args[2] 10583 if x.Op != OpS390XMOVHBRstore { 10584 break 10585 } 10586 if x.AuxInt != i-2 { 10587 break 10588 } 10589 if x.Aux != s { 10590 break 10591 } 10592 if p != x.Args[0] { 10593 break 10594 } 10595 if w != x.Args[1] { 10596 break 10597 } 10598 mem := x.Args[2] 10599 if !(x.Uses == 1 && clobber(x)) { 10600 break 10601 } 10602 v.reset(OpS390XMOVWBRstore) 10603 v.AuxInt = i - 2 10604 v.Aux = s 10605 v.AddArg(p) 10606 v.AddArg(w) 10607 v.AddArg(mem) 10608 return true 10609 } 10610 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 10611 // cond: x.Uses == 1 && clobber(x) 10612 // result: (MOVWBRstore [i-2] {s} p w0 mem) 10613 for { 10614 i := v.AuxInt 10615 s := v.Aux 10616 p := v.Args[0] 10617 v_1 := v.Args[1] 10618 if v_1.Op != OpS390XSRDconst { 10619 break 10620 } 10621 j := v_1.AuxInt 10622 w := v_1.Args[0] 10623 x := v.Args[2] 10624 if x.Op != OpS390XMOVHBRstore { 10625 break 10626 } 10627 if x.AuxInt != i-2 { 10628 break 10629 } 10630 if x.Aux != s { 10631 break 10632 } 10633 if p != x.Args[0] { 10634 break 10635 } 10636 w0 := x.Args[1] 10637 if w0.Op != OpS390XSRDconst { 10638 break 10639 } 10640 if w0.AuxInt != j-16 { 10641 break 10642 } 10643 if w != w0.Args[0] { 10644 break 10645 } 10646 mem := x.Args[2] 10647 if !(x.Uses == 1 && clobber(x)) { 10648 break 10649 } 10650 v.reset(OpS390XMOVWBRstore) 10651 v.AuxInt = i - 2 10652 v.Aux = s 10653 v.AddArg(p) 10654 v.AddArg(w0) 10655 v.AddArg(mem) 10656 return true 10657 } 10658 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 10659 // cond: x.Uses == 1 && clobber(x) 10660 // result: (MOVWBRstore [i-2] {s} p w mem) 10661 for { 10662 i := v.AuxInt 10663 s := v.Aux 10664 p := v.Args[0] 10665 v_1 := v.Args[1] 10666 if v_1.Op != OpS390XSRWconst { 10667 break 10668 } 10669 if v_1.AuxInt != 16 { 10670 break 10671 } 10672 w := v_1.Args[0] 10673 x := v.Args[2] 10674 if x.Op != OpS390XMOVHBRstore { 10675 break 10676 } 10677 if x.AuxInt != i-2 { 10678 break 10679 } 10680 if x.Aux != s { 10681 break 10682 } 10683 if p != x.Args[0] { 10684 break 10685 } 10686 if w != x.Args[1] { 10687 break 10688 } 10689 mem := x.Args[2] 10690 if !(x.Uses == 1 && clobber(x)) { 10691 break 10692 } 10693 v.reset(OpS390XMOVWBRstore) 10694 v.AuxInt = i - 2 10695 v.Aux = s 10696 v.AddArg(p) 10697 v.AddArg(w) 10698 v.AddArg(mem) 10699 return true 10700 } 10701 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 10702 // cond: x.Uses == 1 && clobber(x) 10703 // result: (MOVWBRstore [i-2] {s} p w0 mem) 10704 for { 10705 i := v.AuxInt 10706 s := v.Aux 10707 p := v.Args[0] 10708 v_1 := v.Args[1] 10709 if v_1.Op != OpS390XSRWconst { 10710 break 10711 } 10712 j := v_1.AuxInt 10713 w := v_1.Args[0] 10714 x := v.Args[2] 10715 if x.Op != OpS390XMOVHBRstore { 10716 break 10717 } 10718 if x.AuxInt != i-2 { 10719 break 10720 } 10721 if x.Aux != s { 10722 break 10723 } 10724 if p != x.Args[0] { 10725 break 10726 } 10727 w0 := x.Args[1] 10728 if w0.Op != OpS390XSRWconst { 10729 break 10730 } 10731 if w0.AuxInt != j-16 { 10732 break 10733 } 10734 if w != w0.Args[0] { 10735 break 10736 } 10737 mem := x.Args[2] 10738 if !(x.Uses == 1 && clobber(x)) { 10739 break 10740 } 10741 v.reset(OpS390XMOVWBRstore) 10742 v.AuxInt = i - 2 10743 v.Aux = s 10744 v.AddArg(p) 10745 v.AddArg(w0) 10746 v.AddArg(mem) 10747 return true 10748 } 10749 return false 10750 } 10751 func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value, config *Config) bool { 10752 b := v.Block 10753 _ = b 10754 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 10755 // cond: x.Uses == 1 && clobber(x) 10756 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 10757 for { 10758 i := v.AuxInt 10759 s := v.Aux 10760 p := v.Args[0] 10761 idx := v.Args[1] 10762 v_2 := v.Args[2] 10763 if v_2.Op != OpS390XSRDconst { 10764 break 10765 } 10766 if v_2.AuxInt != 16 { 10767 break 10768 } 10769 w := v_2.Args[0] 10770 x := v.Args[3] 10771 if x.Op != OpS390XMOVHBRstoreidx { 10772 break 10773 } 10774 if x.AuxInt != i-2 { 10775 break 10776 } 10777 if x.Aux != s { 10778 break 10779 } 10780 if p != x.Args[0] { 10781 break 10782 } 10783 if idx != x.Args[1] { 10784 break 10785 } 10786 if w != x.Args[2] { 10787 break 10788 } 10789 mem := x.Args[3] 10790 if !(x.Uses == 1 && clobber(x)) { 10791 break 10792 } 10793 v.reset(OpS390XMOVWBRstoreidx) 10794 v.AuxInt = i - 2 10795 v.Aux = s 10796 v.AddArg(p) 10797 v.AddArg(idx) 10798 v.AddArg(w) 10799 v.AddArg(mem) 10800 return true 10801 } 10802 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 10803 // cond: x.Uses == 1 && clobber(x) 10804 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 10805 for { 10806 i := v.AuxInt 10807 s := v.Aux 10808 p := v.Args[0] 10809 idx := v.Args[1] 10810 v_2 := v.Args[2] 10811 if v_2.Op != OpS390XSRDconst { 10812 break 10813 } 10814 j := v_2.AuxInt 10815 w := v_2.Args[0] 10816 x := v.Args[3] 10817 if x.Op != OpS390XMOVHBRstoreidx { 10818 break 10819 } 10820 if x.AuxInt != i-2 { 10821 break 10822 } 10823 if x.Aux != s { 10824 break 10825 } 10826 if p != x.Args[0] { 10827 break 10828 } 10829 if idx != x.Args[1] { 10830 break 10831 } 10832 w0 := x.Args[2] 10833 if w0.Op != OpS390XSRDconst { 10834 break 10835 } 10836 if w0.AuxInt != j-16 { 10837 break 10838 } 10839 if w != w0.Args[0] { 10840 break 10841 } 10842 mem := x.Args[3] 10843 if !(x.Uses == 1 && clobber(x)) { 10844 break 10845 } 10846 v.reset(OpS390XMOVWBRstoreidx) 10847 v.AuxInt = i - 2 10848 v.Aux = s 10849 v.AddArg(p) 10850 v.AddArg(idx) 10851 v.AddArg(w0) 10852 v.AddArg(mem) 10853 return true 10854 } 10855 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 10856 // cond: x.Uses == 1 && clobber(x) 10857 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 10858 for { 10859 i := v.AuxInt 10860 s := v.Aux 10861 p := v.Args[0] 10862 idx := v.Args[1] 10863 v_2 := v.Args[2] 10864 if v_2.Op != OpS390XSRWconst { 10865 break 10866 } 10867 if v_2.AuxInt != 16 { 10868 break 10869 } 10870 w := v_2.Args[0] 10871 x := v.Args[3] 10872 if x.Op != OpS390XMOVHBRstoreidx { 10873 break 10874 } 10875 if x.AuxInt != i-2 { 10876 break 10877 } 10878 if x.Aux != s { 10879 break 10880 } 10881 if p != x.Args[0] { 10882 break 10883 } 10884 if idx != x.Args[1] { 10885 break 10886 } 10887 if w != x.Args[2] { 10888 break 10889 } 10890 mem := x.Args[3] 10891 if !(x.Uses == 1 && clobber(x)) { 10892 break 10893 } 10894 v.reset(OpS390XMOVWBRstoreidx) 10895 v.AuxInt = i - 2 10896 v.Aux = s 10897 v.AddArg(p) 10898 v.AddArg(idx) 10899 v.AddArg(w) 10900 v.AddArg(mem) 10901 return true 10902 } 10903 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 10904 // cond: x.Uses == 1 && clobber(x) 10905 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 10906 for { 10907 i := v.AuxInt 10908 s := v.Aux 10909 p := v.Args[0] 10910 idx := v.Args[1] 10911 v_2 := v.Args[2] 10912 if v_2.Op != OpS390XSRWconst { 10913 break 10914 } 10915 j := v_2.AuxInt 10916 w := v_2.Args[0] 10917 x := v.Args[3] 10918 if x.Op != OpS390XMOVHBRstoreidx { 10919 break 10920 } 10921 if x.AuxInt != i-2 { 10922 break 10923 } 10924 if x.Aux != s { 10925 break 10926 } 10927 if p != x.Args[0] { 10928 break 10929 } 10930 if idx != x.Args[1] { 10931 break 10932 } 10933 w0 := x.Args[2] 10934 if w0.Op != OpS390XSRWconst { 10935 break 10936 } 10937 if w0.AuxInt != j-16 { 10938 break 10939 } 10940 if w != w0.Args[0] { 10941 break 10942 } 10943 mem := x.Args[3] 10944 if !(x.Uses == 1 && clobber(x)) { 10945 break 10946 } 10947 v.reset(OpS390XMOVWBRstoreidx) 10948 v.AuxInt = i - 2 10949 v.Aux = s 10950 v.AddArg(p) 10951 v.AddArg(idx) 10952 v.AddArg(w0) 10953 v.AddArg(mem) 10954 return true 10955 } 10956 return false 10957 } 10958 func rewriteValueS390X_OpS390XMOVHZload(v *Value, config *Config) bool { 10959 b := v.Block 10960 _ = b 10961 // match: (MOVHZload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 10962 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 10963 // result: (MOVDreg x) 10964 for { 10965 off := v.AuxInt 10966 sym := v.Aux 10967 ptr := v.Args[0] 10968 v_1 := v.Args[1] 10969 if v_1.Op != OpS390XMOVHstore { 10970 break 10971 } 10972 off2 := v_1.AuxInt 10973 sym2 := v_1.Aux 10974 ptr2 := v_1.Args[0] 10975 x := v_1.Args[1] 10976 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 10977 break 10978 } 10979 v.reset(OpS390XMOVDreg) 10980 v.AddArg(x) 10981 return true 10982 } 10983 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 10984 // cond: is20Bit(off1+off2) 10985 // result: (MOVHZload [off1+off2] {sym} ptr mem) 10986 for { 10987 off1 := v.AuxInt 10988 sym := v.Aux 10989 v_0 := v.Args[0] 10990 if v_0.Op != OpS390XADDconst { 10991 break 10992 } 10993 off2 := v_0.AuxInt 10994 ptr := v_0.Args[0] 10995 mem := v.Args[1] 10996 if !(is20Bit(off1 + off2)) { 10997 break 10998 } 10999 v.reset(OpS390XMOVHZload) 11000 v.AuxInt = off1 + off2 11001 v.Aux = sym 11002 v.AddArg(ptr) 11003 v.AddArg(mem) 11004 return true 11005 } 11006 // match: (MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 11007 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11008 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 11009 for { 11010 off1 := v.AuxInt 11011 sym1 := v.Aux 11012 v_0 := v.Args[0] 11013 if v_0.Op != OpS390XMOVDaddr { 11014 break 11015 } 11016 off2 := v_0.AuxInt 11017 sym2 := v_0.Aux 11018 base := v_0.Args[0] 11019 mem := v.Args[1] 11020 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11021 break 11022 } 11023 v.reset(OpS390XMOVHZload) 11024 v.AuxInt = off1 + off2 11025 v.Aux = mergeSym(sym1, sym2) 11026 v.AddArg(base) 11027 v.AddArg(mem) 11028 return true 11029 } 11030 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 11031 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11032 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 11033 for { 11034 off1 := v.AuxInt 11035 sym1 := v.Aux 11036 v_0 := v.Args[0] 11037 if v_0.Op != OpS390XMOVDaddridx { 11038 break 11039 } 11040 off2 := v_0.AuxInt 11041 sym2 := v_0.Aux 11042 ptr := v_0.Args[0] 11043 idx := v_0.Args[1] 11044 mem := v.Args[1] 11045 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11046 break 11047 } 11048 v.reset(OpS390XMOVHZloadidx) 11049 v.AuxInt = off1 + off2 11050 v.Aux = mergeSym(sym1, sym2) 11051 v.AddArg(ptr) 11052 v.AddArg(idx) 11053 v.AddArg(mem) 11054 return true 11055 } 11056 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 11057 // cond: ptr.Op != OpSB 11058 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 11059 for { 11060 off := v.AuxInt 11061 sym := v.Aux 11062 v_0 := v.Args[0] 11063 if v_0.Op != OpS390XADD { 11064 break 11065 } 11066 ptr := v_0.Args[0] 11067 idx := v_0.Args[1] 11068 mem := v.Args[1] 11069 if !(ptr.Op != OpSB) { 11070 break 11071 } 11072 v.reset(OpS390XMOVHZloadidx) 11073 v.AuxInt = off 11074 v.Aux = sym 11075 v.AddArg(ptr) 11076 v.AddArg(idx) 11077 v.AddArg(mem) 11078 return true 11079 } 11080 return false 11081 } 11082 func rewriteValueS390X_OpS390XMOVHZloadidx(v *Value, config *Config) bool { 11083 b := v.Block 11084 _ = b 11085 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 11086 // cond: 11087 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 11088 for { 11089 c := v.AuxInt 11090 sym := v.Aux 11091 v_0 := v.Args[0] 11092 if v_0.Op != OpS390XADDconst { 11093 break 11094 } 11095 d := v_0.AuxInt 11096 ptr := v_0.Args[0] 11097 idx := v.Args[1] 11098 mem := v.Args[2] 11099 v.reset(OpS390XMOVHZloadidx) 11100 v.AuxInt = c + d 11101 v.Aux = sym 11102 v.AddArg(ptr) 11103 v.AddArg(idx) 11104 v.AddArg(mem) 11105 return true 11106 } 11107 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 11108 // cond: 11109 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 11110 for { 11111 c := v.AuxInt 11112 sym := v.Aux 11113 ptr := v.Args[0] 11114 v_1 := v.Args[1] 11115 if v_1.Op != OpS390XADDconst { 11116 break 11117 } 11118 d := v_1.AuxInt 11119 idx := v_1.Args[0] 11120 mem := v.Args[2] 11121 v.reset(OpS390XMOVHZloadidx) 11122 v.AuxInt = c + d 11123 v.Aux = sym 11124 v.AddArg(ptr) 11125 v.AddArg(idx) 11126 v.AddArg(mem) 11127 return true 11128 } 11129 return false 11130 } 11131 func rewriteValueS390X_OpS390XMOVHZreg(v *Value, config *Config) bool { 11132 b := v.Block 11133 _ = b 11134 // match: (MOVHZreg x:(MOVBZload _ _)) 11135 // cond: 11136 // result: (MOVDreg x) 11137 for { 11138 x := v.Args[0] 11139 if x.Op != OpS390XMOVBZload { 11140 break 11141 } 11142 v.reset(OpS390XMOVDreg) 11143 v.AddArg(x) 11144 return true 11145 } 11146 // match: (MOVHZreg x:(MOVHZload _ _)) 11147 // cond: 11148 // result: (MOVDreg x) 11149 for { 11150 x := v.Args[0] 11151 if x.Op != OpS390XMOVHZload { 11152 break 11153 } 11154 v.reset(OpS390XMOVDreg) 11155 v.AddArg(x) 11156 return true 11157 } 11158 // match: (MOVHZreg x:(Arg <t>)) 11159 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 11160 // result: (MOVDreg x) 11161 for { 11162 x := v.Args[0] 11163 if x.Op != OpArg { 11164 break 11165 } 11166 t := x.Type 11167 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 11168 break 11169 } 11170 v.reset(OpS390XMOVDreg) 11171 v.AddArg(x) 11172 return true 11173 } 11174 // match: (MOVHZreg x:(MOVBZreg _)) 11175 // cond: 11176 // result: (MOVDreg x) 11177 for { 11178 x := v.Args[0] 11179 if x.Op != OpS390XMOVBZreg { 11180 break 11181 } 11182 v.reset(OpS390XMOVDreg) 11183 v.AddArg(x) 11184 return true 11185 } 11186 // match: (MOVHZreg x:(MOVHZreg _)) 11187 // cond: 11188 // result: (MOVDreg x) 11189 for { 11190 x := v.Args[0] 11191 if x.Op != OpS390XMOVHZreg { 11192 break 11193 } 11194 v.reset(OpS390XMOVDreg) 11195 v.AddArg(x) 11196 return true 11197 } 11198 // match: (MOVHZreg (MOVDconst [c])) 11199 // cond: 11200 // result: (MOVDconst [int64(uint16(c))]) 11201 for { 11202 v_0 := v.Args[0] 11203 if v_0.Op != OpS390XMOVDconst { 11204 break 11205 } 11206 c := v_0.AuxInt 11207 v.reset(OpS390XMOVDconst) 11208 v.AuxInt = int64(uint16(c)) 11209 return true 11210 } 11211 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 11212 // cond: x.Uses == 1 && clobber(x) 11213 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 11214 for { 11215 x := v.Args[0] 11216 if x.Op != OpS390XMOVHZload { 11217 break 11218 } 11219 off := x.AuxInt 11220 sym := x.Aux 11221 ptr := x.Args[0] 11222 mem := x.Args[1] 11223 if !(x.Uses == 1 && clobber(x)) { 11224 break 11225 } 11226 b = x.Block 11227 v0 := b.NewValue0(v.Line, OpS390XMOVHZload, v.Type) 11228 v.reset(OpCopy) 11229 v.AddArg(v0) 11230 v0.AuxInt = off 11231 v0.Aux = sym 11232 v0.AddArg(ptr) 11233 v0.AddArg(mem) 11234 return true 11235 } 11236 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 11237 // cond: x.Uses == 1 && clobber(x) 11238 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 11239 for { 11240 x := v.Args[0] 11241 if x.Op != OpS390XMOVHZloadidx { 11242 break 11243 } 11244 off := x.AuxInt 11245 sym := x.Aux 11246 ptr := x.Args[0] 11247 idx := x.Args[1] 11248 mem := x.Args[2] 11249 if !(x.Uses == 1 && clobber(x)) { 11250 break 11251 } 11252 b = x.Block 11253 v0 := b.NewValue0(v.Line, OpS390XMOVHZloadidx, v.Type) 11254 v.reset(OpCopy) 11255 v.AddArg(v0) 11256 v0.AuxInt = off 11257 v0.Aux = sym 11258 v0.AddArg(ptr) 11259 v0.AddArg(idx) 11260 v0.AddArg(mem) 11261 return true 11262 } 11263 return false 11264 } 11265 func rewriteValueS390X_OpS390XMOVHload(v *Value, config *Config) bool { 11266 b := v.Block 11267 _ = b 11268 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 11269 // cond: is20Bit(off1+off2) 11270 // result: (MOVHload [off1+off2] {sym} ptr mem) 11271 for { 11272 off1 := v.AuxInt 11273 sym := v.Aux 11274 v_0 := v.Args[0] 11275 if v_0.Op != OpS390XADDconst { 11276 break 11277 } 11278 off2 := v_0.AuxInt 11279 ptr := v_0.Args[0] 11280 mem := v.Args[1] 11281 if !(is20Bit(off1 + off2)) { 11282 break 11283 } 11284 v.reset(OpS390XMOVHload) 11285 v.AuxInt = off1 + off2 11286 v.Aux = sym 11287 v.AddArg(ptr) 11288 v.AddArg(mem) 11289 return true 11290 } 11291 // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 11292 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11293 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 11294 for { 11295 off1 := v.AuxInt 11296 sym1 := v.Aux 11297 v_0 := v.Args[0] 11298 if v_0.Op != OpS390XMOVDaddr { 11299 break 11300 } 11301 off2 := v_0.AuxInt 11302 sym2 := v_0.Aux 11303 base := v_0.Args[0] 11304 mem := v.Args[1] 11305 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11306 break 11307 } 11308 v.reset(OpS390XMOVHload) 11309 v.AuxInt = off1 + off2 11310 v.Aux = mergeSym(sym1, sym2) 11311 v.AddArg(base) 11312 v.AddArg(mem) 11313 return true 11314 } 11315 return false 11316 } 11317 func rewriteValueS390X_OpS390XMOVHreg(v *Value, config *Config) bool { 11318 b := v.Block 11319 _ = b 11320 // match: (MOVHreg x:(MOVBload _ _)) 11321 // cond: 11322 // result: (MOVDreg x) 11323 for { 11324 x := v.Args[0] 11325 if x.Op != OpS390XMOVBload { 11326 break 11327 } 11328 v.reset(OpS390XMOVDreg) 11329 v.AddArg(x) 11330 return true 11331 } 11332 // match: (MOVHreg x:(MOVBZload _ _)) 11333 // cond: 11334 // result: (MOVDreg x) 11335 for { 11336 x := v.Args[0] 11337 if x.Op != OpS390XMOVBZload { 11338 break 11339 } 11340 v.reset(OpS390XMOVDreg) 11341 v.AddArg(x) 11342 return true 11343 } 11344 // match: (MOVHreg x:(MOVHload _ _)) 11345 // cond: 11346 // result: (MOVDreg x) 11347 for { 11348 x := v.Args[0] 11349 if x.Op != OpS390XMOVHload { 11350 break 11351 } 11352 v.reset(OpS390XMOVDreg) 11353 v.AddArg(x) 11354 return true 11355 } 11356 // match: (MOVHreg x:(Arg <t>)) 11357 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 11358 // result: (MOVDreg x) 11359 for { 11360 x := v.Args[0] 11361 if x.Op != OpArg { 11362 break 11363 } 11364 t := x.Type 11365 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 11366 break 11367 } 11368 v.reset(OpS390XMOVDreg) 11369 v.AddArg(x) 11370 return true 11371 } 11372 // match: (MOVHreg x:(MOVBreg _)) 11373 // cond: 11374 // result: (MOVDreg x) 11375 for { 11376 x := v.Args[0] 11377 if x.Op != OpS390XMOVBreg { 11378 break 11379 } 11380 v.reset(OpS390XMOVDreg) 11381 v.AddArg(x) 11382 return true 11383 } 11384 // match: (MOVHreg x:(MOVBZreg _)) 11385 // cond: 11386 // result: (MOVDreg x) 11387 for { 11388 x := v.Args[0] 11389 if x.Op != OpS390XMOVBZreg { 11390 break 11391 } 11392 v.reset(OpS390XMOVDreg) 11393 v.AddArg(x) 11394 return true 11395 } 11396 // match: (MOVHreg x:(MOVHreg _)) 11397 // cond: 11398 // result: (MOVDreg x) 11399 for { 11400 x := v.Args[0] 11401 if x.Op != OpS390XMOVHreg { 11402 break 11403 } 11404 v.reset(OpS390XMOVDreg) 11405 v.AddArg(x) 11406 return true 11407 } 11408 // match: (MOVHreg (MOVDconst [c])) 11409 // cond: 11410 // result: (MOVDconst [int64(int16(c))]) 11411 for { 11412 v_0 := v.Args[0] 11413 if v_0.Op != OpS390XMOVDconst { 11414 break 11415 } 11416 c := v_0.AuxInt 11417 v.reset(OpS390XMOVDconst) 11418 v.AuxInt = int64(int16(c)) 11419 return true 11420 } 11421 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 11422 // cond: x.Uses == 1 && clobber(x) 11423 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 11424 for { 11425 x := v.Args[0] 11426 if x.Op != OpS390XMOVHZload { 11427 break 11428 } 11429 off := x.AuxInt 11430 sym := x.Aux 11431 ptr := x.Args[0] 11432 mem := x.Args[1] 11433 if !(x.Uses == 1 && clobber(x)) { 11434 break 11435 } 11436 b = x.Block 11437 v0 := b.NewValue0(v.Line, OpS390XMOVHload, v.Type) 11438 v.reset(OpCopy) 11439 v.AddArg(v0) 11440 v0.AuxInt = off 11441 v0.Aux = sym 11442 v0.AddArg(ptr) 11443 v0.AddArg(mem) 11444 return true 11445 } 11446 return false 11447 } 11448 func rewriteValueS390X_OpS390XMOVHstore(v *Value, config *Config) bool { 11449 b := v.Block 11450 _ = b 11451 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 11452 // cond: 11453 // result: (MOVHstore [off] {sym} ptr x mem) 11454 for { 11455 off := v.AuxInt 11456 sym := v.Aux 11457 ptr := v.Args[0] 11458 v_1 := v.Args[1] 11459 if v_1.Op != OpS390XMOVHreg { 11460 break 11461 } 11462 x := v_1.Args[0] 11463 mem := v.Args[2] 11464 v.reset(OpS390XMOVHstore) 11465 v.AuxInt = off 11466 v.Aux = sym 11467 v.AddArg(ptr) 11468 v.AddArg(x) 11469 v.AddArg(mem) 11470 return true 11471 } 11472 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 11473 // cond: 11474 // result: (MOVHstore [off] {sym} ptr x mem) 11475 for { 11476 off := v.AuxInt 11477 sym := v.Aux 11478 ptr := v.Args[0] 11479 v_1 := v.Args[1] 11480 if v_1.Op != OpS390XMOVHZreg { 11481 break 11482 } 11483 x := v_1.Args[0] 11484 mem := v.Args[2] 11485 v.reset(OpS390XMOVHstore) 11486 v.AuxInt = off 11487 v.Aux = sym 11488 v.AddArg(ptr) 11489 v.AddArg(x) 11490 v.AddArg(mem) 11491 return true 11492 } 11493 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 11494 // cond: is20Bit(off1+off2) 11495 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 11496 for { 11497 off1 := v.AuxInt 11498 sym := v.Aux 11499 v_0 := v.Args[0] 11500 if v_0.Op != OpS390XADDconst { 11501 break 11502 } 11503 off2 := v_0.AuxInt 11504 ptr := v_0.Args[0] 11505 val := v.Args[1] 11506 mem := v.Args[2] 11507 if !(is20Bit(off1 + off2)) { 11508 break 11509 } 11510 v.reset(OpS390XMOVHstore) 11511 v.AuxInt = off1 + off2 11512 v.Aux = sym 11513 v.AddArg(ptr) 11514 v.AddArg(val) 11515 v.AddArg(mem) 11516 return true 11517 } 11518 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 11519 // cond: validOff(off) && ptr.Op != OpSB 11520 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 11521 for { 11522 off := v.AuxInt 11523 sym := v.Aux 11524 ptr := v.Args[0] 11525 v_1 := v.Args[1] 11526 if v_1.Op != OpS390XMOVDconst { 11527 break 11528 } 11529 c := v_1.AuxInt 11530 mem := v.Args[2] 11531 if !(validOff(off) && ptr.Op != OpSB) { 11532 break 11533 } 11534 v.reset(OpS390XMOVHstoreconst) 11535 v.AuxInt = makeValAndOff(int64(int16(c)), off) 11536 v.Aux = sym 11537 v.AddArg(ptr) 11538 v.AddArg(mem) 11539 return true 11540 } 11541 // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 11542 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11543 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 11544 for { 11545 off1 := v.AuxInt 11546 sym1 := v.Aux 11547 v_0 := v.Args[0] 11548 if v_0.Op != OpS390XMOVDaddr { 11549 break 11550 } 11551 off2 := v_0.AuxInt 11552 sym2 := v_0.Aux 11553 base := v_0.Args[0] 11554 val := v.Args[1] 11555 mem := v.Args[2] 11556 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11557 break 11558 } 11559 v.reset(OpS390XMOVHstore) 11560 v.AuxInt = off1 + off2 11561 v.Aux = mergeSym(sym1, sym2) 11562 v.AddArg(base) 11563 v.AddArg(val) 11564 v.AddArg(mem) 11565 return true 11566 } 11567 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 11568 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11569 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 11570 for { 11571 off1 := v.AuxInt 11572 sym1 := v.Aux 11573 v_0 := v.Args[0] 11574 if v_0.Op != OpS390XMOVDaddridx { 11575 break 11576 } 11577 off2 := v_0.AuxInt 11578 sym2 := v_0.Aux 11579 ptr := v_0.Args[0] 11580 idx := v_0.Args[1] 11581 val := v.Args[1] 11582 mem := v.Args[2] 11583 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11584 break 11585 } 11586 v.reset(OpS390XMOVHstoreidx) 11587 v.AuxInt = off1 + off2 11588 v.Aux = mergeSym(sym1, sym2) 11589 v.AddArg(ptr) 11590 v.AddArg(idx) 11591 v.AddArg(val) 11592 v.AddArg(mem) 11593 return true 11594 } 11595 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 11596 // cond: ptr.Op != OpSB 11597 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 11598 for { 11599 off := v.AuxInt 11600 sym := v.Aux 11601 v_0 := v.Args[0] 11602 if v_0.Op != OpS390XADD { 11603 break 11604 } 11605 ptr := v_0.Args[0] 11606 idx := v_0.Args[1] 11607 val := v.Args[1] 11608 mem := v.Args[2] 11609 if !(ptr.Op != OpSB) { 11610 break 11611 } 11612 v.reset(OpS390XMOVHstoreidx) 11613 v.AuxInt = off 11614 v.Aux = sym 11615 v.AddArg(ptr) 11616 v.AddArg(idx) 11617 v.AddArg(val) 11618 v.AddArg(mem) 11619 return true 11620 } 11621 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 11622 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 11623 // result: (MOVWstore [i-2] {s} p w mem) 11624 for { 11625 i := v.AuxInt 11626 s := v.Aux 11627 p := v.Args[0] 11628 w := v.Args[1] 11629 x := v.Args[2] 11630 if x.Op != OpS390XMOVHstore { 11631 break 11632 } 11633 if x.AuxInt != i-2 { 11634 break 11635 } 11636 if x.Aux != s { 11637 break 11638 } 11639 if p != x.Args[0] { 11640 break 11641 } 11642 x_1 := x.Args[1] 11643 if x_1.Op != OpS390XSRDconst { 11644 break 11645 } 11646 if x_1.AuxInt != 16 { 11647 break 11648 } 11649 if w != x_1.Args[0] { 11650 break 11651 } 11652 mem := x.Args[2] 11653 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 11654 break 11655 } 11656 v.reset(OpS390XMOVWstore) 11657 v.AuxInt = i - 2 11658 v.Aux = s 11659 v.AddArg(p) 11660 v.AddArg(w) 11661 v.AddArg(mem) 11662 return true 11663 } 11664 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 11665 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 11666 // result: (MOVWstore [i-2] {s} p w0 mem) 11667 for { 11668 i := v.AuxInt 11669 s := v.Aux 11670 p := v.Args[0] 11671 w0 := v.Args[1] 11672 if w0.Op != OpS390XSRDconst { 11673 break 11674 } 11675 j := w0.AuxInt 11676 w := w0.Args[0] 11677 x := v.Args[2] 11678 if x.Op != OpS390XMOVHstore { 11679 break 11680 } 11681 if x.AuxInt != i-2 { 11682 break 11683 } 11684 if x.Aux != s { 11685 break 11686 } 11687 if p != x.Args[0] { 11688 break 11689 } 11690 x_1 := x.Args[1] 11691 if x_1.Op != OpS390XSRDconst { 11692 break 11693 } 11694 if x_1.AuxInt != j+16 { 11695 break 11696 } 11697 if w != x_1.Args[0] { 11698 break 11699 } 11700 mem := x.Args[2] 11701 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 11702 break 11703 } 11704 v.reset(OpS390XMOVWstore) 11705 v.AuxInt = i - 2 11706 v.Aux = s 11707 v.AddArg(p) 11708 v.AddArg(w0) 11709 v.AddArg(mem) 11710 return true 11711 } 11712 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 11713 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 11714 // result: (MOVWstore [i-2] {s} p w mem) 11715 for { 11716 i := v.AuxInt 11717 s := v.Aux 11718 p := v.Args[0] 11719 w := v.Args[1] 11720 x := v.Args[2] 11721 if x.Op != OpS390XMOVHstore { 11722 break 11723 } 11724 if x.AuxInt != i-2 { 11725 break 11726 } 11727 if x.Aux != s { 11728 break 11729 } 11730 if p != x.Args[0] { 11731 break 11732 } 11733 x_1 := x.Args[1] 11734 if x_1.Op != OpS390XSRWconst { 11735 break 11736 } 11737 if x_1.AuxInt != 16 { 11738 break 11739 } 11740 if w != x_1.Args[0] { 11741 break 11742 } 11743 mem := x.Args[2] 11744 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 11745 break 11746 } 11747 v.reset(OpS390XMOVWstore) 11748 v.AuxInt = i - 2 11749 v.Aux = s 11750 v.AddArg(p) 11751 v.AddArg(w) 11752 v.AddArg(mem) 11753 return true 11754 } 11755 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 11756 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 11757 // result: (MOVWstore [i-2] {s} p w0 mem) 11758 for { 11759 i := v.AuxInt 11760 s := v.Aux 11761 p := v.Args[0] 11762 w0 := v.Args[1] 11763 if w0.Op != OpS390XSRWconst { 11764 break 11765 } 11766 j := w0.AuxInt 11767 w := w0.Args[0] 11768 x := v.Args[2] 11769 if x.Op != OpS390XMOVHstore { 11770 break 11771 } 11772 if x.AuxInt != i-2 { 11773 break 11774 } 11775 if x.Aux != s { 11776 break 11777 } 11778 if p != x.Args[0] { 11779 break 11780 } 11781 x_1 := x.Args[1] 11782 if x_1.Op != OpS390XSRWconst { 11783 break 11784 } 11785 if x_1.AuxInt != j+16 { 11786 break 11787 } 11788 if w != x_1.Args[0] { 11789 break 11790 } 11791 mem := x.Args[2] 11792 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 11793 break 11794 } 11795 v.reset(OpS390XMOVWstore) 11796 v.AuxInt = i - 2 11797 v.Aux = s 11798 v.AddArg(p) 11799 v.AddArg(w0) 11800 v.AddArg(mem) 11801 return true 11802 } 11803 return false 11804 } 11805 func rewriteValueS390X_OpS390XMOVHstoreconst(v *Value, config *Config) bool { 11806 b := v.Block 11807 _ = b 11808 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 11809 // cond: ValAndOff(sc).canAdd(off) 11810 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 11811 for { 11812 sc := v.AuxInt 11813 s := v.Aux 11814 v_0 := v.Args[0] 11815 if v_0.Op != OpS390XADDconst { 11816 break 11817 } 11818 off := v_0.AuxInt 11819 ptr := v_0.Args[0] 11820 mem := v.Args[1] 11821 if !(ValAndOff(sc).canAdd(off)) { 11822 break 11823 } 11824 v.reset(OpS390XMOVHstoreconst) 11825 v.AuxInt = ValAndOff(sc).add(off) 11826 v.Aux = s 11827 v.AddArg(ptr) 11828 v.AddArg(mem) 11829 return true 11830 } 11831 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 11832 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 11833 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 11834 for { 11835 sc := v.AuxInt 11836 sym1 := v.Aux 11837 v_0 := v.Args[0] 11838 if v_0.Op != OpS390XMOVDaddr { 11839 break 11840 } 11841 off := v_0.AuxInt 11842 sym2 := v_0.Aux 11843 ptr := v_0.Args[0] 11844 mem := v.Args[1] 11845 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 11846 break 11847 } 11848 v.reset(OpS390XMOVHstoreconst) 11849 v.AuxInt = ValAndOff(sc).add(off) 11850 v.Aux = mergeSym(sym1, sym2) 11851 v.AddArg(ptr) 11852 v.AddArg(mem) 11853 return true 11854 } 11855 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 11856 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 11857 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16, ValAndOff(a).Off())] {s} p mem) 11858 for { 11859 c := v.AuxInt 11860 s := v.Aux 11861 p := v.Args[0] 11862 x := v.Args[1] 11863 if x.Op != OpS390XMOVHstoreconst { 11864 break 11865 } 11866 a := x.AuxInt 11867 if x.Aux != s { 11868 break 11869 } 11870 if p != x.Args[0] { 11871 break 11872 } 11873 mem := x.Args[1] 11874 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 11875 break 11876 } 11877 v.reset(OpS390XMOVWstoreconst) 11878 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xffff|ValAndOff(a).Val()<<16, ValAndOff(a).Off()) 11879 v.Aux = s 11880 v.AddArg(p) 11881 v.AddArg(mem) 11882 return true 11883 } 11884 return false 11885 } 11886 func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value, config *Config) bool { 11887 b := v.Block 11888 _ = b 11889 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 11890 // cond: 11891 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 11892 for { 11893 c := v.AuxInt 11894 sym := v.Aux 11895 v_0 := v.Args[0] 11896 if v_0.Op != OpS390XADDconst { 11897 break 11898 } 11899 d := v_0.AuxInt 11900 ptr := v_0.Args[0] 11901 idx := v.Args[1] 11902 val := v.Args[2] 11903 mem := v.Args[3] 11904 v.reset(OpS390XMOVHstoreidx) 11905 v.AuxInt = c + d 11906 v.Aux = sym 11907 v.AddArg(ptr) 11908 v.AddArg(idx) 11909 v.AddArg(val) 11910 v.AddArg(mem) 11911 return true 11912 } 11913 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 11914 // cond: 11915 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 11916 for { 11917 c := v.AuxInt 11918 sym := v.Aux 11919 ptr := v.Args[0] 11920 v_1 := v.Args[1] 11921 if v_1.Op != OpS390XADDconst { 11922 break 11923 } 11924 d := v_1.AuxInt 11925 idx := v_1.Args[0] 11926 val := v.Args[2] 11927 mem := v.Args[3] 11928 v.reset(OpS390XMOVHstoreidx) 11929 v.AuxInt = c + d 11930 v.Aux = sym 11931 v.AddArg(ptr) 11932 v.AddArg(idx) 11933 v.AddArg(val) 11934 v.AddArg(mem) 11935 return true 11936 } 11937 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 11938 // cond: x.Uses == 1 && clobber(x) 11939 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 11940 for { 11941 i := v.AuxInt 11942 s := v.Aux 11943 p := v.Args[0] 11944 idx := v.Args[1] 11945 w := v.Args[2] 11946 x := v.Args[3] 11947 if x.Op != OpS390XMOVHstoreidx { 11948 break 11949 } 11950 if x.AuxInt != i-2 { 11951 break 11952 } 11953 if x.Aux != s { 11954 break 11955 } 11956 if p != x.Args[0] { 11957 break 11958 } 11959 if idx != x.Args[1] { 11960 break 11961 } 11962 x_2 := x.Args[2] 11963 if x_2.Op != OpS390XSRDconst { 11964 break 11965 } 11966 if x_2.AuxInt != 16 { 11967 break 11968 } 11969 if w != x_2.Args[0] { 11970 break 11971 } 11972 mem := x.Args[3] 11973 if !(x.Uses == 1 && clobber(x)) { 11974 break 11975 } 11976 v.reset(OpS390XMOVWstoreidx) 11977 v.AuxInt = i - 2 11978 v.Aux = s 11979 v.AddArg(p) 11980 v.AddArg(idx) 11981 v.AddArg(w) 11982 v.AddArg(mem) 11983 return true 11984 } 11985 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 11986 // cond: x.Uses == 1 && clobber(x) 11987 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 11988 for { 11989 i := v.AuxInt 11990 s := v.Aux 11991 p := v.Args[0] 11992 idx := v.Args[1] 11993 w0 := v.Args[2] 11994 if w0.Op != OpS390XSRDconst { 11995 break 11996 } 11997 j := w0.AuxInt 11998 w := w0.Args[0] 11999 x := v.Args[3] 12000 if x.Op != OpS390XMOVHstoreidx { 12001 break 12002 } 12003 if x.AuxInt != i-2 { 12004 break 12005 } 12006 if x.Aux != s { 12007 break 12008 } 12009 if p != x.Args[0] { 12010 break 12011 } 12012 if idx != x.Args[1] { 12013 break 12014 } 12015 x_2 := x.Args[2] 12016 if x_2.Op != OpS390XSRDconst { 12017 break 12018 } 12019 if x_2.AuxInt != j+16 { 12020 break 12021 } 12022 if w != x_2.Args[0] { 12023 break 12024 } 12025 mem := x.Args[3] 12026 if !(x.Uses == 1 && clobber(x)) { 12027 break 12028 } 12029 v.reset(OpS390XMOVWstoreidx) 12030 v.AuxInt = i - 2 12031 v.Aux = s 12032 v.AddArg(p) 12033 v.AddArg(idx) 12034 v.AddArg(w0) 12035 v.AddArg(mem) 12036 return true 12037 } 12038 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 12039 // cond: x.Uses == 1 && clobber(x) 12040 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 12041 for { 12042 i := v.AuxInt 12043 s := v.Aux 12044 p := v.Args[0] 12045 idx := v.Args[1] 12046 w := v.Args[2] 12047 x := v.Args[3] 12048 if x.Op != OpS390XMOVHstoreidx { 12049 break 12050 } 12051 if x.AuxInt != i-2 { 12052 break 12053 } 12054 if x.Aux != s { 12055 break 12056 } 12057 if p != x.Args[0] { 12058 break 12059 } 12060 if idx != x.Args[1] { 12061 break 12062 } 12063 x_2 := x.Args[2] 12064 if x_2.Op != OpS390XSRWconst { 12065 break 12066 } 12067 if x_2.AuxInt != 16 { 12068 break 12069 } 12070 if w != x_2.Args[0] { 12071 break 12072 } 12073 mem := x.Args[3] 12074 if !(x.Uses == 1 && clobber(x)) { 12075 break 12076 } 12077 v.reset(OpS390XMOVWstoreidx) 12078 v.AuxInt = i - 2 12079 v.Aux = s 12080 v.AddArg(p) 12081 v.AddArg(idx) 12082 v.AddArg(w) 12083 v.AddArg(mem) 12084 return true 12085 } 12086 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 12087 // cond: x.Uses == 1 && clobber(x) 12088 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 12089 for { 12090 i := v.AuxInt 12091 s := v.Aux 12092 p := v.Args[0] 12093 idx := v.Args[1] 12094 w0 := v.Args[2] 12095 if w0.Op != OpS390XSRWconst { 12096 break 12097 } 12098 j := w0.AuxInt 12099 w := w0.Args[0] 12100 x := v.Args[3] 12101 if x.Op != OpS390XMOVHstoreidx { 12102 break 12103 } 12104 if x.AuxInt != i-2 { 12105 break 12106 } 12107 if x.Aux != s { 12108 break 12109 } 12110 if p != x.Args[0] { 12111 break 12112 } 12113 if idx != x.Args[1] { 12114 break 12115 } 12116 x_2 := x.Args[2] 12117 if x_2.Op != OpS390XSRWconst { 12118 break 12119 } 12120 if x_2.AuxInt != j+16 { 12121 break 12122 } 12123 if w != x_2.Args[0] { 12124 break 12125 } 12126 mem := x.Args[3] 12127 if !(x.Uses == 1 && clobber(x)) { 12128 break 12129 } 12130 v.reset(OpS390XMOVWstoreidx) 12131 v.AuxInt = i - 2 12132 v.Aux = s 12133 v.AddArg(p) 12134 v.AddArg(idx) 12135 v.AddArg(w0) 12136 v.AddArg(mem) 12137 return true 12138 } 12139 return false 12140 } 12141 func rewriteValueS390X_OpS390XMOVWBRstore(v *Value, config *Config) bool { 12142 b := v.Block 12143 _ = b 12144 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 12145 // cond: x.Uses == 1 && clobber(x) 12146 // result: (MOVDBRstore [i-4] {s} p w mem) 12147 for { 12148 i := v.AuxInt 12149 s := v.Aux 12150 p := v.Args[0] 12151 v_1 := v.Args[1] 12152 if v_1.Op != OpS390XSRDconst { 12153 break 12154 } 12155 if v_1.AuxInt != 32 { 12156 break 12157 } 12158 w := v_1.Args[0] 12159 x := v.Args[2] 12160 if x.Op != OpS390XMOVWBRstore { 12161 break 12162 } 12163 if x.AuxInt != i-4 { 12164 break 12165 } 12166 if x.Aux != s { 12167 break 12168 } 12169 if p != x.Args[0] { 12170 break 12171 } 12172 if w != x.Args[1] { 12173 break 12174 } 12175 mem := x.Args[2] 12176 if !(x.Uses == 1 && clobber(x)) { 12177 break 12178 } 12179 v.reset(OpS390XMOVDBRstore) 12180 v.AuxInt = i - 4 12181 v.Aux = s 12182 v.AddArg(p) 12183 v.AddArg(w) 12184 v.AddArg(mem) 12185 return true 12186 } 12187 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 12188 // cond: x.Uses == 1 && clobber(x) 12189 // result: (MOVDBRstore [i-4] {s} p w0 mem) 12190 for { 12191 i := v.AuxInt 12192 s := v.Aux 12193 p := v.Args[0] 12194 v_1 := v.Args[1] 12195 if v_1.Op != OpS390XSRDconst { 12196 break 12197 } 12198 j := v_1.AuxInt 12199 w := v_1.Args[0] 12200 x := v.Args[2] 12201 if x.Op != OpS390XMOVWBRstore { 12202 break 12203 } 12204 if x.AuxInt != i-4 { 12205 break 12206 } 12207 if x.Aux != s { 12208 break 12209 } 12210 if p != x.Args[0] { 12211 break 12212 } 12213 w0 := x.Args[1] 12214 if w0.Op != OpS390XSRDconst { 12215 break 12216 } 12217 if w0.AuxInt != j-32 { 12218 break 12219 } 12220 if w != w0.Args[0] { 12221 break 12222 } 12223 mem := x.Args[2] 12224 if !(x.Uses == 1 && clobber(x)) { 12225 break 12226 } 12227 v.reset(OpS390XMOVDBRstore) 12228 v.AuxInt = i - 4 12229 v.Aux = s 12230 v.AddArg(p) 12231 v.AddArg(w0) 12232 v.AddArg(mem) 12233 return true 12234 } 12235 return false 12236 } 12237 func rewriteValueS390X_OpS390XMOVWBRstoreidx(v *Value, config *Config) bool { 12238 b := v.Block 12239 _ = b 12240 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 12241 // cond: x.Uses == 1 && clobber(x) 12242 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 12243 for { 12244 i := v.AuxInt 12245 s := v.Aux 12246 p := v.Args[0] 12247 idx := v.Args[1] 12248 v_2 := v.Args[2] 12249 if v_2.Op != OpS390XSRDconst { 12250 break 12251 } 12252 if v_2.AuxInt != 32 { 12253 break 12254 } 12255 w := v_2.Args[0] 12256 x := v.Args[3] 12257 if x.Op != OpS390XMOVWBRstoreidx { 12258 break 12259 } 12260 if x.AuxInt != i-4 { 12261 break 12262 } 12263 if x.Aux != s { 12264 break 12265 } 12266 if p != x.Args[0] { 12267 break 12268 } 12269 if idx != x.Args[1] { 12270 break 12271 } 12272 if w != x.Args[2] { 12273 break 12274 } 12275 mem := x.Args[3] 12276 if !(x.Uses == 1 && clobber(x)) { 12277 break 12278 } 12279 v.reset(OpS390XMOVDBRstoreidx) 12280 v.AuxInt = i - 4 12281 v.Aux = s 12282 v.AddArg(p) 12283 v.AddArg(idx) 12284 v.AddArg(w) 12285 v.AddArg(mem) 12286 return true 12287 } 12288 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 12289 // cond: x.Uses == 1 && clobber(x) 12290 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 12291 for { 12292 i := v.AuxInt 12293 s := v.Aux 12294 p := v.Args[0] 12295 idx := v.Args[1] 12296 v_2 := v.Args[2] 12297 if v_2.Op != OpS390XSRDconst { 12298 break 12299 } 12300 j := v_2.AuxInt 12301 w := v_2.Args[0] 12302 x := v.Args[3] 12303 if x.Op != OpS390XMOVWBRstoreidx { 12304 break 12305 } 12306 if x.AuxInt != i-4 { 12307 break 12308 } 12309 if x.Aux != s { 12310 break 12311 } 12312 if p != x.Args[0] { 12313 break 12314 } 12315 if idx != x.Args[1] { 12316 break 12317 } 12318 w0 := x.Args[2] 12319 if w0.Op != OpS390XSRDconst { 12320 break 12321 } 12322 if w0.AuxInt != j-32 { 12323 break 12324 } 12325 if w != w0.Args[0] { 12326 break 12327 } 12328 mem := x.Args[3] 12329 if !(x.Uses == 1 && clobber(x)) { 12330 break 12331 } 12332 v.reset(OpS390XMOVDBRstoreidx) 12333 v.AuxInt = i - 4 12334 v.Aux = s 12335 v.AddArg(p) 12336 v.AddArg(idx) 12337 v.AddArg(w0) 12338 v.AddArg(mem) 12339 return true 12340 } 12341 return false 12342 } 12343 func rewriteValueS390X_OpS390XMOVWZload(v *Value, config *Config) bool { 12344 b := v.Block 12345 _ = b 12346 // match: (MOVWZload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 12347 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 12348 // result: (MOVDreg x) 12349 for { 12350 off := v.AuxInt 12351 sym := v.Aux 12352 ptr := v.Args[0] 12353 v_1 := v.Args[1] 12354 if v_1.Op != OpS390XMOVWstore { 12355 break 12356 } 12357 off2 := v_1.AuxInt 12358 sym2 := v_1.Aux 12359 ptr2 := v_1.Args[0] 12360 x := v_1.Args[1] 12361 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 12362 break 12363 } 12364 v.reset(OpS390XMOVDreg) 12365 v.AddArg(x) 12366 return true 12367 } 12368 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 12369 // cond: is20Bit(off1+off2) 12370 // result: (MOVWZload [off1+off2] {sym} ptr mem) 12371 for { 12372 off1 := v.AuxInt 12373 sym := v.Aux 12374 v_0 := v.Args[0] 12375 if v_0.Op != OpS390XADDconst { 12376 break 12377 } 12378 off2 := v_0.AuxInt 12379 ptr := v_0.Args[0] 12380 mem := v.Args[1] 12381 if !(is20Bit(off1 + off2)) { 12382 break 12383 } 12384 v.reset(OpS390XMOVWZload) 12385 v.AuxInt = off1 + off2 12386 v.Aux = sym 12387 v.AddArg(ptr) 12388 v.AddArg(mem) 12389 return true 12390 } 12391 // match: (MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 12392 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12393 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 12394 for { 12395 off1 := v.AuxInt 12396 sym1 := v.Aux 12397 v_0 := v.Args[0] 12398 if v_0.Op != OpS390XMOVDaddr { 12399 break 12400 } 12401 off2 := v_0.AuxInt 12402 sym2 := v_0.Aux 12403 base := v_0.Args[0] 12404 mem := v.Args[1] 12405 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12406 break 12407 } 12408 v.reset(OpS390XMOVWZload) 12409 v.AuxInt = off1 + off2 12410 v.Aux = mergeSym(sym1, sym2) 12411 v.AddArg(base) 12412 v.AddArg(mem) 12413 return true 12414 } 12415 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 12416 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12417 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 12418 for { 12419 off1 := v.AuxInt 12420 sym1 := v.Aux 12421 v_0 := v.Args[0] 12422 if v_0.Op != OpS390XMOVDaddridx { 12423 break 12424 } 12425 off2 := v_0.AuxInt 12426 sym2 := v_0.Aux 12427 ptr := v_0.Args[0] 12428 idx := v_0.Args[1] 12429 mem := v.Args[1] 12430 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12431 break 12432 } 12433 v.reset(OpS390XMOVWZloadidx) 12434 v.AuxInt = off1 + off2 12435 v.Aux = mergeSym(sym1, sym2) 12436 v.AddArg(ptr) 12437 v.AddArg(idx) 12438 v.AddArg(mem) 12439 return true 12440 } 12441 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 12442 // cond: ptr.Op != OpSB 12443 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 12444 for { 12445 off := v.AuxInt 12446 sym := v.Aux 12447 v_0 := v.Args[0] 12448 if v_0.Op != OpS390XADD { 12449 break 12450 } 12451 ptr := v_0.Args[0] 12452 idx := v_0.Args[1] 12453 mem := v.Args[1] 12454 if !(ptr.Op != OpSB) { 12455 break 12456 } 12457 v.reset(OpS390XMOVWZloadidx) 12458 v.AuxInt = off 12459 v.Aux = sym 12460 v.AddArg(ptr) 12461 v.AddArg(idx) 12462 v.AddArg(mem) 12463 return true 12464 } 12465 return false 12466 } 12467 func rewriteValueS390X_OpS390XMOVWZloadidx(v *Value, config *Config) bool { 12468 b := v.Block 12469 _ = b 12470 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 12471 // cond: 12472 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 12473 for { 12474 c := v.AuxInt 12475 sym := v.Aux 12476 v_0 := v.Args[0] 12477 if v_0.Op != OpS390XADDconst { 12478 break 12479 } 12480 d := v_0.AuxInt 12481 ptr := v_0.Args[0] 12482 idx := v.Args[1] 12483 mem := v.Args[2] 12484 v.reset(OpS390XMOVWZloadidx) 12485 v.AuxInt = c + d 12486 v.Aux = sym 12487 v.AddArg(ptr) 12488 v.AddArg(idx) 12489 v.AddArg(mem) 12490 return true 12491 } 12492 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 12493 // cond: 12494 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 12495 for { 12496 c := v.AuxInt 12497 sym := v.Aux 12498 ptr := v.Args[0] 12499 v_1 := v.Args[1] 12500 if v_1.Op != OpS390XADDconst { 12501 break 12502 } 12503 d := v_1.AuxInt 12504 idx := v_1.Args[0] 12505 mem := v.Args[2] 12506 v.reset(OpS390XMOVWZloadidx) 12507 v.AuxInt = c + d 12508 v.Aux = sym 12509 v.AddArg(ptr) 12510 v.AddArg(idx) 12511 v.AddArg(mem) 12512 return true 12513 } 12514 return false 12515 } 12516 func rewriteValueS390X_OpS390XMOVWZreg(v *Value, config *Config) bool { 12517 b := v.Block 12518 _ = b 12519 // match: (MOVWZreg x:(MOVBZload _ _)) 12520 // cond: 12521 // result: (MOVDreg x) 12522 for { 12523 x := v.Args[0] 12524 if x.Op != OpS390XMOVBZload { 12525 break 12526 } 12527 v.reset(OpS390XMOVDreg) 12528 v.AddArg(x) 12529 return true 12530 } 12531 // match: (MOVWZreg x:(MOVHZload _ _)) 12532 // cond: 12533 // result: (MOVDreg x) 12534 for { 12535 x := v.Args[0] 12536 if x.Op != OpS390XMOVHZload { 12537 break 12538 } 12539 v.reset(OpS390XMOVDreg) 12540 v.AddArg(x) 12541 return true 12542 } 12543 // match: (MOVWZreg x:(MOVWZload _ _)) 12544 // cond: 12545 // result: (MOVDreg x) 12546 for { 12547 x := v.Args[0] 12548 if x.Op != OpS390XMOVWZload { 12549 break 12550 } 12551 v.reset(OpS390XMOVDreg) 12552 v.AddArg(x) 12553 return true 12554 } 12555 // match: (MOVWZreg x:(Arg <t>)) 12556 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 12557 // result: (MOVDreg x) 12558 for { 12559 x := v.Args[0] 12560 if x.Op != OpArg { 12561 break 12562 } 12563 t := x.Type 12564 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 12565 break 12566 } 12567 v.reset(OpS390XMOVDreg) 12568 v.AddArg(x) 12569 return true 12570 } 12571 // match: (MOVWZreg x:(MOVBZreg _)) 12572 // cond: 12573 // result: (MOVDreg x) 12574 for { 12575 x := v.Args[0] 12576 if x.Op != OpS390XMOVBZreg { 12577 break 12578 } 12579 v.reset(OpS390XMOVDreg) 12580 v.AddArg(x) 12581 return true 12582 } 12583 // match: (MOVWZreg x:(MOVHZreg _)) 12584 // cond: 12585 // result: (MOVDreg x) 12586 for { 12587 x := v.Args[0] 12588 if x.Op != OpS390XMOVHZreg { 12589 break 12590 } 12591 v.reset(OpS390XMOVDreg) 12592 v.AddArg(x) 12593 return true 12594 } 12595 // match: (MOVWZreg x:(MOVWZreg _)) 12596 // cond: 12597 // result: (MOVDreg x) 12598 for { 12599 x := v.Args[0] 12600 if x.Op != OpS390XMOVWZreg { 12601 break 12602 } 12603 v.reset(OpS390XMOVDreg) 12604 v.AddArg(x) 12605 return true 12606 } 12607 // match: (MOVWZreg (MOVDconst [c])) 12608 // cond: 12609 // result: (MOVDconst [int64(uint32(c))]) 12610 for { 12611 v_0 := v.Args[0] 12612 if v_0.Op != OpS390XMOVDconst { 12613 break 12614 } 12615 c := v_0.AuxInt 12616 v.reset(OpS390XMOVDconst) 12617 v.AuxInt = int64(uint32(c)) 12618 return true 12619 } 12620 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 12621 // cond: x.Uses == 1 && clobber(x) 12622 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 12623 for { 12624 x := v.Args[0] 12625 if x.Op != OpS390XMOVWZload { 12626 break 12627 } 12628 off := x.AuxInt 12629 sym := x.Aux 12630 ptr := x.Args[0] 12631 mem := x.Args[1] 12632 if !(x.Uses == 1 && clobber(x)) { 12633 break 12634 } 12635 b = x.Block 12636 v0 := b.NewValue0(v.Line, OpS390XMOVWZload, v.Type) 12637 v.reset(OpCopy) 12638 v.AddArg(v0) 12639 v0.AuxInt = off 12640 v0.Aux = sym 12641 v0.AddArg(ptr) 12642 v0.AddArg(mem) 12643 return true 12644 } 12645 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 12646 // cond: x.Uses == 1 && clobber(x) 12647 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 12648 for { 12649 x := v.Args[0] 12650 if x.Op != OpS390XMOVWZloadidx { 12651 break 12652 } 12653 off := x.AuxInt 12654 sym := x.Aux 12655 ptr := x.Args[0] 12656 idx := x.Args[1] 12657 mem := x.Args[2] 12658 if !(x.Uses == 1 && clobber(x)) { 12659 break 12660 } 12661 b = x.Block 12662 v0 := b.NewValue0(v.Line, OpS390XMOVWZloadidx, v.Type) 12663 v.reset(OpCopy) 12664 v.AddArg(v0) 12665 v0.AuxInt = off 12666 v0.Aux = sym 12667 v0.AddArg(ptr) 12668 v0.AddArg(idx) 12669 v0.AddArg(mem) 12670 return true 12671 } 12672 return false 12673 } 12674 func rewriteValueS390X_OpS390XMOVWload(v *Value, config *Config) bool { 12675 b := v.Block 12676 _ = b 12677 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 12678 // cond: is20Bit(off1+off2) 12679 // result: (MOVWload [off1+off2] {sym} ptr mem) 12680 for { 12681 off1 := v.AuxInt 12682 sym := v.Aux 12683 v_0 := v.Args[0] 12684 if v_0.Op != OpS390XADDconst { 12685 break 12686 } 12687 off2 := v_0.AuxInt 12688 ptr := v_0.Args[0] 12689 mem := v.Args[1] 12690 if !(is20Bit(off1 + off2)) { 12691 break 12692 } 12693 v.reset(OpS390XMOVWload) 12694 v.AuxInt = off1 + off2 12695 v.Aux = sym 12696 v.AddArg(ptr) 12697 v.AddArg(mem) 12698 return true 12699 } 12700 // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 12701 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12702 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 12703 for { 12704 off1 := v.AuxInt 12705 sym1 := v.Aux 12706 v_0 := v.Args[0] 12707 if v_0.Op != OpS390XMOVDaddr { 12708 break 12709 } 12710 off2 := v_0.AuxInt 12711 sym2 := v_0.Aux 12712 base := v_0.Args[0] 12713 mem := v.Args[1] 12714 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12715 break 12716 } 12717 v.reset(OpS390XMOVWload) 12718 v.AuxInt = off1 + off2 12719 v.Aux = mergeSym(sym1, sym2) 12720 v.AddArg(base) 12721 v.AddArg(mem) 12722 return true 12723 } 12724 return false 12725 } 12726 func rewriteValueS390X_OpS390XMOVWreg(v *Value, config *Config) bool { 12727 b := v.Block 12728 _ = b 12729 // match: (MOVWreg x:(MOVBload _ _)) 12730 // cond: 12731 // result: (MOVDreg x) 12732 for { 12733 x := v.Args[0] 12734 if x.Op != OpS390XMOVBload { 12735 break 12736 } 12737 v.reset(OpS390XMOVDreg) 12738 v.AddArg(x) 12739 return true 12740 } 12741 // match: (MOVWreg x:(MOVBZload _ _)) 12742 // cond: 12743 // result: (MOVDreg x) 12744 for { 12745 x := v.Args[0] 12746 if x.Op != OpS390XMOVBZload { 12747 break 12748 } 12749 v.reset(OpS390XMOVDreg) 12750 v.AddArg(x) 12751 return true 12752 } 12753 // match: (MOVWreg x:(MOVHload _ _)) 12754 // cond: 12755 // result: (MOVDreg x) 12756 for { 12757 x := v.Args[0] 12758 if x.Op != OpS390XMOVHload { 12759 break 12760 } 12761 v.reset(OpS390XMOVDreg) 12762 v.AddArg(x) 12763 return true 12764 } 12765 // match: (MOVWreg x:(MOVHZload _ _)) 12766 // cond: 12767 // result: (MOVDreg x) 12768 for { 12769 x := v.Args[0] 12770 if x.Op != OpS390XMOVHZload { 12771 break 12772 } 12773 v.reset(OpS390XMOVDreg) 12774 v.AddArg(x) 12775 return true 12776 } 12777 // match: (MOVWreg x:(MOVWload _ _)) 12778 // cond: 12779 // result: (MOVDreg x) 12780 for { 12781 x := v.Args[0] 12782 if x.Op != OpS390XMOVWload { 12783 break 12784 } 12785 v.reset(OpS390XMOVDreg) 12786 v.AddArg(x) 12787 return true 12788 } 12789 // match: (MOVWreg x:(Arg <t>)) 12790 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 12791 // result: (MOVDreg x) 12792 for { 12793 x := v.Args[0] 12794 if x.Op != OpArg { 12795 break 12796 } 12797 t := x.Type 12798 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 12799 break 12800 } 12801 v.reset(OpS390XMOVDreg) 12802 v.AddArg(x) 12803 return true 12804 } 12805 // match: (MOVWreg x:(MOVBreg _)) 12806 // cond: 12807 // result: (MOVDreg x) 12808 for { 12809 x := v.Args[0] 12810 if x.Op != OpS390XMOVBreg { 12811 break 12812 } 12813 v.reset(OpS390XMOVDreg) 12814 v.AddArg(x) 12815 return true 12816 } 12817 // match: (MOVWreg x:(MOVBZreg _)) 12818 // cond: 12819 // result: (MOVDreg x) 12820 for { 12821 x := v.Args[0] 12822 if x.Op != OpS390XMOVBZreg { 12823 break 12824 } 12825 v.reset(OpS390XMOVDreg) 12826 v.AddArg(x) 12827 return true 12828 } 12829 // match: (MOVWreg x:(MOVHreg _)) 12830 // cond: 12831 // result: (MOVDreg x) 12832 for { 12833 x := v.Args[0] 12834 if x.Op != OpS390XMOVHreg { 12835 break 12836 } 12837 v.reset(OpS390XMOVDreg) 12838 v.AddArg(x) 12839 return true 12840 } 12841 // match: (MOVWreg x:(MOVHreg _)) 12842 // cond: 12843 // result: (MOVDreg x) 12844 for { 12845 x := v.Args[0] 12846 if x.Op != OpS390XMOVHreg { 12847 break 12848 } 12849 v.reset(OpS390XMOVDreg) 12850 v.AddArg(x) 12851 return true 12852 } 12853 // match: (MOVWreg x:(MOVWreg _)) 12854 // cond: 12855 // result: (MOVDreg x) 12856 for { 12857 x := v.Args[0] 12858 if x.Op != OpS390XMOVWreg { 12859 break 12860 } 12861 v.reset(OpS390XMOVDreg) 12862 v.AddArg(x) 12863 return true 12864 } 12865 // match: (MOVWreg (MOVDconst [c])) 12866 // cond: 12867 // result: (MOVDconst [int64(int32(c))]) 12868 for { 12869 v_0 := v.Args[0] 12870 if v_0.Op != OpS390XMOVDconst { 12871 break 12872 } 12873 c := v_0.AuxInt 12874 v.reset(OpS390XMOVDconst) 12875 v.AuxInt = int64(int32(c)) 12876 return true 12877 } 12878 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 12879 // cond: x.Uses == 1 && clobber(x) 12880 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 12881 for { 12882 x := v.Args[0] 12883 if x.Op != OpS390XMOVWZload { 12884 break 12885 } 12886 off := x.AuxInt 12887 sym := x.Aux 12888 ptr := x.Args[0] 12889 mem := x.Args[1] 12890 if !(x.Uses == 1 && clobber(x)) { 12891 break 12892 } 12893 b = x.Block 12894 v0 := b.NewValue0(v.Line, OpS390XMOVWload, v.Type) 12895 v.reset(OpCopy) 12896 v.AddArg(v0) 12897 v0.AuxInt = off 12898 v0.Aux = sym 12899 v0.AddArg(ptr) 12900 v0.AddArg(mem) 12901 return true 12902 } 12903 return false 12904 } 12905 func rewriteValueS390X_OpS390XMOVWstore(v *Value, config *Config) bool { 12906 b := v.Block 12907 _ = b 12908 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 12909 // cond: 12910 // result: (MOVWstore [off] {sym} ptr x mem) 12911 for { 12912 off := v.AuxInt 12913 sym := v.Aux 12914 ptr := v.Args[0] 12915 v_1 := v.Args[1] 12916 if v_1.Op != OpS390XMOVWreg { 12917 break 12918 } 12919 x := v_1.Args[0] 12920 mem := v.Args[2] 12921 v.reset(OpS390XMOVWstore) 12922 v.AuxInt = off 12923 v.Aux = sym 12924 v.AddArg(ptr) 12925 v.AddArg(x) 12926 v.AddArg(mem) 12927 return true 12928 } 12929 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 12930 // cond: 12931 // result: (MOVWstore [off] {sym} ptr x mem) 12932 for { 12933 off := v.AuxInt 12934 sym := v.Aux 12935 ptr := v.Args[0] 12936 v_1 := v.Args[1] 12937 if v_1.Op != OpS390XMOVWZreg { 12938 break 12939 } 12940 x := v_1.Args[0] 12941 mem := v.Args[2] 12942 v.reset(OpS390XMOVWstore) 12943 v.AuxInt = off 12944 v.Aux = sym 12945 v.AddArg(ptr) 12946 v.AddArg(x) 12947 v.AddArg(mem) 12948 return true 12949 } 12950 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 12951 // cond: is20Bit(off1+off2) 12952 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 12953 for { 12954 off1 := v.AuxInt 12955 sym := v.Aux 12956 v_0 := v.Args[0] 12957 if v_0.Op != OpS390XADDconst { 12958 break 12959 } 12960 off2 := v_0.AuxInt 12961 ptr := v_0.Args[0] 12962 val := v.Args[1] 12963 mem := v.Args[2] 12964 if !(is20Bit(off1 + off2)) { 12965 break 12966 } 12967 v.reset(OpS390XMOVWstore) 12968 v.AuxInt = off1 + off2 12969 v.Aux = sym 12970 v.AddArg(ptr) 12971 v.AddArg(val) 12972 v.AddArg(mem) 12973 return true 12974 } 12975 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 12976 // cond: validOff(off) && int64(int16(c)) == c && ptr.Op != OpSB 12977 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 12978 for { 12979 off := v.AuxInt 12980 sym := v.Aux 12981 ptr := v.Args[0] 12982 v_1 := v.Args[1] 12983 if v_1.Op != OpS390XMOVDconst { 12984 break 12985 } 12986 c := v_1.AuxInt 12987 mem := v.Args[2] 12988 if !(validOff(off) && int64(int16(c)) == c && ptr.Op != OpSB) { 12989 break 12990 } 12991 v.reset(OpS390XMOVWstoreconst) 12992 v.AuxInt = makeValAndOff(int64(int32(c)), off) 12993 v.Aux = sym 12994 v.AddArg(ptr) 12995 v.AddArg(mem) 12996 return true 12997 } 12998 // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 12999 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 13000 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 13001 for { 13002 off1 := v.AuxInt 13003 sym1 := v.Aux 13004 v_0 := v.Args[0] 13005 if v_0.Op != OpS390XMOVDaddr { 13006 break 13007 } 13008 off2 := v_0.AuxInt 13009 sym2 := v_0.Aux 13010 base := v_0.Args[0] 13011 val := v.Args[1] 13012 mem := v.Args[2] 13013 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 13014 break 13015 } 13016 v.reset(OpS390XMOVWstore) 13017 v.AuxInt = off1 + off2 13018 v.Aux = mergeSym(sym1, sym2) 13019 v.AddArg(base) 13020 v.AddArg(val) 13021 v.AddArg(mem) 13022 return true 13023 } 13024 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 13025 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 13026 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 13027 for { 13028 off1 := v.AuxInt 13029 sym1 := v.Aux 13030 v_0 := v.Args[0] 13031 if v_0.Op != OpS390XMOVDaddridx { 13032 break 13033 } 13034 off2 := v_0.AuxInt 13035 sym2 := v_0.Aux 13036 ptr := v_0.Args[0] 13037 idx := v_0.Args[1] 13038 val := v.Args[1] 13039 mem := v.Args[2] 13040 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 13041 break 13042 } 13043 v.reset(OpS390XMOVWstoreidx) 13044 v.AuxInt = off1 + off2 13045 v.Aux = mergeSym(sym1, sym2) 13046 v.AddArg(ptr) 13047 v.AddArg(idx) 13048 v.AddArg(val) 13049 v.AddArg(mem) 13050 return true 13051 } 13052 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 13053 // cond: ptr.Op != OpSB 13054 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 13055 for { 13056 off := v.AuxInt 13057 sym := v.Aux 13058 v_0 := v.Args[0] 13059 if v_0.Op != OpS390XADD { 13060 break 13061 } 13062 ptr := v_0.Args[0] 13063 idx := v_0.Args[1] 13064 val := v.Args[1] 13065 mem := v.Args[2] 13066 if !(ptr.Op != OpSB) { 13067 break 13068 } 13069 v.reset(OpS390XMOVWstoreidx) 13070 v.AuxInt = off 13071 v.Aux = sym 13072 v.AddArg(ptr) 13073 v.AddArg(idx) 13074 v.AddArg(val) 13075 v.AddArg(mem) 13076 return true 13077 } 13078 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 13079 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 13080 // result: (MOVDstore [i-4] {s} p w mem) 13081 for { 13082 i := v.AuxInt 13083 s := v.Aux 13084 p := v.Args[0] 13085 v_1 := v.Args[1] 13086 if v_1.Op != OpS390XSRDconst { 13087 break 13088 } 13089 if v_1.AuxInt != 32 { 13090 break 13091 } 13092 w := v_1.Args[0] 13093 x := v.Args[2] 13094 if x.Op != OpS390XMOVWstore { 13095 break 13096 } 13097 if x.AuxInt != i-4 { 13098 break 13099 } 13100 if x.Aux != s { 13101 break 13102 } 13103 if p != x.Args[0] { 13104 break 13105 } 13106 if w != x.Args[1] { 13107 break 13108 } 13109 mem := x.Args[2] 13110 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 13111 break 13112 } 13113 v.reset(OpS390XMOVDstore) 13114 v.AuxInt = i - 4 13115 v.Aux = s 13116 v.AddArg(p) 13117 v.AddArg(w) 13118 v.AddArg(mem) 13119 return true 13120 } 13121 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 13122 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 13123 // result: (MOVDstore [i-4] {s} p w0 mem) 13124 for { 13125 i := v.AuxInt 13126 s := v.Aux 13127 p := v.Args[0] 13128 w0 := v.Args[1] 13129 if w0.Op != OpS390XSRDconst { 13130 break 13131 } 13132 j := w0.AuxInt 13133 w := w0.Args[0] 13134 x := v.Args[2] 13135 if x.Op != OpS390XMOVWstore { 13136 break 13137 } 13138 if x.AuxInt != i-4 { 13139 break 13140 } 13141 if x.Aux != s { 13142 break 13143 } 13144 if p != x.Args[0] { 13145 break 13146 } 13147 x_1 := x.Args[1] 13148 if x_1.Op != OpS390XSRDconst { 13149 break 13150 } 13151 if x_1.AuxInt != j+32 { 13152 break 13153 } 13154 if w != x_1.Args[0] { 13155 break 13156 } 13157 mem := x.Args[2] 13158 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 13159 break 13160 } 13161 v.reset(OpS390XMOVDstore) 13162 v.AuxInt = i - 4 13163 v.Aux = s 13164 v.AddArg(p) 13165 v.AddArg(w0) 13166 v.AddArg(mem) 13167 return true 13168 } 13169 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 13170 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 13171 // result: (STM2 [i-4] {s} p w0 w1 mem) 13172 for { 13173 i := v.AuxInt 13174 s := v.Aux 13175 p := v.Args[0] 13176 w1 := v.Args[1] 13177 x := v.Args[2] 13178 if x.Op != OpS390XMOVWstore { 13179 break 13180 } 13181 if x.AuxInt != i-4 { 13182 break 13183 } 13184 if x.Aux != s { 13185 break 13186 } 13187 if p != x.Args[0] { 13188 break 13189 } 13190 w0 := x.Args[1] 13191 mem := x.Args[2] 13192 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 13193 break 13194 } 13195 v.reset(OpS390XSTM2) 13196 v.AuxInt = i - 4 13197 v.Aux = s 13198 v.AddArg(p) 13199 v.AddArg(w0) 13200 v.AddArg(w1) 13201 v.AddArg(mem) 13202 return true 13203 } 13204 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 13205 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 13206 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 13207 for { 13208 i := v.AuxInt 13209 s := v.Aux 13210 p := v.Args[0] 13211 w2 := v.Args[1] 13212 x := v.Args[2] 13213 if x.Op != OpS390XSTM2 { 13214 break 13215 } 13216 if x.AuxInt != i-8 { 13217 break 13218 } 13219 if x.Aux != s { 13220 break 13221 } 13222 if p != x.Args[0] { 13223 break 13224 } 13225 w0 := x.Args[1] 13226 w1 := x.Args[2] 13227 mem := x.Args[3] 13228 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 13229 break 13230 } 13231 v.reset(OpS390XSTM3) 13232 v.AuxInt = i - 8 13233 v.Aux = s 13234 v.AddArg(p) 13235 v.AddArg(w0) 13236 v.AddArg(w1) 13237 v.AddArg(w2) 13238 v.AddArg(mem) 13239 return true 13240 } 13241 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 13242 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 13243 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 13244 for { 13245 i := v.AuxInt 13246 s := v.Aux 13247 p := v.Args[0] 13248 w3 := v.Args[1] 13249 x := v.Args[2] 13250 if x.Op != OpS390XSTM3 { 13251 break 13252 } 13253 if x.AuxInt != i-12 { 13254 break 13255 } 13256 if x.Aux != s { 13257 break 13258 } 13259 if p != x.Args[0] { 13260 break 13261 } 13262 w0 := x.Args[1] 13263 w1 := x.Args[2] 13264 w2 := x.Args[3] 13265 mem := x.Args[4] 13266 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 13267 break 13268 } 13269 v.reset(OpS390XSTM4) 13270 v.AuxInt = i - 12 13271 v.Aux = s 13272 v.AddArg(p) 13273 v.AddArg(w0) 13274 v.AddArg(w1) 13275 v.AddArg(w2) 13276 v.AddArg(w3) 13277 v.AddArg(mem) 13278 return true 13279 } 13280 return false 13281 } 13282 func rewriteValueS390X_OpS390XMOVWstoreconst(v *Value, config *Config) bool { 13283 b := v.Block 13284 _ = b 13285 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 13286 // cond: ValAndOff(sc).canAdd(off) 13287 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 13288 for { 13289 sc := v.AuxInt 13290 s := v.Aux 13291 v_0 := v.Args[0] 13292 if v_0.Op != OpS390XADDconst { 13293 break 13294 } 13295 off := v_0.AuxInt 13296 ptr := v_0.Args[0] 13297 mem := v.Args[1] 13298 if !(ValAndOff(sc).canAdd(off)) { 13299 break 13300 } 13301 v.reset(OpS390XMOVWstoreconst) 13302 v.AuxInt = ValAndOff(sc).add(off) 13303 v.Aux = s 13304 v.AddArg(ptr) 13305 v.AddArg(mem) 13306 return true 13307 } 13308 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 13309 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 13310 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 13311 for { 13312 sc := v.AuxInt 13313 sym1 := v.Aux 13314 v_0 := v.Args[0] 13315 if v_0.Op != OpS390XMOVDaddr { 13316 break 13317 } 13318 off := v_0.AuxInt 13319 sym2 := v_0.Aux 13320 ptr := v_0.Args[0] 13321 mem := v.Args[1] 13322 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 13323 break 13324 } 13325 v.reset(OpS390XMOVWstoreconst) 13326 v.AuxInt = ValAndOff(sc).add(off) 13327 v.Aux = mergeSym(sym1, sym2) 13328 v.AddArg(ptr) 13329 v.AddArg(mem) 13330 return true 13331 } 13332 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 13333 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 13334 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 13335 for { 13336 c := v.AuxInt 13337 s := v.Aux 13338 p := v.Args[0] 13339 x := v.Args[1] 13340 if x.Op != OpS390XMOVWstoreconst { 13341 break 13342 } 13343 a := x.AuxInt 13344 if x.Aux != s { 13345 break 13346 } 13347 if p != x.Args[0] { 13348 break 13349 } 13350 mem := x.Args[1] 13351 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 13352 break 13353 } 13354 v.reset(OpS390XMOVDstore) 13355 v.AuxInt = ValAndOff(a).Off() 13356 v.Aux = s 13357 v.AddArg(p) 13358 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 13359 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 13360 v.AddArg(v0) 13361 v.AddArg(mem) 13362 return true 13363 } 13364 return false 13365 } 13366 func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value, config *Config) bool { 13367 b := v.Block 13368 _ = b 13369 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 13370 // cond: 13371 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 13372 for { 13373 c := v.AuxInt 13374 sym := v.Aux 13375 v_0 := v.Args[0] 13376 if v_0.Op != OpS390XADDconst { 13377 break 13378 } 13379 d := v_0.AuxInt 13380 ptr := v_0.Args[0] 13381 idx := v.Args[1] 13382 val := v.Args[2] 13383 mem := v.Args[3] 13384 v.reset(OpS390XMOVWstoreidx) 13385 v.AuxInt = c + d 13386 v.Aux = sym 13387 v.AddArg(ptr) 13388 v.AddArg(idx) 13389 v.AddArg(val) 13390 v.AddArg(mem) 13391 return true 13392 } 13393 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 13394 // cond: 13395 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 13396 for { 13397 c := v.AuxInt 13398 sym := v.Aux 13399 ptr := v.Args[0] 13400 v_1 := v.Args[1] 13401 if v_1.Op != OpS390XADDconst { 13402 break 13403 } 13404 d := v_1.AuxInt 13405 idx := v_1.Args[0] 13406 val := v.Args[2] 13407 mem := v.Args[3] 13408 v.reset(OpS390XMOVWstoreidx) 13409 v.AuxInt = c + d 13410 v.Aux = sym 13411 v.AddArg(ptr) 13412 v.AddArg(idx) 13413 v.AddArg(val) 13414 v.AddArg(mem) 13415 return true 13416 } 13417 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 13418 // cond: x.Uses == 1 && clobber(x) 13419 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 13420 for { 13421 i := v.AuxInt 13422 s := v.Aux 13423 p := v.Args[0] 13424 idx := v.Args[1] 13425 w := v.Args[2] 13426 x := v.Args[3] 13427 if x.Op != OpS390XMOVWstoreidx { 13428 break 13429 } 13430 if x.AuxInt != i-4 { 13431 break 13432 } 13433 if x.Aux != s { 13434 break 13435 } 13436 if p != x.Args[0] { 13437 break 13438 } 13439 if idx != x.Args[1] { 13440 break 13441 } 13442 x_2 := x.Args[2] 13443 if x_2.Op != OpS390XSRDconst { 13444 break 13445 } 13446 if x_2.AuxInt != 32 { 13447 break 13448 } 13449 if w != x_2.Args[0] { 13450 break 13451 } 13452 mem := x.Args[3] 13453 if !(x.Uses == 1 && clobber(x)) { 13454 break 13455 } 13456 v.reset(OpS390XMOVDstoreidx) 13457 v.AuxInt = i - 4 13458 v.Aux = s 13459 v.AddArg(p) 13460 v.AddArg(idx) 13461 v.AddArg(w) 13462 v.AddArg(mem) 13463 return true 13464 } 13465 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 13466 // cond: x.Uses == 1 && clobber(x) 13467 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 13468 for { 13469 i := v.AuxInt 13470 s := v.Aux 13471 p := v.Args[0] 13472 idx := v.Args[1] 13473 w0 := v.Args[2] 13474 if w0.Op != OpS390XSRDconst { 13475 break 13476 } 13477 j := w0.AuxInt 13478 w := w0.Args[0] 13479 x := v.Args[3] 13480 if x.Op != OpS390XMOVWstoreidx { 13481 break 13482 } 13483 if x.AuxInt != i-4 { 13484 break 13485 } 13486 if x.Aux != s { 13487 break 13488 } 13489 if p != x.Args[0] { 13490 break 13491 } 13492 if idx != x.Args[1] { 13493 break 13494 } 13495 x_2 := x.Args[2] 13496 if x_2.Op != OpS390XSRDconst { 13497 break 13498 } 13499 if x_2.AuxInt != j+32 { 13500 break 13501 } 13502 if w != x_2.Args[0] { 13503 break 13504 } 13505 mem := x.Args[3] 13506 if !(x.Uses == 1 && clobber(x)) { 13507 break 13508 } 13509 v.reset(OpS390XMOVDstoreidx) 13510 v.AuxInt = i - 4 13511 v.Aux = s 13512 v.AddArg(p) 13513 v.AddArg(idx) 13514 v.AddArg(w0) 13515 v.AddArg(mem) 13516 return true 13517 } 13518 return false 13519 } 13520 func rewriteValueS390X_OpS390XMULLD(v *Value, config *Config) bool { 13521 b := v.Block 13522 _ = b 13523 // match: (MULLD x (MOVDconst [c])) 13524 // cond: is32Bit(c) 13525 // result: (MULLDconst [c] x) 13526 for { 13527 x := v.Args[0] 13528 v_1 := v.Args[1] 13529 if v_1.Op != OpS390XMOVDconst { 13530 break 13531 } 13532 c := v_1.AuxInt 13533 if !(is32Bit(c)) { 13534 break 13535 } 13536 v.reset(OpS390XMULLDconst) 13537 v.AuxInt = c 13538 v.AddArg(x) 13539 return true 13540 } 13541 // match: (MULLD (MOVDconst [c]) x) 13542 // cond: is32Bit(c) 13543 // result: (MULLDconst [c] x) 13544 for { 13545 v_0 := v.Args[0] 13546 if v_0.Op != OpS390XMOVDconst { 13547 break 13548 } 13549 c := v_0.AuxInt 13550 x := v.Args[1] 13551 if !(is32Bit(c)) { 13552 break 13553 } 13554 v.reset(OpS390XMULLDconst) 13555 v.AuxInt = c 13556 v.AddArg(x) 13557 return true 13558 } 13559 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 13560 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 13561 // result: (MULLDload <t> [off] {sym} x ptr mem) 13562 for { 13563 t := v.Type 13564 x := v.Args[0] 13565 g := v.Args[1] 13566 if g.Op != OpS390XMOVDload { 13567 break 13568 } 13569 off := g.AuxInt 13570 sym := g.Aux 13571 ptr := g.Args[0] 13572 mem := g.Args[1] 13573 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 13574 break 13575 } 13576 v.reset(OpS390XMULLDload) 13577 v.Type = t 13578 v.AuxInt = off 13579 v.Aux = sym 13580 v.AddArg(x) 13581 v.AddArg(ptr) 13582 v.AddArg(mem) 13583 return true 13584 } 13585 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 13586 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 13587 // result: (MULLDload <t> [off] {sym} x ptr mem) 13588 for { 13589 t := v.Type 13590 g := v.Args[0] 13591 if g.Op != OpS390XMOVDload { 13592 break 13593 } 13594 off := g.AuxInt 13595 sym := g.Aux 13596 ptr := g.Args[0] 13597 mem := g.Args[1] 13598 x := v.Args[1] 13599 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 13600 break 13601 } 13602 v.reset(OpS390XMULLDload) 13603 v.Type = t 13604 v.AuxInt = off 13605 v.Aux = sym 13606 v.AddArg(x) 13607 v.AddArg(ptr) 13608 v.AddArg(mem) 13609 return true 13610 } 13611 return false 13612 } 13613 func rewriteValueS390X_OpS390XMULLDconst(v *Value, config *Config) bool { 13614 b := v.Block 13615 _ = b 13616 // match: (MULLDconst [-1] x) 13617 // cond: 13618 // result: (NEG x) 13619 for { 13620 if v.AuxInt != -1 { 13621 break 13622 } 13623 x := v.Args[0] 13624 v.reset(OpS390XNEG) 13625 v.AddArg(x) 13626 return true 13627 } 13628 // match: (MULLDconst [0] _) 13629 // cond: 13630 // result: (MOVDconst [0]) 13631 for { 13632 if v.AuxInt != 0 { 13633 break 13634 } 13635 v.reset(OpS390XMOVDconst) 13636 v.AuxInt = 0 13637 return true 13638 } 13639 // match: (MULLDconst [1] x) 13640 // cond: 13641 // result: x 13642 for { 13643 if v.AuxInt != 1 { 13644 break 13645 } 13646 x := v.Args[0] 13647 v.reset(OpCopy) 13648 v.Type = x.Type 13649 v.AddArg(x) 13650 return true 13651 } 13652 // match: (MULLDconst [c] x) 13653 // cond: isPowerOfTwo(c) 13654 // result: (SLDconst [log2(c)] x) 13655 for { 13656 c := v.AuxInt 13657 x := v.Args[0] 13658 if !(isPowerOfTwo(c)) { 13659 break 13660 } 13661 v.reset(OpS390XSLDconst) 13662 v.AuxInt = log2(c) 13663 v.AddArg(x) 13664 return true 13665 } 13666 // match: (MULLDconst [c] x) 13667 // cond: isPowerOfTwo(c+1) && c >= 15 13668 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 13669 for { 13670 c := v.AuxInt 13671 x := v.Args[0] 13672 if !(isPowerOfTwo(c+1) && c >= 15) { 13673 break 13674 } 13675 v.reset(OpS390XSUB) 13676 v0 := b.NewValue0(v.Line, OpS390XSLDconst, v.Type) 13677 v0.AuxInt = log2(c + 1) 13678 v0.AddArg(x) 13679 v.AddArg(v0) 13680 v.AddArg(x) 13681 return true 13682 } 13683 // match: (MULLDconst [c] x) 13684 // cond: isPowerOfTwo(c-1) && c >= 17 13685 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 13686 for { 13687 c := v.AuxInt 13688 x := v.Args[0] 13689 if !(isPowerOfTwo(c-1) && c >= 17) { 13690 break 13691 } 13692 v.reset(OpS390XADD) 13693 v0 := b.NewValue0(v.Line, OpS390XSLDconst, v.Type) 13694 v0.AuxInt = log2(c - 1) 13695 v0.AddArg(x) 13696 v.AddArg(v0) 13697 v.AddArg(x) 13698 return true 13699 } 13700 // match: (MULLDconst [c] (MOVDconst [d])) 13701 // cond: 13702 // result: (MOVDconst [c*d]) 13703 for { 13704 c := v.AuxInt 13705 v_0 := v.Args[0] 13706 if v_0.Op != OpS390XMOVDconst { 13707 break 13708 } 13709 d := v_0.AuxInt 13710 v.reset(OpS390XMOVDconst) 13711 v.AuxInt = c * d 13712 return true 13713 } 13714 return false 13715 } 13716 func rewriteValueS390X_OpS390XMULLW(v *Value, config *Config) bool { 13717 b := v.Block 13718 _ = b 13719 // match: (MULLW x (MOVDconst [c])) 13720 // cond: 13721 // result: (MULLWconst [c] x) 13722 for { 13723 x := v.Args[0] 13724 v_1 := v.Args[1] 13725 if v_1.Op != OpS390XMOVDconst { 13726 break 13727 } 13728 c := v_1.AuxInt 13729 v.reset(OpS390XMULLWconst) 13730 v.AuxInt = c 13731 v.AddArg(x) 13732 return true 13733 } 13734 // match: (MULLW (MOVDconst [c]) x) 13735 // cond: 13736 // result: (MULLWconst [c] x) 13737 for { 13738 v_0 := v.Args[0] 13739 if v_0.Op != OpS390XMOVDconst { 13740 break 13741 } 13742 c := v_0.AuxInt 13743 x := v.Args[1] 13744 v.reset(OpS390XMULLWconst) 13745 v.AuxInt = c 13746 v.AddArg(x) 13747 return true 13748 } 13749 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 13750 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 13751 // result: (MULLWload <t> [off] {sym} x ptr mem) 13752 for { 13753 t := v.Type 13754 x := v.Args[0] 13755 g := v.Args[1] 13756 if g.Op != OpS390XMOVWload { 13757 break 13758 } 13759 off := g.AuxInt 13760 sym := g.Aux 13761 ptr := g.Args[0] 13762 mem := g.Args[1] 13763 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 13764 break 13765 } 13766 v.reset(OpS390XMULLWload) 13767 v.Type = t 13768 v.AuxInt = off 13769 v.Aux = sym 13770 v.AddArg(x) 13771 v.AddArg(ptr) 13772 v.AddArg(mem) 13773 return true 13774 } 13775 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 13776 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 13777 // result: (MULLWload <t> [off] {sym} x ptr mem) 13778 for { 13779 t := v.Type 13780 g := v.Args[0] 13781 if g.Op != OpS390XMOVWload { 13782 break 13783 } 13784 off := g.AuxInt 13785 sym := g.Aux 13786 ptr := g.Args[0] 13787 mem := g.Args[1] 13788 x := v.Args[1] 13789 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 13790 break 13791 } 13792 v.reset(OpS390XMULLWload) 13793 v.Type = t 13794 v.AuxInt = off 13795 v.Aux = sym 13796 v.AddArg(x) 13797 v.AddArg(ptr) 13798 v.AddArg(mem) 13799 return true 13800 } 13801 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 13802 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 13803 // result: (MULLWload <t> [off] {sym} x ptr mem) 13804 for { 13805 t := v.Type 13806 x := v.Args[0] 13807 g := v.Args[1] 13808 if g.Op != OpS390XMOVWZload { 13809 break 13810 } 13811 off := g.AuxInt 13812 sym := g.Aux 13813 ptr := g.Args[0] 13814 mem := g.Args[1] 13815 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 13816 break 13817 } 13818 v.reset(OpS390XMULLWload) 13819 v.Type = t 13820 v.AuxInt = off 13821 v.Aux = sym 13822 v.AddArg(x) 13823 v.AddArg(ptr) 13824 v.AddArg(mem) 13825 return true 13826 } 13827 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 13828 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 13829 // result: (MULLWload <t> [off] {sym} x ptr mem) 13830 for { 13831 t := v.Type 13832 g := v.Args[0] 13833 if g.Op != OpS390XMOVWZload { 13834 break 13835 } 13836 off := g.AuxInt 13837 sym := g.Aux 13838 ptr := g.Args[0] 13839 mem := g.Args[1] 13840 x := v.Args[1] 13841 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 13842 break 13843 } 13844 v.reset(OpS390XMULLWload) 13845 v.Type = t 13846 v.AuxInt = off 13847 v.Aux = sym 13848 v.AddArg(x) 13849 v.AddArg(ptr) 13850 v.AddArg(mem) 13851 return true 13852 } 13853 return false 13854 } 13855 func rewriteValueS390X_OpS390XMULLWconst(v *Value, config *Config) bool { 13856 b := v.Block 13857 _ = b 13858 // match: (MULLWconst [-1] x) 13859 // cond: 13860 // result: (NEGW x) 13861 for { 13862 if v.AuxInt != -1 { 13863 break 13864 } 13865 x := v.Args[0] 13866 v.reset(OpS390XNEGW) 13867 v.AddArg(x) 13868 return true 13869 } 13870 // match: (MULLWconst [0] _) 13871 // cond: 13872 // result: (MOVDconst [0]) 13873 for { 13874 if v.AuxInt != 0 { 13875 break 13876 } 13877 v.reset(OpS390XMOVDconst) 13878 v.AuxInt = 0 13879 return true 13880 } 13881 // match: (MULLWconst [1] x) 13882 // cond: 13883 // result: x 13884 for { 13885 if v.AuxInt != 1 { 13886 break 13887 } 13888 x := v.Args[0] 13889 v.reset(OpCopy) 13890 v.Type = x.Type 13891 v.AddArg(x) 13892 return true 13893 } 13894 // match: (MULLWconst [c] x) 13895 // cond: isPowerOfTwo(c) 13896 // result: (SLWconst [log2(c)] x) 13897 for { 13898 c := v.AuxInt 13899 x := v.Args[0] 13900 if !(isPowerOfTwo(c)) { 13901 break 13902 } 13903 v.reset(OpS390XSLWconst) 13904 v.AuxInt = log2(c) 13905 v.AddArg(x) 13906 return true 13907 } 13908 // match: (MULLWconst [c] x) 13909 // cond: isPowerOfTwo(c+1) && c >= 15 13910 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 13911 for { 13912 c := v.AuxInt 13913 x := v.Args[0] 13914 if !(isPowerOfTwo(c+1) && c >= 15) { 13915 break 13916 } 13917 v.reset(OpS390XSUBW) 13918 v0 := b.NewValue0(v.Line, OpS390XSLWconst, v.Type) 13919 v0.AuxInt = log2(c + 1) 13920 v0.AddArg(x) 13921 v.AddArg(v0) 13922 v.AddArg(x) 13923 return true 13924 } 13925 // match: (MULLWconst [c] x) 13926 // cond: isPowerOfTwo(c-1) && c >= 17 13927 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 13928 for { 13929 c := v.AuxInt 13930 x := v.Args[0] 13931 if !(isPowerOfTwo(c-1) && c >= 17) { 13932 break 13933 } 13934 v.reset(OpS390XADDW) 13935 v0 := b.NewValue0(v.Line, OpS390XSLWconst, v.Type) 13936 v0.AuxInt = log2(c - 1) 13937 v0.AddArg(x) 13938 v.AddArg(v0) 13939 v.AddArg(x) 13940 return true 13941 } 13942 // match: (MULLWconst [c] (MOVDconst [d])) 13943 // cond: 13944 // result: (MOVDconst [int64(int32(c*d))]) 13945 for { 13946 c := v.AuxInt 13947 v_0 := v.Args[0] 13948 if v_0.Op != OpS390XMOVDconst { 13949 break 13950 } 13951 d := v_0.AuxInt 13952 v.reset(OpS390XMOVDconst) 13953 v.AuxInt = int64(int32(c * d)) 13954 return true 13955 } 13956 return false 13957 } 13958 func rewriteValueS390X_OpS390XNEG(v *Value, config *Config) bool { 13959 b := v.Block 13960 _ = b 13961 // match: (NEG (MOVDconst [c])) 13962 // cond: 13963 // result: (MOVDconst [-c]) 13964 for { 13965 v_0 := v.Args[0] 13966 if v_0.Op != OpS390XMOVDconst { 13967 break 13968 } 13969 c := v_0.AuxInt 13970 v.reset(OpS390XMOVDconst) 13971 v.AuxInt = -c 13972 return true 13973 } 13974 return false 13975 } 13976 func rewriteValueS390X_OpS390XNEGW(v *Value, config *Config) bool { 13977 b := v.Block 13978 _ = b 13979 // match: (NEGW (MOVDconst [c])) 13980 // cond: 13981 // result: (MOVDconst [int64(int32(-c))]) 13982 for { 13983 v_0 := v.Args[0] 13984 if v_0.Op != OpS390XMOVDconst { 13985 break 13986 } 13987 c := v_0.AuxInt 13988 v.reset(OpS390XMOVDconst) 13989 v.AuxInt = int64(int32(-c)) 13990 return true 13991 } 13992 return false 13993 } 13994 func rewriteValueS390X_OpS390XNOT(v *Value, config *Config) bool { 13995 b := v.Block 13996 _ = b 13997 // match: (NOT x) 13998 // cond: true 13999 // result: (XOR (MOVDconst [-1]) x) 14000 for { 14001 x := v.Args[0] 14002 if !(true) { 14003 break 14004 } 14005 v.reset(OpS390XXOR) 14006 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 14007 v0.AuxInt = -1 14008 v.AddArg(v0) 14009 v.AddArg(x) 14010 return true 14011 } 14012 return false 14013 } 14014 func rewriteValueS390X_OpS390XNOTW(v *Value, config *Config) bool { 14015 b := v.Block 14016 _ = b 14017 // match: (NOTW x) 14018 // cond: true 14019 // result: (XORWconst [-1] x) 14020 for { 14021 x := v.Args[0] 14022 if !(true) { 14023 break 14024 } 14025 v.reset(OpS390XXORWconst) 14026 v.AuxInt = -1 14027 v.AddArg(x) 14028 return true 14029 } 14030 return false 14031 } 14032 func rewriteValueS390X_OpS390XOR(v *Value, config *Config) bool { 14033 b := v.Block 14034 _ = b 14035 // match: (OR x (MOVDconst [c])) 14036 // cond: isU32Bit(c) 14037 // result: (ORconst [c] x) 14038 for { 14039 x := v.Args[0] 14040 v_1 := v.Args[1] 14041 if v_1.Op != OpS390XMOVDconst { 14042 break 14043 } 14044 c := v_1.AuxInt 14045 if !(isU32Bit(c)) { 14046 break 14047 } 14048 v.reset(OpS390XORconst) 14049 v.AuxInt = c 14050 v.AddArg(x) 14051 return true 14052 } 14053 // match: (OR (MOVDconst [c]) x) 14054 // cond: isU32Bit(c) 14055 // result: (ORconst [c] x) 14056 for { 14057 v_0 := v.Args[0] 14058 if v_0.Op != OpS390XMOVDconst { 14059 break 14060 } 14061 c := v_0.AuxInt 14062 x := v.Args[1] 14063 if !(isU32Bit(c)) { 14064 break 14065 } 14066 v.reset(OpS390XORconst) 14067 v.AuxInt = c 14068 v.AddArg(x) 14069 return true 14070 } 14071 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 14072 // cond: 14073 // result: (MOVDconst [c|d]) 14074 for { 14075 v_0 := v.Args[0] 14076 if v_0.Op != OpS390XMOVDconst { 14077 break 14078 } 14079 c := v_0.AuxInt 14080 v_1 := v.Args[1] 14081 if v_1.Op != OpS390XMOVDconst { 14082 break 14083 } 14084 d := v_1.AuxInt 14085 v.reset(OpS390XMOVDconst) 14086 v.AuxInt = c | d 14087 return true 14088 } 14089 // match: (OR x x) 14090 // cond: 14091 // result: x 14092 for { 14093 x := v.Args[0] 14094 if x != v.Args[1] { 14095 break 14096 } 14097 v.reset(OpCopy) 14098 v.Type = x.Type 14099 v.AddArg(x) 14100 return true 14101 } 14102 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 14103 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 14104 // result: (ORload <t> [off] {sym} x ptr mem) 14105 for { 14106 t := v.Type 14107 x := v.Args[0] 14108 g := v.Args[1] 14109 if g.Op != OpS390XMOVDload { 14110 break 14111 } 14112 off := g.AuxInt 14113 sym := g.Aux 14114 ptr := g.Args[0] 14115 mem := g.Args[1] 14116 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 14117 break 14118 } 14119 v.reset(OpS390XORload) 14120 v.Type = t 14121 v.AuxInt = off 14122 v.Aux = sym 14123 v.AddArg(x) 14124 v.AddArg(ptr) 14125 v.AddArg(mem) 14126 return true 14127 } 14128 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 14129 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 14130 // result: (ORload <t> [off] {sym} x ptr mem) 14131 for { 14132 t := v.Type 14133 g := v.Args[0] 14134 if g.Op != OpS390XMOVDload { 14135 break 14136 } 14137 off := g.AuxInt 14138 sym := g.Aux 14139 ptr := g.Args[0] 14140 mem := g.Args[1] 14141 x := v.Args[1] 14142 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 14143 break 14144 } 14145 v.reset(OpS390XORload) 14146 v.Type = t 14147 v.AuxInt = off 14148 v.Aux = sym 14149 v.AddArg(x) 14150 v.AddArg(ptr) 14151 v.AddArg(mem) 14152 return true 14153 } 14154 // match: (OR o0:(OR o1:(OR o2:(OR o3:(OR o4:(OR o5:(OR x0:(MOVBZload [i] {s} p mem) s0:(SLDconst [8] x1:(MOVBZload [i+1] {s} p mem))) s1:(SLDconst [16] x2:(MOVBZload [i+2] {s} p mem))) s2:(SLDconst [24] x3:(MOVBZload [i+3] {s} p mem))) s3:(SLDconst [32] x4:(MOVBZload [i+4] {s} p mem))) s4:(SLDconst [40] x5:(MOVBZload [i+5] {s} p mem))) s5:(SLDconst [48] x6:(MOVBZload [i+6] {s} p mem))) s6:(SLDconst [56] x7:(MOVBZload [i+7] {s} p mem))) 14155 // cond: p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) 14156 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDBRload [i] {s} p mem) 14157 for { 14158 o0 := v.Args[0] 14159 if o0.Op != OpS390XOR { 14160 break 14161 } 14162 o1 := o0.Args[0] 14163 if o1.Op != OpS390XOR { 14164 break 14165 } 14166 o2 := o1.Args[0] 14167 if o2.Op != OpS390XOR { 14168 break 14169 } 14170 o3 := o2.Args[0] 14171 if o3.Op != OpS390XOR { 14172 break 14173 } 14174 o4 := o3.Args[0] 14175 if o4.Op != OpS390XOR { 14176 break 14177 } 14178 o5 := o4.Args[0] 14179 if o5.Op != OpS390XOR { 14180 break 14181 } 14182 x0 := o5.Args[0] 14183 if x0.Op != OpS390XMOVBZload { 14184 break 14185 } 14186 i := x0.AuxInt 14187 s := x0.Aux 14188 p := x0.Args[0] 14189 mem := x0.Args[1] 14190 s0 := o5.Args[1] 14191 if s0.Op != OpS390XSLDconst { 14192 break 14193 } 14194 if s0.AuxInt != 8 { 14195 break 14196 } 14197 x1 := s0.Args[0] 14198 if x1.Op != OpS390XMOVBZload { 14199 break 14200 } 14201 if x1.AuxInt != i+1 { 14202 break 14203 } 14204 if x1.Aux != s { 14205 break 14206 } 14207 if p != x1.Args[0] { 14208 break 14209 } 14210 if mem != x1.Args[1] { 14211 break 14212 } 14213 s1 := o4.Args[1] 14214 if s1.Op != OpS390XSLDconst { 14215 break 14216 } 14217 if s1.AuxInt != 16 { 14218 break 14219 } 14220 x2 := s1.Args[0] 14221 if x2.Op != OpS390XMOVBZload { 14222 break 14223 } 14224 if x2.AuxInt != i+2 { 14225 break 14226 } 14227 if x2.Aux != s { 14228 break 14229 } 14230 if p != x2.Args[0] { 14231 break 14232 } 14233 if mem != x2.Args[1] { 14234 break 14235 } 14236 s2 := o3.Args[1] 14237 if s2.Op != OpS390XSLDconst { 14238 break 14239 } 14240 if s2.AuxInt != 24 { 14241 break 14242 } 14243 x3 := s2.Args[0] 14244 if x3.Op != OpS390XMOVBZload { 14245 break 14246 } 14247 if x3.AuxInt != i+3 { 14248 break 14249 } 14250 if x3.Aux != s { 14251 break 14252 } 14253 if p != x3.Args[0] { 14254 break 14255 } 14256 if mem != x3.Args[1] { 14257 break 14258 } 14259 s3 := o2.Args[1] 14260 if s3.Op != OpS390XSLDconst { 14261 break 14262 } 14263 if s3.AuxInt != 32 { 14264 break 14265 } 14266 x4 := s3.Args[0] 14267 if x4.Op != OpS390XMOVBZload { 14268 break 14269 } 14270 if x4.AuxInt != i+4 { 14271 break 14272 } 14273 if x4.Aux != s { 14274 break 14275 } 14276 if p != x4.Args[0] { 14277 break 14278 } 14279 if mem != x4.Args[1] { 14280 break 14281 } 14282 s4 := o1.Args[1] 14283 if s4.Op != OpS390XSLDconst { 14284 break 14285 } 14286 if s4.AuxInt != 40 { 14287 break 14288 } 14289 x5 := s4.Args[0] 14290 if x5.Op != OpS390XMOVBZload { 14291 break 14292 } 14293 if x5.AuxInt != i+5 { 14294 break 14295 } 14296 if x5.Aux != s { 14297 break 14298 } 14299 if p != x5.Args[0] { 14300 break 14301 } 14302 if mem != x5.Args[1] { 14303 break 14304 } 14305 s5 := o0.Args[1] 14306 if s5.Op != OpS390XSLDconst { 14307 break 14308 } 14309 if s5.AuxInt != 48 { 14310 break 14311 } 14312 x6 := s5.Args[0] 14313 if x6.Op != OpS390XMOVBZload { 14314 break 14315 } 14316 if x6.AuxInt != i+6 { 14317 break 14318 } 14319 if x6.Aux != s { 14320 break 14321 } 14322 if p != x6.Args[0] { 14323 break 14324 } 14325 if mem != x6.Args[1] { 14326 break 14327 } 14328 s6 := v.Args[1] 14329 if s6.Op != OpS390XSLDconst { 14330 break 14331 } 14332 if s6.AuxInt != 56 { 14333 break 14334 } 14335 x7 := s6.Args[0] 14336 if x7.Op != OpS390XMOVBZload { 14337 break 14338 } 14339 if x7.AuxInt != i+7 { 14340 break 14341 } 14342 if x7.Aux != s { 14343 break 14344 } 14345 if p != x7.Args[0] { 14346 break 14347 } 14348 if mem != x7.Args[1] { 14349 break 14350 } 14351 if !(p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5)) { 14352 break 14353 } 14354 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 14355 v0 := b.NewValue0(v.Line, OpS390XMOVDBRload, config.fe.TypeUInt64()) 14356 v.reset(OpCopy) 14357 v.AddArg(v0) 14358 v0.AuxInt = i 14359 v0.Aux = s 14360 v0.AddArg(p) 14361 v0.AddArg(mem) 14362 return true 14363 } 14364 // match: (OR o0:(OR o1:(OR o2:(OR o3:(OR o4:(OR o5:(OR x0:(MOVBZloadidx [i] {s} p idx mem) s0:(SLDconst [8] x1:(MOVBZloadidx [i+1] {s} p idx mem))) s1:(SLDconst [16] x2:(MOVBZloadidx [i+2] {s} p idx mem))) s2:(SLDconst [24] x3:(MOVBZloadidx [i+3] {s} p idx mem))) s3:(SLDconst [32] x4:(MOVBZloadidx [i+4] {s} p idx mem))) s4:(SLDconst [40] x5:(MOVBZloadidx [i+5] {s} p idx mem))) s5:(SLDconst [48] x6:(MOVBZloadidx [i+6] {s} p idx mem))) s6:(SLDconst [56] x7:(MOVBZloadidx [i+7] {s} p idx mem))) 14365 // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) 14366 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDBRloadidx <v.Type> [i] {s} p idx mem) 14367 for { 14368 o0 := v.Args[0] 14369 if o0.Op != OpS390XOR { 14370 break 14371 } 14372 o1 := o0.Args[0] 14373 if o1.Op != OpS390XOR { 14374 break 14375 } 14376 o2 := o1.Args[0] 14377 if o2.Op != OpS390XOR { 14378 break 14379 } 14380 o3 := o2.Args[0] 14381 if o3.Op != OpS390XOR { 14382 break 14383 } 14384 o4 := o3.Args[0] 14385 if o4.Op != OpS390XOR { 14386 break 14387 } 14388 o5 := o4.Args[0] 14389 if o5.Op != OpS390XOR { 14390 break 14391 } 14392 x0 := o5.Args[0] 14393 if x0.Op != OpS390XMOVBZloadidx { 14394 break 14395 } 14396 i := x0.AuxInt 14397 s := x0.Aux 14398 p := x0.Args[0] 14399 idx := x0.Args[1] 14400 mem := x0.Args[2] 14401 s0 := o5.Args[1] 14402 if s0.Op != OpS390XSLDconst { 14403 break 14404 } 14405 if s0.AuxInt != 8 { 14406 break 14407 } 14408 x1 := s0.Args[0] 14409 if x1.Op != OpS390XMOVBZloadidx { 14410 break 14411 } 14412 if x1.AuxInt != i+1 { 14413 break 14414 } 14415 if x1.Aux != s { 14416 break 14417 } 14418 if p != x1.Args[0] { 14419 break 14420 } 14421 if idx != x1.Args[1] { 14422 break 14423 } 14424 if mem != x1.Args[2] { 14425 break 14426 } 14427 s1 := o4.Args[1] 14428 if s1.Op != OpS390XSLDconst { 14429 break 14430 } 14431 if s1.AuxInt != 16 { 14432 break 14433 } 14434 x2 := s1.Args[0] 14435 if x2.Op != OpS390XMOVBZloadidx { 14436 break 14437 } 14438 if x2.AuxInt != i+2 { 14439 break 14440 } 14441 if x2.Aux != s { 14442 break 14443 } 14444 if p != x2.Args[0] { 14445 break 14446 } 14447 if idx != x2.Args[1] { 14448 break 14449 } 14450 if mem != x2.Args[2] { 14451 break 14452 } 14453 s2 := o3.Args[1] 14454 if s2.Op != OpS390XSLDconst { 14455 break 14456 } 14457 if s2.AuxInt != 24 { 14458 break 14459 } 14460 x3 := s2.Args[0] 14461 if x3.Op != OpS390XMOVBZloadidx { 14462 break 14463 } 14464 if x3.AuxInt != i+3 { 14465 break 14466 } 14467 if x3.Aux != s { 14468 break 14469 } 14470 if p != x3.Args[0] { 14471 break 14472 } 14473 if idx != x3.Args[1] { 14474 break 14475 } 14476 if mem != x3.Args[2] { 14477 break 14478 } 14479 s3 := o2.Args[1] 14480 if s3.Op != OpS390XSLDconst { 14481 break 14482 } 14483 if s3.AuxInt != 32 { 14484 break 14485 } 14486 x4 := s3.Args[0] 14487 if x4.Op != OpS390XMOVBZloadidx { 14488 break 14489 } 14490 if x4.AuxInt != i+4 { 14491 break 14492 } 14493 if x4.Aux != s { 14494 break 14495 } 14496 if p != x4.Args[0] { 14497 break 14498 } 14499 if idx != x4.Args[1] { 14500 break 14501 } 14502 if mem != x4.Args[2] { 14503 break 14504 } 14505 s4 := o1.Args[1] 14506 if s4.Op != OpS390XSLDconst { 14507 break 14508 } 14509 if s4.AuxInt != 40 { 14510 break 14511 } 14512 x5 := s4.Args[0] 14513 if x5.Op != OpS390XMOVBZloadidx { 14514 break 14515 } 14516 if x5.AuxInt != i+5 { 14517 break 14518 } 14519 if x5.Aux != s { 14520 break 14521 } 14522 if p != x5.Args[0] { 14523 break 14524 } 14525 if idx != x5.Args[1] { 14526 break 14527 } 14528 if mem != x5.Args[2] { 14529 break 14530 } 14531 s5 := o0.Args[1] 14532 if s5.Op != OpS390XSLDconst { 14533 break 14534 } 14535 if s5.AuxInt != 48 { 14536 break 14537 } 14538 x6 := s5.Args[0] 14539 if x6.Op != OpS390XMOVBZloadidx { 14540 break 14541 } 14542 if x6.AuxInt != i+6 { 14543 break 14544 } 14545 if x6.Aux != s { 14546 break 14547 } 14548 if p != x6.Args[0] { 14549 break 14550 } 14551 if idx != x6.Args[1] { 14552 break 14553 } 14554 if mem != x6.Args[2] { 14555 break 14556 } 14557 s6 := v.Args[1] 14558 if s6.Op != OpS390XSLDconst { 14559 break 14560 } 14561 if s6.AuxInt != 56 { 14562 break 14563 } 14564 x7 := s6.Args[0] 14565 if x7.Op != OpS390XMOVBZloadidx { 14566 break 14567 } 14568 if x7.AuxInt != i+7 { 14569 break 14570 } 14571 if x7.Aux != s { 14572 break 14573 } 14574 if p != x7.Args[0] { 14575 break 14576 } 14577 if idx != x7.Args[1] { 14578 break 14579 } 14580 if mem != x7.Args[2] { 14581 break 14582 } 14583 if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5)) { 14584 break 14585 } 14586 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 14587 v0 := b.NewValue0(v.Line, OpS390XMOVDBRloadidx, v.Type) 14588 v.reset(OpCopy) 14589 v.AddArg(v0) 14590 v0.AuxInt = i 14591 v0.Aux = s 14592 v0.AddArg(p) 14593 v0.AddArg(idx) 14594 v0.AddArg(mem) 14595 return true 14596 } 14597 // match: (OR o0:(OR o1:(OR o2:(OR o3:(OR o4:(OR o5:(OR x0:(MOVBZload [i] {s} p mem) s0:(SLDconst [8] x1:(MOVBZload [i-1] {s} p mem))) s1:(SLDconst [16] x2:(MOVBZload [i-2] {s} p mem))) s2:(SLDconst [24] x3:(MOVBZload [i-3] {s} p mem))) s3:(SLDconst [32] x4:(MOVBZload [i-4] {s} p mem))) s4:(SLDconst [40] x5:(MOVBZload [i-5] {s} p mem))) s5:(SLDconst [48] x6:(MOVBZload [i-6] {s} p mem))) s6:(SLDconst [56] x7:(MOVBZload [i-7] {s} p mem))) 14598 // cond: p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) 14599 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload [i-7] {s} p mem) 14600 for { 14601 o0 := v.Args[0] 14602 if o0.Op != OpS390XOR { 14603 break 14604 } 14605 o1 := o0.Args[0] 14606 if o1.Op != OpS390XOR { 14607 break 14608 } 14609 o2 := o1.Args[0] 14610 if o2.Op != OpS390XOR { 14611 break 14612 } 14613 o3 := o2.Args[0] 14614 if o3.Op != OpS390XOR { 14615 break 14616 } 14617 o4 := o3.Args[0] 14618 if o4.Op != OpS390XOR { 14619 break 14620 } 14621 o5 := o4.Args[0] 14622 if o5.Op != OpS390XOR { 14623 break 14624 } 14625 x0 := o5.Args[0] 14626 if x0.Op != OpS390XMOVBZload { 14627 break 14628 } 14629 i := x0.AuxInt 14630 s := x0.Aux 14631 p := x0.Args[0] 14632 mem := x0.Args[1] 14633 s0 := o5.Args[1] 14634 if s0.Op != OpS390XSLDconst { 14635 break 14636 } 14637 if s0.AuxInt != 8 { 14638 break 14639 } 14640 x1 := s0.Args[0] 14641 if x1.Op != OpS390XMOVBZload { 14642 break 14643 } 14644 if x1.AuxInt != i-1 { 14645 break 14646 } 14647 if x1.Aux != s { 14648 break 14649 } 14650 if p != x1.Args[0] { 14651 break 14652 } 14653 if mem != x1.Args[1] { 14654 break 14655 } 14656 s1 := o4.Args[1] 14657 if s1.Op != OpS390XSLDconst { 14658 break 14659 } 14660 if s1.AuxInt != 16 { 14661 break 14662 } 14663 x2 := s1.Args[0] 14664 if x2.Op != OpS390XMOVBZload { 14665 break 14666 } 14667 if x2.AuxInt != i-2 { 14668 break 14669 } 14670 if x2.Aux != s { 14671 break 14672 } 14673 if p != x2.Args[0] { 14674 break 14675 } 14676 if mem != x2.Args[1] { 14677 break 14678 } 14679 s2 := o3.Args[1] 14680 if s2.Op != OpS390XSLDconst { 14681 break 14682 } 14683 if s2.AuxInt != 24 { 14684 break 14685 } 14686 x3 := s2.Args[0] 14687 if x3.Op != OpS390XMOVBZload { 14688 break 14689 } 14690 if x3.AuxInt != i-3 { 14691 break 14692 } 14693 if x3.Aux != s { 14694 break 14695 } 14696 if p != x3.Args[0] { 14697 break 14698 } 14699 if mem != x3.Args[1] { 14700 break 14701 } 14702 s3 := o2.Args[1] 14703 if s3.Op != OpS390XSLDconst { 14704 break 14705 } 14706 if s3.AuxInt != 32 { 14707 break 14708 } 14709 x4 := s3.Args[0] 14710 if x4.Op != OpS390XMOVBZload { 14711 break 14712 } 14713 if x4.AuxInt != i-4 { 14714 break 14715 } 14716 if x4.Aux != s { 14717 break 14718 } 14719 if p != x4.Args[0] { 14720 break 14721 } 14722 if mem != x4.Args[1] { 14723 break 14724 } 14725 s4 := o1.Args[1] 14726 if s4.Op != OpS390XSLDconst { 14727 break 14728 } 14729 if s4.AuxInt != 40 { 14730 break 14731 } 14732 x5 := s4.Args[0] 14733 if x5.Op != OpS390XMOVBZload { 14734 break 14735 } 14736 if x5.AuxInt != i-5 { 14737 break 14738 } 14739 if x5.Aux != s { 14740 break 14741 } 14742 if p != x5.Args[0] { 14743 break 14744 } 14745 if mem != x5.Args[1] { 14746 break 14747 } 14748 s5 := o0.Args[1] 14749 if s5.Op != OpS390XSLDconst { 14750 break 14751 } 14752 if s5.AuxInt != 48 { 14753 break 14754 } 14755 x6 := s5.Args[0] 14756 if x6.Op != OpS390XMOVBZload { 14757 break 14758 } 14759 if x6.AuxInt != i-6 { 14760 break 14761 } 14762 if x6.Aux != s { 14763 break 14764 } 14765 if p != x6.Args[0] { 14766 break 14767 } 14768 if mem != x6.Args[1] { 14769 break 14770 } 14771 s6 := v.Args[1] 14772 if s6.Op != OpS390XSLDconst { 14773 break 14774 } 14775 if s6.AuxInt != 56 { 14776 break 14777 } 14778 x7 := s6.Args[0] 14779 if x7.Op != OpS390XMOVBZload { 14780 break 14781 } 14782 if x7.AuxInt != i-7 { 14783 break 14784 } 14785 if x7.Aux != s { 14786 break 14787 } 14788 if p != x7.Args[0] { 14789 break 14790 } 14791 if mem != x7.Args[1] { 14792 break 14793 } 14794 if !(p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5)) { 14795 break 14796 } 14797 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 14798 v0 := b.NewValue0(v.Line, OpS390XMOVDload, config.fe.TypeUInt64()) 14799 v.reset(OpCopy) 14800 v.AddArg(v0) 14801 v0.AuxInt = i - 7 14802 v0.Aux = s 14803 v0.AddArg(p) 14804 v0.AddArg(mem) 14805 return true 14806 } 14807 // match: (OR o0:(OR o1:(OR o2:(OR o3:(OR o4:(OR o5:(OR x0:(MOVBZloadidx [i] {s} p idx mem) s0:(SLDconst [8] x1:(MOVBZloadidx [i-1] {s} p idx mem))) s1:(SLDconst [16] x2:(MOVBZloadidx [i-2] {s} p idx mem))) s2:(SLDconst [24] x3:(MOVBZloadidx [i-3] {s} p idx mem))) s3:(SLDconst [32] x4:(MOVBZloadidx [i-4] {s} p idx mem))) s4:(SLDconst [40] x5:(MOVBZloadidx [i-5] {s} p idx mem))) s5:(SLDconst [48] x6:(MOVBZloadidx [i-6] {s} p idx mem))) s6:(SLDconst [56] x7:(MOVBZloadidx [i-7] {s} p idx mem))) 14808 // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) 14809 // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx <v.Type> [i-7] {s} p idx mem) 14810 for { 14811 o0 := v.Args[0] 14812 if o0.Op != OpS390XOR { 14813 break 14814 } 14815 o1 := o0.Args[0] 14816 if o1.Op != OpS390XOR { 14817 break 14818 } 14819 o2 := o1.Args[0] 14820 if o2.Op != OpS390XOR { 14821 break 14822 } 14823 o3 := o2.Args[0] 14824 if o3.Op != OpS390XOR { 14825 break 14826 } 14827 o4 := o3.Args[0] 14828 if o4.Op != OpS390XOR { 14829 break 14830 } 14831 o5 := o4.Args[0] 14832 if o5.Op != OpS390XOR { 14833 break 14834 } 14835 x0 := o5.Args[0] 14836 if x0.Op != OpS390XMOVBZloadidx { 14837 break 14838 } 14839 i := x0.AuxInt 14840 s := x0.Aux 14841 p := x0.Args[0] 14842 idx := x0.Args[1] 14843 mem := x0.Args[2] 14844 s0 := o5.Args[1] 14845 if s0.Op != OpS390XSLDconst { 14846 break 14847 } 14848 if s0.AuxInt != 8 { 14849 break 14850 } 14851 x1 := s0.Args[0] 14852 if x1.Op != OpS390XMOVBZloadidx { 14853 break 14854 } 14855 if x1.AuxInt != i-1 { 14856 break 14857 } 14858 if x1.Aux != s { 14859 break 14860 } 14861 if p != x1.Args[0] { 14862 break 14863 } 14864 if idx != x1.Args[1] { 14865 break 14866 } 14867 if mem != x1.Args[2] { 14868 break 14869 } 14870 s1 := o4.Args[1] 14871 if s1.Op != OpS390XSLDconst { 14872 break 14873 } 14874 if s1.AuxInt != 16 { 14875 break 14876 } 14877 x2 := s1.Args[0] 14878 if x2.Op != OpS390XMOVBZloadidx { 14879 break 14880 } 14881 if x2.AuxInt != i-2 { 14882 break 14883 } 14884 if x2.Aux != s { 14885 break 14886 } 14887 if p != x2.Args[0] { 14888 break 14889 } 14890 if idx != x2.Args[1] { 14891 break 14892 } 14893 if mem != x2.Args[2] { 14894 break 14895 } 14896 s2 := o3.Args[1] 14897 if s2.Op != OpS390XSLDconst { 14898 break 14899 } 14900 if s2.AuxInt != 24 { 14901 break 14902 } 14903 x3 := s2.Args[0] 14904 if x3.Op != OpS390XMOVBZloadidx { 14905 break 14906 } 14907 if x3.AuxInt != i-3 { 14908 break 14909 } 14910 if x3.Aux != s { 14911 break 14912 } 14913 if p != x3.Args[0] { 14914 break 14915 } 14916 if idx != x3.Args[1] { 14917 break 14918 } 14919 if mem != x3.Args[2] { 14920 break 14921 } 14922 s3 := o2.Args[1] 14923 if s3.Op != OpS390XSLDconst { 14924 break 14925 } 14926 if s3.AuxInt != 32 { 14927 break 14928 } 14929 x4 := s3.Args[0] 14930 if x4.Op != OpS390XMOVBZloadidx { 14931 break 14932 } 14933 if x4.AuxInt != i-4 { 14934 break 14935 } 14936 if x4.Aux != s { 14937 break 14938 } 14939 if p != x4.Args[0] { 14940 break 14941 } 14942 if idx != x4.Args[1] { 14943 break 14944 } 14945 if mem != x4.Args[2] { 14946 break 14947 } 14948 s4 := o1.Args[1] 14949 if s4.Op != OpS390XSLDconst { 14950 break 14951 } 14952 if s4.AuxInt != 40 { 14953 break 14954 } 14955 x5 := s4.Args[0] 14956 if x5.Op != OpS390XMOVBZloadidx { 14957 break 14958 } 14959 if x5.AuxInt != i-5 { 14960 break 14961 } 14962 if x5.Aux != s { 14963 break 14964 } 14965 if p != x5.Args[0] { 14966 break 14967 } 14968 if idx != x5.Args[1] { 14969 break 14970 } 14971 if mem != x5.Args[2] { 14972 break 14973 } 14974 s5 := o0.Args[1] 14975 if s5.Op != OpS390XSLDconst { 14976 break 14977 } 14978 if s5.AuxInt != 48 { 14979 break 14980 } 14981 x6 := s5.Args[0] 14982 if x6.Op != OpS390XMOVBZloadidx { 14983 break 14984 } 14985 if x6.AuxInt != i-6 { 14986 break 14987 } 14988 if x6.Aux != s { 14989 break 14990 } 14991 if p != x6.Args[0] { 14992 break 14993 } 14994 if idx != x6.Args[1] { 14995 break 14996 } 14997 if mem != x6.Args[2] { 14998 break 14999 } 15000 s6 := v.Args[1] 15001 if s6.Op != OpS390XSLDconst { 15002 break 15003 } 15004 if s6.AuxInt != 56 { 15005 break 15006 } 15007 x7 := s6.Args[0] 15008 if x7.Op != OpS390XMOVBZloadidx { 15009 break 15010 } 15011 if x7.AuxInt != i-7 { 15012 break 15013 } 15014 if x7.Aux != s { 15015 break 15016 } 15017 if p != x7.Args[0] { 15018 break 15019 } 15020 if idx != x7.Args[1] { 15021 break 15022 } 15023 if mem != x7.Args[2] { 15024 break 15025 } 15026 if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5)) { 15027 break 15028 } 15029 b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) 15030 v0 := b.NewValue0(v.Line, OpS390XMOVDloadidx, v.Type) 15031 v.reset(OpCopy) 15032 v.AddArg(v0) 15033 v0.AuxInt = i - 7 15034 v0.Aux = s 15035 v0.AddArg(p) 15036 v0.AddArg(idx) 15037 v0.AddArg(mem) 15038 return true 15039 } 15040 return false 15041 } 15042 func rewriteValueS390X_OpS390XORW(v *Value, config *Config) bool { 15043 b := v.Block 15044 _ = b 15045 // match: (ORW x (MOVDconst [c])) 15046 // cond: 15047 // result: (ORWconst [c] x) 15048 for { 15049 x := v.Args[0] 15050 v_1 := v.Args[1] 15051 if v_1.Op != OpS390XMOVDconst { 15052 break 15053 } 15054 c := v_1.AuxInt 15055 v.reset(OpS390XORWconst) 15056 v.AuxInt = c 15057 v.AddArg(x) 15058 return true 15059 } 15060 // match: (ORW (MOVDconst [c]) x) 15061 // cond: 15062 // result: (ORWconst [c] x) 15063 for { 15064 v_0 := v.Args[0] 15065 if v_0.Op != OpS390XMOVDconst { 15066 break 15067 } 15068 c := v_0.AuxInt 15069 x := v.Args[1] 15070 v.reset(OpS390XORWconst) 15071 v.AuxInt = c 15072 v.AddArg(x) 15073 return true 15074 } 15075 // match: (ORW x x) 15076 // cond: 15077 // result: x 15078 for { 15079 x := v.Args[0] 15080 if x != v.Args[1] { 15081 break 15082 } 15083 v.reset(OpCopy) 15084 v.Type = x.Type 15085 v.AddArg(x) 15086 return true 15087 } 15088 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 15089 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 15090 // result: (ORWload <t> [off] {sym} x ptr mem) 15091 for { 15092 t := v.Type 15093 x := v.Args[0] 15094 g := v.Args[1] 15095 if g.Op != OpS390XMOVWload { 15096 break 15097 } 15098 off := g.AuxInt 15099 sym := g.Aux 15100 ptr := g.Args[0] 15101 mem := g.Args[1] 15102 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 15103 break 15104 } 15105 v.reset(OpS390XORWload) 15106 v.Type = t 15107 v.AuxInt = off 15108 v.Aux = sym 15109 v.AddArg(x) 15110 v.AddArg(ptr) 15111 v.AddArg(mem) 15112 return true 15113 } 15114 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 15115 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 15116 // result: (ORWload <t> [off] {sym} x ptr mem) 15117 for { 15118 t := v.Type 15119 g := v.Args[0] 15120 if g.Op != OpS390XMOVWload { 15121 break 15122 } 15123 off := g.AuxInt 15124 sym := g.Aux 15125 ptr := g.Args[0] 15126 mem := g.Args[1] 15127 x := v.Args[1] 15128 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 15129 break 15130 } 15131 v.reset(OpS390XORWload) 15132 v.Type = t 15133 v.AuxInt = off 15134 v.Aux = sym 15135 v.AddArg(x) 15136 v.AddArg(ptr) 15137 v.AddArg(mem) 15138 return true 15139 } 15140 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 15141 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 15142 // result: (ORWload <t> [off] {sym} x ptr mem) 15143 for { 15144 t := v.Type 15145 x := v.Args[0] 15146 g := v.Args[1] 15147 if g.Op != OpS390XMOVWZload { 15148 break 15149 } 15150 off := g.AuxInt 15151 sym := g.Aux 15152 ptr := g.Args[0] 15153 mem := g.Args[1] 15154 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 15155 break 15156 } 15157 v.reset(OpS390XORWload) 15158 v.Type = t 15159 v.AuxInt = off 15160 v.Aux = sym 15161 v.AddArg(x) 15162 v.AddArg(ptr) 15163 v.AddArg(mem) 15164 return true 15165 } 15166 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 15167 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 15168 // result: (ORWload <t> [off] {sym} x ptr mem) 15169 for { 15170 t := v.Type 15171 g := v.Args[0] 15172 if g.Op != OpS390XMOVWZload { 15173 break 15174 } 15175 off := g.AuxInt 15176 sym := g.Aux 15177 ptr := g.Args[0] 15178 mem := g.Args[1] 15179 x := v.Args[1] 15180 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 15181 break 15182 } 15183 v.reset(OpS390XORWload) 15184 v.Type = t 15185 v.AuxInt = off 15186 v.Aux = sym 15187 v.AddArg(x) 15188 v.AddArg(ptr) 15189 v.AddArg(mem) 15190 return true 15191 } 15192 // match: (ORW x0:(MOVBZload [i] {s} p mem) s0:(SLWconst [8] x1:(MOVBZload [i+1] {s} p mem))) 15193 // cond: p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 15194 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i] {s} p mem)) 15195 for { 15196 x0 := v.Args[0] 15197 if x0.Op != OpS390XMOVBZload { 15198 break 15199 } 15200 i := x0.AuxInt 15201 s := x0.Aux 15202 p := x0.Args[0] 15203 mem := x0.Args[1] 15204 s0 := v.Args[1] 15205 if s0.Op != OpS390XSLWconst { 15206 break 15207 } 15208 if s0.AuxInt != 8 { 15209 break 15210 } 15211 x1 := s0.Args[0] 15212 if x1.Op != OpS390XMOVBZload { 15213 break 15214 } 15215 if x1.AuxInt != i+1 { 15216 break 15217 } 15218 if x1.Aux != s { 15219 break 15220 } 15221 if p != x1.Args[0] { 15222 break 15223 } 15224 if mem != x1.Args[1] { 15225 break 15226 } 15227 if !(p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 15228 break 15229 } 15230 b = mergePoint(b, x0, x1) 15231 v0 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 15232 v.reset(OpCopy) 15233 v.AddArg(v0) 15234 v1 := b.NewValue0(v.Line, OpS390XMOVHBRload, config.fe.TypeUInt16()) 15235 v1.AuxInt = i 15236 v1.Aux = s 15237 v1.AddArg(p) 15238 v1.AddArg(mem) 15239 v0.AddArg(v1) 15240 return true 15241 } 15242 // match: (ORW o0:(ORW z0:(MOVHZreg x0:(MOVHBRload [i] {s} p mem)) s0:(SLWconst [16] x1:(MOVBZload [i+2] {s} p mem))) s1:(SLWconst [24] x2:(MOVBZload [i+3] {s} p mem))) 15243 // cond: p.Op != OpSB && z0.Uses == 1 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(z0) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 15244 // result: @mergePoint(b,x0,x1,x2) (MOVWBRload [i] {s} p mem) 15245 for { 15246 o0 := v.Args[0] 15247 if o0.Op != OpS390XORW { 15248 break 15249 } 15250 z0 := o0.Args[0] 15251 if z0.Op != OpS390XMOVHZreg { 15252 break 15253 } 15254 x0 := z0.Args[0] 15255 if x0.Op != OpS390XMOVHBRload { 15256 break 15257 } 15258 i := x0.AuxInt 15259 s := x0.Aux 15260 p := x0.Args[0] 15261 mem := x0.Args[1] 15262 s0 := o0.Args[1] 15263 if s0.Op != OpS390XSLWconst { 15264 break 15265 } 15266 if s0.AuxInt != 16 { 15267 break 15268 } 15269 x1 := s0.Args[0] 15270 if x1.Op != OpS390XMOVBZload { 15271 break 15272 } 15273 if x1.AuxInt != i+2 { 15274 break 15275 } 15276 if x1.Aux != s { 15277 break 15278 } 15279 if p != x1.Args[0] { 15280 break 15281 } 15282 if mem != x1.Args[1] { 15283 break 15284 } 15285 s1 := v.Args[1] 15286 if s1.Op != OpS390XSLWconst { 15287 break 15288 } 15289 if s1.AuxInt != 24 { 15290 break 15291 } 15292 x2 := s1.Args[0] 15293 if x2.Op != OpS390XMOVBZload { 15294 break 15295 } 15296 if x2.AuxInt != i+3 { 15297 break 15298 } 15299 if x2.Aux != s { 15300 break 15301 } 15302 if p != x2.Args[0] { 15303 break 15304 } 15305 if mem != x2.Args[1] { 15306 break 15307 } 15308 if !(p.Op != OpSB && z0.Uses == 1 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(z0) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 15309 break 15310 } 15311 b = mergePoint(b, x0, x1, x2) 15312 v0 := b.NewValue0(v.Line, OpS390XMOVWBRload, config.fe.TypeUInt32()) 15313 v.reset(OpCopy) 15314 v.AddArg(v0) 15315 v0.AuxInt = i 15316 v0.Aux = s 15317 v0.AddArg(p) 15318 v0.AddArg(mem) 15319 return true 15320 } 15321 // match: (ORW x0:(MOVBZloadidx [i] {s} p idx mem) s0:(SLWconst [8] x1:(MOVBZloadidx [i+1] {s} p idx mem))) 15322 // cond: x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 15323 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx <v.Type> [i] {s} p idx mem)) 15324 for { 15325 x0 := v.Args[0] 15326 if x0.Op != OpS390XMOVBZloadidx { 15327 break 15328 } 15329 i := x0.AuxInt 15330 s := x0.Aux 15331 p := x0.Args[0] 15332 idx := x0.Args[1] 15333 mem := x0.Args[2] 15334 s0 := v.Args[1] 15335 if s0.Op != OpS390XSLWconst { 15336 break 15337 } 15338 if s0.AuxInt != 8 { 15339 break 15340 } 15341 x1 := s0.Args[0] 15342 if x1.Op != OpS390XMOVBZloadidx { 15343 break 15344 } 15345 if x1.AuxInt != i+1 { 15346 break 15347 } 15348 if x1.Aux != s { 15349 break 15350 } 15351 if p != x1.Args[0] { 15352 break 15353 } 15354 if idx != x1.Args[1] { 15355 break 15356 } 15357 if mem != x1.Args[2] { 15358 break 15359 } 15360 if !(x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 15361 break 15362 } 15363 b = mergePoint(b, x0, x1) 15364 v0 := b.NewValue0(v.Line, OpS390XMOVHZreg, config.fe.TypeUInt64()) 15365 v.reset(OpCopy) 15366 v.AddArg(v0) 15367 v1 := b.NewValue0(v.Line, OpS390XMOVHBRloadidx, v.Type) 15368 v1.AuxInt = i 15369 v1.Aux = s 15370 v1.AddArg(p) 15371 v1.AddArg(idx) 15372 v1.AddArg(mem) 15373 v0.AddArg(v1) 15374 return true 15375 } 15376 // match: (ORW o0:(ORW z0:(MOVHZreg x0:(MOVHBRloadidx [i] {s} p idx mem)) s0:(SLWconst [16] x1:(MOVBZloadidx [i+2] {s} p idx mem))) s1:(SLWconst [24] x2:(MOVBZloadidx [i+3] {s} p idx mem))) 15377 // cond: z0.Uses == 1 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(z0) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 15378 // result: @mergePoint(b,x0,x1,x2) (MOVWZreg (MOVWBRloadidx <v.Type> [i] {s} p idx mem)) 15379 for { 15380 o0 := v.Args[0] 15381 if o0.Op != OpS390XORW { 15382 break 15383 } 15384 z0 := o0.Args[0] 15385 if z0.Op != OpS390XMOVHZreg { 15386 break 15387 } 15388 x0 := z0.Args[0] 15389 if x0.Op != OpS390XMOVHBRloadidx { 15390 break 15391 } 15392 i := x0.AuxInt 15393 s := x0.Aux 15394 p := x0.Args[0] 15395 idx := x0.Args[1] 15396 mem := x0.Args[2] 15397 s0 := o0.Args[1] 15398 if s0.Op != OpS390XSLWconst { 15399 break 15400 } 15401 if s0.AuxInt != 16 { 15402 break 15403 } 15404 x1 := s0.Args[0] 15405 if x1.Op != OpS390XMOVBZloadidx { 15406 break 15407 } 15408 if x1.AuxInt != i+2 { 15409 break 15410 } 15411 if x1.Aux != s { 15412 break 15413 } 15414 if p != x1.Args[0] { 15415 break 15416 } 15417 if idx != x1.Args[1] { 15418 break 15419 } 15420 if mem != x1.Args[2] { 15421 break 15422 } 15423 s1 := v.Args[1] 15424 if s1.Op != OpS390XSLWconst { 15425 break 15426 } 15427 if s1.AuxInt != 24 { 15428 break 15429 } 15430 x2 := s1.Args[0] 15431 if x2.Op != OpS390XMOVBZloadidx { 15432 break 15433 } 15434 if x2.AuxInt != i+3 { 15435 break 15436 } 15437 if x2.Aux != s { 15438 break 15439 } 15440 if p != x2.Args[0] { 15441 break 15442 } 15443 if idx != x2.Args[1] { 15444 break 15445 } 15446 if mem != x2.Args[2] { 15447 break 15448 } 15449 if !(z0.Uses == 1 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(z0) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 15450 break 15451 } 15452 b = mergePoint(b, x0, x1, x2) 15453 v0 := b.NewValue0(v.Line, OpS390XMOVWZreg, config.fe.TypeUInt64()) 15454 v.reset(OpCopy) 15455 v.AddArg(v0) 15456 v1 := b.NewValue0(v.Line, OpS390XMOVWBRloadidx, v.Type) 15457 v1.AuxInt = i 15458 v1.Aux = s 15459 v1.AddArg(p) 15460 v1.AddArg(idx) 15461 v1.AddArg(mem) 15462 v0.AddArg(v1) 15463 return true 15464 } 15465 // match: (ORW x0:(MOVBZload [i] {s} p mem) s0:(SLWconst [8] x1:(MOVBZload [i-1] {s} p mem))) 15466 // cond: p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 15467 // result: @mergePoint(b,x0,x1) (MOVHZload [i-1] {s} p mem) 15468 for { 15469 x0 := v.Args[0] 15470 if x0.Op != OpS390XMOVBZload { 15471 break 15472 } 15473 i := x0.AuxInt 15474 s := x0.Aux 15475 p := x0.Args[0] 15476 mem := x0.Args[1] 15477 s0 := v.Args[1] 15478 if s0.Op != OpS390XSLWconst { 15479 break 15480 } 15481 if s0.AuxInt != 8 { 15482 break 15483 } 15484 x1 := s0.Args[0] 15485 if x1.Op != OpS390XMOVBZload { 15486 break 15487 } 15488 if x1.AuxInt != i-1 { 15489 break 15490 } 15491 if x1.Aux != s { 15492 break 15493 } 15494 if p != x1.Args[0] { 15495 break 15496 } 15497 if mem != x1.Args[1] { 15498 break 15499 } 15500 if !(p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 15501 break 15502 } 15503 b = mergePoint(b, x0, x1) 15504 v0 := b.NewValue0(v.Line, OpS390XMOVHZload, config.fe.TypeUInt16()) 15505 v.reset(OpCopy) 15506 v.AddArg(v0) 15507 v0.AuxInt = i - 1 15508 v0.Aux = s 15509 v0.AddArg(p) 15510 v0.AddArg(mem) 15511 return true 15512 } 15513 // match: (ORW o0:(ORW x0:(MOVHZload [i] {s} p mem) s0:(SLWconst [16] x1:(MOVBZload [i-1] {s} p mem))) s1:(SLWconst [24] x2:(MOVBZload [i-2] {s} p mem))) 15514 // cond: p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 15515 // result: @mergePoint(b,x0,x1,x2) (MOVWZload [i-2] {s} p mem) 15516 for { 15517 o0 := v.Args[0] 15518 if o0.Op != OpS390XORW { 15519 break 15520 } 15521 x0 := o0.Args[0] 15522 if x0.Op != OpS390XMOVHZload { 15523 break 15524 } 15525 i := x0.AuxInt 15526 s := x0.Aux 15527 p := x0.Args[0] 15528 mem := x0.Args[1] 15529 s0 := o0.Args[1] 15530 if s0.Op != OpS390XSLWconst { 15531 break 15532 } 15533 if s0.AuxInt != 16 { 15534 break 15535 } 15536 x1 := s0.Args[0] 15537 if x1.Op != OpS390XMOVBZload { 15538 break 15539 } 15540 if x1.AuxInt != i-1 { 15541 break 15542 } 15543 if x1.Aux != s { 15544 break 15545 } 15546 if p != x1.Args[0] { 15547 break 15548 } 15549 if mem != x1.Args[1] { 15550 break 15551 } 15552 s1 := v.Args[1] 15553 if s1.Op != OpS390XSLWconst { 15554 break 15555 } 15556 if s1.AuxInt != 24 { 15557 break 15558 } 15559 x2 := s1.Args[0] 15560 if x2.Op != OpS390XMOVBZload { 15561 break 15562 } 15563 if x2.AuxInt != i-2 { 15564 break 15565 } 15566 if x2.Aux != s { 15567 break 15568 } 15569 if p != x2.Args[0] { 15570 break 15571 } 15572 if mem != x2.Args[1] { 15573 break 15574 } 15575 if !(p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 15576 break 15577 } 15578 b = mergePoint(b, x0, x1, x2) 15579 v0 := b.NewValue0(v.Line, OpS390XMOVWZload, config.fe.TypeUInt32()) 15580 v.reset(OpCopy) 15581 v.AddArg(v0) 15582 v0.AuxInt = i - 2 15583 v0.Aux = s 15584 v0.AddArg(p) 15585 v0.AddArg(mem) 15586 return true 15587 } 15588 // match: (ORW x0:(MOVBZloadidx [i] {s} p idx mem) s0:(SLWconst [8] x1:(MOVBZloadidx [i-1] {s} p idx mem))) 15589 // cond: x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) 15590 // result: @mergePoint(b,x0,x1) (MOVHZloadidx <v.Type> [i-1] {s} p idx mem) 15591 for { 15592 x0 := v.Args[0] 15593 if x0.Op != OpS390XMOVBZloadidx { 15594 break 15595 } 15596 i := x0.AuxInt 15597 s := x0.Aux 15598 p := x0.Args[0] 15599 idx := x0.Args[1] 15600 mem := x0.Args[2] 15601 s0 := v.Args[1] 15602 if s0.Op != OpS390XSLWconst { 15603 break 15604 } 15605 if s0.AuxInt != 8 { 15606 break 15607 } 15608 x1 := s0.Args[0] 15609 if x1.Op != OpS390XMOVBZloadidx { 15610 break 15611 } 15612 if x1.AuxInt != i-1 { 15613 break 15614 } 15615 if x1.Aux != s { 15616 break 15617 } 15618 if p != x1.Args[0] { 15619 break 15620 } 15621 if idx != x1.Args[1] { 15622 break 15623 } 15624 if mem != x1.Args[2] { 15625 break 15626 } 15627 if !(x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { 15628 break 15629 } 15630 b = mergePoint(b, x0, x1) 15631 v0 := b.NewValue0(v.Line, OpS390XMOVHZloadidx, v.Type) 15632 v.reset(OpCopy) 15633 v.AddArg(v0) 15634 v0.AuxInt = i - 1 15635 v0.Aux = s 15636 v0.AddArg(p) 15637 v0.AddArg(idx) 15638 v0.AddArg(mem) 15639 return true 15640 } 15641 // match: (ORW o0:(ORW x0:(MOVHZloadidx [i] {s} p idx mem) s0:(SLWconst [16] x1:(MOVBZloadidx [i-1] {s} p idx mem))) s1:(SLWconst [24] x2:(MOVBZloadidx [i-2] {s} p idx mem))) 15642 // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) 15643 // result: @mergePoint(b,x0,x1,x2) (MOVWZloadidx <v.Type> [i-2] {s} p idx mem) 15644 for { 15645 o0 := v.Args[0] 15646 if o0.Op != OpS390XORW { 15647 break 15648 } 15649 x0 := o0.Args[0] 15650 if x0.Op != OpS390XMOVHZloadidx { 15651 break 15652 } 15653 i := x0.AuxInt 15654 s := x0.Aux 15655 p := x0.Args[0] 15656 idx := x0.Args[1] 15657 mem := x0.Args[2] 15658 s0 := o0.Args[1] 15659 if s0.Op != OpS390XSLWconst { 15660 break 15661 } 15662 if s0.AuxInt != 16 { 15663 break 15664 } 15665 x1 := s0.Args[0] 15666 if x1.Op != OpS390XMOVBZloadidx { 15667 break 15668 } 15669 if x1.AuxInt != i-1 { 15670 break 15671 } 15672 if x1.Aux != s { 15673 break 15674 } 15675 if p != x1.Args[0] { 15676 break 15677 } 15678 if idx != x1.Args[1] { 15679 break 15680 } 15681 if mem != x1.Args[2] { 15682 break 15683 } 15684 s1 := v.Args[1] 15685 if s1.Op != OpS390XSLWconst { 15686 break 15687 } 15688 if s1.AuxInt != 24 { 15689 break 15690 } 15691 x2 := s1.Args[0] 15692 if x2.Op != OpS390XMOVBZloadidx { 15693 break 15694 } 15695 if x2.AuxInt != i-2 { 15696 break 15697 } 15698 if x2.Aux != s { 15699 break 15700 } 15701 if p != x2.Args[0] { 15702 break 15703 } 15704 if idx != x2.Args[1] { 15705 break 15706 } 15707 if mem != x2.Args[2] { 15708 break 15709 } 15710 if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { 15711 break 15712 } 15713 b = mergePoint(b, x0, x1, x2) 15714 v0 := b.NewValue0(v.Line, OpS390XMOVWZloadidx, v.Type) 15715 v.reset(OpCopy) 15716 v.AddArg(v0) 15717 v0.AuxInt = i - 2 15718 v0.Aux = s 15719 v0.AddArg(p) 15720 v0.AddArg(idx) 15721 v0.AddArg(mem) 15722 return true 15723 } 15724 return false 15725 } 15726 func rewriteValueS390X_OpS390XORWconst(v *Value, config *Config) bool { 15727 b := v.Block 15728 _ = b 15729 // match: (ORWconst [c] x) 15730 // cond: int32(c)==0 15731 // result: x 15732 for { 15733 c := v.AuxInt 15734 x := v.Args[0] 15735 if !(int32(c) == 0) { 15736 break 15737 } 15738 v.reset(OpCopy) 15739 v.Type = x.Type 15740 v.AddArg(x) 15741 return true 15742 } 15743 // match: (ORWconst [c] _) 15744 // cond: int32(c)==-1 15745 // result: (MOVDconst [-1]) 15746 for { 15747 c := v.AuxInt 15748 if !(int32(c) == -1) { 15749 break 15750 } 15751 v.reset(OpS390XMOVDconst) 15752 v.AuxInt = -1 15753 return true 15754 } 15755 // match: (ORWconst [c] (MOVDconst [d])) 15756 // cond: 15757 // result: (MOVDconst [c|d]) 15758 for { 15759 c := v.AuxInt 15760 v_0 := v.Args[0] 15761 if v_0.Op != OpS390XMOVDconst { 15762 break 15763 } 15764 d := v_0.AuxInt 15765 v.reset(OpS390XMOVDconst) 15766 v.AuxInt = c | d 15767 return true 15768 } 15769 return false 15770 } 15771 func rewriteValueS390X_OpS390XORconst(v *Value, config *Config) bool { 15772 b := v.Block 15773 _ = b 15774 // match: (ORconst [0] x) 15775 // cond: 15776 // result: x 15777 for { 15778 if v.AuxInt != 0 { 15779 break 15780 } 15781 x := v.Args[0] 15782 v.reset(OpCopy) 15783 v.Type = x.Type 15784 v.AddArg(x) 15785 return true 15786 } 15787 // match: (ORconst [-1] _) 15788 // cond: 15789 // result: (MOVDconst [-1]) 15790 for { 15791 if v.AuxInt != -1 { 15792 break 15793 } 15794 v.reset(OpS390XMOVDconst) 15795 v.AuxInt = -1 15796 return true 15797 } 15798 // match: (ORconst [c] (MOVDconst [d])) 15799 // cond: 15800 // result: (MOVDconst [c|d]) 15801 for { 15802 c := v.AuxInt 15803 v_0 := v.Args[0] 15804 if v_0.Op != OpS390XMOVDconst { 15805 break 15806 } 15807 d := v_0.AuxInt 15808 v.reset(OpS390XMOVDconst) 15809 v.AuxInt = c | d 15810 return true 15811 } 15812 return false 15813 } 15814 func rewriteValueS390X_OpS390XSLD(v *Value, config *Config) bool { 15815 b := v.Block 15816 _ = b 15817 // match: (SLD x (MOVDconst [c])) 15818 // cond: 15819 // result: (SLDconst [c&63] x) 15820 for { 15821 x := v.Args[0] 15822 v_1 := v.Args[1] 15823 if v_1.Op != OpS390XMOVDconst { 15824 break 15825 } 15826 c := v_1.AuxInt 15827 v.reset(OpS390XSLDconst) 15828 v.AuxInt = c & 63 15829 v.AddArg(x) 15830 return true 15831 } 15832 // match: (SLD x (ANDconst [63] y)) 15833 // cond: 15834 // result: (SLD x y) 15835 for { 15836 x := v.Args[0] 15837 v_1 := v.Args[1] 15838 if v_1.Op != OpS390XANDconst { 15839 break 15840 } 15841 if v_1.AuxInt != 63 { 15842 break 15843 } 15844 y := v_1.Args[0] 15845 v.reset(OpS390XSLD) 15846 v.AddArg(x) 15847 v.AddArg(y) 15848 return true 15849 } 15850 return false 15851 } 15852 func rewriteValueS390X_OpS390XSLW(v *Value, config *Config) bool { 15853 b := v.Block 15854 _ = b 15855 // match: (SLW x (MOVDconst [c])) 15856 // cond: 15857 // result: (SLWconst [c&63] x) 15858 for { 15859 x := v.Args[0] 15860 v_1 := v.Args[1] 15861 if v_1.Op != OpS390XMOVDconst { 15862 break 15863 } 15864 c := v_1.AuxInt 15865 v.reset(OpS390XSLWconst) 15866 v.AuxInt = c & 63 15867 v.AddArg(x) 15868 return true 15869 } 15870 // match: (SLW x (ANDWconst [63] y)) 15871 // cond: 15872 // result: (SLW x y) 15873 for { 15874 x := v.Args[0] 15875 v_1 := v.Args[1] 15876 if v_1.Op != OpS390XANDWconst { 15877 break 15878 } 15879 if v_1.AuxInt != 63 { 15880 break 15881 } 15882 y := v_1.Args[0] 15883 v.reset(OpS390XSLW) 15884 v.AddArg(x) 15885 v.AddArg(y) 15886 return true 15887 } 15888 return false 15889 } 15890 func rewriteValueS390X_OpS390XSRAD(v *Value, config *Config) bool { 15891 b := v.Block 15892 _ = b 15893 // match: (SRAD x (MOVDconst [c])) 15894 // cond: 15895 // result: (SRADconst [c&63] x) 15896 for { 15897 x := v.Args[0] 15898 v_1 := v.Args[1] 15899 if v_1.Op != OpS390XMOVDconst { 15900 break 15901 } 15902 c := v_1.AuxInt 15903 v.reset(OpS390XSRADconst) 15904 v.AuxInt = c & 63 15905 v.AddArg(x) 15906 return true 15907 } 15908 // match: (SRAD x (ANDconst [63] y)) 15909 // cond: 15910 // result: (SRAD x y) 15911 for { 15912 x := v.Args[0] 15913 v_1 := v.Args[1] 15914 if v_1.Op != OpS390XANDconst { 15915 break 15916 } 15917 if v_1.AuxInt != 63 { 15918 break 15919 } 15920 y := v_1.Args[0] 15921 v.reset(OpS390XSRAD) 15922 v.AddArg(x) 15923 v.AddArg(y) 15924 return true 15925 } 15926 return false 15927 } 15928 func rewriteValueS390X_OpS390XSRADconst(v *Value, config *Config) bool { 15929 b := v.Block 15930 _ = b 15931 // match: (SRADconst [c] (MOVDconst [d])) 15932 // cond: 15933 // result: (MOVDconst [d>>uint64(c)]) 15934 for { 15935 c := v.AuxInt 15936 v_0 := v.Args[0] 15937 if v_0.Op != OpS390XMOVDconst { 15938 break 15939 } 15940 d := v_0.AuxInt 15941 v.reset(OpS390XMOVDconst) 15942 v.AuxInt = d >> uint64(c) 15943 return true 15944 } 15945 return false 15946 } 15947 func rewriteValueS390X_OpS390XSRAW(v *Value, config *Config) bool { 15948 b := v.Block 15949 _ = b 15950 // match: (SRAW x (MOVDconst [c])) 15951 // cond: 15952 // result: (SRAWconst [c&63] x) 15953 for { 15954 x := v.Args[0] 15955 v_1 := v.Args[1] 15956 if v_1.Op != OpS390XMOVDconst { 15957 break 15958 } 15959 c := v_1.AuxInt 15960 v.reset(OpS390XSRAWconst) 15961 v.AuxInt = c & 63 15962 v.AddArg(x) 15963 return true 15964 } 15965 // match: (SRAW x (ANDWconst [63] y)) 15966 // cond: 15967 // result: (SRAW x y) 15968 for { 15969 x := v.Args[0] 15970 v_1 := v.Args[1] 15971 if v_1.Op != OpS390XANDWconst { 15972 break 15973 } 15974 if v_1.AuxInt != 63 { 15975 break 15976 } 15977 y := v_1.Args[0] 15978 v.reset(OpS390XSRAW) 15979 v.AddArg(x) 15980 v.AddArg(y) 15981 return true 15982 } 15983 return false 15984 } 15985 func rewriteValueS390X_OpS390XSRAWconst(v *Value, config *Config) bool { 15986 b := v.Block 15987 _ = b 15988 // match: (SRAWconst [c] (MOVDconst [d])) 15989 // cond: 15990 // result: (MOVDconst [d>>uint64(c)]) 15991 for { 15992 c := v.AuxInt 15993 v_0 := v.Args[0] 15994 if v_0.Op != OpS390XMOVDconst { 15995 break 15996 } 15997 d := v_0.AuxInt 15998 v.reset(OpS390XMOVDconst) 15999 v.AuxInt = d >> uint64(c) 16000 return true 16001 } 16002 return false 16003 } 16004 func rewriteValueS390X_OpS390XSRD(v *Value, config *Config) bool { 16005 b := v.Block 16006 _ = b 16007 // match: (SRD x (MOVDconst [c])) 16008 // cond: 16009 // result: (SRDconst [c&63] x) 16010 for { 16011 x := v.Args[0] 16012 v_1 := v.Args[1] 16013 if v_1.Op != OpS390XMOVDconst { 16014 break 16015 } 16016 c := v_1.AuxInt 16017 v.reset(OpS390XSRDconst) 16018 v.AuxInt = c & 63 16019 v.AddArg(x) 16020 return true 16021 } 16022 // match: (SRD x (ANDconst [63] y)) 16023 // cond: 16024 // result: (SRD x y) 16025 for { 16026 x := v.Args[0] 16027 v_1 := v.Args[1] 16028 if v_1.Op != OpS390XANDconst { 16029 break 16030 } 16031 if v_1.AuxInt != 63 { 16032 break 16033 } 16034 y := v_1.Args[0] 16035 v.reset(OpS390XSRD) 16036 v.AddArg(x) 16037 v.AddArg(y) 16038 return true 16039 } 16040 return false 16041 } 16042 func rewriteValueS390X_OpS390XSRW(v *Value, config *Config) bool { 16043 b := v.Block 16044 _ = b 16045 // match: (SRW x (MOVDconst [c])) 16046 // cond: 16047 // result: (SRWconst [c&63] x) 16048 for { 16049 x := v.Args[0] 16050 v_1 := v.Args[1] 16051 if v_1.Op != OpS390XMOVDconst { 16052 break 16053 } 16054 c := v_1.AuxInt 16055 v.reset(OpS390XSRWconst) 16056 v.AuxInt = c & 63 16057 v.AddArg(x) 16058 return true 16059 } 16060 // match: (SRW x (ANDWconst [63] y)) 16061 // cond: 16062 // result: (SRW x y) 16063 for { 16064 x := v.Args[0] 16065 v_1 := v.Args[1] 16066 if v_1.Op != OpS390XANDWconst { 16067 break 16068 } 16069 if v_1.AuxInt != 63 { 16070 break 16071 } 16072 y := v_1.Args[0] 16073 v.reset(OpS390XSRW) 16074 v.AddArg(x) 16075 v.AddArg(y) 16076 return true 16077 } 16078 return false 16079 } 16080 func rewriteValueS390X_OpS390XSTM2(v *Value, config *Config) bool { 16081 b := v.Block 16082 _ = b 16083 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 16084 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 16085 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 16086 for { 16087 i := v.AuxInt 16088 s := v.Aux 16089 p := v.Args[0] 16090 w2 := v.Args[1] 16091 w3 := v.Args[2] 16092 x := v.Args[3] 16093 if x.Op != OpS390XSTM2 { 16094 break 16095 } 16096 if x.AuxInt != i-8 { 16097 break 16098 } 16099 if x.Aux != s { 16100 break 16101 } 16102 if p != x.Args[0] { 16103 break 16104 } 16105 w0 := x.Args[1] 16106 w1 := x.Args[2] 16107 mem := x.Args[3] 16108 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 16109 break 16110 } 16111 v.reset(OpS390XSTM4) 16112 v.AuxInt = i - 8 16113 v.Aux = s 16114 v.AddArg(p) 16115 v.AddArg(w0) 16116 v.AddArg(w1) 16117 v.AddArg(w2) 16118 v.AddArg(w3) 16119 v.AddArg(mem) 16120 return true 16121 } 16122 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 16123 // cond: 16124 // result: (MOVDstore [i] {s} p x mem) 16125 for { 16126 i := v.AuxInt 16127 s := v.Aux 16128 p := v.Args[0] 16129 v_1 := v.Args[1] 16130 if v_1.Op != OpS390XSRDconst { 16131 break 16132 } 16133 if v_1.AuxInt != 32 { 16134 break 16135 } 16136 x := v_1.Args[0] 16137 if x != v.Args[2] { 16138 break 16139 } 16140 mem := v.Args[3] 16141 v.reset(OpS390XMOVDstore) 16142 v.AuxInt = i 16143 v.Aux = s 16144 v.AddArg(p) 16145 v.AddArg(x) 16146 v.AddArg(mem) 16147 return true 16148 } 16149 return false 16150 } 16151 func rewriteValueS390X_OpS390XSTMG2(v *Value, config *Config) bool { 16152 b := v.Block 16153 _ = b 16154 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 16155 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 16156 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 16157 for { 16158 i := v.AuxInt 16159 s := v.Aux 16160 p := v.Args[0] 16161 w2 := v.Args[1] 16162 w3 := v.Args[2] 16163 x := v.Args[3] 16164 if x.Op != OpS390XSTMG2 { 16165 break 16166 } 16167 if x.AuxInt != i-16 { 16168 break 16169 } 16170 if x.Aux != s { 16171 break 16172 } 16173 if p != x.Args[0] { 16174 break 16175 } 16176 w0 := x.Args[1] 16177 w1 := x.Args[2] 16178 mem := x.Args[3] 16179 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 16180 break 16181 } 16182 v.reset(OpS390XSTMG4) 16183 v.AuxInt = i - 16 16184 v.Aux = s 16185 v.AddArg(p) 16186 v.AddArg(w0) 16187 v.AddArg(w1) 16188 v.AddArg(w2) 16189 v.AddArg(w3) 16190 v.AddArg(mem) 16191 return true 16192 } 16193 return false 16194 } 16195 func rewriteValueS390X_OpS390XSUB(v *Value, config *Config) bool { 16196 b := v.Block 16197 _ = b 16198 // match: (SUB x (MOVDconst [c])) 16199 // cond: is32Bit(c) 16200 // result: (SUBconst x [c]) 16201 for { 16202 x := v.Args[0] 16203 v_1 := v.Args[1] 16204 if v_1.Op != OpS390XMOVDconst { 16205 break 16206 } 16207 c := v_1.AuxInt 16208 if !(is32Bit(c)) { 16209 break 16210 } 16211 v.reset(OpS390XSUBconst) 16212 v.AuxInt = c 16213 v.AddArg(x) 16214 return true 16215 } 16216 // match: (SUB (MOVDconst [c]) x) 16217 // cond: is32Bit(c) 16218 // result: (NEG (SUBconst <v.Type> x [c])) 16219 for { 16220 v_0 := v.Args[0] 16221 if v_0.Op != OpS390XMOVDconst { 16222 break 16223 } 16224 c := v_0.AuxInt 16225 x := v.Args[1] 16226 if !(is32Bit(c)) { 16227 break 16228 } 16229 v.reset(OpS390XNEG) 16230 v0 := b.NewValue0(v.Line, OpS390XSUBconst, v.Type) 16231 v0.AuxInt = c 16232 v0.AddArg(x) 16233 v.AddArg(v0) 16234 return true 16235 } 16236 // match: (SUB x x) 16237 // cond: 16238 // result: (MOVDconst [0]) 16239 for { 16240 x := v.Args[0] 16241 if x != v.Args[1] { 16242 break 16243 } 16244 v.reset(OpS390XMOVDconst) 16245 v.AuxInt = 0 16246 return true 16247 } 16248 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 16249 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16250 // result: (SUBload <t> [off] {sym} x ptr mem) 16251 for { 16252 t := v.Type 16253 x := v.Args[0] 16254 g := v.Args[1] 16255 if g.Op != OpS390XMOVDload { 16256 break 16257 } 16258 off := g.AuxInt 16259 sym := g.Aux 16260 ptr := g.Args[0] 16261 mem := g.Args[1] 16262 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16263 break 16264 } 16265 v.reset(OpS390XSUBload) 16266 v.Type = t 16267 v.AuxInt = off 16268 v.Aux = sym 16269 v.AddArg(x) 16270 v.AddArg(ptr) 16271 v.AddArg(mem) 16272 return true 16273 } 16274 return false 16275 } 16276 func rewriteValueS390X_OpS390XSUBEWcarrymask(v *Value, config *Config) bool { 16277 b := v.Block 16278 _ = b 16279 // match: (SUBEWcarrymask (FlagEQ)) 16280 // cond: 16281 // result: (MOVDconst [-1]) 16282 for { 16283 v_0 := v.Args[0] 16284 if v_0.Op != OpS390XFlagEQ { 16285 break 16286 } 16287 v.reset(OpS390XMOVDconst) 16288 v.AuxInt = -1 16289 return true 16290 } 16291 // match: (SUBEWcarrymask (FlagLT)) 16292 // cond: 16293 // result: (MOVDconst [-1]) 16294 for { 16295 v_0 := v.Args[0] 16296 if v_0.Op != OpS390XFlagLT { 16297 break 16298 } 16299 v.reset(OpS390XMOVDconst) 16300 v.AuxInt = -1 16301 return true 16302 } 16303 // match: (SUBEWcarrymask (FlagGT)) 16304 // cond: 16305 // result: (MOVDconst [0]) 16306 for { 16307 v_0 := v.Args[0] 16308 if v_0.Op != OpS390XFlagGT { 16309 break 16310 } 16311 v.reset(OpS390XMOVDconst) 16312 v.AuxInt = 0 16313 return true 16314 } 16315 return false 16316 } 16317 func rewriteValueS390X_OpS390XSUBEcarrymask(v *Value, config *Config) bool { 16318 b := v.Block 16319 _ = b 16320 // match: (SUBEcarrymask (FlagEQ)) 16321 // cond: 16322 // result: (MOVDconst [-1]) 16323 for { 16324 v_0 := v.Args[0] 16325 if v_0.Op != OpS390XFlagEQ { 16326 break 16327 } 16328 v.reset(OpS390XMOVDconst) 16329 v.AuxInt = -1 16330 return true 16331 } 16332 // match: (SUBEcarrymask (FlagLT)) 16333 // cond: 16334 // result: (MOVDconst [-1]) 16335 for { 16336 v_0 := v.Args[0] 16337 if v_0.Op != OpS390XFlagLT { 16338 break 16339 } 16340 v.reset(OpS390XMOVDconst) 16341 v.AuxInt = -1 16342 return true 16343 } 16344 // match: (SUBEcarrymask (FlagGT)) 16345 // cond: 16346 // result: (MOVDconst [0]) 16347 for { 16348 v_0 := v.Args[0] 16349 if v_0.Op != OpS390XFlagGT { 16350 break 16351 } 16352 v.reset(OpS390XMOVDconst) 16353 v.AuxInt = 0 16354 return true 16355 } 16356 return false 16357 } 16358 func rewriteValueS390X_OpS390XSUBW(v *Value, config *Config) bool { 16359 b := v.Block 16360 _ = b 16361 // match: (SUBW x (MOVDconst [c])) 16362 // cond: 16363 // result: (SUBWconst x [c]) 16364 for { 16365 x := v.Args[0] 16366 v_1 := v.Args[1] 16367 if v_1.Op != OpS390XMOVDconst { 16368 break 16369 } 16370 c := v_1.AuxInt 16371 v.reset(OpS390XSUBWconst) 16372 v.AuxInt = c 16373 v.AddArg(x) 16374 return true 16375 } 16376 // match: (SUBW (MOVDconst [c]) x) 16377 // cond: 16378 // result: (NEGW (SUBWconst <v.Type> x [c])) 16379 for { 16380 v_0 := v.Args[0] 16381 if v_0.Op != OpS390XMOVDconst { 16382 break 16383 } 16384 c := v_0.AuxInt 16385 x := v.Args[1] 16386 v.reset(OpS390XNEGW) 16387 v0 := b.NewValue0(v.Line, OpS390XSUBWconst, v.Type) 16388 v0.AuxInt = c 16389 v0.AddArg(x) 16390 v.AddArg(v0) 16391 return true 16392 } 16393 // match: (SUBW x x) 16394 // cond: 16395 // result: (MOVDconst [0]) 16396 for { 16397 x := v.Args[0] 16398 if x != v.Args[1] { 16399 break 16400 } 16401 v.reset(OpS390XMOVDconst) 16402 v.AuxInt = 0 16403 return true 16404 } 16405 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 16406 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16407 // result: (SUBWload <t> [off] {sym} x ptr mem) 16408 for { 16409 t := v.Type 16410 x := v.Args[0] 16411 g := v.Args[1] 16412 if g.Op != OpS390XMOVWload { 16413 break 16414 } 16415 off := g.AuxInt 16416 sym := g.Aux 16417 ptr := g.Args[0] 16418 mem := g.Args[1] 16419 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16420 break 16421 } 16422 v.reset(OpS390XSUBWload) 16423 v.Type = t 16424 v.AuxInt = off 16425 v.Aux = sym 16426 v.AddArg(x) 16427 v.AddArg(ptr) 16428 v.AddArg(mem) 16429 return true 16430 } 16431 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 16432 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16433 // result: (SUBWload <t> [off] {sym} x ptr mem) 16434 for { 16435 t := v.Type 16436 x := v.Args[0] 16437 g := v.Args[1] 16438 if g.Op != OpS390XMOVWZload { 16439 break 16440 } 16441 off := g.AuxInt 16442 sym := g.Aux 16443 ptr := g.Args[0] 16444 mem := g.Args[1] 16445 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16446 break 16447 } 16448 v.reset(OpS390XSUBWload) 16449 v.Type = t 16450 v.AuxInt = off 16451 v.Aux = sym 16452 v.AddArg(x) 16453 v.AddArg(ptr) 16454 v.AddArg(mem) 16455 return true 16456 } 16457 return false 16458 } 16459 func rewriteValueS390X_OpS390XSUBWconst(v *Value, config *Config) bool { 16460 b := v.Block 16461 _ = b 16462 // match: (SUBWconst [c] x) 16463 // cond: int32(c) == 0 16464 // result: x 16465 for { 16466 c := v.AuxInt 16467 x := v.Args[0] 16468 if !(int32(c) == 0) { 16469 break 16470 } 16471 v.reset(OpCopy) 16472 v.Type = x.Type 16473 v.AddArg(x) 16474 return true 16475 } 16476 // match: (SUBWconst [c] x) 16477 // cond: 16478 // result: (ADDWconst [int64(int32(-c))] x) 16479 for { 16480 c := v.AuxInt 16481 x := v.Args[0] 16482 v.reset(OpS390XADDWconst) 16483 v.AuxInt = int64(int32(-c)) 16484 v.AddArg(x) 16485 return true 16486 } 16487 } 16488 func rewriteValueS390X_OpS390XSUBconst(v *Value, config *Config) bool { 16489 b := v.Block 16490 _ = b 16491 // match: (SUBconst [0] x) 16492 // cond: 16493 // result: x 16494 for { 16495 if v.AuxInt != 0 { 16496 break 16497 } 16498 x := v.Args[0] 16499 v.reset(OpCopy) 16500 v.Type = x.Type 16501 v.AddArg(x) 16502 return true 16503 } 16504 // match: (SUBconst [c] x) 16505 // cond: c != -(1<<31) 16506 // result: (ADDconst [-c] x) 16507 for { 16508 c := v.AuxInt 16509 x := v.Args[0] 16510 if !(c != -(1 << 31)) { 16511 break 16512 } 16513 v.reset(OpS390XADDconst) 16514 v.AuxInt = -c 16515 v.AddArg(x) 16516 return true 16517 } 16518 // match: (SUBconst (MOVDconst [d]) [c]) 16519 // cond: 16520 // result: (MOVDconst [d-c]) 16521 for { 16522 c := v.AuxInt 16523 v_0 := v.Args[0] 16524 if v_0.Op != OpS390XMOVDconst { 16525 break 16526 } 16527 d := v_0.AuxInt 16528 v.reset(OpS390XMOVDconst) 16529 v.AuxInt = d - c 16530 return true 16531 } 16532 // match: (SUBconst (SUBconst x [d]) [c]) 16533 // cond: is32Bit(-c-d) 16534 // result: (ADDconst [-c-d] x) 16535 for { 16536 c := v.AuxInt 16537 v_0 := v.Args[0] 16538 if v_0.Op != OpS390XSUBconst { 16539 break 16540 } 16541 d := v_0.AuxInt 16542 x := v_0.Args[0] 16543 if !(is32Bit(-c - d)) { 16544 break 16545 } 16546 v.reset(OpS390XADDconst) 16547 v.AuxInt = -c - d 16548 v.AddArg(x) 16549 return true 16550 } 16551 return false 16552 } 16553 func rewriteValueS390X_OpS390XXOR(v *Value, config *Config) bool { 16554 b := v.Block 16555 _ = b 16556 // match: (XOR x (MOVDconst [c])) 16557 // cond: isU32Bit(c) 16558 // result: (XORconst [c] x) 16559 for { 16560 x := v.Args[0] 16561 v_1 := v.Args[1] 16562 if v_1.Op != OpS390XMOVDconst { 16563 break 16564 } 16565 c := v_1.AuxInt 16566 if !(isU32Bit(c)) { 16567 break 16568 } 16569 v.reset(OpS390XXORconst) 16570 v.AuxInt = c 16571 v.AddArg(x) 16572 return true 16573 } 16574 // match: (XOR (MOVDconst [c]) x) 16575 // cond: isU32Bit(c) 16576 // result: (XORconst [c] x) 16577 for { 16578 v_0 := v.Args[0] 16579 if v_0.Op != OpS390XMOVDconst { 16580 break 16581 } 16582 c := v_0.AuxInt 16583 x := v.Args[1] 16584 if !(isU32Bit(c)) { 16585 break 16586 } 16587 v.reset(OpS390XXORconst) 16588 v.AuxInt = c 16589 v.AddArg(x) 16590 return true 16591 } 16592 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 16593 // cond: 16594 // result: (MOVDconst [c^d]) 16595 for { 16596 v_0 := v.Args[0] 16597 if v_0.Op != OpS390XMOVDconst { 16598 break 16599 } 16600 c := v_0.AuxInt 16601 v_1 := v.Args[1] 16602 if v_1.Op != OpS390XMOVDconst { 16603 break 16604 } 16605 d := v_1.AuxInt 16606 v.reset(OpS390XMOVDconst) 16607 v.AuxInt = c ^ d 16608 return true 16609 } 16610 // match: (XOR x x) 16611 // cond: 16612 // result: (MOVDconst [0]) 16613 for { 16614 x := v.Args[0] 16615 if x != v.Args[1] { 16616 break 16617 } 16618 v.reset(OpS390XMOVDconst) 16619 v.AuxInt = 0 16620 return true 16621 } 16622 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 16623 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16624 // result: (XORload <t> [off] {sym} x ptr mem) 16625 for { 16626 t := v.Type 16627 x := v.Args[0] 16628 g := v.Args[1] 16629 if g.Op != OpS390XMOVDload { 16630 break 16631 } 16632 off := g.AuxInt 16633 sym := g.Aux 16634 ptr := g.Args[0] 16635 mem := g.Args[1] 16636 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16637 break 16638 } 16639 v.reset(OpS390XXORload) 16640 v.Type = t 16641 v.AuxInt = off 16642 v.Aux = sym 16643 v.AddArg(x) 16644 v.AddArg(ptr) 16645 v.AddArg(mem) 16646 return true 16647 } 16648 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 16649 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16650 // result: (XORload <t> [off] {sym} x ptr mem) 16651 for { 16652 t := v.Type 16653 g := v.Args[0] 16654 if g.Op != OpS390XMOVDload { 16655 break 16656 } 16657 off := g.AuxInt 16658 sym := g.Aux 16659 ptr := g.Args[0] 16660 mem := g.Args[1] 16661 x := v.Args[1] 16662 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16663 break 16664 } 16665 v.reset(OpS390XXORload) 16666 v.Type = t 16667 v.AuxInt = off 16668 v.Aux = sym 16669 v.AddArg(x) 16670 v.AddArg(ptr) 16671 v.AddArg(mem) 16672 return true 16673 } 16674 return false 16675 } 16676 func rewriteValueS390X_OpS390XXORW(v *Value, config *Config) bool { 16677 b := v.Block 16678 _ = b 16679 // match: (XORW x (MOVDconst [c])) 16680 // cond: 16681 // result: (XORWconst [c] x) 16682 for { 16683 x := v.Args[0] 16684 v_1 := v.Args[1] 16685 if v_1.Op != OpS390XMOVDconst { 16686 break 16687 } 16688 c := v_1.AuxInt 16689 v.reset(OpS390XXORWconst) 16690 v.AuxInt = c 16691 v.AddArg(x) 16692 return true 16693 } 16694 // match: (XORW (MOVDconst [c]) x) 16695 // cond: 16696 // result: (XORWconst [c] x) 16697 for { 16698 v_0 := v.Args[0] 16699 if v_0.Op != OpS390XMOVDconst { 16700 break 16701 } 16702 c := v_0.AuxInt 16703 x := v.Args[1] 16704 v.reset(OpS390XXORWconst) 16705 v.AuxInt = c 16706 v.AddArg(x) 16707 return true 16708 } 16709 // match: (XORW x x) 16710 // cond: 16711 // result: (MOVDconst [0]) 16712 for { 16713 x := v.Args[0] 16714 if x != v.Args[1] { 16715 break 16716 } 16717 v.reset(OpS390XMOVDconst) 16718 v.AuxInt = 0 16719 return true 16720 } 16721 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 16722 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16723 // result: (XORWload <t> [off] {sym} x ptr mem) 16724 for { 16725 t := v.Type 16726 x := v.Args[0] 16727 g := v.Args[1] 16728 if g.Op != OpS390XMOVWload { 16729 break 16730 } 16731 off := g.AuxInt 16732 sym := g.Aux 16733 ptr := g.Args[0] 16734 mem := g.Args[1] 16735 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16736 break 16737 } 16738 v.reset(OpS390XXORWload) 16739 v.Type = t 16740 v.AuxInt = off 16741 v.Aux = sym 16742 v.AddArg(x) 16743 v.AddArg(ptr) 16744 v.AddArg(mem) 16745 return true 16746 } 16747 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 16748 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16749 // result: (XORWload <t> [off] {sym} x ptr mem) 16750 for { 16751 t := v.Type 16752 g := v.Args[0] 16753 if g.Op != OpS390XMOVWload { 16754 break 16755 } 16756 off := g.AuxInt 16757 sym := g.Aux 16758 ptr := g.Args[0] 16759 mem := g.Args[1] 16760 x := v.Args[1] 16761 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16762 break 16763 } 16764 v.reset(OpS390XXORWload) 16765 v.Type = t 16766 v.AuxInt = off 16767 v.Aux = sym 16768 v.AddArg(x) 16769 v.AddArg(ptr) 16770 v.AddArg(mem) 16771 return true 16772 } 16773 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 16774 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16775 // result: (XORWload <t> [off] {sym} x ptr mem) 16776 for { 16777 t := v.Type 16778 x := v.Args[0] 16779 g := v.Args[1] 16780 if g.Op != OpS390XMOVWZload { 16781 break 16782 } 16783 off := g.AuxInt 16784 sym := g.Aux 16785 ptr := g.Args[0] 16786 mem := g.Args[1] 16787 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16788 break 16789 } 16790 v.reset(OpS390XXORWload) 16791 v.Type = t 16792 v.AuxInt = off 16793 v.Aux = sym 16794 v.AddArg(x) 16795 v.AddArg(ptr) 16796 v.AddArg(mem) 16797 return true 16798 } 16799 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 16800 // cond: g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g) 16801 // result: (XORWload <t> [off] {sym} x ptr mem) 16802 for { 16803 t := v.Type 16804 g := v.Args[0] 16805 if g.Op != OpS390XMOVWZload { 16806 break 16807 } 16808 off := g.AuxInt 16809 sym := g.Aux 16810 ptr := g.Args[0] 16811 mem := g.Args[1] 16812 x := v.Args[1] 16813 if !(g.Uses == 1 && ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g) && clobber(g)) { 16814 break 16815 } 16816 v.reset(OpS390XXORWload) 16817 v.Type = t 16818 v.AuxInt = off 16819 v.Aux = sym 16820 v.AddArg(x) 16821 v.AddArg(ptr) 16822 v.AddArg(mem) 16823 return true 16824 } 16825 return false 16826 } 16827 func rewriteValueS390X_OpS390XXORWconst(v *Value, config *Config) bool { 16828 b := v.Block 16829 _ = b 16830 // match: (XORWconst [c] x) 16831 // cond: int32(c)==0 16832 // result: x 16833 for { 16834 c := v.AuxInt 16835 x := v.Args[0] 16836 if !(int32(c) == 0) { 16837 break 16838 } 16839 v.reset(OpCopy) 16840 v.Type = x.Type 16841 v.AddArg(x) 16842 return true 16843 } 16844 // match: (XORWconst [c] (MOVDconst [d])) 16845 // cond: 16846 // result: (MOVDconst [c^d]) 16847 for { 16848 c := v.AuxInt 16849 v_0 := v.Args[0] 16850 if v_0.Op != OpS390XMOVDconst { 16851 break 16852 } 16853 d := v_0.AuxInt 16854 v.reset(OpS390XMOVDconst) 16855 v.AuxInt = c ^ d 16856 return true 16857 } 16858 return false 16859 } 16860 func rewriteValueS390X_OpS390XXORconst(v *Value, config *Config) bool { 16861 b := v.Block 16862 _ = b 16863 // match: (XORconst [0] x) 16864 // cond: 16865 // result: x 16866 for { 16867 if v.AuxInt != 0 { 16868 break 16869 } 16870 x := v.Args[0] 16871 v.reset(OpCopy) 16872 v.Type = x.Type 16873 v.AddArg(x) 16874 return true 16875 } 16876 // match: (XORconst [c] (MOVDconst [d])) 16877 // cond: 16878 // result: (MOVDconst [c^d]) 16879 for { 16880 c := v.AuxInt 16881 v_0 := v.Args[0] 16882 if v_0.Op != OpS390XMOVDconst { 16883 break 16884 } 16885 d := v_0.AuxInt 16886 v.reset(OpS390XMOVDconst) 16887 v.AuxInt = c ^ d 16888 return true 16889 } 16890 return false 16891 } 16892 func rewriteValueS390X_OpSelect0(v *Value, config *Config) bool { 16893 b := v.Block 16894 _ = b 16895 // match: (Select0 <t> (AddTupleFirst32 tuple val)) 16896 // cond: 16897 // result: (ADDW val (Select0 <t> tuple)) 16898 for { 16899 t := v.Type 16900 v_0 := v.Args[0] 16901 if v_0.Op != OpS390XAddTupleFirst32 { 16902 break 16903 } 16904 tuple := v_0.Args[0] 16905 val := v_0.Args[1] 16906 v.reset(OpS390XADDW) 16907 v.AddArg(val) 16908 v0 := b.NewValue0(v.Line, OpSelect0, t) 16909 v0.AddArg(tuple) 16910 v.AddArg(v0) 16911 return true 16912 } 16913 // match: (Select0 <t> (AddTupleFirst64 tuple val)) 16914 // cond: 16915 // result: (ADD val (Select0 <t> tuple)) 16916 for { 16917 t := v.Type 16918 v_0 := v.Args[0] 16919 if v_0.Op != OpS390XAddTupleFirst64 { 16920 break 16921 } 16922 tuple := v_0.Args[0] 16923 val := v_0.Args[1] 16924 v.reset(OpS390XADD) 16925 v.AddArg(val) 16926 v0 := b.NewValue0(v.Line, OpSelect0, t) 16927 v0.AddArg(tuple) 16928 v.AddArg(v0) 16929 return true 16930 } 16931 return false 16932 } 16933 func rewriteValueS390X_OpSelect1(v *Value, config *Config) bool { 16934 b := v.Block 16935 _ = b 16936 // match: (Select1 (AddTupleFirst32 tuple _ )) 16937 // cond: 16938 // result: (Select1 tuple) 16939 for { 16940 v_0 := v.Args[0] 16941 if v_0.Op != OpS390XAddTupleFirst32 { 16942 break 16943 } 16944 tuple := v_0.Args[0] 16945 v.reset(OpSelect1) 16946 v.AddArg(tuple) 16947 return true 16948 } 16949 // match: (Select1 (AddTupleFirst64 tuple _ )) 16950 // cond: 16951 // result: (Select1 tuple) 16952 for { 16953 v_0 := v.Args[0] 16954 if v_0.Op != OpS390XAddTupleFirst64 { 16955 break 16956 } 16957 tuple := v_0.Args[0] 16958 v.reset(OpSelect1) 16959 v.AddArg(tuple) 16960 return true 16961 } 16962 return false 16963 } 16964 func rewriteValueS390X_OpSignExt16to32(v *Value, config *Config) bool { 16965 b := v.Block 16966 _ = b 16967 // match: (SignExt16to32 x) 16968 // cond: 16969 // result: (MOVHreg x) 16970 for { 16971 x := v.Args[0] 16972 v.reset(OpS390XMOVHreg) 16973 v.AddArg(x) 16974 return true 16975 } 16976 } 16977 func rewriteValueS390X_OpSignExt16to64(v *Value, config *Config) bool { 16978 b := v.Block 16979 _ = b 16980 // match: (SignExt16to64 x) 16981 // cond: 16982 // result: (MOVHreg x) 16983 for { 16984 x := v.Args[0] 16985 v.reset(OpS390XMOVHreg) 16986 v.AddArg(x) 16987 return true 16988 } 16989 } 16990 func rewriteValueS390X_OpSignExt32to64(v *Value, config *Config) bool { 16991 b := v.Block 16992 _ = b 16993 // match: (SignExt32to64 x) 16994 // cond: 16995 // result: (MOVWreg x) 16996 for { 16997 x := v.Args[0] 16998 v.reset(OpS390XMOVWreg) 16999 v.AddArg(x) 17000 return true 17001 } 17002 } 17003 func rewriteValueS390X_OpSignExt8to16(v *Value, config *Config) bool { 17004 b := v.Block 17005 _ = b 17006 // match: (SignExt8to16 x) 17007 // cond: 17008 // result: (MOVBreg x) 17009 for { 17010 x := v.Args[0] 17011 v.reset(OpS390XMOVBreg) 17012 v.AddArg(x) 17013 return true 17014 } 17015 } 17016 func rewriteValueS390X_OpSignExt8to32(v *Value, config *Config) bool { 17017 b := v.Block 17018 _ = b 17019 // match: (SignExt8to32 x) 17020 // cond: 17021 // result: (MOVBreg x) 17022 for { 17023 x := v.Args[0] 17024 v.reset(OpS390XMOVBreg) 17025 v.AddArg(x) 17026 return true 17027 } 17028 } 17029 func rewriteValueS390X_OpSignExt8to64(v *Value, config *Config) bool { 17030 b := v.Block 17031 _ = b 17032 // match: (SignExt8to64 x) 17033 // cond: 17034 // result: (MOVBreg x) 17035 for { 17036 x := v.Args[0] 17037 v.reset(OpS390XMOVBreg) 17038 v.AddArg(x) 17039 return true 17040 } 17041 } 17042 func rewriteValueS390X_OpSlicemask(v *Value, config *Config) bool { 17043 b := v.Block 17044 _ = b 17045 // match: (Slicemask <t> x) 17046 // cond: 17047 // result: (XOR (MOVDconst [-1]) (SRADconst <t> (SUBconst <t> x [1]) [63])) 17048 for { 17049 t := v.Type 17050 x := v.Args[0] 17051 v.reset(OpS390XXOR) 17052 v0 := b.NewValue0(v.Line, OpS390XMOVDconst, config.fe.TypeUInt64()) 17053 v0.AuxInt = -1 17054 v.AddArg(v0) 17055 v1 := b.NewValue0(v.Line, OpS390XSRADconst, t) 17056 v1.AuxInt = 63 17057 v2 := b.NewValue0(v.Line, OpS390XSUBconst, t) 17058 v2.AuxInt = 1 17059 v2.AddArg(x) 17060 v1.AddArg(v2) 17061 v.AddArg(v1) 17062 return true 17063 } 17064 } 17065 func rewriteValueS390X_OpSqrt(v *Value, config *Config) bool { 17066 b := v.Block 17067 _ = b 17068 // match: (Sqrt x) 17069 // cond: 17070 // result: (FSQRT x) 17071 for { 17072 x := v.Args[0] 17073 v.reset(OpS390XFSQRT) 17074 v.AddArg(x) 17075 return true 17076 } 17077 } 17078 func rewriteValueS390X_OpStaticCall(v *Value, config *Config) bool { 17079 b := v.Block 17080 _ = b 17081 // match: (StaticCall [argwid] {target} mem) 17082 // cond: 17083 // result: (CALLstatic [argwid] {target} mem) 17084 for { 17085 argwid := v.AuxInt 17086 target := v.Aux 17087 mem := v.Args[0] 17088 v.reset(OpS390XCALLstatic) 17089 v.AuxInt = argwid 17090 v.Aux = target 17091 v.AddArg(mem) 17092 return true 17093 } 17094 } 17095 func rewriteValueS390X_OpStore(v *Value, config *Config) bool { 17096 b := v.Block 17097 _ = b 17098 // match: (Store [8] ptr val mem) 17099 // cond: is64BitFloat(val.Type) 17100 // result: (FMOVDstore ptr val mem) 17101 for { 17102 if v.AuxInt != 8 { 17103 break 17104 } 17105 ptr := v.Args[0] 17106 val := v.Args[1] 17107 mem := v.Args[2] 17108 if !(is64BitFloat(val.Type)) { 17109 break 17110 } 17111 v.reset(OpS390XFMOVDstore) 17112 v.AddArg(ptr) 17113 v.AddArg(val) 17114 v.AddArg(mem) 17115 return true 17116 } 17117 // match: (Store [4] ptr val mem) 17118 // cond: is32BitFloat(val.Type) 17119 // result: (FMOVSstore ptr val mem) 17120 for { 17121 if v.AuxInt != 4 { 17122 break 17123 } 17124 ptr := v.Args[0] 17125 val := v.Args[1] 17126 mem := v.Args[2] 17127 if !(is32BitFloat(val.Type)) { 17128 break 17129 } 17130 v.reset(OpS390XFMOVSstore) 17131 v.AddArg(ptr) 17132 v.AddArg(val) 17133 v.AddArg(mem) 17134 return true 17135 } 17136 // match: (Store [8] ptr val mem) 17137 // cond: 17138 // result: (MOVDstore ptr val mem) 17139 for { 17140 if v.AuxInt != 8 { 17141 break 17142 } 17143 ptr := v.Args[0] 17144 val := v.Args[1] 17145 mem := v.Args[2] 17146 v.reset(OpS390XMOVDstore) 17147 v.AddArg(ptr) 17148 v.AddArg(val) 17149 v.AddArg(mem) 17150 return true 17151 } 17152 // match: (Store [4] ptr val mem) 17153 // cond: 17154 // result: (MOVWstore ptr val mem) 17155 for { 17156 if v.AuxInt != 4 { 17157 break 17158 } 17159 ptr := v.Args[0] 17160 val := v.Args[1] 17161 mem := v.Args[2] 17162 v.reset(OpS390XMOVWstore) 17163 v.AddArg(ptr) 17164 v.AddArg(val) 17165 v.AddArg(mem) 17166 return true 17167 } 17168 // match: (Store [2] ptr val mem) 17169 // cond: 17170 // result: (MOVHstore ptr val mem) 17171 for { 17172 if v.AuxInt != 2 { 17173 break 17174 } 17175 ptr := v.Args[0] 17176 val := v.Args[1] 17177 mem := v.Args[2] 17178 v.reset(OpS390XMOVHstore) 17179 v.AddArg(ptr) 17180 v.AddArg(val) 17181 v.AddArg(mem) 17182 return true 17183 } 17184 // match: (Store [1] ptr val mem) 17185 // cond: 17186 // result: (MOVBstore ptr val mem) 17187 for { 17188 if v.AuxInt != 1 { 17189 break 17190 } 17191 ptr := v.Args[0] 17192 val := v.Args[1] 17193 mem := v.Args[2] 17194 v.reset(OpS390XMOVBstore) 17195 v.AddArg(ptr) 17196 v.AddArg(val) 17197 v.AddArg(mem) 17198 return true 17199 } 17200 return false 17201 } 17202 func rewriteValueS390X_OpSub16(v *Value, config *Config) bool { 17203 b := v.Block 17204 _ = b 17205 // match: (Sub16 x y) 17206 // cond: 17207 // result: (SUBW x y) 17208 for { 17209 x := v.Args[0] 17210 y := v.Args[1] 17211 v.reset(OpS390XSUBW) 17212 v.AddArg(x) 17213 v.AddArg(y) 17214 return true 17215 } 17216 } 17217 func rewriteValueS390X_OpSub32(v *Value, config *Config) bool { 17218 b := v.Block 17219 _ = b 17220 // match: (Sub32 x y) 17221 // cond: 17222 // result: (SUBW x y) 17223 for { 17224 x := v.Args[0] 17225 y := v.Args[1] 17226 v.reset(OpS390XSUBW) 17227 v.AddArg(x) 17228 v.AddArg(y) 17229 return true 17230 } 17231 } 17232 func rewriteValueS390X_OpSub32F(v *Value, config *Config) bool { 17233 b := v.Block 17234 _ = b 17235 // match: (Sub32F x y) 17236 // cond: 17237 // result: (FSUBS x y) 17238 for { 17239 x := v.Args[0] 17240 y := v.Args[1] 17241 v.reset(OpS390XFSUBS) 17242 v.AddArg(x) 17243 v.AddArg(y) 17244 return true 17245 } 17246 } 17247 func rewriteValueS390X_OpSub64(v *Value, config *Config) bool { 17248 b := v.Block 17249 _ = b 17250 // match: (Sub64 x y) 17251 // cond: 17252 // result: (SUB x y) 17253 for { 17254 x := v.Args[0] 17255 y := v.Args[1] 17256 v.reset(OpS390XSUB) 17257 v.AddArg(x) 17258 v.AddArg(y) 17259 return true 17260 } 17261 } 17262 func rewriteValueS390X_OpSub64F(v *Value, config *Config) bool { 17263 b := v.Block 17264 _ = b 17265 // match: (Sub64F x y) 17266 // cond: 17267 // result: (FSUB x y) 17268 for { 17269 x := v.Args[0] 17270 y := v.Args[1] 17271 v.reset(OpS390XFSUB) 17272 v.AddArg(x) 17273 v.AddArg(y) 17274 return true 17275 } 17276 } 17277 func rewriteValueS390X_OpSub8(v *Value, config *Config) bool { 17278 b := v.Block 17279 _ = b 17280 // match: (Sub8 x y) 17281 // cond: 17282 // result: (SUBW x y) 17283 for { 17284 x := v.Args[0] 17285 y := v.Args[1] 17286 v.reset(OpS390XSUBW) 17287 v.AddArg(x) 17288 v.AddArg(y) 17289 return true 17290 } 17291 } 17292 func rewriteValueS390X_OpSubPtr(v *Value, config *Config) bool { 17293 b := v.Block 17294 _ = b 17295 // match: (SubPtr x y) 17296 // cond: 17297 // result: (SUB x y) 17298 for { 17299 x := v.Args[0] 17300 y := v.Args[1] 17301 v.reset(OpS390XSUB) 17302 v.AddArg(x) 17303 v.AddArg(y) 17304 return true 17305 } 17306 } 17307 func rewriteValueS390X_OpTrunc16to8(v *Value, config *Config) bool { 17308 b := v.Block 17309 _ = b 17310 // match: (Trunc16to8 x) 17311 // cond: 17312 // result: x 17313 for { 17314 x := v.Args[0] 17315 v.reset(OpCopy) 17316 v.Type = x.Type 17317 v.AddArg(x) 17318 return true 17319 } 17320 } 17321 func rewriteValueS390X_OpTrunc32to16(v *Value, config *Config) bool { 17322 b := v.Block 17323 _ = b 17324 // match: (Trunc32to16 x) 17325 // cond: 17326 // result: x 17327 for { 17328 x := v.Args[0] 17329 v.reset(OpCopy) 17330 v.Type = x.Type 17331 v.AddArg(x) 17332 return true 17333 } 17334 } 17335 func rewriteValueS390X_OpTrunc32to8(v *Value, config *Config) bool { 17336 b := v.Block 17337 _ = b 17338 // match: (Trunc32to8 x) 17339 // cond: 17340 // result: x 17341 for { 17342 x := v.Args[0] 17343 v.reset(OpCopy) 17344 v.Type = x.Type 17345 v.AddArg(x) 17346 return true 17347 } 17348 } 17349 func rewriteValueS390X_OpTrunc64to16(v *Value, config *Config) bool { 17350 b := v.Block 17351 _ = b 17352 // match: (Trunc64to16 x) 17353 // cond: 17354 // result: x 17355 for { 17356 x := v.Args[0] 17357 v.reset(OpCopy) 17358 v.Type = x.Type 17359 v.AddArg(x) 17360 return true 17361 } 17362 } 17363 func rewriteValueS390X_OpTrunc64to32(v *Value, config *Config) bool { 17364 b := v.Block 17365 _ = b 17366 // match: (Trunc64to32 x) 17367 // cond: 17368 // result: x 17369 for { 17370 x := v.Args[0] 17371 v.reset(OpCopy) 17372 v.Type = x.Type 17373 v.AddArg(x) 17374 return true 17375 } 17376 } 17377 func rewriteValueS390X_OpTrunc64to8(v *Value, config *Config) bool { 17378 b := v.Block 17379 _ = b 17380 // match: (Trunc64to8 x) 17381 // cond: 17382 // result: x 17383 for { 17384 x := v.Args[0] 17385 v.reset(OpCopy) 17386 v.Type = x.Type 17387 v.AddArg(x) 17388 return true 17389 } 17390 } 17391 func rewriteValueS390X_OpXor16(v *Value, config *Config) bool { 17392 b := v.Block 17393 _ = b 17394 // match: (Xor16 x y) 17395 // cond: 17396 // result: (XORW x y) 17397 for { 17398 x := v.Args[0] 17399 y := v.Args[1] 17400 v.reset(OpS390XXORW) 17401 v.AddArg(x) 17402 v.AddArg(y) 17403 return true 17404 } 17405 } 17406 func rewriteValueS390X_OpXor32(v *Value, config *Config) bool { 17407 b := v.Block 17408 _ = b 17409 // match: (Xor32 x y) 17410 // cond: 17411 // result: (XORW x y) 17412 for { 17413 x := v.Args[0] 17414 y := v.Args[1] 17415 v.reset(OpS390XXORW) 17416 v.AddArg(x) 17417 v.AddArg(y) 17418 return true 17419 } 17420 } 17421 func rewriteValueS390X_OpXor64(v *Value, config *Config) bool { 17422 b := v.Block 17423 _ = b 17424 // match: (Xor64 x y) 17425 // cond: 17426 // result: (XOR x y) 17427 for { 17428 x := v.Args[0] 17429 y := v.Args[1] 17430 v.reset(OpS390XXOR) 17431 v.AddArg(x) 17432 v.AddArg(y) 17433 return true 17434 } 17435 } 17436 func rewriteValueS390X_OpXor8(v *Value, config *Config) bool { 17437 b := v.Block 17438 _ = b 17439 // match: (Xor8 x y) 17440 // cond: 17441 // result: (XORW x y) 17442 for { 17443 x := v.Args[0] 17444 y := v.Args[1] 17445 v.reset(OpS390XXORW) 17446 v.AddArg(x) 17447 v.AddArg(y) 17448 return true 17449 } 17450 } 17451 func rewriteValueS390X_OpZero(v *Value, config *Config) bool { 17452 b := v.Block 17453 _ = b 17454 // match: (Zero [s] _ mem) 17455 // cond: SizeAndAlign(s).Size() == 0 17456 // result: mem 17457 for { 17458 s := v.AuxInt 17459 mem := v.Args[1] 17460 if !(SizeAndAlign(s).Size() == 0) { 17461 break 17462 } 17463 v.reset(OpCopy) 17464 v.Type = mem.Type 17465 v.AddArg(mem) 17466 return true 17467 } 17468 // match: (Zero [s] destptr mem) 17469 // cond: SizeAndAlign(s).Size() == 1 17470 // result: (MOVBstoreconst [0] destptr mem) 17471 for { 17472 s := v.AuxInt 17473 destptr := v.Args[0] 17474 mem := v.Args[1] 17475 if !(SizeAndAlign(s).Size() == 1) { 17476 break 17477 } 17478 v.reset(OpS390XMOVBstoreconst) 17479 v.AuxInt = 0 17480 v.AddArg(destptr) 17481 v.AddArg(mem) 17482 return true 17483 } 17484 // match: (Zero [s] destptr mem) 17485 // cond: SizeAndAlign(s).Size() == 2 17486 // result: (MOVHstoreconst [0] destptr mem) 17487 for { 17488 s := v.AuxInt 17489 destptr := v.Args[0] 17490 mem := v.Args[1] 17491 if !(SizeAndAlign(s).Size() == 2) { 17492 break 17493 } 17494 v.reset(OpS390XMOVHstoreconst) 17495 v.AuxInt = 0 17496 v.AddArg(destptr) 17497 v.AddArg(mem) 17498 return true 17499 } 17500 // match: (Zero [s] destptr mem) 17501 // cond: SizeAndAlign(s).Size() == 4 17502 // result: (MOVWstoreconst [0] destptr mem) 17503 for { 17504 s := v.AuxInt 17505 destptr := v.Args[0] 17506 mem := v.Args[1] 17507 if !(SizeAndAlign(s).Size() == 4) { 17508 break 17509 } 17510 v.reset(OpS390XMOVWstoreconst) 17511 v.AuxInt = 0 17512 v.AddArg(destptr) 17513 v.AddArg(mem) 17514 return true 17515 } 17516 // match: (Zero [s] destptr mem) 17517 // cond: SizeAndAlign(s).Size() == 8 17518 // result: (MOVDstoreconst [0] destptr mem) 17519 for { 17520 s := v.AuxInt 17521 destptr := v.Args[0] 17522 mem := v.Args[1] 17523 if !(SizeAndAlign(s).Size() == 8) { 17524 break 17525 } 17526 v.reset(OpS390XMOVDstoreconst) 17527 v.AuxInt = 0 17528 v.AddArg(destptr) 17529 v.AddArg(mem) 17530 return true 17531 } 17532 // match: (Zero [s] destptr mem) 17533 // cond: SizeAndAlign(s).Size() == 3 17534 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 17535 for { 17536 s := v.AuxInt 17537 destptr := v.Args[0] 17538 mem := v.Args[1] 17539 if !(SizeAndAlign(s).Size() == 3) { 17540 break 17541 } 17542 v.reset(OpS390XMOVBstoreconst) 17543 v.AuxInt = makeValAndOff(0, 2) 17544 v.AddArg(destptr) 17545 v0 := b.NewValue0(v.Line, OpS390XMOVHstoreconst, TypeMem) 17546 v0.AuxInt = 0 17547 v0.AddArg(destptr) 17548 v0.AddArg(mem) 17549 v.AddArg(v0) 17550 return true 17551 } 17552 // match: (Zero [s] destptr mem) 17553 // cond: SizeAndAlign(s).Size() == 5 17554 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 17555 for { 17556 s := v.AuxInt 17557 destptr := v.Args[0] 17558 mem := v.Args[1] 17559 if !(SizeAndAlign(s).Size() == 5) { 17560 break 17561 } 17562 v.reset(OpS390XMOVBstoreconst) 17563 v.AuxInt = makeValAndOff(0, 4) 17564 v.AddArg(destptr) 17565 v0 := b.NewValue0(v.Line, OpS390XMOVWstoreconst, TypeMem) 17566 v0.AuxInt = 0 17567 v0.AddArg(destptr) 17568 v0.AddArg(mem) 17569 v.AddArg(v0) 17570 return true 17571 } 17572 // match: (Zero [s] destptr mem) 17573 // cond: SizeAndAlign(s).Size() == 6 17574 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 17575 for { 17576 s := v.AuxInt 17577 destptr := v.Args[0] 17578 mem := v.Args[1] 17579 if !(SizeAndAlign(s).Size() == 6) { 17580 break 17581 } 17582 v.reset(OpS390XMOVHstoreconst) 17583 v.AuxInt = makeValAndOff(0, 4) 17584 v.AddArg(destptr) 17585 v0 := b.NewValue0(v.Line, OpS390XMOVWstoreconst, TypeMem) 17586 v0.AuxInt = 0 17587 v0.AddArg(destptr) 17588 v0.AddArg(mem) 17589 v.AddArg(v0) 17590 return true 17591 } 17592 // match: (Zero [s] destptr mem) 17593 // cond: SizeAndAlign(s).Size() == 7 17594 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 17595 for { 17596 s := v.AuxInt 17597 destptr := v.Args[0] 17598 mem := v.Args[1] 17599 if !(SizeAndAlign(s).Size() == 7) { 17600 break 17601 } 17602 v.reset(OpS390XMOVWstoreconst) 17603 v.AuxInt = makeValAndOff(0, 3) 17604 v.AddArg(destptr) 17605 v0 := b.NewValue0(v.Line, OpS390XMOVWstoreconst, TypeMem) 17606 v0.AuxInt = 0 17607 v0.AddArg(destptr) 17608 v0.AddArg(mem) 17609 v.AddArg(v0) 17610 return true 17611 } 17612 // match: (Zero [s] destptr mem) 17613 // cond: SizeAndAlign(s).Size() > 0 && SizeAndAlign(s).Size() <= 1024 17614 // result: (CLEAR [makeValAndOff(SizeAndAlign(s).Size(), 0)] destptr mem) 17615 for { 17616 s := v.AuxInt 17617 destptr := v.Args[0] 17618 mem := v.Args[1] 17619 if !(SizeAndAlign(s).Size() > 0 && SizeAndAlign(s).Size() <= 1024) { 17620 break 17621 } 17622 v.reset(OpS390XCLEAR) 17623 v.AuxInt = makeValAndOff(SizeAndAlign(s).Size(), 0) 17624 v.AddArg(destptr) 17625 v.AddArg(mem) 17626 return true 17627 } 17628 // match: (Zero [s] destptr mem) 17629 // cond: SizeAndAlign(s).Size() > 1024 17630 // result: (LoweredZero [SizeAndAlign(s).Size()%256] destptr (ADDconst <destptr.Type> destptr [(SizeAndAlign(s).Size()/256)*256]) mem) 17631 for { 17632 s := v.AuxInt 17633 destptr := v.Args[0] 17634 mem := v.Args[1] 17635 if !(SizeAndAlign(s).Size() > 1024) { 17636 break 17637 } 17638 v.reset(OpS390XLoweredZero) 17639 v.AuxInt = SizeAndAlign(s).Size() % 256 17640 v.AddArg(destptr) 17641 v0 := b.NewValue0(v.Line, OpS390XADDconst, destptr.Type) 17642 v0.AuxInt = (SizeAndAlign(s).Size() / 256) * 256 17643 v0.AddArg(destptr) 17644 v.AddArg(v0) 17645 v.AddArg(mem) 17646 return true 17647 } 17648 return false 17649 } 17650 func rewriteValueS390X_OpZeroExt16to32(v *Value, config *Config) bool { 17651 b := v.Block 17652 _ = b 17653 // match: (ZeroExt16to32 x) 17654 // cond: 17655 // result: (MOVHZreg x) 17656 for { 17657 x := v.Args[0] 17658 v.reset(OpS390XMOVHZreg) 17659 v.AddArg(x) 17660 return true 17661 } 17662 } 17663 func rewriteValueS390X_OpZeroExt16to64(v *Value, config *Config) bool { 17664 b := v.Block 17665 _ = b 17666 // match: (ZeroExt16to64 x) 17667 // cond: 17668 // result: (MOVHZreg x) 17669 for { 17670 x := v.Args[0] 17671 v.reset(OpS390XMOVHZreg) 17672 v.AddArg(x) 17673 return true 17674 } 17675 } 17676 func rewriteValueS390X_OpZeroExt32to64(v *Value, config *Config) bool { 17677 b := v.Block 17678 _ = b 17679 // match: (ZeroExt32to64 x) 17680 // cond: 17681 // result: (MOVWZreg x) 17682 for { 17683 x := v.Args[0] 17684 v.reset(OpS390XMOVWZreg) 17685 v.AddArg(x) 17686 return true 17687 } 17688 } 17689 func rewriteValueS390X_OpZeroExt8to16(v *Value, config *Config) bool { 17690 b := v.Block 17691 _ = b 17692 // match: (ZeroExt8to16 x) 17693 // cond: 17694 // result: (MOVBZreg x) 17695 for { 17696 x := v.Args[0] 17697 v.reset(OpS390XMOVBZreg) 17698 v.AddArg(x) 17699 return true 17700 } 17701 } 17702 func rewriteValueS390X_OpZeroExt8to32(v *Value, config *Config) bool { 17703 b := v.Block 17704 _ = b 17705 // match: (ZeroExt8to32 x) 17706 // cond: 17707 // result: (MOVBZreg x) 17708 for { 17709 x := v.Args[0] 17710 v.reset(OpS390XMOVBZreg) 17711 v.AddArg(x) 17712 return true 17713 } 17714 } 17715 func rewriteValueS390X_OpZeroExt8to64(v *Value, config *Config) bool { 17716 b := v.Block 17717 _ = b 17718 // match: (ZeroExt8to64 x) 17719 // cond: 17720 // result: (MOVBZreg x) 17721 for { 17722 x := v.Args[0] 17723 v.reset(OpS390XMOVBZreg) 17724 v.AddArg(x) 17725 return true 17726 } 17727 } 17728 func rewriteBlockS390X(b *Block, config *Config) bool { 17729 switch b.Kind { 17730 case BlockS390XEQ: 17731 // match: (EQ (InvertFlags cmp) yes no) 17732 // cond: 17733 // result: (EQ cmp yes no) 17734 for { 17735 v := b.Control 17736 if v.Op != OpS390XInvertFlags { 17737 break 17738 } 17739 cmp := v.Args[0] 17740 yes := b.Succs[0] 17741 no := b.Succs[1] 17742 b.Kind = BlockS390XEQ 17743 b.SetControl(cmp) 17744 _ = yes 17745 _ = no 17746 return true 17747 } 17748 // match: (EQ (FlagEQ) yes no) 17749 // cond: 17750 // result: (First nil yes no) 17751 for { 17752 v := b.Control 17753 if v.Op != OpS390XFlagEQ { 17754 break 17755 } 17756 yes := b.Succs[0] 17757 no := b.Succs[1] 17758 b.Kind = BlockFirst 17759 b.SetControl(nil) 17760 _ = yes 17761 _ = no 17762 return true 17763 } 17764 // match: (EQ (FlagLT) yes no) 17765 // cond: 17766 // result: (First nil no yes) 17767 for { 17768 v := b.Control 17769 if v.Op != OpS390XFlagLT { 17770 break 17771 } 17772 yes := b.Succs[0] 17773 no := b.Succs[1] 17774 b.Kind = BlockFirst 17775 b.SetControl(nil) 17776 b.swapSuccessors() 17777 _ = no 17778 _ = yes 17779 return true 17780 } 17781 // match: (EQ (FlagGT) yes no) 17782 // cond: 17783 // result: (First nil no yes) 17784 for { 17785 v := b.Control 17786 if v.Op != OpS390XFlagGT { 17787 break 17788 } 17789 yes := b.Succs[0] 17790 no := b.Succs[1] 17791 b.Kind = BlockFirst 17792 b.SetControl(nil) 17793 b.swapSuccessors() 17794 _ = no 17795 _ = yes 17796 return true 17797 } 17798 case BlockS390XGE: 17799 // match: (GE (InvertFlags cmp) yes no) 17800 // cond: 17801 // result: (LE cmp yes no) 17802 for { 17803 v := b.Control 17804 if v.Op != OpS390XInvertFlags { 17805 break 17806 } 17807 cmp := v.Args[0] 17808 yes := b.Succs[0] 17809 no := b.Succs[1] 17810 b.Kind = BlockS390XLE 17811 b.SetControl(cmp) 17812 _ = yes 17813 _ = no 17814 return true 17815 } 17816 // match: (GE (FlagEQ) yes no) 17817 // cond: 17818 // result: (First nil yes no) 17819 for { 17820 v := b.Control 17821 if v.Op != OpS390XFlagEQ { 17822 break 17823 } 17824 yes := b.Succs[0] 17825 no := b.Succs[1] 17826 b.Kind = BlockFirst 17827 b.SetControl(nil) 17828 _ = yes 17829 _ = no 17830 return true 17831 } 17832 // match: (GE (FlagLT) yes no) 17833 // cond: 17834 // result: (First nil no yes) 17835 for { 17836 v := b.Control 17837 if v.Op != OpS390XFlagLT { 17838 break 17839 } 17840 yes := b.Succs[0] 17841 no := b.Succs[1] 17842 b.Kind = BlockFirst 17843 b.SetControl(nil) 17844 b.swapSuccessors() 17845 _ = no 17846 _ = yes 17847 return true 17848 } 17849 // match: (GE (FlagGT) yes no) 17850 // cond: 17851 // result: (First nil yes no) 17852 for { 17853 v := b.Control 17854 if v.Op != OpS390XFlagGT { 17855 break 17856 } 17857 yes := b.Succs[0] 17858 no := b.Succs[1] 17859 b.Kind = BlockFirst 17860 b.SetControl(nil) 17861 _ = yes 17862 _ = no 17863 return true 17864 } 17865 case BlockS390XGT: 17866 // match: (GT (InvertFlags cmp) yes no) 17867 // cond: 17868 // result: (LT cmp yes no) 17869 for { 17870 v := b.Control 17871 if v.Op != OpS390XInvertFlags { 17872 break 17873 } 17874 cmp := v.Args[0] 17875 yes := b.Succs[0] 17876 no := b.Succs[1] 17877 b.Kind = BlockS390XLT 17878 b.SetControl(cmp) 17879 _ = yes 17880 _ = no 17881 return true 17882 } 17883 // match: (GT (FlagEQ) yes no) 17884 // cond: 17885 // result: (First nil no yes) 17886 for { 17887 v := b.Control 17888 if v.Op != OpS390XFlagEQ { 17889 break 17890 } 17891 yes := b.Succs[0] 17892 no := b.Succs[1] 17893 b.Kind = BlockFirst 17894 b.SetControl(nil) 17895 b.swapSuccessors() 17896 _ = no 17897 _ = yes 17898 return true 17899 } 17900 // match: (GT (FlagLT) yes no) 17901 // cond: 17902 // result: (First nil no yes) 17903 for { 17904 v := b.Control 17905 if v.Op != OpS390XFlagLT { 17906 break 17907 } 17908 yes := b.Succs[0] 17909 no := b.Succs[1] 17910 b.Kind = BlockFirst 17911 b.SetControl(nil) 17912 b.swapSuccessors() 17913 _ = no 17914 _ = yes 17915 return true 17916 } 17917 // match: (GT (FlagGT) yes no) 17918 // cond: 17919 // result: (First nil yes no) 17920 for { 17921 v := b.Control 17922 if v.Op != OpS390XFlagGT { 17923 break 17924 } 17925 yes := b.Succs[0] 17926 no := b.Succs[1] 17927 b.Kind = BlockFirst 17928 b.SetControl(nil) 17929 _ = yes 17930 _ = no 17931 return true 17932 } 17933 case BlockIf: 17934 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 17935 // cond: 17936 // result: (LT cmp yes no) 17937 for { 17938 v := b.Control 17939 if v.Op != OpS390XMOVDLT { 17940 break 17941 } 17942 v_0 := v.Args[0] 17943 if v_0.Op != OpS390XMOVDconst { 17944 break 17945 } 17946 if v_0.AuxInt != 0 { 17947 break 17948 } 17949 v_1 := v.Args[1] 17950 if v_1.Op != OpS390XMOVDconst { 17951 break 17952 } 17953 if v_1.AuxInt != 1 { 17954 break 17955 } 17956 cmp := v.Args[2] 17957 yes := b.Succs[0] 17958 no := b.Succs[1] 17959 b.Kind = BlockS390XLT 17960 b.SetControl(cmp) 17961 _ = yes 17962 _ = no 17963 return true 17964 } 17965 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 17966 // cond: 17967 // result: (LE cmp yes no) 17968 for { 17969 v := b.Control 17970 if v.Op != OpS390XMOVDLE { 17971 break 17972 } 17973 v_0 := v.Args[0] 17974 if v_0.Op != OpS390XMOVDconst { 17975 break 17976 } 17977 if v_0.AuxInt != 0 { 17978 break 17979 } 17980 v_1 := v.Args[1] 17981 if v_1.Op != OpS390XMOVDconst { 17982 break 17983 } 17984 if v_1.AuxInt != 1 { 17985 break 17986 } 17987 cmp := v.Args[2] 17988 yes := b.Succs[0] 17989 no := b.Succs[1] 17990 b.Kind = BlockS390XLE 17991 b.SetControl(cmp) 17992 _ = yes 17993 _ = no 17994 return true 17995 } 17996 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 17997 // cond: 17998 // result: (GT cmp yes no) 17999 for { 18000 v := b.Control 18001 if v.Op != OpS390XMOVDGT { 18002 break 18003 } 18004 v_0 := v.Args[0] 18005 if v_0.Op != OpS390XMOVDconst { 18006 break 18007 } 18008 if v_0.AuxInt != 0 { 18009 break 18010 } 18011 v_1 := v.Args[1] 18012 if v_1.Op != OpS390XMOVDconst { 18013 break 18014 } 18015 if v_1.AuxInt != 1 { 18016 break 18017 } 18018 cmp := v.Args[2] 18019 yes := b.Succs[0] 18020 no := b.Succs[1] 18021 b.Kind = BlockS390XGT 18022 b.SetControl(cmp) 18023 _ = yes 18024 _ = no 18025 return true 18026 } 18027 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 18028 // cond: 18029 // result: (GE cmp yes no) 18030 for { 18031 v := b.Control 18032 if v.Op != OpS390XMOVDGE { 18033 break 18034 } 18035 v_0 := v.Args[0] 18036 if v_0.Op != OpS390XMOVDconst { 18037 break 18038 } 18039 if v_0.AuxInt != 0 { 18040 break 18041 } 18042 v_1 := v.Args[1] 18043 if v_1.Op != OpS390XMOVDconst { 18044 break 18045 } 18046 if v_1.AuxInt != 1 { 18047 break 18048 } 18049 cmp := v.Args[2] 18050 yes := b.Succs[0] 18051 no := b.Succs[1] 18052 b.Kind = BlockS390XGE 18053 b.SetControl(cmp) 18054 _ = yes 18055 _ = no 18056 return true 18057 } 18058 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 18059 // cond: 18060 // result: (EQ cmp yes no) 18061 for { 18062 v := b.Control 18063 if v.Op != OpS390XMOVDEQ { 18064 break 18065 } 18066 v_0 := v.Args[0] 18067 if v_0.Op != OpS390XMOVDconst { 18068 break 18069 } 18070 if v_0.AuxInt != 0 { 18071 break 18072 } 18073 v_1 := v.Args[1] 18074 if v_1.Op != OpS390XMOVDconst { 18075 break 18076 } 18077 if v_1.AuxInt != 1 { 18078 break 18079 } 18080 cmp := v.Args[2] 18081 yes := b.Succs[0] 18082 no := b.Succs[1] 18083 b.Kind = BlockS390XEQ 18084 b.SetControl(cmp) 18085 _ = yes 18086 _ = no 18087 return true 18088 } 18089 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 18090 // cond: 18091 // result: (NE cmp yes no) 18092 for { 18093 v := b.Control 18094 if v.Op != OpS390XMOVDNE { 18095 break 18096 } 18097 v_0 := v.Args[0] 18098 if v_0.Op != OpS390XMOVDconst { 18099 break 18100 } 18101 if v_0.AuxInt != 0 { 18102 break 18103 } 18104 v_1 := v.Args[1] 18105 if v_1.Op != OpS390XMOVDconst { 18106 break 18107 } 18108 if v_1.AuxInt != 1 { 18109 break 18110 } 18111 cmp := v.Args[2] 18112 yes := b.Succs[0] 18113 no := b.Succs[1] 18114 b.Kind = BlockS390XNE 18115 b.SetControl(cmp) 18116 _ = yes 18117 _ = no 18118 return true 18119 } 18120 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 18121 // cond: 18122 // result: (GTF cmp yes no) 18123 for { 18124 v := b.Control 18125 if v.Op != OpS390XMOVDGTnoinv { 18126 break 18127 } 18128 v_0 := v.Args[0] 18129 if v_0.Op != OpS390XMOVDconst { 18130 break 18131 } 18132 if v_0.AuxInt != 0 { 18133 break 18134 } 18135 v_1 := v.Args[1] 18136 if v_1.Op != OpS390XMOVDconst { 18137 break 18138 } 18139 if v_1.AuxInt != 1 { 18140 break 18141 } 18142 cmp := v.Args[2] 18143 yes := b.Succs[0] 18144 no := b.Succs[1] 18145 b.Kind = BlockS390XGTF 18146 b.SetControl(cmp) 18147 _ = yes 18148 _ = no 18149 return true 18150 } 18151 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 18152 // cond: 18153 // result: (GEF cmp yes no) 18154 for { 18155 v := b.Control 18156 if v.Op != OpS390XMOVDGEnoinv { 18157 break 18158 } 18159 v_0 := v.Args[0] 18160 if v_0.Op != OpS390XMOVDconst { 18161 break 18162 } 18163 if v_0.AuxInt != 0 { 18164 break 18165 } 18166 v_1 := v.Args[1] 18167 if v_1.Op != OpS390XMOVDconst { 18168 break 18169 } 18170 if v_1.AuxInt != 1 { 18171 break 18172 } 18173 cmp := v.Args[2] 18174 yes := b.Succs[0] 18175 no := b.Succs[1] 18176 b.Kind = BlockS390XGEF 18177 b.SetControl(cmp) 18178 _ = yes 18179 _ = no 18180 return true 18181 } 18182 // match: (If cond yes no) 18183 // cond: 18184 // result: (NE (CMPWconst [0] (MOVBZreg cond)) yes no) 18185 for { 18186 v := b.Control 18187 _ = v 18188 cond := b.Control 18189 yes := b.Succs[0] 18190 no := b.Succs[1] 18191 b.Kind = BlockS390XNE 18192 v0 := b.NewValue0(v.Line, OpS390XCMPWconst, TypeFlags) 18193 v0.AuxInt = 0 18194 v1 := b.NewValue0(v.Line, OpS390XMOVBZreg, config.fe.TypeUInt64()) 18195 v1.AddArg(cond) 18196 v0.AddArg(v1) 18197 b.SetControl(v0) 18198 _ = yes 18199 _ = no 18200 return true 18201 } 18202 case BlockS390XLE: 18203 // match: (LE (InvertFlags cmp) yes no) 18204 // cond: 18205 // result: (GE cmp yes no) 18206 for { 18207 v := b.Control 18208 if v.Op != OpS390XInvertFlags { 18209 break 18210 } 18211 cmp := v.Args[0] 18212 yes := b.Succs[0] 18213 no := b.Succs[1] 18214 b.Kind = BlockS390XGE 18215 b.SetControl(cmp) 18216 _ = yes 18217 _ = no 18218 return true 18219 } 18220 // match: (LE (FlagEQ) yes no) 18221 // cond: 18222 // result: (First nil yes no) 18223 for { 18224 v := b.Control 18225 if v.Op != OpS390XFlagEQ { 18226 break 18227 } 18228 yes := b.Succs[0] 18229 no := b.Succs[1] 18230 b.Kind = BlockFirst 18231 b.SetControl(nil) 18232 _ = yes 18233 _ = no 18234 return true 18235 } 18236 // match: (LE (FlagLT) yes no) 18237 // cond: 18238 // result: (First nil yes no) 18239 for { 18240 v := b.Control 18241 if v.Op != OpS390XFlagLT { 18242 break 18243 } 18244 yes := b.Succs[0] 18245 no := b.Succs[1] 18246 b.Kind = BlockFirst 18247 b.SetControl(nil) 18248 _ = yes 18249 _ = no 18250 return true 18251 } 18252 // match: (LE (FlagGT) yes no) 18253 // cond: 18254 // result: (First nil no yes) 18255 for { 18256 v := b.Control 18257 if v.Op != OpS390XFlagGT { 18258 break 18259 } 18260 yes := b.Succs[0] 18261 no := b.Succs[1] 18262 b.Kind = BlockFirst 18263 b.SetControl(nil) 18264 b.swapSuccessors() 18265 _ = no 18266 _ = yes 18267 return true 18268 } 18269 case BlockS390XLT: 18270 // match: (LT (InvertFlags cmp) yes no) 18271 // cond: 18272 // result: (GT cmp yes no) 18273 for { 18274 v := b.Control 18275 if v.Op != OpS390XInvertFlags { 18276 break 18277 } 18278 cmp := v.Args[0] 18279 yes := b.Succs[0] 18280 no := b.Succs[1] 18281 b.Kind = BlockS390XGT 18282 b.SetControl(cmp) 18283 _ = yes 18284 _ = no 18285 return true 18286 } 18287 // match: (LT (FlagEQ) yes no) 18288 // cond: 18289 // result: (First nil no yes) 18290 for { 18291 v := b.Control 18292 if v.Op != OpS390XFlagEQ { 18293 break 18294 } 18295 yes := b.Succs[0] 18296 no := b.Succs[1] 18297 b.Kind = BlockFirst 18298 b.SetControl(nil) 18299 b.swapSuccessors() 18300 _ = no 18301 _ = yes 18302 return true 18303 } 18304 // match: (LT (FlagLT) yes no) 18305 // cond: 18306 // result: (First nil yes no) 18307 for { 18308 v := b.Control 18309 if v.Op != OpS390XFlagLT { 18310 break 18311 } 18312 yes := b.Succs[0] 18313 no := b.Succs[1] 18314 b.Kind = BlockFirst 18315 b.SetControl(nil) 18316 _ = yes 18317 _ = no 18318 return true 18319 } 18320 // match: (LT (FlagGT) yes no) 18321 // cond: 18322 // result: (First nil no yes) 18323 for { 18324 v := b.Control 18325 if v.Op != OpS390XFlagGT { 18326 break 18327 } 18328 yes := b.Succs[0] 18329 no := b.Succs[1] 18330 b.Kind = BlockFirst 18331 b.SetControl(nil) 18332 b.swapSuccessors() 18333 _ = no 18334 _ = yes 18335 return true 18336 } 18337 case BlockS390XNE: 18338 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 18339 // cond: 18340 // result: (LT cmp yes no) 18341 for { 18342 v := b.Control 18343 if v.Op != OpS390XCMPWconst { 18344 break 18345 } 18346 if v.AuxInt != 0 { 18347 break 18348 } 18349 v_0 := v.Args[0] 18350 if v_0.Op != OpS390XMOVDLT { 18351 break 18352 } 18353 v_0_0 := v_0.Args[0] 18354 if v_0_0.Op != OpS390XMOVDconst { 18355 break 18356 } 18357 if v_0_0.AuxInt != 0 { 18358 break 18359 } 18360 v_0_1 := v_0.Args[1] 18361 if v_0_1.Op != OpS390XMOVDconst { 18362 break 18363 } 18364 if v_0_1.AuxInt != 1 { 18365 break 18366 } 18367 cmp := v_0.Args[2] 18368 yes := b.Succs[0] 18369 no := b.Succs[1] 18370 b.Kind = BlockS390XLT 18371 b.SetControl(cmp) 18372 _ = yes 18373 _ = no 18374 return true 18375 } 18376 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 18377 // cond: 18378 // result: (LE cmp yes no) 18379 for { 18380 v := b.Control 18381 if v.Op != OpS390XCMPWconst { 18382 break 18383 } 18384 if v.AuxInt != 0 { 18385 break 18386 } 18387 v_0 := v.Args[0] 18388 if v_0.Op != OpS390XMOVDLE { 18389 break 18390 } 18391 v_0_0 := v_0.Args[0] 18392 if v_0_0.Op != OpS390XMOVDconst { 18393 break 18394 } 18395 if v_0_0.AuxInt != 0 { 18396 break 18397 } 18398 v_0_1 := v_0.Args[1] 18399 if v_0_1.Op != OpS390XMOVDconst { 18400 break 18401 } 18402 if v_0_1.AuxInt != 1 { 18403 break 18404 } 18405 cmp := v_0.Args[2] 18406 yes := b.Succs[0] 18407 no := b.Succs[1] 18408 b.Kind = BlockS390XLE 18409 b.SetControl(cmp) 18410 _ = yes 18411 _ = no 18412 return true 18413 } 18414 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 18415 // cond: 18416 // result: (GT cmp yes no) 18417 for { 18418 v := b.Control 18419 if v.Op != OpS390XCMPWconst { 18420 break 18421 } 18422 if v.AuxInt != 0 { 18423 break 18424 } 18425 v_0 := v.Args[0] 18426 if v_0.Op != OpS390XMOVDGT { 18427 break 18428 } 18429 v_0_0 := v_0.Args[0] 18430 if v_0_0.Op != OpS390XMOVDconst { 18431 break 18432 } 18433 if v_0_0.AuxInt != 0 { 18434 break 18435 } 18436 v_0_1 := v_0.Args[1] 18437 if v_0_1.Op != OpS390XMOVDconst { 18438 break 18439 } 18440 if v_0_1.AuxInt != 1 { 18441 break 18442 } 18443 cmp := v_0.Args[2] 18444 yes := b.Succs[0] 18445 no := b.Succs[1] 18446 b.Kind = BlockS390XGT 18447 b.SetControl(cmp) 18448 _ = yes 18449 _ = no 18450 return true 18451 } 18452 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 18453 // cond: 18454 // result: (GE cmp yes no) 18455 for { 18456 v := b.Control 18457 if v.Op != OpS390XCMPWconst { 18458 break 18459 } 18460 if v.AuxInt != 0 { 18461 break 18462 } 18463 v_0 := v.Args[0] 18464 if v_0.Op != OpS390XMOVDGE { 18465 break 18466 } 18467 v_0_0 := v_0.Args[0] 18468 if v_0_0.Op != OpS390XMOVDconst { 18469 break 18470 } 18471 if v_0_0.AuxInt != 0 { 18472 break 18473 } 18474 v_0_1 := v_0.Args[1] 18475 if v_0_1.Op != OpS390XMOVDconst { 18476 break 18477 } 18478 if v_0_1.AuxInt != 1 { 18479 break 18480 } 18481 cmp := v_0.Args[2] 18482 yes := b.Succs[0] 18483 no := b.Succs[1] 18484 b.Kind = BlockS390XGE 18485 b.SetControl(cmp) 18486 _ = yes 18487 _ = no 18488 return true 18489 } 18490 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 18491 // cond: 18492 // result: (EQ cmp yes no) 18493 for { 18494 v := b.Control 18495 if v.Op != OpS390XCMPWconst { 18496 break 18497 } 18498 if v.AuxInt != 0 { 18499 break 18500 } 18501 v_0 := v.Args[0] 18502 if v_0.Op != OpS390XMOVDEQ { 18503 break 18504 } 18505 v_0_0 := v_0.Args[0] 18506 if v_0_0.Op != OpS390XMOVDconst { 18507 break 18508 } 18509 if v_0_0.AuxInt != 0 { 18510 break 18511 } 18512 v_0_1 := v_0.Args[1] 18513 if v_0_1.Op != OpS390XMOVDconst { 18514 break 18515 } 18516 if v_0_1.AuxInt != 1 { 18517 break 18518 } 18519 cmp := v_0.Args[2] 18520 yes := b.Succs[0] 18521 no := b.Succs[1] 18522 b.Kind = BlockS390XEQ 18523 b.SetControl(cmp) 18524 _ = yes 18525 _ = no 18526 return true 18527 } 18528 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 18529 // cond: 18530 // result: (NE cmp yes no) 18531 for { 18532 v := b.Control 18533 if v.Op != OpS390XCMPWconst { 18534 break 18535 } 18536 if v.AuxInt != 0 { 18537 break 18538 } 18539 v_0 := v.Args[0] 18540 if v_0.Op != OpS390XMOVDNE { 18541 break 18542 } 18543 v_0_0 := v_0.Args[0] 18544 if v_0_0.Op != OpS390XMOVDconst { 18545 break 18546 } 18547 if v_0_0.AuxInt != 0 { 18548 break 18549 } 18550 v_0_1 := v_0.Args[1] 18551 if v_0_1.Op != OpS390XMOVDconst { 18552 break 18553 } 18554 if v_0_1.AuxInt != 1 { 18555 break 18556 } 18557 cmp := v_0.Args[2] 18558 yes := b.Succs[0] 18559 no := b.Succs[1] 18560 b.Kind = BlockS390XNE 18561 b.SetControl(cmp) 18562 _ = yes 18563 _ = no 18564 return true 18565 } 18566 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 18567 // cond: 18568 // result: (GTF cmp yes no) 18569 for { 18570 v := b.Control 18571 if v.Op != OpS390XCMPWconst { 18572 break 18573 } 18574 if v.AuxInt != 0 { 18575 break 18576 } 18577 v_0 := v.Args[0] 18578 if v_0.Op != OpS390XMOVDGTnoinv { 18579 break 18580 } 18581 v_0_0 := v_0.Args[0] 18582 if v_0_0.Op != OpS390XMOVDconst { 18583 break 18584 } 18585 if v_0_0.AuxInt != 0 { 18586 break 18587 } 18588 v_0_1 := v_0.Args[1] 18589 if v_0_1.Op != OpS390XMOVDconst { 18590 break 18591 } 18592 if v_0_1.AuxInt != 1 { 18593 break 18594 } 18595 cmp := v_0.Args[2] 18596 yes := b.Succs[0] 18597 no := b.Succs[1] 18598 b.Kind = BlockS390XGTF 18599 b.SetControl(cmp) 18600 _ = yes 18601 _ = no 18602 return true 18603 } 18604 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 18605 // cond: 18606 // result: (GEF cmp yes no) 18607 for { 18608 v := b.Control 18609 if v.Op != OpS390XCMPWconst { 18610 break 18611 } 18612 if v.AuxInt != 0 { 18613 break 18614 } 18615 v_0 := v.Args[0] 18616 if v_0.Op != OpS390XMOVDGEnoinv { 18617 break 18618 } 18619 v_0_0 := v_0.Args[0] 18620 if v_0_0.Op != OpS390XMOVDconst { 18621 break 18622 } 18623 if v_0_0.AuxInt != 0 { 18624 break 18625 } 18626 v_0_1 := v_0.Args[1] 18627 if v_0_1.Op != OpS390XMOVDconst { 18628 break 18629 } 18630 if v_0_1.AuxInt != 1 { 18631 break 18632 } 18633 cmp := v_0.Args[2] 18634 yes := b.Succs[0] 18635 no := b.Succs[1] 18636 b.Kind = BlockS390XGEF 18637 b.SetControl(cmp) 18638 _ = yes 18639 _ = no 18640 return true 18641 } 18642 // match: (NE (InvertFlags cmp) yes no) 18643 // cond: 18644 // result: (NE cmp yes no) 18645 for { 18646 v := b.Control 18647 if v.Op != OpS390XInvertFlags { 18648 break 18649 } 18650 cmp := v.Args[0] 18651 yes := b.Succs[0] 18652 no := b.Succs[1] 18653 b.Kind = BlockS390XNE 18654 b.SetControl(cmp) 18655 _ = yes 18656 _ = no 18657 return true 18658 } 18659 // match: (NE (FlagEQ) yes no) 18660 // cond: 18661 // result: (First nil no yes) 18662 for { 18663 v := b.Control 18664 if v.Op != OpS390XFlagEQ { 18665 break 18666 } 18667 yes := b.Succs[0] 18668 no := b.Succs[1] 18669 b.Kind = BlockFirst 18670 b.SetControl(nil) 18671 b.swapSuccessors() 18672 _ = no 18673 _ = yes 18674 return true 18675 } 18676 // match: (NE (FlagLT) yes no) 18677 // cond: 18678 // result: (First nil yes no) 18679 for { 18680 v := b.Control 18681 if v.Op != OpS390XFlagLT { 18682 break 18683 } 18684 yes := b.Succs[0] 18685 no := b.Succs[1] 18686 b.Kind = BlockFirst 18687 b.SetControl(nil) 18688 _ = yes 18689 _ = no 18690 return true 18691 } 18692 // match: (NE (FlagGT) yes no) 18693 // cond: 18694 // result: (First nil yes no) 18695 for { 18696 v := b.Control 18697 if v.Op != OpS390XFlagGT { 18698 break 18699 } 18700 yes := b.Succs[0] 18701 no := b.Succs[1] 18702 b.Kind = BlockFirst 18703 b.SetControl(nil) 18704 _ = yes 18705 _ = no 18706 return true 18707 } 18708 } 18709 return false 18710 } 18711