github.com/slayercat/go@v0.0.0-20170428012452-c51559813f61/src/cmd/compile/internal/ssa/rewriteS390X.go (about) 1 // Code generated from gen/S390X.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 10 var _ = math.MinInt8 // in case not otherwise used 11 var _ = obj.ANOP // in case not otherwise used 12 var _ = objabi.GOROOT // in case not otherwise used 13 14 func rewriteValueS390X(v *Value) bool { 15 switch v.Op { 16 case OpAdd16: 17 return rewriteValueS390X_OpAdd16_0(v) 18 case OpAdd32: 19 return rewriteValueS390X_OpAdd32_0(v) 20 case OpAdd32F: 21 return rewriteValueS390X_OpAdd32F_0(v) 22 case OpAdd64: 23 return rewriteValueS390X_OpAdd64_0(v) 24 case OpAdd64F: 25 return rewriteValueS390X_OpAdd64F_0(v) 26 case OpAdd8: 27 return rewriteValueS390X_OpAdd8_0(v) 28 case OpAddPtr: 29 return rewriteValueS390X_OpAddPtr_0(v) 30 case OpAddr: 31 return rewriteValueS390X_OpAddr_0(v) 32 case OpAnd16: 33 return rewriteValueS390X_OpAnd16_0(v) 34 case OpAnd32: 35 return rewriteValueS390X_OpAnd32_0(v) 36 case OpAnd64: 37 return rewriteValueS390X_OpAnd64_0(v) 38 case OpAnd8: 39 return rewriteValueS390X_OpAnd8_0(v) 40 case OpAndB: 41 return rewriteValueS390X_OpAndB_0(v) 42 case OpAtomicAdd32: 43 return rewriteValueS390X_OpAtomicAdd32_0(v) 44 case OpAtomicAdd64: 45 return rewriteValueS390X_OpAtomicAdd64_0(v) 46 case OpAtomicCompareAndSwap32: 47 return rewriteValueS390X_OpAtomicCompareAndSwap32_0(v) 48 case OpAtomicCompareAndSwap64: 49 return rewriteValueS390X_OpAtomicCompareAndSwap64_0(v) 50 case OpAtomicExchange32: 51 return rewriteValueS390X_OpAtomicExchange32_0(v) 52 case OpAtomicExchange64: 53 return rewriteValueS390X_OpAtomicExchange64_0(v) 54 case OpAtomicLoad32: 55 return rewriteValueS390X_OpAtomicLoad32_0(v) 56 case OpAtomicLoad64: 57 return rewriteValueS390X_OpAtomicLoad64_0(v) 58 case OpAtomicLoadPtr: 59 return rewriteValueS390X_OpAtomicLoadPtr_0(v) 60 case OpAtomicStore32: 61 return rewriteValueS390X_OpAtomicStore32_0(v) 62 case OpAtomicStore64: 63 return rewriteValueS390X_OpAtomicStore64_0(v) 64 case OpAtomicStorePtrNoWB: 65 return rewriteValueS390X_OpAtomicStorePtrNoWB_0(v) 66 case OpAvg64u: 67 return rewriteValueS390X_OpAvg64u_0(v) 68 case OpBitLen64: 69 return rewriteValueS390X_OpBitLen64_0(v) 70 case OpBswap32: 71 return rewriteValueS390X_OpBswap32_0(v) 72 case OpBswap64: 73 return rewriteValueS390X_OpBswap64_0(v) 74 case OpClosureCall: 75 return rewriteValueS390X_OpClosureCall_0(v) 76 case OpCom16: 77 return rewriteValueS390X_OpCom16_0(v) 78 case OpCom32: 79 return rewriteValueS390X_OpCom32_0(v) 80 case OpCom64: 81 return rewriteValueS390X_OpCom64_0(v) 82 case OpCom8: 83 return rewriteValueS390X_OpCom8_0(v) 84 case OpConst16: 85 return rewriteValueS390X_OpConst16_0(v) 86 case OpConst32: 87 return rewriteValueS390X_OpConst32_0(v) 88 case OpConst32F: 89 return rewriteValueS390X_OpConst32F_0(v) 90 case OpConst64: 91 return rewriteValueS390X_OpConst64_0(v) 92 case OpConst64F: 93 return rewriteValueS390X_OpConst64F_0(v) 94 case OpConst8: 95 return rewriteValueS390X_OpConst8_0(v) 96 case OpConstBool: 97 return rewriteValueS390X_OpConstBool_0(v) 98 case OpConstNil: 99 return rewriteValueS390X_OpConstNil_0(v) 100 case OpConvert: 101 return rewriteValueS390X_OpConvert_0(v) 102 case OpCtz32: 103 return rewriteValueS390X_OpCtz32_0(v) 104 case OpCtz64: 105 return rewriteValueS390X_OpCtz64_0(v) 106 case OpCvt32Fto32: 107 return rewriteValueS390X_OpCvt32Fto32_0(v) 108 case OpCvt32Fto64: 109 return rewriteValueS390X_OpCvt32Fto64_0(v) 110 case OpCvt32Fto64F: 111 return rewriteValueS390X_OpCvt32Fto64F_0(v) 112 case OpCvt32to32F: 113 return rewriteValueS390X_OpCvt32to32F_0(v) 114 case OpCvt32to64F: 115 return rewriteValueS390X_OpCvt32to64F_0(v) 116 case OpCvt64Fto32: 117 return rewriteValueS390X_OpCvt64Fto32_0(v) 118 case OpCvt64Fto32F: 119 return rewriteValueS390X_OpCvt64Fto32F_0(v) 120 case OpCvt64Fto64: 121 return rewriteValueS390X_OpCvt64Fto64_0(v) 122 case OpCvt64to32F: 123 return rewriteValueS390X_OpCvt64to32F_0(v) 124 case OpCvt64to64F: 125 return rewriteValueS390X_OpCvt64to64F_0(v) 126 case OpDiv16: 127 return rewriteValueS390X_OpDiv16_0(v) 128 case OpDiv16u: 129 return rewriteValueS390X_OpDiv16u_0(v) 130 case OpDiv32: 131 return rewriteValueS390X_OpDiv32_0(v) 132 case OpDiv32F: 133 return rewriteValueS390X_OpDiv32F_0(v) 134 case OpDiv32u: 135 return rewriteValueS390X_OpDiv32u_0(v) 136 case OpDiv64: 137 return rewriteValueS390X_OpDiv64_0(v) 138 case OpDiv64F: 139 return rewriteValueS390X_OpDiv64F_0(v) 140 case OpDiv64u: 141 return rewriteValueS390X_OpDiv64u_0(v) 142 case OpDiv8: 143 return rewriteValueS390X_OpDiv8_0(v) 144 case OpDiv8u: 145 return rewriteValueS390X_OpDiv8u_0(v) 146 case OpEq16: 147 return rewriteValueS390X_OpEq16_0(v) 148 case OpEq32: 149 return rewriteValueS390X_OpEq32_0(v) 150 case OpEq32F: 151 return rewriteValueS390X_OpEq32F_0(v) 152 case OpEq64: 153 return rewriteValueS390X_OpEq64_0(v) 154 case OpEq64F: 155 return rewriteValueS390X_OpEq64F_0(v) 156 case OpEq8: 157 return rewriteValueS390X_OpEq8_0(v) 158 case OpEqB: 159 return rewriteValueS390X_OpEqB_0(v) 160 case OpEqPtr: 161 return rewriteValueS390X_OpEqPtr_0(v) 162 case OpGeq16: 163 return rewriteValueS390X_OpGeq16_0(v) 164 case OpGeq16U: 165 return rewriteValueS390X_OpGeq16U_0(v) 166 case OpGeq32: 167 return rewriteValueS390X_OpGeq32_0(v) 168 case OpGeq32F: 169 return rewriteValueS390X_OpGeq32F_0(v) 170 case OpGeq32U: 171 return rewriteValueS390X_OpGeq32U_0(v) 172 case OpGeq64: 173 return rewriteValueS390X_OpGeq64_0(v) 174 case OpGeq64F: 175 return rewriteValueS390X_OpGeq64F_0(v) 176 case OpGeq64U: 177 return rewriteValueS390X_OpGeq64U_0(v) 178 case OpGeq8: 179 return rewriteValueS390X_OpGeq8_0(v) 180 case OpGeq8U: 181 return rewriteValueS390X_OpGeq8U_0(v) 182 case OpGetClosurePtr: 183 return rewriteValueS390X_OpGetClosurePtr_0(v) 184 case OpGetG: 185 return rewriteValueS390X_OpGetG_0(v) 186 case OpGreater16: 187 return rewriteValueS390X_OpGreater16_0(v) 188 case OpGreater16U: 189 return rewriteValueS390X_OpGreater16U_0(v) 190 case OpGreater32: 191 return rewriteValueS390X_OpGreater32_0(v) 192 case OpGreater32F: 193 return rewriteValueS390X_OpGreater32F_0(v) 194 case OpGreater32U: 195 return rewriteValueS390X_OpGreater32U_0(v) 196 case OpGreater64: 197 return rewriteValueS390X_OpGreater64_0(v) 198 case OpGreater64F: 199 return rewriteValueS390X_OpGreater64F_0(v) 200 case OpGreater64U: 201 return rewriteValueS390X_OpGreater64U_0(v) 202 case OpGreater8: 203 return rewriteValueS390X_OpGreater8_0(v) 204 case OpGreater8U: 205 return rewriteValueS390X_OpGreater8U_0(v) 206 case OpHmul32: 207 return rewriteValueS390X_OpHmul32_0(v) 208 case OpHmul32u: 209 return rewriteValueS390X_OpHmul32u_0(v) 210 case OpHmul64: 211 return rewriteValueS390X_OpHmul64_0(v) 212 case OpHmul64u: 213 return rewriteValueS390X_OpHmul64u_0(v) 214 case OpITab: 215 return rewriteValueS390X_OpITab_0(v) 216 case OpInterCall: 217 return rewriteValueS390X_OpInterCall_0(v) 218 case OpIsInBounds: 219 return rewriteValueS390X_OpIsInBounds_0(v) 220 case OpIsNonNil: 221 return rewriteValueS390X_OpIsNonNil_0(v) 222 case OpIsSliceInBounds: 223 return rewriteValueS390X_OpIsSliceInBounds_0(v) 224 case OpLeq16: 225 return rewriteValueS390X_OpLeq16_0(v) 226 case OpLeq16U: 227 return rewriteValueS390X_OpLeq16U_0(v) 228 case OpLeq32: 229 return rewriteValueS390X_OpLeq32_0(v) 230 case OpLeq32F: 231 return rewriteValueS390X_OpLeq32F_0(v) 232 case OpLeq32U: 233 return rewriteValueS390X_OpLeq32U_0(v) 234 case OpLeq64: 235 return rewriteValueS390X_OpLeq64_0(v) 236 case OpLeq64F: 237 return rewriteValueS390X_OpLeq64F_0(v) 238 case OpLeq64U: 239 return rewriteValueS390X_OpLeq64U_0(v) 240 case OpLeq8: 241 return rewriteValueS390X_OpLeq8_0(v) 242 case OpLeq8U: 243 return rewriteValueS390X_OpLeq8U_0(v) 244 case OpLess16: 245 return rewriteValueS390X_OpLess16_0(v) 246 case OpLess16U: 247 return rewriteValueS390X_OpLess16U_0(v) 248 case OpLess32: 249 return rewriteValueS390X_OpLess32_0(v) 250 case OpLess32F: 251 return rewriteValueS390X_OpLess32F_0(v) 252 case OpLess32U: 253 return rewriteValueS390X_OpLess32U_0(v) 254 case OpLess64: 255 return rewriteValueS390X_OpLess64_0(v) 256 case OpLess64F: 257 return rewriteValueS390X_OpLess64F_0(v) 258 case OpLess64U: 259 return rewriteValueS390X_OpLess64U_0(v) 260 case OpLess8: 261 return rewriteValueS390X_OpLess8_0(v) 262 case OpLess8U: 263 return rewriteValueS390X_OpLess8U_0(v) 264 case OpLoad: 265 return rewriteValueS390X_OpLoad_0(v) 266 case OpLsh16x16: 267 return rewriteValueS390X_OpLsh16x16_0(v) 268 case OpLsh16x32: 269 return rewriteValueS390X_OpLsh16x32_0(v) 270 case OpLsh16x64: 271 return rewriteValueS390X_OpLsh16x64_0(v) 272 case OpLsh16x8: 273 return rewriteValueS390X_OpLsh16x8_0(v) 274 case OpLsh32x16: 275 return rewriteValueS390X_OpLsh32x16_0(v) 276 case OpLsh32x32: 277 return rewriteValueS390X_OpLsh32x32_0(v) 278 case OpLsh32x64: 279 return rewriteValueS390X_OpLsh32x64_0(v) 280 case OpLsh32x8: 281 return rewriteValueS390X_OpLsh32x8_0(v) 282 case OpLsh64x16: 283 return rewriteValueS390X_OpLsh64x16_0(v) 284 case OpLsh64x32: 285 return rewriteValueS390X_OpLsh64x32_0(v) 286 case OpLsh64x64: 287 return rewriteValueS390X_OpLsh64x64_0(v) 288 case OpLsh64x8: 289 return rewriteValueS390X_OpLsh64x8_0(v) 290 case OpLsh8x16: 291 return rewriteValueS390X_OpLsh8x16_0(v) 292 case OpLsh8x32: 293 return rewriteValueS390X_OpLsh8x32_0(v) 294 case OpLsh8x64: 295 return rewriteValueS390X_OpLsh8x64_0(v) 296 case OpLsh8x8: 297 return rewriteValueS390X_OpLsh8x8_0(v) 298 case OpMod16: 299 return rewriteValueS390X_OpMod16_0(v) 300 case OpMod16u: 301 return rewriteValueS390X_OpMod16u_0(v) 302 case OpMod32: 303 return rewriteValueS390X_OpMod32_0(v) 304 case OpMod32u: 305 return rewriteValueS390X_OpMod32u_0(v) 306 case OpMod64: 307 return rewriteValueS390X_OpMod64_0(v) 308 case OpMod64u: 309 return rewriteValueS390X_OpMod64u_0(v) 310 case OpMod8: 311 return rewriteValueS390X_OpMod8_0(v) 312 case OpMod8u: 313 return rewriteValueS390X_OpMod8u_0(v) 314 case OpMove: 315 return rewriteValueS390X_OpMove_0(v) || rewriteValueS390X_OpMove_10(v) 316 case OpMul16: 317 return rewriteValueS390X_OpMul16_0(v) 318 case OpMul32: 319 return rewriteValueS390X_OpMul32_0(v) 320 case OpMul32F: 321 return rewriteValueS390X_OpMul32F_0(v) 322 case OpMul64: 323 return rewriteValueS390X_OpMul64_0(v) 324 case OpMul64F: 325 return rewriteValueS390X_OpMul64F_0(v) 326 case OpMul8: 327 return rewriteValueS390X_OpMul8_0(v) 328 case OpNeg16: 329 return rewriteValueS390X_OpNeg16_0(v) 330 case OpNeg32: 331 return rewriteValueS390X_OpNeg32_0(v) 332 case OpNeg32F: 333 return rewriteValueS390X_OpNeg32F_0(v) 334 case OpNeg64: 335 return rewriteValueS390X_OpNeg64_0(v) 336 case OpNeg64F: 337 return rewriteValueS390X_OpNeg64F_0(v) 338 case OpNeg8: 339 return rewriteValueS390X_OpNeg8_0(v) 340 case OpNeq16: 341 return rewriteValueS390X_OpNeq16_0(v) 342 case OpNeq32: 343 return rewriteValueS390X_OpNeq32_0(v) 344 case OpNeq32F: 345 return rewriteValueS390X_OpNeq32F_0(v) 346 case OpNeq64: 347 return rewriteValueS390X_OpNeq64_0(v) 348 case OpNeq64F: 349 return rewriteValueS390X_OpNeq64F_0(v) 350 case OpNeq8: 351 return rewriteValueS390X_OpNeq8_0(v) 352 case OpNeqB: 353 return rewriteValueS390X_OpNeqB_0(v) 354 case OpNeqPtr: 355 return rewriteValueS390X_OpNeqPtr_0(v) 356 case OpNilCheck: 357 return rewriteValueS390X_OpNilCheck_0(v) 358 case OpNot: 359 return rewriteValueS390X_OpNot_0(v) 360 case OpOffPtr: 361 return rewriteValueS390X_OpOffPtr_0(v) 362 case OpOr16: 363 return rewriteValueS390X_OpOr16_0(v) 364 case OpOr32: 365 return rewriteValueS390X_OpOr32_0(v) 366 case OpOr64: 367 return rewriteValueS390X_OpOr64_0(v) 368 case OpOr8: 369 return rewriteValueS390X_OpOr8_0(v) 370 case OpOrB: 371 return rewriteValueS390X_OpOrB_0(v) 372 case OpRound32F: 373 return rewriteValueS390X_OpRound32F_0(v) 374 case OpRound64F: 375 return rewriteValueS390X_OpRound64F_0(v) 376 case OpRsh16Ux16: 377 return rewriteValueS390X_OpRsh16Ux16_0(v) 378 case OpRsh16Ux32: 379 return rewriteValueS390X_OpRsh16Ux32_0(v) 380 case OpRsh16Ux64: 381 return rewriteValueS390X_OpRsh16Ux64_0(v) 382 case OpRsh16Ux8: 383 return rewriteValueS390X_OpRsh16Ux8_0(v) 384 case OpRsh16x16: 385 return rewriteValueS390X_OpRsh16x16_0(v) 386 case OpRsh16x32: 387 return rewriteValueS390X_OpRsh16x32_0(v) 388 case OpRsh16x64: 389 return rewriteValueS390X_OpRsh16x64_0(v) 390 case OpRsh16x8: 391 return rewriteValueS390X_OpRsh16x8_0(v) 392 case OpRsh32Ux16: 393 return rewriteValueS390X_OpRsh32Ux16_0(v) 394 case OpRsh32Ux32: 395 return rewriteValueS390X_OpRsh32Ux32_0(v) 396 case OpRsh32Ux64: 397 return rewriteValueS390X_OpRsh32Ux64_0(v) 398 case OpRsh32Ux8: 399 return rewriteValueS390X_OpRsh32Ux8_0(v) 400 case OpRsh32x16: 401 return rewriteValueS390X_OpRsh32x16_0(v) 402 case OpRsh32x32: 403 return rewriteValueS390X_OpRsh32x32_0(v) 404 case OpRsh32x64: 405 return rewriteValueS390X_OpRsh32x64_0(v) 406 case OpRsh32x8: 407 return rewriteValueS390X_OpRsh32x8_0(v) 408 case OpRsh64Ux16: 409 return rewriteValueS390X_OpRsh64Ux16_0(v) 410 case OpRsh64Ux32: 411 return rewriteValueS390X_OpRsh64Ux32_0(v) 412 case OpRsh64Ux64: 413 return rewriteValueS390X_OpRsh64Ux64_0(v) 414 case OpRsh64Ux8: 415 return rewriteValueS390X_OpRsh64Ux8_0(v) 416 case OpRsh64x16: 417 return rewriteValueS390X_OpRsh64x16_0(v) 418 case OpRsh64x32: 419 return rewriteValueS390X_OpRsh64x32_0(v) 420 case OpRsh64x64: 421 return rewriteValueS390X_OpRsh64x64_0(v) 422 case OpRsh64x8: 423 return rewriteValueS390X_OpRsh64x8_0(v) 424 case OpRsh8Ux16: 425 return rewriteValueS390X_OpRsh8Ux16_0(v) 426 case OpRsh8Ux32: 427 return rewriteValueS390X_OpRsh8Ux32_0(v) 428 case OpRsh8Ux64: 429 return rewriteValueS390X_OpRsh8Ux64_0(v) 430 case OpRsh8Ux8: 431 return rewriteValueS390X_OpRsh8Ux8_0(v) 432 case OpRsh8x16: 433 return rewriteValueS390X_OpRsh8x16_0(v) 434 case OpRsh8x32: 435 return rewriteValueS390X_OpRsh8x32_0(v) 436 case OpRsh8x64: 437 return rewriteValueS390X_OpRsh8x64_0(v) 438 case OpRsh8x8: 439 return rewriteValueS390X_OpRsh8x8_0(v) 440 case OpS390XADD: 441 return rewriteValueS390X_OpS390XADD_0(v) || rewriteValueS390X_OpS390XADD_10(v) 442 case OpS390XADDW: 443 return rewriteValueS390X_OpS390XADDW_0(v) || rewriteValueS390X_OpS390XADDW_10(v) 444 case OpS390XADDWconst: 445 return rewriteValueS390X_OpS390XADDWconst_0(v) 446 case OpS390XADDconst: 447 return rewriteValueS390X_OpS390XADDconst_0(v) 448 case OpS390XAND: 449 return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v) 450 case OpS390XANDW: 451 return rewriteValueS390X_OpS390XANDW_0(v) || rewriteValueS390X_OpS390XANDW_10(v) 452 case OpS390XANDWconst: 453 return rewriteValueS390X_OpS390XANDWconst_0(v) 454 case OpS390XANDconst: 455 return rewriteValueS390X_OpS390XANDconst_0(v) 456 case OpS390XCMP: 457 return rewriteValueS390X_OpS390XCMP_0(v) 458 case OpS390XCMPU: 459 return rewriteValueS390X_OpS390XCMPU_0(v) 460 case OpS390XCMPUconst: 461 return rewriteValueS390X_OpS390XCMPUconst_0(v) 462 case OpS390XCMPW: 463 return rewriteValueS390X_OpS390XCMPW_0(v) 464 case OpS390XCMPWU: 465 return rewriteValueS390X_OpS390XCMPWU_0(v) 466 case OpS390XCMPWUconst: 467 return rewriteValueS390X_OpS390XCMPWUconst_0(v) 468 case OpS390XCMPWconst: 469 return rewriteValueS390X_OpS390XCMPWconst_0(v) 470 case OpS390XCMPconst: 471 return rewriteValueS390X_OpS390XCMPconst_0(v) 472 case OpS390XFADD: 473 return rewriteValueS390X_OpS390XFADD_0(v) 474 case OpS390XFADDS: 475 return rewriteValueS390X_OpS390XFADDS_0(v) 476 case OpS390XFMOVDload: 477 return rewriteValueS390X_OpS390XFMOVDload_0(v) 478 case OpS390XFMOVDloadidx: 479 return rewriteValueS390X_OpS390XFMOVDloadidx_0(v) 480 case OpS390XFMOVDstore: 481 return rewriteValueS390X_OpS390XFMOVDstore_0(v) 482 case OpS390XFMOVDstoreidx: 483 return rewriteValueS390X_OpS390XFMOVDstoreidx_0(v) 484 case OpS390XFMOVSload: 485 return rewriteValueS390X_OpS390XFMOVSload_0(v) 486 case OpS390XFMOVSloadidx: 487 return rewriteValueS390X_OpS390XFMOVSloadidx_0(v) 488 case OpS390XFMOVSstore: 489 return rewriteValueS390X_OpS390XFMOVSstore_0(v) 490 case OpS390XFMOVSstoreidx: 491 return rewriteValueS390X_OpS390XFMOVSstoreidx_0(v) 492 case OpS390XFSUB: 493 return rewriteValueS390X_OpS390XFSUB_0(v) 494 case OpS390XFSUBS: 495 return rewriteValueS390X_OpS390XFSUBS_0(v) 496 case OpS390XLoweredRound32F: 497 return rewriteValueS390X_OpS390XLoweredRound32F_0(v) 498 case OpS390XLoweredRound64F: 499 return rewriteValueS390X_OpS390XLoweredRound64F_0(v) 500 case OpS390XMOVBZload: 501 return rewriteValueS390X_OpS390XMOVBZload_0(v) 502 case OpS390XMOVBZloadidx: 503 return rewriteValueS390X_OpS390XMOVBZloadidx_0(v) 504 case OpS390XMOVBZreg: 505 return rewriteValueS390X_OpS390XMOVBZreg_0(v) || rewriteValueS390X_OpS390XMOVBZreg_10(v) 506 case OpS390XMOVBload: 507 return rewriteValueS390X_OpS390XMOVBload_0(v) 508 case OpS390XMOVBreg: 509 return rewriteValueS390X_OpS390XMOVBreg_0(v) 510 case OpS390XMOVBstore: 511 return rewriteValueS390X_OpS390XMOVBstore_0(v) || rewriteValueS390X_OpS390XMOVBstore_10(v) 512 case OpS390XMOVBstoreconst: 513 return rewriteValueS390X_OpS390XMOVBstoreconst_0(v) 514 case OpS390XMOVBstoreidx: 515 return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v) 516 case OpS390XMOVDEQ: 517 return rewriteValueS390X_OpS390XMOVDEQ_0(v) 518 case OpS390XMOVDGE: 519 return rewriteValueS390X_OpS390XMOVDGE_0(v) 520 case OpS390XMOVDGT: 521 return rewriteValueS390X_OpS390XMOVDGT_0(v) 522 case OpS390XMOVDLE: 523 return rewriteValueS390X_OpS390XMOVDLE_0(v) 524 case OpS390XMOVDLT: 525 return rewriteValueS390X_OpS390XMOVDLT_0(v) 526 case OpS390XMOVDNE: 527 return rewriteValueS390X_OpS390XMOVDNE_0(v) 528 case OpS390XMOVDaddridx: 529 return rewriteValueS390X_OpS390XMOVDaddridx_0(v) 530 case OpS390XMOVDload: 531 return rewriteValueS390X_OpS390XMOVDload_0(v) 532 case OpS390XMOVDloadidx: 533 return rewriteValueS390X_OpS390XMOVDloadidx_0(v) 534 case OpS390XMOVDnop: 535 return rewriteValueS390X_OpS390XMOVDnop_0(v) || rewriteValueS390X_OpS390XMOVDnop_10(v) 536 case OpS390XMOVDreg: 537 return rewriteValueS390X_OpS390XMOVDreg_0(v) || rewriteValueS390X_OpS390XMOVDreg_10(v) 538 case OpS390XMOVDstore: 539 return rewriteValueS390X_OpS390XMOVDstore_0(v) 540 case OpS390XMOVDstoreconst: 541 return rewriteValueS390X_OpS390XMOVDstoreconst_0(v) 542 case OpS390XMOVDstoreidx: 543 return rewriteValueS390X_OpS390XMOVDstoreidx_0(v) 544 case OpS390XMOVHBRstore: 545 return rewriteValueS390X_OpS390XMOVHBRstore_0(v) 546 case OpS390XMOVHBRstoreidx: 547 return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v) 548 case OpS390XMOVHZload: 549 return rewriteValueS390X_OpS390XMOVHZload_0(v) 550 case OpS390XMOVHZloadidx: 551 return rewriteValueS390X_OpS390XMOVHZloadidx_0(v) 552 case OpS390XMOVHZreg: 553 return rewriteValueS390X_OpS390XMOVHZreg_0(v) 554 case OpS390XMOVHload: 555 return rewriteValueS390X_OpS390XMOVHload_0(v) 556 case OpS390XMOVHreg: 557 return rewriteValueS390X_OpS390XMOVHreg_0(v) 558 case OpS390XMOVHstore: 559 return rewriteValueS390X_OpS390XMOVHstore_0(v) || rewriteValueS390X_OpS390XMOVHstore_10(v) 560 case OpS390XMOVHstoreconst: 561 return rewriteValueS390X_OpS390XMOVHstoreconst_0(v) 562 case OpS390XMOVHstoreidx: 563 return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v) 564 case OpS390XMOVWBRstore: 565 return rewriteValueS390X_OpS390XMOVWBRstore_0(v) 566 case OpS390XMOVWBRstoreidx: 567 return rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v) 568 case OpS390XMOVWZload: 569 return rewriteValueS390X_OpS390XMOVWZload_0(v) 570 case OpS390XMOVWZloadidx: 571 return rewriteValueS390X_OpS390XMOVWZloadidx_0(v) 572 case OpS390XMOVWZreg: 573 return rewriteValueS390X_OpS390XMOVWZreg_0(v) 574 case OpS390XMOVWload: 575 return rewriteValueS390X_OpS390XMOVWload_0(v) 576 case OpS390XMOVWreg: 577 return rewriteValueS390X_OpS390XMOVWreg_0(v) || rewriteValueS390X_OpS390XMOVWreg_10(v) 578 case OpS390XMOVWstore: 579 return rewriteValueS390X_OpS390XMOVWstore_0(v) || rewriteValueS390X_OpS390XMOVWstore_10(v) 580 case OpS390XMOVWstoreconst: 581 return rewriteValueS390X_OpS390XMOVWstoreconst_0(v) 582 case OpS390XMOVWstoreidx: 583 return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v) 584 case OpS390XMULLD: 585 return rewriteValueS390X_OpS390XMULLD_0(v) 586 case OpS390XMULLDconst: 587 return rewriteValueS390X_OpS390XMULLDconst_0(v) 588 case OpS390XMULLW: 589 return rewriteValueS390X_OpS390XMULLW_0(v) 590 case OpS390XMULLWconst: 591 return rewriteValueS390X_OpS390XMULLWconst_0(v) 592 case OpS390XNEG: 593 return rewriteValueS390X_OpS390XNEG_0(v) 594 case OpS390XNEGW: 595 return rewriteValueS390X_OpS390XNEGW_0(v) 596 case OpS390XNOT: 597 return rewriteValueS390X_OpS390XNOT_0(v) 598 case OpS390XNOTW: 599 return rewriteValueS390X_OpS390XNOTW_0(v) 600 case OpS390XOR: 601 return rewriteValueS390X_OpS390XOR_0(v) || rewriteValueS390X_OpS390XOR_10(v) || rewriteValueS390X_OpS390XOR_20(v) || rewriteValueS390X_OpS390XOR_30(v) || rewriteValueS390X_OpS390XOR_40(v) || rewriteValueS390X_OpS390XOR_50(v) || rewriteValueS390X_OpS390XOR_60(v) || rewriteValueS390X_OpS390XOR_70(v) || rewriteValueS390X_OpS390XOR_80(v) || rewriteValueS390X_OpS390XOR_90(v) || rewriteValueS390X_OpS390XOR_100(v) || rewriteValueS390X_OpS390XOR_110(v) || rewriteValueS390X_OpS390XOR_120(v) || rewriteValueS390X_OpS390XOR_130(v) || rewriteValueS390X_OpS390XOR_140(v) || rewriteValueS390X_OpS390XOR_150(v) 602 case OpS390XORW: 603 return rewriteValueS390X_OpS390XORW_0(v) || rewriteValueS390X_OpS390XORW_10(v) || rewriteValueS390X_OpS390XORW_20(v) || rewriteValueS390X_OpS390XORW_30(v) || rewriteValueS390X_OpS390XORW_40(v) || rewriteValueS390X_OpS390XORW_50(v) || rewriteValueS390X_OpS390XORW_60(v) || rewriteValueS390X_OpS390XORW_70(v) || rewriteValueS390X_OpS390XORW_80(v) || rewriteValueS390X_OpS390XORW_90(v) 604 case OpS390XORWconst: 605 return rewriteValueS390X_OpS390XORWconst_0(v) 606 case OpS390XORconst: 607 return rewriteValueS390X_OpS390XORconst_0(v) 608 case OpS390XSLD: 609 return rewriteValueS390X_OpS390XSLD_0(v) 610 case OpS390XSLW: 611 return rewriteValueS390X_OpS390XSLW_0(v) 612 case OpS390XSRAD: 613 return rewriteValueS390X_OpS390XSRAD_0(v) 614 case OpS390XSRADconst: 615 return rewriteValueS390X_OpS390XSRADconst_0(v) 616 case OpS390XSRAW: 617 return rewriteValueS390X_OpS390XSRAW_0(v) 618 case OpS390XSRAWconst: 619 return rewriteValueS390X_OpS390XSRAWconst_0(v) 620 case OpS390XSRD: 621 return rewriteValueS390X_OpS390XSRD_0(v) 622 case OpS390XSRW: 623 return rewriteValueS390X_OpS390XSRW_0(v) 624 case OpS390XSTM2: 625 return rewriteValueS390X_OpS390XSTM2_0(v) 626 case OpS390XSTMG2: 627 return rewriteValueS390X_OpS390XSTMG2_0(v) 628 case OpS390XSUB: 629 return rewriteValueS390X_OpS390XSUB_0(v) 630 case OpS390XSUBEWcarrymask: 631 return rewriteValueS390X_OpS390XSUBEWcarrymask_0(v) 632 case OpS390XSUBEcarrymask: 633 return rewriteValueS390X_OpS390XSUBEcarrymask_0(v) 634 case OpS390XSUBW: 635 return rewriteValueS390X_OpS390XSUBW_0(v) 636 case OpS390XSUBWconst: 637 return rewriteValueS390X_OpS390XSUBWconst_0(v) 638 case OpS390XSUBconst: 639 return rewriteValueS390X_OpS390XSUBconst_0(v) 640 case OpS390XXOR: 641 return rewriteValueS390X_OpS390XXOR_0(v) || rewriteValueS390X_OpS390XXOR_10(v) 642 case OpS390XXORW: 643 return rewriteValueS390X_OpS390XXORW_0(v) || rewriteValueS390X_OpS390XXORW_10(v) 644 case OpS390XXORWconst: 645 return rewriteValueS390X_OpS390XXORWconst_0(v) 646 case OpS390XXORconst: 647 return rewriteValueS390X_OpS390XXORconst_0(v) 648 case OpSelect0: 649 return rewriteValueS390X_OpSelect0_0(v) 650 case OpSelect1: 651 return rewriteValueS390X_OpSelect1_0(v) 652 case OpSignExt16to32: 653 return rewriteValueS390X_OpSignExt16to32_0(v) 654 case OpSignExt16to64: 655 return rewriteValueS390X_OpSignExt16to64_0(v) 656 case OpSignExt32to64: 657 return rewriteValueS390X_OpSignExt32to64_0(v) 658 case OpSignExt8to16: 659 return rewriteValueS390X_OpSignExt8to16_0(v) 660 case OpSignExt8to32: 661 return rewriteValueS390X_OpSignExt8to32_0(v) 662 case OpSignExt8to64: 663 return rewriteValueS390X_OpSignExt8to64_0(v) 664 case OpSlicemask: 665 return rewriteValueS390X_OpSlicemask_0(v) 666 case OpSqrt: 667 return rewriteValueS390X_OpSqrt_0(v) 668 case OpStaticCall: 669 return rewriteValueS390X_OpStaticCall_0(v) 670 case OpStore: 671 return rewriteValueS390X_OpStore_0(v) 672 case OpSub16: 673 return rewriteValueS390X_OpSub16_0(v) 674 case OpSub32: 675 return rewriteValueS390X_OpSub32_0(v) 676 case OpSub32F: 677 return rewriteValueS390X_OpSub32F_0(v) 678 case OpSub64: 679 return rewriteValueS390X_OpSub64_0(v) 680 case OpSub64F: 681 return rewriteValueS390X_OpSub64F_0(v) 682 case OpSub8: 683 return rewriteValueS390X_OpSub8_0(v) 684 case OpSubPtr: 685 return rewriteValueS390X_OpSubPtr_0(v) 686 case OpTrunc16to8: 687 return rewriteValueS390X_OpTrunc16to8_0(v) 688 case OpTrunc32to16: 689 return rewriteValueS390X_OpTrunc32to16_0(v) 690 case OpTrunc32to8: 691 return rewriteValueS390X_OpTrunc32to8_0(v) 692 case OpTrunc64to16: 693 return rewriteValueS390X_OpTrunc64to16_0(v) 694 case OpTrunc64to32: 695 return rewriteValueS390X_OpTrunc64to32_0(v) 696 case OpTrunc64to8: 697 return rewriteValueS390X_OpTrunc64to8_0(v) 698 case OpXor16: 699 return rewriteValueS390X_OpXor16_0(v) 700 case OpXor32: 701 return rewriteValueS390X_OpXor32_0(v) 702 case OpXor64: 703 return rewriteValueS390X_OpXor64_0(v) 704 case OpXor8: 705 return rewriteValueS390X_OpXor8_0(v) 706 case OpZero: 707 return rewriteValueS390X_OpZero_0(v) || rewriteValueS390X_OpZero_10(v) 708 case OpZeroExt16to32: 709 return rewriteValueS390X_OpZeroExt16to32_0(v) 710 case OpZeroExt16to64: 711 return rewriteValueS390X_OpZeroExt16to64_0(v) 712 case OpZeroExt32to64: 713 return rewriteValueS390X_OpZeroExt32to64_0(v) 714 case OpZeroExt8to16: 715 return rewriteValueS390X_OpZeroExt8to16_0(v) 716 case OpZeroExt8to32: 717 return rewriteValueS390X_OpZeroExt8to32_0(v) 718 case OpZeroExt8to64: 719 return rewriteValueS390X_OpZeroExt8to64_0(v) 720 } 721 return false 722 } 723 func rewriteValueS390X_OpAdd16_0(v *Value) bool { 724 // match: (Add16 x y) 725 // cond: 726 // result: (ADDW x y) 727 for { 728 x := v.Args[0] 729 y := v.Args[1] 730 v.reset(OpS390XADDW) 731 v.AddArg(x) 732 v.AddArg(y) 733 return true 734 } 735 } 736 func rewriteValueS390X_OpAdd32_0(v *Value) bool { 737 // match: (Add32 x y) 738 // cond: 739 // result: (ADDW x y) 740 for { 741 x := v.Args[0] 742 y := v.Args[1] 743 v.reset(OpS390XADDW) 744 v.AddArg(x) 745 v.AddArg(y) 746 return true 747 } 748 } 749 func rewriteValueS390X_OpAdd32F_0(v *Value) bool { 750 // match: (Add32F x y) 751 // cond: 752 // result: (FADDS x y) 753 for { 754 x := v.Args[0] 755 y := v.Args[1] 756 v.reset(OpS390XFADDS) 757 v.AddArg(x) 758 v.AddArg(y) 759 return true 760 } 761 } 762 func rewriteValueS390X_OpAdd64_0(v *Value) bool { 763 // match: (Add64 x y) 764 // cond: 765 // result: (ADD x y) 766 for { 767 x := v.Args[0] 768 y := v.Args[1] 769 v.reset(OpS390XADD) 770 v.AddArg(x) 771 v.AddArg(y) 772 return true 773 } 774 } 775 func rewriteValueS390X_OpAdd64F_0(v *Value) bool { 776 // match: (Add64F x y) 777 // cond: 778 // result: (FADD x y) 779 for { 780 x := v.Args[0] 781 y := v.Args[1] 782 v.reset(OpS390XFADD) 783 v.AddArg(x) 784 v.AddArg(y) 785 return true 786 } 787 } 788 func rewriteValueS390X_OpAdd8_0(v *Value) bool { 789 // match: (Add8 x y) 790 // cond: 791 // result: (ADDW x y) 792 for { 793 x := v.Args[0] 794 y := v.Args[1] 795 v.reset(OpS390XADDW) 796 v.AddArg(x) 797 v.AddArg(y) 798 return true 799 } 800 } 801 func rewriteValueS390X_OpAddPtr_0(v *Value) bool { 802 // match: (AddPtr x y) 803 // cond: 804 // result: (ADD x y) 805 for { 806 x := v.Args[0] 807 y := v.Args[1] 808 v.reset(OpS390XADD) 809 v.AddArg(x) 810 v.AddArg(y) 811 return true 812 } 813 } 814 func rewriteValueS390X_OpAddr_0(v *Value) bool { 815 // match: (Addr {sym} base) 816 // cond: 817 // result: (MOVDaddr {sym} base) 818 for { 819 sym := v.Aux 820 base := v.Args[0] 821 v.reset(OpS390XMOVDaddr) 822 v.Aux = sym 823 v.AddArg(base) 824 return true 825 } 826 } 827 func rewriteValueS390X_OpAnd16_0(v *Value) bool { 828 // match: (And16 x y) 829 // cond: 830 // result: (ANDW x y) 831 for { 832 x := v.Args[0] 833 y := v.Args[1] 834 v.reset(OpS390XANDW) 835 v.AddArg(x) 836 v.AddArg(y) 837 return true 838 } 839 } 840 func rewriteValueS390X_OpAnd32_0(v *Value) bool { 841 // match: (And32 x y) 842 // cond: 843 // result: (ANDW x y) 844 for { 845 x := v.Args[0] 846 y := v.Args[1] 847 v.reset(OpS390XANDW) 848 v.AddArg(x) 849 v.AddArg(y) 850 return true 851 } 852 } 853 func rewriteValueS390X_OpAnd64_0(v *Value) bool { 854 // match: (And64 x y) 855 // cond: 856 // result: (AND x y) 857 for { 858 x := v.Args[0] 859 y := v.Args[1] 860 v.reset(OpS390XAND) 861 v.AddArg(x) 862 v.AddArg(y) 863 return true 864 } 865 } 866 func rewriteValueS390X_OpAnd8_0(v *Value) bool { 867 // match: (And8 x y) 868 // cond: 869 // result: (ANDW x y) 870 for { 871 x := v.Args[0] 872 y := v.Args[1] 873 v.reset(OpS390XANDW) 874 v.AddArg(x) 875 v.AddArg(y) 876 return true 877 } 878 } 879 func rewriteValueS390X_OpAndB_0(v *Value) bool { 880 // match: (AndB x y) 881 // cond: 882 // result: (ANDW x y) 883 for { 884 x := v.Args[0] 885 y := v.Args[1] 886 v.reset(OpS390XANDW) 887 v.AddArg(x) 888 v.AddArg(y) 889 return true 890 } 891 } 892 func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { 893 b := v.Block 894 _ = b 895 types := &b.Func.Config.Types 896 _ = types 897 // match: (AtomicAdd32 ptr val mem) 898 // cond: 899 // result: (AddTupleFirst32 (LAA ptr val mem) val) 900 for { 901 ptr := v.Args[0] 902 val := v.Args[1] 903 mem := v.Args[2] 904 v.reset(OpS390XAddTupleFirst32) 905 v0 := b.NewValue0(v.Pos, OpS390XLAA, MakeTuple(types.UInt32, TypeMem)) 906 v0.AddArg(ptr) 907 v0.AddArg(val) 908 v0.AddArg(mem) 909 v.AddArg(v0) 910 v.AddArg(val) 911 return true 912 } 913 } 914 func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { 915 b := v.Block 916 _ = b 917 types := &b.Func.Config.Types 918 _ = types 919 // match: (AtomicAdd64 ptr val mem) 920 // cond: 921 // result: (AddTupleFirst64 (LAAG ptr val mem) val) 922 for { 923 ptr := v.Args[0] 924 val := v.Args[1] 925 mem := v.Args[2] 926 v.reset(OpS390XAddTupleFirst64) 927 v0 := b.NewValue0(v.Pos, OpS390XLAAG, MakeTuple(types.UInt64, TypeMem)) 928 v0.AddArg(ptr) 929 v0.AddArg(val) 930 v0.AddArg(mem) 931 v.AddArg(v0) 932 v.AddArg(val) 933 return true 934 } 935 } 936 func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool { 937 // match: (AtomicCompareAndSwap32 ptr old new_ mem) 938 // cond: 939 // result: (LoweredAtomicCas32 ptr old new_ mem) 940 for { 941 ptr := v.Args[0] 942 old := v.Args[1] 943 new_ := v.Args[2] 944 mem := v.Args[3] 945 v.reset(OpS390XLoweredAtomicCas32) 946 v.AddArg(ptr) 947 v.AddArg(old) 948 v.AddArg(new_) 949 v.AddArg(mem) 950 return true 951 } 952 } 953 func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool { 954 // match: (AtomicCompareAndSwap64 ptr old new_ mem) 955 // cond: 956 // result: (LoweredAtomicCas64 ptr old new_ mem) 957 for { 958 ptr := v.Args[0] 959 old := v.Args[1] 960 new_ := v.Args[2] 961 mem := v.Args[3] 962 v.reset(OpS390XLoweredAtomicCas64) 963 v.AddArg(ptr) 964 v.AddArg(old) 965 v.AddArg(new_) 966 v.AddArg(mem) 967 return true 968 } 969 } 970 func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool { 971 // match: (AtomicExchange32 ptr val mem) 972 // cond: 973 // result: (LoweredAtomicExchange32 ptr val mem) 974 for { 975 ptr := v.Args[0] 976 val := v.Args[1] 977 mem := v.Args[2] 978 v.reset(OpS390XLoweredAtomicExchange32) 979 v.AddArg(ptr) 980 v.AddArg(val) 981 v.AddArg(mem) 982 return true 983 } 984 } 985 func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool { 986 // match: (AtomicExchange64 ptr val mem) 987 // cond: 988 // result: (LoweredAtomicExchange64 ptr val mem) 989 for { 990 ptr := v.Args[0] 991 val := v.Args[1] 992 mem := v.Args[2] 993 v.reset(OpS390XLoweredAtomicExchange64) 994 v.AddArg(ptr) 995 v.AddArg(val) 996 v.AddArg(mem) 997 return true 998 } 999 } 1000 func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool { 1001 // match: (AtomicLoad32 ptr mem) 1002 // cond: 1003 // result: (MOVWZatomicload ptr mem) 1004 for { 1005 ptr := v.Args[0] 1006 mem := v.Args[1] 1007 v.reset(OpS390XMOVWZatomicload) 1008 v.AddArg(ptr) 1009 v.AddArg(mem) 1010 return true 1011 } 1012 } 1013 func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool { 1014 // match: (AtomicLoad64 ptr mem) 1015 // cond: 1016 // result: (MOVDatomicload ptr mem) 1017 for { 1018 ptr := v.Args[0] 1019 mem := v.Args[1] 1020 v.reset(OpS390XMOVDatomicload) 1021 v.AddArg(ptr) 1022 v.AddArg(mem) 1023 return true 1024 } 1025 } 1026 func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool { 1027 // match: (AtomicLoadPtr ptr mem) 1028 // cond: 1029 // result: (MOVDatomicload ptr mem) 1030 for { 1031 ptr := v.Args[0] 1032 mem := v.Args[1] 1033 v.reset(OpS390XMOVDatomicload) 1034 v.AddArg(ptr) 1035 v.AddArg(mem) 1036 return true 1037 } 1038 } 1039 func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool { 1040 // match: (AtomicStore32 ptr val mem) 1041 // cond: 1042 // result: (MOVWatomicstore ptr val mem) 1043 for { 1044 ptr := v.Args[0] 1045 val := v.Args[1] 1046 mem := v.Args[2] 1047 v.reset(OpS390XMOVWatomicstore) 1048 v.AddArg(ptr) 1049 v.AddArg(val) 1050 v.AddArg(mem) 1051 return true 1052 } 1053 } 1054 func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool { 1055 // match: (AtomicStore64 ptr val mem) 1056 // cond: 1057 // result: (MOVDatomicstore ptr val mem) 1058 for { 1059 ptr := v.Args[0] 1060 val := v.Args[1] 1061 mem := v.Args[2] 1062 v.reset(OpS390XMOVDatomicstore) 1063 v.AddArg(ptr) 1064 v.AddArg(val) 1065 v.AddArg(mem) 1066 return true 1067 } 1068 } 1069 func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { 1070 // match: (AtomicStorePtrNoWB ptr val mem) 1071 // cond: 1072 // result: (MOVDatomicstore ptr val mem) 1073 for { 1074 ptr := v.Args[0] 1075 val := v.Args[1] 1076 mem := v.Args[2] 1077 v.reset(OpS390XMOVDatomicstore) 1078 v.AddArg(ptr) 1079 v.AddArg(val) 1080 v.AddArg(mem) 1081 return true 1082 } 1083 } 1084 func rewriteValueS390X_OpAvg64u_0(v *Value) bool { 1085 b := v.Block 1086 _ = b 1087 // match: (Avg64u <t> x y) 1088 // cond: 1089 // result: (ADD (SRDconst <t> (SUB <t> x y) [1]) y) 1090 for { 1091 t := v.Type 1092 x := v.Args[0] 1093 y := v.Args[1] 1094 v.reset(OpS390XADD) 1095 v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) 1096 v0.AuxInt = 1 1097 v1 := b.NewValue0(v.Pos, OpS390XSUB, t) 1098 v1.AddArg(x) 1099 v1.AddArg(y) 1100 v0.AddArg(v1) 1101 v.AddArg(v0) 1102 v.AddArg(y) 1103 return true 1104 } 1105 } 1106 func rewriteValueS390X_OpBitLen64_0(v *Value) bool { 1107 b := v.Block 1108 _ = b 1109 types := &b.Func.Config.Types 1110 _ = types 1111 // match: (BitLen64 x) 1112 // cond: 1113 // result: (SUB (MOVDconst [64]) (FLOGR x)) 1114 for { 1115 x := v.Args[0] 1116 v.reset(OpS390XSUB) 1117 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1118 v0.AuxInt = 64 1119 v.AddArg(v0) 1120 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, types.UInt64) 1121 v1.AddArg(x) 1122 v.AddArg(v1) 1123 return true 1124 } 1125 } 1126 func rewriteValueS390X_OpBswap32_0(v *Value) bool { 1127 // match: (Bswap32 x) 1128 // cond: 1129 // result: (MOVWBR x) 1130 for { 1131 x := v.Args[0] 1132 v.reset(OpS390XMOVWBR) 1133 v.AddArg(x) 1134 return true 1135 } 1136 } 1137 func rewriteValueS390X_OpBswap64_0(v *Value) bool { 1138 // match: (Bswap64 x) 1139 // cond: 1140 // result: (MOVDBR x) 1141 for { 1142 x := v.Args[0] 1143 v.reset(OpS390XMOVDBR) 1144 v.AddArg(x) 1145 return true 1146 } 1147 } 1148 func rewriteValueS390X_OpClosureCall_0(v *Value) bool { 1149 // match: (ClosureCall [argwid] entry closure mem) 1150 // cond: 1151 // result: (CALLclosure [argwid] entry closure mem) 1152 for { 1153 argwid := v.AuxInt 1154 entry := v.Args[0] 1155 closure := v.Args[1] 1156 mem := v.Args[2] 1157 v.reset(OpS390XCALLclosure) 1158 v.AuxInt = argwid 1159 v.AddArg(entry) 1160 v.AddArg(closure) 1161 v.AddArg(mem) 1162 return true 1163 } 1164 } 1165 func rewriteValueS390X_OpCom16_0(v *Value) bool { 1166 // match: (Com16 x) 1167 // cond: 1168 // result: (NOTW x) 1169 for { 1170 x := v.Args[0] 1171 v.reset(OpS390XNOTW) 1172 v.AddArg(x) 1173 return true 1174 } 1175 } 1176 func rewriteValueS390X_OpCom32_0(v *Value) bool { 1177 // match: (Com32 x) 1178 // cond: 1179 // result: (NOTW x) 1180 for { 1181 x := v.Args[0] 1182 v.reset(OpS390XNOTW) 1183 v.AddArg(x) 1184 return true 1185 } 1186 } 1187 func rewriteValueS390X_OpCom64_0(v *Value) bool { 1188 // match: (Com64 x) 1189 // cond: 1190 // result: (NOT x) 1191 for { 1192 x := v.Args[0] 1193 v.reset(OpS390XNOT) 1194 v.AddArg(x) 1195 return true 1196 } 1197 } 1198 func rewriteValueS390X_OpCom8_0(v *Value) bool { 1199 // match: (Com8 x) 1200 // cond: 1201 // result: (NOTW x) 1202 for { 1203 x := v.Args[0] 1204 v.reset(OpS390XNOTW) 1205 v.AddArg(x) 1206 return true 1207 } 1208 } 1209 func rewriteValueS390X_OpConst16_0(v *Value) bool { 1210 // match: (Const16 [val]) 1211 // cond: 1212 // result: (MOVDconst [val]) 1213 for { 1214 val := v.AuxInt 1215 v.reset(OpS390XMOVDconst) 1216 v.AuxInt = val 1217 return true 1218 } 1219 } 1220 func rewriteValueS390X_OpConst32_0(v *Value) bool { 1221 // match: (Const32 [val]) 1222 // cond: 1223 // result: (MOVDconst [val]) 1224 for { 1225 val := v.AuxInt 1226 v.reset(OpS390XMOVDconst) 1227 v.AuxInt = val 1228 return true 1229 } 1230 } 1231 func rewriteValueS390X_OpConst32F_0(v *Value) bool { 1232 // match: (Const32F [val]) 1233 // cond: 1234 // result: (FMOVSconst [val]) 1235 for { 1236 val := v.AuxInt 1237 v.reset(OpS390XFMOVSconst) 1238 v.AuxInt = val 1239 return true 1240 } 1241 } 1242 func rewriteValueS390X_OpConst64_0(v *Value) bool { 1243 // match: (Const64 [val]) 1244 // cond: 1245 // result: (MOVDconst [val]) 1246 for { 1247 val := v.AuxInt 1248 v.reset(OpS390XMOVDconst) 1249 v.AuxInt = val 1250 return true 1251 } 1252 } 1253 func rewriteValueS390X_OpConst64F_0(v *Value) bool { 1254 // match: (Const64F [val]) 1255 // cond: 1256 // result: (FMOVDconst [val]) 1257 for { 1258 val := v.AuxInt 1259 v.reset(OpS390XFMOVDconst) 1260 v.AuxInt = val 1261 return true 1262 } 1263 } 1264 func rewriteValueS390X_OpConst8_0(v *Value) bool { 1265 // match: (Const8 [val]) 1266 // cond: 1267 // result: (MOVDconst [val]) 1268 for { 1269 val := v.AuxInt 1270 v.reset(OpS390XMOVDconst) 1271 v.AuxInt = val 1272 return true 1273 } 1274 } 1275 func rewriteValueS390X_OpConstBool_0(v *Value) bool { 1276 // match: (ConstBool [b]) 1277 // cond: 1278 // result: (MOVDconst [b]) 1279 for { 1280 b := v.AuxInt 1281 v.reset(OpS390XMOVDconst) 1282 v.AuxInt = b 1283 return true 1284 } 1285 } 1286 func rewriteValueS390X_OpConstNil_0(v *Value) bool { 1287 // match: (ConstNil) 1288 // cond: 1289 // result: (MOVDconst [0]) 1290 for { 1291 v.reset(OpS390XMOVDconst) 1292 v.AuxInt = 0 1293 return true 1294 } 1295 } 1296 func rewriteValueS390X_OpConvert_0(v *Value) bool { 1297 // match: (Convert <t> x mem) 1298 // cond: 1299 // result: (MOVDconvert <t> x mem) 1300 for { 1301 t := v.Type 1302 x := v.Args[0] 1303 mem := v.Args[1] 1304 v.reset(OpS390XMOVDconvert) 1305 v.Type = t 1306 v.AddArg(x) 1307 v.AddArg(mem) 1308 return true 1309 } 1310 } 1311 func rewriteValueS390X_OpCtz32_0(v *Value) bool { 1312 b := v.Block 1313 _ = b 1314 types := &b.Func.Config.Types 1315 _ = types 1316 // match: (Ctz32 <t> x) 1317 // cond: 1318 // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW <t> (SUBWconst <t> [1] x) (NOTW <t> x))))) 1319 for { 1320 t := v.Type 1321 x := v.Args[0] 1322 v.reset(OpS390XSUB) 1323 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1324 v0.AuxInt = 64 1325 v.AddArg(v0) 1326 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, types.UInt64) 1327 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 1328 v3 := b.NewValue0(v.Pos, OpS390XANDW, t) 1329 v4 := b.NewValue0(v.Pos, OpS390XSUBWconst, t) 1330 v4.AuxInt = 1 1331 v4.AddArg(x) 1332 v3.AddArg(v4) 1333 v5 := b.NewValue0(v.Pos, OpS390XNOTW, t) 1334 v5.AddArg(x) 1335 v3.AddArg(v5) 1336 v2.AddArg(v3) 1337 v1.AddArg(v2) 1338 v.AddArg(v1) 1339 return true 1340 } 1341 } 1342 func rewriteValueS390X_OpCtz64_0(v *Value) bool { 1343 b := v.Block 1344 _ = b 1345 types := &b.Func.Config.Types 1346 _ = types 1347 // match: (Ctz64 <t> x) 1348 // cond: 1349 // result: (SUB (MOVDconst [64]) (FLOGR (AND <t> (SUBconst <t> [1] x) (NOT <t> x)))) 1350 for { 1351 t := v.Type 1352 x := v.Args[0] 1353 v.reset(OpS390XSUB) 1354 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1355 v0.AuxInt = 64 1356 v.AddArg(v0) 1357 v1 := b.NewValue0(v.Pos, OpS390XFLOGR, types.UInt64) 1358 v2 := b.NewValue0(v.Pos, OpS390XAND, t) 1359 v3 := b.NewValue0(v.Pos, OpS390XSUBconst, t) 1360 v3.AuxInt = 1 1361 v3.AddArg(x) 1362 v2.AddArg(v3) 1363 v4 := b.NewValue0(v.Pos, OpS390XNOT, t) 1364 v4.AddArg(x) 1365 v2.AddArg(v4) 1366 v1.AddArg(v2) 1367 v.AddArg(v1) 1368 return true 1369 } 1370 } 1371 func rewriteValueS390X_OpCvt32Fto32_0(v *Value) bool { 1372 // match: (Cvt32Fto32 x) 1373 // cond: 1374 // result: (CFEBRA x) 1375 for { 1376 x := v.Args[0] 1377 v.reset(OpS390XCFEBRA) 1378 v.AddArg(x) 1379 return true 1380 } 1381 } 1382 func rewriteValueS390X_OpCvt32Fto64_0(v *Value) bool { 1383 // match: (Cvt32Fto64 x) 1384 // cond: 1385 // result: (CGEBRA x) 1386 for { 1387 x := v.Args[0] 1388 v.reset(OpS390XCGEBRA) 1389 v.AddArg(x) 1390 return true 1391 } 1392 } 1393 func rewriteValueS390X_OpCvt32Fto64F_0(v *Value) bool { 1394 // match: (Cvt32Fto64F x) 1395 // cond: 1396 // result: (LDEBR x) 1397 for { 1398 x := v.Args[0] 1399 v.reset(OpS390XLDEBR) 1400 v.AddArg(x) 1401 return true 1402 } 1403 } 1404 func rewriteValueS390X_OpCvt32to32F_0(v *Value) bool { 1405 // match: (Cvt32to32F x) 1406 // cond: 1407 // result: (CEFBRA x) 1408 for { 1409 x := v.Args[0] 1410 v.reset(OpS390XCEFBRA) 1411 v.AddArg(x) 1412 return true 1413 } 1414 } 1415 func rewriteValueS390X_OpCvt32to64F_0(v *Value) bool { 1416 // match: (Cvt32to64F x) 1417 // cond: 1418 // result: (CDFBRA x) 1419 for { 1420 x := v.Args[0] 1421 v.reset(OpS390XCDFBRA) 1422 v.AddArg(x) 1423 return true 1424 } 1425 } 1426 func rewriteValueS390X_OpCvt64Fto32_0(v *Value) bool { 1427 // match: (Cvt64Fto32 x) 1428 // cond: 1429 // result: (CFDBRA x) 1430 for { 1431 x := v.Args[0] 1432 v.reset(OpS390XCFDBRA) 1433 v.AddArg(x) 1434 return true 1435 } 1436 } 1437 func rewriteValueS390X_OpCvt64Fto32F_0(v *Value) bool { 1438 // match: (Cvt64Fto32F x) 1439 // cond: 1440 // result: (LEDBR x) 1441 for { 1442 x := v.Args[0] 1443 v.reset(OpS390XLEDBR) 1444 v.AddArg(x) 1445 return true 1446 } 1447 } 1448 func rewriteValueS390X_OpCvt64Fto64_0(v *Value) bool { 1449 // match: (Cvt64Fto64 x) 1450 // cond: 1451 // result: (CGDBRA x) 1452 for { 1453 x := v.Args[0] 1454 v.reset(OpS390XCGDBRA) 1455 v.AddArg(x) 1456 return true 1457 } 1458 } 1459 func rewriteValueS390X_OpCvt64to32F_0(v *Value) bool { 1460 // match: (Cvt64to32F x) 1461 // cond: 1462 // result: (CEGBRA x) 1463 for { 1464 x := v.Args[0] 1465 v.reset(OpS390XCEGBRA) 1466 v.AddArg(x) 1467 return true 1468 } 1469 } 1470 func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool { 1471 // match: (Cvt64to64F x) 1472 // cond: 1473 // result: (CDGBRA x) 1474 for { 1475 x := v.Args[0] 1476 v.reset(OpS390XCDGBRA) 1477 v.AddArg(x) 1478 return true 1479 } 1480 } 1481 func rewriteValueS390X_OpDiv16_0(v *Value) bool { 1482 b := v.Block 1483 _ = b 1484 types := &b.Func.Config.Types 1485 _ = types 1486 // match: (Div16 x y) 1487 // cond: 1488 // result: (DIVW (MOVHreg x) (MOVHreg y)) 1489 for { 1490 x := v.Args[0] 1491 y := v.Args[1] 1492 v.reset(OpS390XDIVW) 1493 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1494 v0.AddArg(x) 1495 v.AddArg(v0) 1496 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1497 v1.AddArg(y) 1498 v.AddArg(v1) 1499 return true 1500 } 1501 } 1502 func rewriteValueS390X_OpDiv16u_0(v *Value) bool { 1503 b := v.Block 1504 _ = b 1505 types := &b.Func.Config.Types 1506 _ = types 1507 // match: (Div16u x y) 1508 // cond: 1509 // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) 1510 for { 1511 x := v.Args[0] 1512 y := v.Args[1] 1513 v.reset(OpS390XDIVWU) 1514 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 1515 v0.AddArg(x) 1516 v.AddArg(v0) 1517 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 1518 v1.AddArg(y) 1519 v.AddArg(v1) 1520 return true 1521 } 1522 } 1523 func rewriteValueS390X_OpDiv32_0(v *Value) bool { 1524 b := v.Block 1525 _ = b 1526 types := &b.Func.Config.Types 1527 _ = types 1528 // match: (Div32 x y) 1529 // cond: 1530 // result: (DIVW (MOVWreg x) y) 1531 for { 1532 x := v.Args[0] 1533 y := v.Args[1] 1534 v.reset(OpS390XDIVW) 1535 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, types.Int64) 1536 v0.AddArg(x) 1537 v.AddArg(v0) 1538 v.AddArg(y) 1539 return true 1540 } 1541 } 1542 func rewriteValueS390X_OpDiv32F_0(v *Value) bool { 1543 // match: (Div32F x y) 1544 // cond: 1545 // result: (FDIVS x y) 1546 for { 1547 x := v.Args[0] 1548 y := v.Args[1] 1549 v.reset(OpS390XFDIVS) 1550 v.AddArg(x) 1551 v.AddArg(y) 1552 return true 1553 } 1554 } 1555 func rewriteValueS390X_OpDiv32u_0(v *Value) bool { 1556 b := v.Block 1557 _ = b 1558 types := &b.Func.Config.Types 1559 _ = types 1560 // match: (Div32u x y) 1561 // cond: 1562 // result: (DIVWU (MOVWZreg x) y) 1563 for { 1564 x := v.Args[0] 1565 y := v.Args[1] 1566 v.reset(OpS390XDIVWU) 1567 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 1568 v0.AddArg(x) 1569 v.AddArg(v0) 1570 v.AddArg(y) 1571 return true 1572 } 1573 } 1574 func rewriteValueS390X_OpDiv64_0(v *Value) bool { 1575 // match: (Div64 x y) 1576 // cond: 1577 // result: (DIVD x y) 1578 for { 1579 x := v.Args[0] 1580 y := v.Args[1] 1581 v.reset(OpS390XDIVD) 1582 v.AddArg(x) 1583 v.AddArg(y) 1584 return true 1585 } 1586 } 1587 func rewriteValueS390X_OpDiv64F_0(v *Value) bool { 1588 // match: (Div64F x y) 1589 // cond: 1590 // result: (FDIV x y) 1591 for { 1592 x := v.Args[0] 1593 y := v.Args[1] 1594 v.reset(OpS390XFDIV) 1595 v.AddArg(x) 1596 v.AddArg(y) 1597 return true 1598 } 1599 } 1600 func rewriteValueS390X_OpDiv64u_0(v *Value) bool { 1601 // match: (Div64u x y) 1602 // cond: 1603 // result: (DIVDU x y) 1604 for { 1605 x := v.Args[0] 1606 y := v.Args[1] 1607 v.reset(OpS390XDIVDU) 1608 v.AddArg(x) 1609 v.AddArg(y) 1610 return true 1611 } 1612 } 1613 func rewriteValueS390X_OpDiv8_0(v *Value) bool { 1614 b := v.Block 1615 _ = b 1616 types := &b.Func.Config.Types 1617 _ = types 1618 // match: (Div8 x y) 1619 // cond: 1620 // result: (DIVW (MOVBreg x) (MOVBreg y)) 1621 for { 1622 x := v.Args[0] 1623 y := v.Args[1] 1624 v.reset(OpS390XDIVW) 1625 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1626 v0.AddArg(x) 1627 v.AddArg(v0) 1628 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1629 v1.AddArg(y) 1630 v.AddArg(v1) 1631 return true 1632 } 1633 } 1634 func rewriteValueS390X_OpDiv8u_0(v *Value) bool { 1635 b := v.Block 1636 _ = b 1637 types := &b.Func.Config.Types 1638 _ = types 1639 // match: (Div8u x y) 1640 // cond: 1641 // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) 1642 for { 1643 x := v.Args[0] 1644 y := v.Args[1] 1645 v.reset(OpS390XDIVWU) 1646 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 1647 v0.AddArg(x) 1648 v.AddArg(v0) 1649 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 1650 v1.AddArg(y) 1651 v.AddArg(v1) 1652 return true 1653 } 1654 } 1655 func rewriteValueS390X_OpEq16_0(v *Value) bool { 1656 b := v.Block 1657 _ = b 1658 types := &b.Func.Config.Types 1659 _ = types 1660 // match: (Eq16 x y) 1661 // cond: 1662 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1663 for { 1664 x := v.Args[0] 1665 y := v.Args[1] 1666 v.reset(OpS390XMOVDEQ) 1667 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1668 v0.AuxInt = 0 1669 v.AddArg(v0) 1670 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1671 v1.AuxInt = 1 1672 v.AddArg(v1) 1673 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1674 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1675 v3.AddArg(x) 1676 v2.AddArg(v3) 1677 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1678 v4.AddArg(y) 1679 v2.AddArg(v4) 1680 v.AddArg(v2) 1681 return true 1682 } 1683 } 1684 func rewriteValueS390X_OpEq32_0(v *Value) bool { 1685 b := v.Block 1686 _ = b 1687 types := &b.Func.Config.Types 1688 _ = types 1689 // match: (Eq32 x y) 1690 // cond: 1691 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1692 for { 1693 x := v.Args[0] 1694 y := v.Args[1] 1695 v.reset(OpS390XMOVDEQ) 1696 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1697 v0.AuxInt = 0 1698 v.AddArg(v0) 1699 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1700 v1.AuxInt = 1 1701 v.AddArg(v1) 1702 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 1703 v2.AddArg(x) 1704 v2.AddArg(y) 1705 v.AddArg(v2) 1706 return true 1707 } 1708 } 1709 func rewriteValueS390X_OpEq32F_0(v *Value) bool { 1710 b := v.Block 1711 _ = b 1712 types := &b.Func.Config.Types 1713 _ = types 1714 // match: (Eq32F x y) 1715 // cond: 1716 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1717 for { 1718 x := v.Args[0] 1719 y := v.Args[1] 1720 v.reset(OpS390XMOVDEQ) 1721 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1722 v0.AuxInt = 0 1723 v.AddArg(v0) 1724 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1725 v1.AuxInt = 1 1726 v.AddArg(v1) 1727 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 1728 v2.AddArg(x) 1729 v2.AddArg(y) 1730 v.AddArg(v2) 1731 return true 1732 } 1733 } 1734 func rewriteValueS390X_OpEq64_0(v *Value) bool { 1735 b := v.Block 1736 _ = b 1737 types := &b.Func.Config.Types 1738 _ = types 1739 // match: (Eq64 x y) 1740 // cond: 1741 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1742 for { 1743 x := v.Args[0] 1744 y := v.Args[1] 1745 v.reset(OpS390XMOVDEQ) 1746 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1747 v0.AuxInt = 0 1748 v.AddArg(v0) 1749 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1750 v1.AuxInt = 1 1751 v.AddArg(v1) 1752 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1753 v2.AddArg(x) 1754 v2.AddArg(y) 1755 v.AddArg(v2) 1756 return true 1757 } 1758 } 1759 func rewriteValueS390X_OpEq64F_0(v *Value) bool { 1760 b := v.Block 1761 _ = b 1762 types := &b.Func.Config.Types 1763 _ = types 1764 // match: (Eq64F x y) 1765 // cond: 1766 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 1767 for { 1768 x := v.Args[0] 1769 y := v.Args[1] 1770 v.reset(OpS390XMOVDEQ) 1771 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1772 v0.AuxInt = 0 1773 v.AddArg(v0) 1774 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1775 v1.AuxInt = 1 1776 v.AddArg(v1) 1777 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 1778 v2.AddArg(x) 1779 v2.AddArg(y) 1780 v.AddArg(v2) 1781 return true 1782 } 1783 } 1784 func rewriteValueS390X_OpEq8_0(v *Value) bool { 1785 b := v.Block 1786 _ = b 1787 types := &b.Func.Config.Types 1788 _ = types 1789 // match: (Eq8 x y) 1790 // cond: 1791 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1792 for { 1793 x := v.Args[0] 1794 y := v.Args[1] 1795 v.reset(OpS390XMOVDEQ) 1796 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1797 v0.AuxInt = 0 1798 v.AddArg(v0) 1799 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1800 v1.AuxInt = 1 1801 v.AddArg(v1) 1802 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1803 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1804 v3.AddArg(x) 1805 v2.AddArg(v3) 1806 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1807 v4.AddArg(y) 1808 v2.AddArg(v4) 1809 v.AddArg(v2) 1810 return true 1811 } 1812 } 1813 func rewriteValueS390X_OpEqB_0(v *Value) bool { 1814 b := v.Block 1815 _ = b 1816 types := &b.Func.Config.Types 1817 _ = types 1818 // match: (EqB x y) 1819 // cond: 1820 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 1821 for { 1822 x := v.Args[0] 1823 y := v.Args[1] 1824 v.reset(OpS390XMOVDEQ) 1825 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1826 v0.AuxInt = 0 1827 v.AddArg(v0) 1828 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1829 v1.AuxInt = 1 1830 v.AddArg(v1) 1831 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1832 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1833 v3.AddArg(x) 1834 v2.AddArg(v3) 1835 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 1836 v4.AddArg(y) 1837 v2.AddArg(v4) 1838 v.AddArg(v2) 1839 return true 1840 } 1841 } 1842 func rewriteValueS390X_OpEqPtr_0(v *Value) bool { 1843 b := v.Block 1844 _ = b 1845 types := &b.Func.Config.Types 1846 _ = types 1847 // match: (EqPtr x y) 1848 // cond: 1849 // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 1850 for { 1851 x := v.Args[0] 1852 y := v.Args[1] 1853 v.reset(OpS390XMOVDEQ) 1854 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1855 v0.AuxInt = 0 1856 v.AddArg(v0) 1857 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1858 v1.AuxInt = 1 1859 v.AddArg(v1) 1860 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1861 v2.AddArg(x) 1862 v2.AddArg(y) 1863 v.AddArg(v2) 1864 return true 1865 } 1866 } 1867 func rewriteValueS390X_OpGeq16_0(v *Value) bool { 1868 b := v.Block 1869 _ = b 1870 types := &b.Func.Config.Types 1871 _ = types 1872 // match: (Geq16 x y) 1873 // cond: 1874 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 1875 for { 1876 x := v.Args[0] 1877 y := v.Args[1] 1878 v.reset(OpS390XMOVDGE) 1879 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1880 v0.AuxInt = 0 1881 v.AddArg(v0) 1882 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1883 v1.AuxInt = 1 1884 v.AddArg(v1) 1885 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 1886 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1887 v3.AddArg(x) 1888 v2.AddArg(v3) 1889 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 1890 v4.AddArg(y) 1891 v2.AddArg(v4) 1892 v.AddArg(v2) 1893 return true 1894 } 1895 } 1896 func rewriteValueS390X_OpGeq16U_0(v *Value) bool { 1897 b := v.Block 1898 _ = b 1899 types := &b.Func.Config.Types 1900 _ = types 1901 // match: (Geq16U x y) 1902 // cond: 1903 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 1904 for { 1905 x := v.Args[0] 1906 y := v.Args[1] 1907 v.reset(OpS390XMOVDGE) 1908 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1909 v0.AuxInt = 0 1910 v.AddArg(v0) 1911 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1912 v1.AuxInt = 1 1913 v.AddArg(v1) 1914 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 1915 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 1916 v3.AddArg(x) 1917 v2.AddArg(v3) 1918 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 1919 v4.AddArg(y) 1920 v2.AddArg(v4) 1921 v.AddArg(v2) 1922 return true 1923 } 1924 } 1925 func rewriteValueS390X_OpGeq32_0(v *Value) bool { 1926 b := v.Block 1927 _ = b 1928 types := &b.Func.Config.Types 1929 _ = types 1930 // match: (Geq32 x y) 1931 // cond: 1932 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 1933 for { 1934 x := v.Args[0] 1935 y := v.Args[1] 1936 v.reset(OpS390XMOVDGE) 1937 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1938 v0.AuxInt = 0 1939 v.AddArg(v0) 1940 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1941 v1.AuxInt = 1 1942 v.AddArg(v1) 1943 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 1944 v2.AddArg(x) 1945 v2.AddArg(y) 1946 v.AddArg(v2) 1947 return true 1948 } 1949 } 1950 func rewriteValueS390X_OpGeq32F_0(v *Value) bool { 1951 b := v.Block 1952 _ = b 1953 types := &b.Func.Config.Types 1954 _ = types 1955 // match: (Geq32F x y) 1956 // cond: 1957 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 1958 for { 1959 x := v.Args[0] 1960 y := v.Args[1] 1961 v.reset(OpS390XMOVDGEnoinv) 1962 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1963 v0.AuxInt = 0 1964 v.AddArg(v0) 1965 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1966 v1.AuxInt = 1 1967 v.AddArg(v1) 1968 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 1969 v2.AddArg(x) 1970 v2.AddArg(y) 1971 v.AddArg(v2) 1972 return true 1973 } 1974 } 1975 func rewriteValueS390X_OpGeq32U_0(v *Value) bool { 1976 b := v.Block 1977 _ = b 1978 types := &b.Func.Config.Types 1979 _ = types 1980 // match: (Geq32U x y) 1981 // cond: 1982 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 1983 for { 1984 x := v.Args[0] 1985 y := v.Args[1] 1986 v.reset(OpS390XMOVDGE) 1987 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1988 v0.AuxInt = 0 1989 v.AddArg(v0) 1990 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 1991 v1.AuxInt = 1 1992 v.AddArg(v1) 1993 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, TypeFlags) 1994 v2.AddArg(x) 1995 v2.AddArg(y) 1996 v.AddArg(v2) 1997 return true 1998 } 1999 } 2000 func rewriteValueS390X_OpGeq64_0(v *Value) bool { 2001 b := v.Block 2002 _ = b 2003 types := &b.Func.Config.Types 2004 _ = types 2005 // match: (Geq64 x y) 2006 // cond: 2007 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2008 for { 2009 x := v.Args[0] 2010 y := v.Args[1] 2011 v.reset(OpS390XMOVDGE) 2012 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2013 v0.AuxInt = 0 2014 v.AddArg(v0) 2015 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2016 v1.AuxInt = 1 2017 v.AddArg(v1) 2018 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2019 v2.AddArg(x) 2020 v2.AddArg(y) 2021 v.AddArg(v2) 2022 return true 2023 } 2024 } 2025 func rewriteValueS390X_OpGeq64F_0(v *Value) bool { 2026 b := v.Block 2027 _ = b 2028 types := &b.Func.Config.Types 2029 _ = types 2030 // match: (Geq64F x y) 2031 // cond: 2032 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2033 for { 2034 x := v.Args[0] 2035 y := v.Args[1] 2036 v.reset(OpS390XMOVDGEnoinv) 2037 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2038 v0.AuxInt = 0 2039 v.AddArg(v0) 2040 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2041 v1.AuxInt = 1 2042 v.AddArg(v1) 2043 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 2044 v2.AddArg(x) 2045 v2.AddArg(y) 2046 v.AddArg(v2) 2047 return true 2048 } 2049 } 2050 func rewriteValueS390X_OpGeq64U_0(v *Value) bool { 2051 b := v.Block 2052 _ = b 2053 types := &b.Func.Config.Types 2054 _ = types 2055 // match: (Geq64U x y) 2056 // cond: 2057 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2058 for { 2059 x := v.Args[0] 2060 y := v.Args[1] 2061 v.reset(OpS390XMOVDGE) 2062 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2063 v0.AuxInt = 0 2064 v.AddArg(v0) 2065 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2066 v1.AuxInt = 1 2067 v.AddArg(v1) 2068 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2069 v2.AddArg(x) 2070 v2.AddArg(y) 2071 v.AddArg(v2) 2072 return true 2073 } 2074 } 2075 func rewriteValueS390X_OpGeq8_0(v *Value) bool { 2076 b := v.Block 2077 _ = b 2078 types := &b.Func.Config.Types 2079 _ = types 2080 // match: (Geq8 x y) 2081 // cond: 2082 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2083 for { 2084 x := v.Args[0] 2085 y := v.Args[1] 2086 v.reset(OpS390XMOVDGE) 2087 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2088 v0.AuxInt = 0 2089 v.AddArg(v0) 2090 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2091 v1.AuxInt = 1 2092 v.AddArg(v1) 2093 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2094 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2095 v3.AddArg(x) 2096 v2.AddArg(v3) 2097 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2098 v4.AddArg(y) 2099 v2.AddArg(v4) 2100 v.AddArg(v2) 2101 return true 2102 } 2103 } 2104 func rewriteValueS390X_OpGeq8U_0(v *Value) bool { 2105 b := v.Block 2106 _ = b 2107 types := &b.Func.Config.Types 2108 _ = types 2109 // match: (Geq8U x y) 2110 // cond: 2111 // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2112 for { 2113 x := v.Args[0] 2114 y := v.Args[1] 2115 v.reset(OpS390XMOVDGE) 2116 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2117 v0.AuxInt = 0 2118 v.AddArg(v0) 2119 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2120 v1.AuxInt = 1 2121 v.AddArg(v1) 2122 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2123 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2124 v3.AddArg(x) 2125 v2.AddArg(v3) 2126 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2127 v4.AddArg(y) 2128 v2.AddArg(v4) 2129 v.AddArg(v2) 2130 return true 2131 } 2132 } 2133 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool { 2134 // match: (GetClosurePtr) 2135 // cond: 2136 // result: (LoweredGetClosurePtr) 2137 for { 2138 v.reset(OpS390XLoweredGetClosurePtr) 2139 return true 2140 } 2141 } 2142 func rewriteValueS390X_OpGetG_0(v *Value) bool { 2143 // match: (GetG mem) 2144 // cond: 2145 // result: (LoweredGetG mem) 2146 for { 2147 mem := v.Args[0] 2148 v.reset(OpS390XLoweredGetG) 2149 v.AddArg(mem) 2150 return true 2151 } 2152 } 2153 func rewriteValueS390X_OpGreater16_0(v *Value) bool { 2154 b := v.Block 2155 _ = b 2156 types := &b.Func.Config.Types 2157 _ = types 2158 // match: (Greater16 x y) 2159 // cond: 2160 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2161 for { 2162 x := v.Args[0] 2163 y := v.Args[1] 2164 v.reset(OpS390XMOVDGT) 2165 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2166 v0.AuxInt = 0 2167 v.AddArg(v0) 2168 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2169 v1.AuxInt = 1 2170 v.AddArg(v1) 2171 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2172 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2173 v3.AddArg(x) 2174 v2.AddArg(v3) 2175 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2176 v4.AddArg(y) 2177 v2.AddArg(v4) 2178 v.AddArg(v2) 2179 return true 2180 } 2181 } 2182 func rewriteValueS390X_OpGreater16U_0(v *Value) bool { 2183 b := v.Block 2184 _ = b 2185 types := &b.Func.Config.Types 2186 _ = types 2187 // match: (Greater16U x y) 2188 // cond: 2189 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2190 for { 2191 x := v.Args[0] 2192 y := v.Args[1] 2193 v.reset(OpS390XMOVDGT) 2194 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2195 v0.AuxInt = 0 2196 v.AddArg(v0) 2197 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2198 v1.AuxInt = 1 2199 v.AddArg(v1) 2200 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2201 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2202 v3.AddArg(x) 2203 v2.AddArg(v3) 2204 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2205 v4.AddArg(y) 2206 v2.AddArg(v4) 2207 v.AddArg(v2) 2208 return true 2209 } 2210 } 2211 func rewriteValueS390X_OpGreater32_0(v *Value) bool { 2212 b := v.Block 2213 _ = b 2214 types := &b.Func.Config.Types 2215 _ = types 2216 // match: (Greater32 x y) 2217 // cond: 2218 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2219 for { 2220 x := v.Args[0] 2221 y := v.Args[1] 2222 v.reset(OpS390XMOVDGT) 2223 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2224 v0.AuxInt = 0 2225 v.AddArg(v0) 2226 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2227 v1.AuxInt = 1 2228 v.AddArg(v1) 2229 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 2230 v2.AddArg(x) 2231 v2.AddArg(y) 2232 v.AddArg(v2) 2233 return true 2234 } 2235 } 2236 func rewriteValueS390X_OpGreater32F_0(v *Value) bool { 2237 b := v.Block 2238 _ = b 2239 types := &b.Func.Config.Types 2240 _ = types 2241 // match: (Greater32F x y) 2242 // cond: 2243 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 2244 for { 2245 x := v.Args[0] 2246 y := v.Args[1] 2247 v.reset(OpS390XMOVDGTnoinv) 2248 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2249 v0.AuxInt = 0 2250 v.AddArg(v0) 2251 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2252 v1.AuxInt = 1 2253 v.AddArg(v1) 2254 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 2255 v2.AddArg(x) 2256 v2.AddArg(y) 2257 v.AddArg(v2) 2258 return true 2259 } 2260 } 2261 func rewriteValueS390X_OpGreater32U_0(v *Value) bool { 2262 b := v.Block 2263 _ = b 2264 types := &b.Func.Config.Types 2265 _ = types 2266 // match: (Greater32U x y) 2267 // cond: 2268 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2269 for { 2270 x := v.Args[0] 2271 y := v.Args[1] 2272 v.reset(OpS390XMOVDGT) 2273 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2274 v0.AuxInt = 0 2275 v.AddArg(v0) 2276 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2277 v1.AuxInt = 1 2278 v.AddArg(v1) 2279 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, TypeFlags) 2280 v2.AddArg(x) 2281 v2.AddArg(y) 2282 v.AddArg(v2) 2283 return true 2284 } 2285 } 2286 func rewriteValueS390X_OpGreater64_0(v *Value) bool { 2287 b := v.Block 2288 _ = b 2289 types := &b.Func.Config.Types 2290 _ = types 2291 // match: (Greater64 x y) 2292 // cond: 2293 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2294 for { 2295 x := v.Args[0] 2296 y := v.Args[1] 2297 v.reset(OpS390XMOVDGT) 2298 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2299 v0.AuxInt = 0 2300 v.AddArg(v0) 2301 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2302 v1.AuxInt = 1 2303 v.AddArg(v1) 2304 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2305 v2.AddArg(x) 2306 v2.AddArg(y) 2307 v.AddArg(v2) 2308 return true 2309 } 2310 } 2311 func rewriteValueS390X_OpGreater64F_0(v *Value) bool { 2312 b := v.Block 2313 _ = b 2314 types := &b.Func.Config.Types 2315 _ = types 2316 // match: (Greater64F x y) 2317 // cond: 2318 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 2319 for { 2320 x := v.Args[0] 2321 y := v.Args[1] 2322 v.reset(OpS390XMOVDGTnoinv) 2323 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2324 v0.AuxInt = 0 2325 v.AddArg(v0) 2326 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2327 v1.AuxInt = 1 2328 v.AddArg(v1) 2329 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 2330 v2.AddArg(x) 2331 v2.AddArg(y) 2332 v.AddArg(v2) 2333 return true 2334 } 2335 } 2336 func rewriteValueS390X_OpGreater64U_0(v *Value) bool { 2337 b := v.Block 2338 _ = b 2339 types := &b.Func.Config.Types 2340 _ = types 2341 // match: (Greater64U x y) 2342 // cond: 2343 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2344 for { 2345 x := v.Args[0] 2346 y := v.Args[1] 2347 v.reset(OpS390XMOVDGT) 2348 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2349 v0.AuxInt = 0 2350 v.AddArg(v0) 2351 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2352 v1.AuxInt = 1 2353 v.AddArg(v1) 2354 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2355 v2.AddArg(x) 2356 v2.AddArg(y) 2357 v.AddArg(v2) 2358 return true 2359 } 2360 } 2361 func rewriteValueS390X_OpGreater8_0(v *Value) bool { 2362 b := v.Block 2363 _ = b 2364 types := &b.Func.Config.Types 2365 _ = types 2366 // match: (Greater8 x y) 2367 // cond: 2368 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2369 for { 2370 x := v.Args[0] 2371 y := v.Args[1] 2372 v.reset(OpS390XMOVDGT) 2373 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2374 v0.AuxInt = 0 2375 v.AddArg(v0) 2376 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2377 v1.AuxInt = 1 2378 v.AddArg(v1) 2379 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2380 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2381 v3.AddArg(x) 2382 v2.AddArg(v3) 2383 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2384 v4.AddArg(y) 2385 v2.AddArg(v4) 2386 v.AddArg(v2) 2387 return true 2388 } 2389 } 2390 func rewriteValueS390X_OpGreater8U_0(v *Value) bool { 2391 b := v.Block 2392 _ = b 2393 types := &b.Func.Config.Types 2394 _ = types 2395 // match: (Greater8U x y) 2396 // cond: 2397 // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2398 for { 2399 x := v.Args[0] 2400 y := v.Args[1] 2401 v.reset(OpS390XMOVDGT) 2402 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2403 v0.AuxInt = 0 2404 v.AddArg(v0) 2405 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2406 v1.AuxInt = 1 2407 v.AddArg(v1) 2408 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2409 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2410 v3.AddArg(x) 2411 v2.AddArg(v3) 2412 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2413 v4.AddArg(y) 2414 v2.AddArg(v4) 2415 v.AddArg(v2) 2416 return true 2417 } 2418 } 2419 func rewriteValueS390X_OpHmul32_0(v *Value) bool { 2420 b := v.Block 2421 _ = b 2422 types := &b.Func.Config.Types 2423 _ = types 2424 // match: (Hmul32 x y) 2425 // cond: 2426 // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) 2427 for { 2428 x := v.Args[0] 2429 y := v.Args[1] 2430 v.reset(OpS390XSRDconst) 2431 v.AuxInt = 32 2432 v0 := b.NewValue0(v.Pos, OpS390XMULLD, types.Int64) 2433 v1 := b.NewValue0(v.Pos, OpS390XMOVWreg, types.Int64) 2434 v1.AddArg(x) 2435 v0.AddArg(v1) 2436 v2 := b.NewValue0(v.Pos, OpS390XMOVWreg, types.Int64) 2437 v2.AddArg(y) 2438 v0.AddArg(v2) 2439 v.AddArg(v0) 2440 return true 2441 } 2442 } 2443 func rewriteValueS390X_OpHmul32u_0(v *Value) bool { 2444 b := v.Block 2445 _ = b 2446 types := &b.Func.Config.Types 2447 _ = types 2448 // match: (Hmul32u x y) 2449 // cond: 2450 // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) 2451 for { 2452 x := v.Args[0] 2453 y := v.Args[1] 2454 v.reset(OpS390XSRDconst) 2455 v.AuxInt = 32 2456 v0 := b.NewValue0(v.Pos, OpS390XMULLD, types.Int64) 2457 v1 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 2458 v1.AddArg(x) 2459 v0.AddArg(v1) 2460 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 2461 v2.AddArg(y) 2462 v0.AddArg(v2) 2463 v.AddArg(v0) 2464 return true 2465 } 2466 } 2467 func rewriteValueS390X_OpHmul64_0(v *Value) bool { 2468 // match: (Hmul64 x y) 2469 // cond: 2470 // result: (MULHD x y) 2471 for { 2472 x := v.Args[0] 2473 y := v.Args[1] 2474 v.reset(OpS390XMULHD) 2475 v.AddArg(x) 2476 v.AddArg(y) 2477 return true 2478 } 2479 } 2480 func rewriteValueS390X_OpHmul64u_0(v *Value) bool { 2481 // match: (Hmul64u x y) 2482 // cond: 2483 // result: (MULHDU x y) 2484 for { 2485 x := v.Args[0] 2486 y := v.Args[1] 2487 v.reset(OpS390XMULHDU) 2488 v.AddArg(x) 2489 v.AddArg(y) 2490 return true 2491 } 2492 } 2493 func rewriteValueS390X_OpITab_0(v *Value) bool { 2494 // match: (ITab (Load ptr mem)) 2495 // cond: 2496 // result: (MOVDload ptr mem) 2497 for { 2498 v_0 := v.Args[0] 2499 if v_0.Op != OpLoad { 2500 break 2501 } 2502 ptr := v_0.Args[0] 2503 mem := v_0.Args[1] 2504 v.reset(OpS390XMOVDload) 2505 v.AddArg(ptr) 2506 v.AddArg(mem) 2507 return true 2508 } 2509 return false 2510 } 2511 func rewriteValueS390X_OpInterCall_0(v *Value) bool { 2512 // match: (InterCall [argwid] entry mem) 2513 // cond: 2514 // result: (CALLinter [argwid] entry mem) 2515 for { 2516 argwid := v.AuxInt 2517 entry := v.Args[0] 2518 mem := v.Args[1] 2519 v.reset(OpS390XCALLinter) 2520 v.AuxInt = argwid 2521 v.AddArg(entry) 2522 v.AddArg(mem) 2523 return true 2524 } 2525 } 2526 func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { 2527 b := v.Block 2528 _ = b 2529 types := &b.Func.Config.Types 2530 _ = types 2531 // match: (IsInBounds idx len) 2532 // cond: 2533 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2534 for { 2535 idx := v.Args[0] 2536 len := v.Args[1] 2537 v.reset(OpS390XMOVDLT) 2538 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2539 v0.AuxInt = 0 2540 v.AddArg(v0) 2541 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2542 v1.AuxInt = 1 2543 v.AddArg(v1) 2544 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2545 v2.AddArg(idx) 2546 v2.AddArg(len) 2547 v.AddArg(v2) 2548 return true 2549 } 2550 } 2551 func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { 2552 b := v.Block 2553 _ = b 2554 types := &b.Func.Config.Types 2555 _ = types 2556 // match: (IsNonNil p) 2557 // cond: 2558 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) 2559 for { 2560 p := v.Args[0] 2561 v.reset(OpS390XMOVDNE) 2562 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2563 v0.AuxInt = 0 2564 v.AddArg(v0) 2565 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2566 v1.AuxInt = 1 2567 v.AddArg(v1) 2568 v2 := b.NewValue0(v.Pos, OpS390XCMPconst, TypeFlags) 2569 v2.AuxInt = 0 2570 v2.AddArg(p) 2571 v.AddArg(v2) 2572 return true 2573 } 2574 } 2575 func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { 2576 b := v.Block 2577 _ = b 2578 types := &b.Func.Config.Types 2579 _ = types 2580 // match: (IsSliceInBounds idx len) 2581 // cond: 2582 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) 2583 for { 2584 idx := v.Args[0] 2585 len := v.Args[1] 2586 v.reset(OpS390XMOVDLE) 2587 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2588 v0.AuxInt = 0 2589 v.AddArg(v0) 2590 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2591 v1.AuxInt = 1 2592 v.AddArg(v1) 2593 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2594 v2.AddArg(idx) 2595 v2.AddArg(len) 2596 v.AddArg(v2) 2597 return true 2598 } 2599 } 2600 func rewriteValueS390X_OpLeq16_0(v *Value) bool { 2601 b := v.Block 2602 _ = b 2603 types := &b.Func.Config.Types 2604 _ = types 2605 // match: (Leq16 x y) 2606 // cond: 2607 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2608 for { 2609 x := v.Args[0] 2610 y := v.Args[1] 2611 v.reset(OpS390XMOVDLE) 2612 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2613 v0.AuxInt = 0 2614 v.AddArg(v0) 2615 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2616 v1.AuxInt = 1 2617 v.AddArg(v1) 2618 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2619 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2620 v3.AddArg(x) 2621 v2.AddArg(v3) 2622 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2623 v4.AddArg(y) 2624 v2.AddArg(v4) 2625 v.AddArg(v2) 2626 return true 2627 } 2628 } 2629 func rewriteValueS390X_OpLeq16U_0(v *Value) bool { 2630 b := v.Block 2631 _ = b 2632 types := &b.Func.Config.Types 2633 _ = types 2634 // match: (Leq16U x y) 2635 // cond: 2636 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2637 for { 2638 x := v.Args[0] 2639 y := v.Args[1] 2640 v.reset(OpS390XMOVDLE) 2641 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2642 v0.AuxInt = 0 2643 v.AddArg(v0) 2644 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2645 v1.AuxInt = 1 2646 v.AddArg(v1) 2647 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2648 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2649 v3.AddArg(x) 2650 v2.AddArg(v3) 2651 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2652 v4.AddArg(y) 2653 v2.AddArg(v4) 2654 v.AddArg(v2) 2655 return true 2656 } 2657 } 2658 func rewriteValueS390X_OpLeq32_0(v *Value) bool { 2659 b := v.Block 2660 _ = b 2661 types := &b.Func.Config.Types 2662 _ = types 2663 // match: (Leq32 x y) 2664 // cond: 2665 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2666 for { 2667 x := v.Args[0] 2668 y := v.Args[1] 2669 v.reset(OpS390XMOVDLE) 2670 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2671 v0.AuxInt = 0 2672 v.AddArg(v0) 2673 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2674 v1.AuxInt = 1 2675 v.AddArg(v1) 2676 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 2677 v2.AddArg(x) 2678 v2.AddArg(y) 2679 v.AddArg(v2) 2680 return true 2681 } 2682 } 2683 func rewriteValueS390X_OpLeq32F_0(v *Value) bool { 2684 b := v.Block 2685 _ = b 2686 types := &b.Func.Config.Types 2687 _ = types 2688 // match: (Leq32F x y) 2689 // cond: 2690 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2691 for { 2692 x := v.Args[0] 2693 y := v.Args[1] 2694 v.reset(OpS390XMOVDGEnoinv) 2695 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2696 v0.AuxInt = 0 2697 v.AddArg(v0) 2698 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2699 v1.AuxInt = 1 2700 v.AddArg(v1) 2701 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 2702 v2.AddArg(y) 2703 v2.AddArg(x) 2704 v.AddArg(v2) 2705 return true 2706 } 2707 } 2708 func rewriteValueS390X_OpLeq32U_0(v *Value) bool { 2709 b := v.Block 2710 _ = b 2711 types := &b.Func.Config.Types 2712 _ = types 2713 // match: (Leq32U x y) 2714 // cond: 2715 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2716 for { 2717 x := v.Args[0] 2718 y := v.Args[1] 2719 v.reset(OpS390XMOVDLE) 2720 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2721 v0.AuxInt = 0 2722 v.AddArg(v0) 2723 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2724 v1.AuxInt = 1 2725 v.AddArg(v1) 2726 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, TypeFlags) 2727 v2.AddArg(x) 2728 v2.AddArg(y) 2729 v.AddArg(v2) 2730 return true 2731 } 2732 } 2733 func rewriteValueS390X_OpLeq64_0(v *Value) bool { 2734 b := v.Block 2735 _ = b 2736 types := &b.Func.Config.Types 2737 _ = types 2738 // match: (Leq64 x y) 2739 // cond: 2740 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 2741 for { 2742 x := v.Args[0] 2743 y := v.Args[1] 2744 v.reset(OpS390XMOVDLE) 2745 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2746 v0.AuxInt = 0 2747 v.AddArg(v0) 2748 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2749 v1.AuxInt = 1 2750 v.AddArg(v1) 2751 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2752 v2.AddArg(x) 2753 v2.AddArg(y) 2754 v.AddArg(v2) 2755 return true 2756 } 2757 } 2758 func rewriteValueS390X_OpLeq64F_0(v *Value) bool { 2759 b := v.Block 2760 _ = b 2761 types := &b.Func.Config.Types 2762 _ = types 2763 // match: (Leq64F x y) 2764 // cond: 2765 // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 2766 for { 2767 x := v.Args[0] 2768 y := v.Args[1] 2769 v.reset(OpS390XMOVDGEnoinv) 2770 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2771 v0.AuxInt = 0 2772 v.AddArg(v0) 2773 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2774 v1.AuxInt = 1 2775 v.AddArg(v1) 2776 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 2777 v2.AddArg(y) 2778 v2.AddArg(x) 2779 v.AddArg(v2) 2780 return true 2781 } 2782 } 2783 func rewriteValueS390X_OpLeq64U_0(v *Value) bool { 2784 b := v.Block 2785 _ = b 2786 types := &b.Func.Config.Types 2787 _ = types 2788 // match: (Leq64U x y) 2789 // cond: 2790 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 2791 for { 2792 x := v.Args[0] 2793 y := v.Args[1] 2794 v.reset(OpS390XMOVDLE) 2795 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2796 v0.AuxInt = 0 2797 v.AddArg(v0) 2798 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2799 v1.AuxInt = 1 2800 v.AddArg(v1) 2801 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2802 v2.AddArg(x) 2803 v2.AddArg(y) 2804 v.AddArg(v2) 2805 return true 2806 } 2807 } 2808 func rewriteValueS390X_OpLeq8_0(v *Value) bool { 2809 b := v.Block 2810 _ = b 2811 types := &b.Func.Config.Types 2812 _ = types 2813 // match: (Leq8 x y) 2814 // cond: 2815 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 2816 for { 2817 x := v.Args[0] 2818 y := v.Args[1] 2819 v.reset(OpS390XMOVDLE) 2820 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2821 v0.AuxInt = 0 2822 v.AddArg(v0) 2823 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2824 v1.AuxInt = 1 2825 v.AddArg(v1) 2826 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2827 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2828 v3.AddArg(x) 2829 v2.AddArg(v3) 2830 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 2831 v4.AddArg(y) 2832 v2.AddArg(v4) 2833 v.AddArg(v2) 2834 return true 2835 } 2836 } 2837 func rewriteValueS390X_OpLeq8U_0(v *Value) bool { 2838 b := v.Block 2839 _ = b 2840 types := &b.Func.Config.Types 2841 _ = types 2842 // match: (Leq8U x y) 2843 // cond: 2844 // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 2845 for { 2846 x := v.Args[0] 2847 y := v.Args[1] 2848 v.reset(OpS390XMOVDLE) 2849 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2850 v0.AuxInt = 0 2851 v.AddArg(v0) 2852 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2853 v1.AuxInt = 1 2854 v.AddArg(v1) 2855 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2856 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2857 v3.AddArg(x) 2858 v2.AddArg(v3) 2859 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 2860 v4.AddArg(y) 2861 v2.AddArg(v4) 2862 v.AddArg(v2) 2863 return true 2864 } 2865 } 2866 func rewriteValueS390X_OpLess16_0(v *Value) bool { 2867 b := v.Block 2868 _ = b 2869 types := &b.Func.Config.Types 2870 _ = types 2871 // match: (Less16 x y) 2872 // cond: 2873 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 2874 for { 2875 x := v.Args[0] 2876 y := v.Args[1] 2877 v.reset(OpS390XMOVDLT) 2878 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2879 v0.AuxInt = 0 2880 v.AddArg(v0) 2881 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2882 v1.AuxInt = 1 2883 v.AddArg(v1) 2884 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 2885 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2886 v3.AddArg(x) 2887 v2.AddArg(v3) 2888 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 2889 v4.AddArg(y) 2890 v2.AddArg(v4) 2891 v.AddArg(v2) 2892 return true 2893 } 2894 } 2895 func rewriteValueS390X_OpLess16U_0(v *Value) bool { 2896 b := v.Block 2897 _ = b 2898 types := &b.Func.Config.Types 2899 _ = types 2900 // match: (Less16U x y) 2901 // cond: 2902 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVHZreg x) (MOVHZreg y))) 2903 for { 2904 x := v.Args[0] 2905 y := v.Args[1] 2906 v.reset(OpS390XMOVDLT) 2907 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2908 v0.AuxInt = 0 2909 v.AddArg(v0) 2910 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2911 v1.AuxInt = 1 2912 v.AddArg(v1) 2913 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 2914 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2915 v3.AddArg(x) 2916 v2.AddArg(v3) 2917 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 2918 v4.AddArg(y) 2919 v2.AddArg(v4) 2920 v.AddArg(v2) 2921 return true 2922 } 2923 } 2924 func rewriteValueS390X_OpLess32_0(v *Value) bool { 2925 b := v.Block 2926 _ = b 2927 types := &b.Func.Config.Types 2928 _ = types 2929 // match: (Less32 x y) 2930 // cond: 2931 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 2932 for { 2933 x := v.Args[0] 2934 y := v.Args[1] 2935 v.reset(OpS390XMOVDLT) 2936 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2937 v0.AuxInt = 0 2938 v.AddArg(v0) 2939 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2940 v1.AuxInt = 1 2941 v.AddArg(v1) 2942 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 2943 v2.AddArg(x) 2944 v2.AddArg(y) 2945 v.AddArg(v2) 2946 return true 2947 } 2948 } 2949 func rewriteValueS390X_OpLess32F_0(v *Value) bool { 2950 b := v.Block 2951 _ = b 2952 types := &b.Func.Config.Types 2953 _ = types 2954 // match: (Less32F x y) 2955 // cond: 2956 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) 2957 for { 2958 x := v.Args[0] 2959 y := v.Args[1] 2960 v.reset(OpS390XMOVDGTnoinv) 2961 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2962 v0.AuxInt = 0 2963 v.AddArg(v0) 2964 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2965 v1.AuxInt = 1 2966 v.AddArg(v1) 2967 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 2968 v2.AddArg(y) 2969 v2.AddArg(x) 2970 v.AddArg(v2) 2971 return true 2972 } 2973 } 2974 func rewriteValueS390X_OpLess32U_0(v *Value) bool { 2975 b := v.Block 2976 _ = b 2977 types := &b.Func.Config.Types 2978 _ = types 2979 // match: (Less32U x y) 2980 // cond: 2981 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) 2982 for { 2983 x := v.Args[0] 2984 y := v.Args[1] 2985 v.reset(OpS390XMOVDLT) 2986 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2987 v0.AuxInt = 0 2988 v.AddArg(v0) 2989 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 2990 v1.AuxInt = 1 2991 v.AddArg(v1) 2992 v2 := b.NewValue0(v.Pos, OpS390XCMPWU, TypeFlags) 2993 v2.AddArg(x) 2994 v2.AddArg(y) 2995 v.AddArg(v2) 2996 return true 2997 } 2998 } 2999 func rewriteValueS390X_OpLess64_0(v *Value) bool { 3000 b := v.Block 3001 _ = b 3002 types := &b.Func.Config.Types 3003 _ = types 3004 // match: (Less64 x y) 3005 // cond: 3006 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 3007 for { 3008 x := v.Args[0] 3009 y := v.Args[1] 3010 v.reset(OpS390XMOVDLT) 3011 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3012 v0.AuxInt = 0 3013 v.AddArg(v0) 3014 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3015 v1.AuxInt = 1 3016 v.AddArg(v1) 3017 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 3018 v2.AddArg(x) 3019 v2.AddArg(y) 3020 v.AddArg(v2) 3021 return true 3022 } 3023 } 3024 func rewriteValueS390X_OpLess64F_0(v *Value) bool { 3025 b := v.Block 3026 _ = b 3027 types := &b.Func.Config.Types 3028 _ = types 3029 // match: (Less64F x y) 3030 // cond: 3031 // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) 3032 for { 3033 x := v.Args[0] 3034 y := v.Args[1] 3035 v.reset(OpS390XMOVDGTnoinv) 3036 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3037 v0.AuxInt = 0 3038 v.AddArg(v0) 3039 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3040 v1.AuxInt = 1 3041 v.AddArg(v1) 3042 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 3043 v2.AddArg(y) 3044 v2.AddArg(x) 3045 v.AddArg(v2) 3046 return true 3047 } 3048 } 3049 func rewriteValueS390X_OpLess64U_0(v *Value) bool { 3050 b := v.Block 3051 _ = b 3052 types := &b.Func.Config.Types 3053 _ = types 3054 // match: (Less64U x y) 3055 // cond: 3056 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) 3057 for { 3058 x := v.Args[0] 3059 y := v.Args[1] 3060 v.reset(OpS390XMOVDLT) 3061 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3062 v0.AuxInt = 0 3063 v.AddArg(v0) 3064 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3065 v1.AuxInt = 1 3066 v.AddArg(v1) 3067 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 3068 v2.AddArg(x) 3069 v2.AddArg(y) 3070 v.AddArg(v2) 3071 return true 3072 } 3073 } 3074 func rewriteValueS390X_OpLess8_0(v *Value) bool { 3075 b := v.Block 3076 _ = b 3077 types := &b.Func.Config.Types 3078 _ = types 3079 // match: (Less8 x y) 3080 // cond: 3081 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 3082 for { 3083 x := v.Args[0] 3084 y := v.Args[1] 3085 v.reset(OpS390XMOVDLT) 3086 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3087 v0.AuxInt = 0 3088 v.AddArg(v0) 3089 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3090 v1.AuxInt = 1 3091 v.AddArg(v1) 3092 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 3093 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 3094 v3.AddArg(x) 3095 v2.AddArg(v3) 3096 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 3097 v4.AddArg(y) 3098 v2.AddArg(v4) 3099 v.AddArg(v2) 3100 return true 3101 } 3102 } 3103 func rewriteValueS390X_OpLess8U_0(v *Value) bool { 3104 b := v.Block 3105 _ = b 3106 types := &b.Func.Config.Types 3107 _ = types 3108 // match: (Less8U x y) 3109 // cond: 3110 // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU (MOVBZreg x) (MOVBZreg y))) 3111 for { 3112 x := v.Args[0] 3113 y := v.Args[1] 3114 v.reset(OpS390XMOVDLT) 3115 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3116 v0.AuxInt = 0 3117 v.AddArg(v0) 3118 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 3119 v1.AuxInt = 1 3120 v.AddArg(v1) 3121 v2 := b.NewValue0(v.Pos, OpS390XCMPU, TypeFlags) 3122 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3123 v3.AddArg(x) 3124 v2.AddArg(v3) 3125 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3126 v4.AddArg(y) 3127 v2.AddArg(v4) 3128 v.AddArg(v2) 3129 return true 3130 } 3131 } 3132 func rewriteValueS390X_OpLoad_0(v *Value) bool { 3133 // match: (Load <t> ptr mem) 3134 // cond: (is64BitInt(t) || isPtr(t)) 3135 // result: (MOVDload ptr mem) 3136 for { 3137 t := v.Type 3138 ptr := v.Args[0] 3139 mem := v.Args[1] 3140 if !(is64BitInt(t) || isPtr(t)) { 3141 break 3142 } 3143 v.reset(OpS390XMOVDload) 3144 v.AddArg(ptr) 3145 v.AddArg(mem) 3146 return true 3147 } 3148 // match: (Load <t> ptr mem) 3149 // cond: is32BitInt(t) && isSigned(t) 3150 // result: (MOVWload ptr mem) 3151 for { 3152 t := v.Type 3153 ptr := v.Args[0] 3154 mem := v.Args[1] 3155 if !(is32BitInt(t) && isSigned(t)) { 3156 break 3157 } 3158 v.reset(OpS390XMOVWload) 3159 v.AddArg(ptr) 3160 v.AddArg(mem) 3161 return true 3162 } 3163 // match: (Load <t> ptr mem) 3164 // cond: is32BitInt(t) && !isSigned(t) 3165 // result: (MOVWZload ptr mem) 3166 for { 3167 t := v.Type 3168 ptr := v.Args[0] 3169 mem := v.Args[1] 3170 if !(is32BitInt(t) && !isSigned(t)) { 3171 break 3172 } 3173 v.reset(OpS390XMOVWZload) 3174 v.AddArg(ptr) 3175 v.AddArg(mem) 3176 return true 3177 } 3178 // match: (Load <t> ptr mem) 3179 // cond: is16BitInt(t) && isSigned(t) 3180 // result: (MOVHload ptr mem) 3181 for { 3182 t := v.Type 3183 ptr := v.Args[0] 3184 mem := v.Args[1] 3185 if !(is16BitInt(t) && isSigned(t)) { 3186 break 3187 } 3188 v.reset(OpS390XMOVHload) 3189 v.AddArg(ptr) 3190 v.AddArg(mem) 3191 return true 3192 } 3193 // match: (Load <t> ptr mem) 3194 // cond: is16BitInt(t) && !isSigned(t) 3195 // result: (MOVHZload ptr mem) 3196 for { 3197 t := v.Type 3198 ptr := v.Args[0] 3199 mem := v.Args[1] 3200 if !(is16BitInt(t) && !isSigned(t)) { 3201 break 3202 } 3203 v.reset(OpS390XMOVHZload) 3204 v.AddArg(ptr) 3205 v.AddArg(mem) 3206 return true 3207 } 3208 // match: (Load <t> ptr mem) 3209 // cond: is8BitInt(t) && isSigned(t) 3210 // result: (MOVBload ptr mem) 3211 for { 3212 t := v.Type 3213 ptr := v.Args[0] 3214 mem := v.Args[1] 3215 if !(is8BitInt(t) && isSigned(t)) { 3216 break 3217 } 3218 v.reset(OpS390XMOVBload) 3219 v.AddArg(ptr) 3220 v.AddArg(mem) 3221 return true 3222 } 3223 // match: (Load <t> ptr mem) 3224 // cond: (t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) 3225 // result: (MOVBZload ptr mem) 3226 for { 3227 t := v.Type 3228 ptr := v.Args[0] 3229 mem := v.Args[1] 3230 if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { 3231 break 3232 } 3233 v.reset(OpS390XMOVBZload) 3234 v.AddArg(ptr) 3235 v.AddArg(mem) 3236 return true 3237 } 3238 // match: (Load <t> ptr mem) 3239 // cond: is32BitFloat(t) 3240 // result: (FMOVSload ptr mem) 3241 for { 3242 t := v.Type 3243 ptr := v.Args[0] 3244 mem := v.Args[1] 3245 if !(is32BitFloat(t)) { 3246 break 3247 } 3248 v.reset(OpS390XFMOVSload) 3249 v.AddArg(ptr) 3250 v.AddArg(mem) 3251 return true 3252 } 3253 // match: (Load <t> ptr mem) 3254 // cond: is64BitFloat(t) 3255 // result: (FMOVDload ptr mem) 3256 for { 3257 t := v.Type 3258 ptr := v.Args[0] 3259 mem := v.Args[1] 3260 if !(is64BitFloat(t)) { 3261 break 3262 } 3263 v.reset(OpS390XFMOVDload) 3264 v.AddArg(ptr) 3265 v.AddArg(mem) 3266 return true 3267 } 3268 return false 3269 } 3270 func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { 3271 b := v.Block 3272 _ = b 3273 types := &b.Func.Config.Types 3274 _ = types 3275 // match: (Lsh16x16 <t> x y) 3276 // cond: 3277 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3278 for { 3279 t := v.Type 3280 x := v.Args[0] 3281 y := v.Args[1] 3282 v.reset(OpS390XANDW) 3283 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3284 v0.AddArg(x) 3285 v0.AddArg(y) 3286 v.AddArg(v0) 3287 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3288 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3289 v2.AuxInt = 31 3290 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3291 v3.AddArg(y) 3292 v2.AddArg(v3) 3293 v1.AddArg(v2) 3294 v.AddArg(v1) 3295 return true 3296 } 3297 } 3298 func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { 3299 b := v.Block 3300 _ = b 3301 // match: (Lsh16x32 <t> x y) 3302 // cond: 3303 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3304 for { 3305 t := v.Type 3306 x := v.Args[0] 3307 y := v.Args[1] 3308 v.reset(OpS390XANDW) 3309 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3310 v0.AddArg(x) 3311 v0.AddArg(y) 3312 v.AddArg(v0) 3313 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3314 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3315 v2.AuxInt = 31 3316 v2.AddArg(y) 3317 v1.AddArg(v2) 3318 v.AddArg(v1) 3319 return true 3320 } 3321 } 3322 func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { 3323 b := v.Block 3324 _ = b 3325 // match: (Lsh16x64 <t> x y) 3326 // cond: 3327 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3328 for { 3329 t := v.Type 3330 x := v.Args[0] 3331 y := v.Args[1] 3332 v.reset(OpS390XANDW) 3333 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3334 v0.AddArg(x) 3335 v0.AddArg(y) 3336 v.AddArg(v0) 3337 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3338 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 3339 v2.AuxInt = 31 3340 v2.AddArg(y) 3341 v1.AddArg(v2) 3342 v.AddArg(v1) 3343 return true 3344 } 3345 } 3346 func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { 3347 b := v.Block 3348 _ = b 3349 types := &b.Func.Config.Types 3350 _ = types 3351 // match: (Lsh16x8 <t> x y) 3352 // cond: 3353 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3354 for { 3355 t := v.Type 3356 x := v.Args[0] 3357 y := v.Args[1] 3358 v.reset(OpS390XANDW) 3359 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3360 v0.AddArg(x) 3361 v0.AddArg(y) 3362 v.AddArg(v0) 3363 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3364 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3365 v2.AuxInt = 31 3366 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3367 v3.AddArg(y) 3368 v2.AddArg(v3) 3369 v1.AddArg(v2) 3370 v.AddArg(v1) 3371 return true 3372 } 3373 } 3374 func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { 3375 b := v.Block 3376 _ = b 3377 types := &b.Func.Config.Types 3378 _ = types 3379 // match: (Lsh32x16 <t> x y) 3380 // cond: 3381 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3382 for { 3383 t := v.Type 3384 x := v.Args[0] 3385 y := v.Args[1] 3386 v.reset(OpS390XANDW) 3387 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3388 v0.AddArg(x) 3389 v0.AddArg(y) 3390 v.AddArg(v0) 3391 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3392 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3393 v2.AuxInt = 31 3394 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3395 v3.AddArg(y) 3396 v2.AddArg(v3) 3397 v1.AddArg(v2) 3398 v.AddArg(v1) 3399 return true 3400 } 3401 } 3402 func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { 3403 b := v.Block 3404 _ = b 3405 // match: (Lsh32x32 <t> x y) 3406 // cond: 3407 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3408 for { 3409 t := v.Type 3410 x := v.Args[0] 3411 y := v.Args[1] 3412 v.reset(OpS390XANDW) 3413 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3414 v0.AddArg(x) 3415 v0.AddArg(y) 3416 v.AddArg(v0) 3417 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3418 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3419 v2.AuxInt = 31 3420 v2.AddArg(y) 3421 v1.AddArg(v2) 3422 v.AddArg(v1) 3423 return true 3424 } 3425 } 3426 func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { 3427 b := v.Block 3428 _ = b 3429 // match: (Lsh32x64 <t> x y) 3430 // cond: 3431 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3432 for { 3433 t := v.Type 3434 x := v.Args[0] 3435 y := v.Args[1] 3436 v.reset(OpS390XANDW) 3437 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3438 v0.AddArg(x) 3439 v0.AddArg(y) 3440 v.AddArg(v0) 3441 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3442 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 3443 v2.AuxInt = 31 3444 v2.AddArg(y) 3445 v1.AddArg(v2) 3446 v.AddArg(v1) 3447 return true 3448 } 3449 } 3450 func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { 3451 b := v.Block 3452 _ = b 3453 types := &b.Func.Config.Types 3454 _ = types 3455 // match: (Lsh32x8 <t> x y) 3456 // cond: 3457 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3458 for { 3459 t := v.Type 3460 x := v.Args[0] 3461 y := v.Args[1] 3462 v.reset(OpS390XANDW) 3463 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3464 v0.AddArg(x) 3465 v0.AddArg(y) 3466 v.AddArg(v0) 3467 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3468 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3469 v2.AuxInt = 31 3470 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3471 v3.AddArg(y) 3472 v2.AddArg(v3) 3473 v1.AddArg(v2) 3474 v.AddArg(v1) 3475 return true 3476 } 3477 } 3478 func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { 3479 b := v.Block 3480 _ = b 3481 types := &b.Func.Config.Types 3482 _ = types 3483 // match: (Lsh64x16 <t> x y) 3484 // cond: 3485 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 3486 for { 3487 t := v.Type 3488 x := v.Args[0] 3489 y := v.Args[1] 3490 v.reset(OpS390XAND) 3491 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3492 v0.AddArg(x) 3493 v0.AddArg(y) 3494 v.AddArg(v0) 3495 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3496 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3497 v2.AuxInt = 63 3498 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3499 v3.AddArg(y) 3500 v2.AddArg(v3) 3501 v1.AddArg(v2) 3502 v.AddArg(v1) 3503 return true 3504 } 3505 } 3506 func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { 3507 b := v.Block 3508 _ = b 3509 // match: (Lsh64x32 <t> x y) 3510 // cond: 3511 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 3512 for { 3513 t := v.Type 3514 x := v.Args[0] 3515 y := v.Args[1] 3516 v.reset(OpS390XAND) 3517 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3518 v0.AddArg(x) 3519 v0.AddArg(y) 3520 v.AddArg(v0) 3521 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3522 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3523 v2.AuxInt = 63 3524 v2.AddArg(y) 3525 v1.AddArg(v2) 3526 v.AddArg(v1) 3527 return true 3528 } 3529 } 3530 func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { 3531 b := v.Block 3532 _ = b 3533 // match: (Lsh64x64 <t> x y) 3534 // cond: 3535 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 3536 for { 3537 t := v.Type 3538 x := v.Args[0] 3539 y := v.Args[1] 3540 v.reset(OpS390XAND) 3541 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3542 v0.AddArg(x) 3543 v0.AddArg(y) 3544 v.AddArg(v0) 3545 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3546 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 3547 v2.AuxInt = 63 3548 v2.AddArg(y) 3549 v1.AddArg(v2) 3550 v.AddArg(v1) 3551 return true 3552 } 3553 } 3554 func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { 3555 b := v.Block 3556 _ = b 3557 types := &b.Func.Config.Types 3558 _ = types 3559 // match: (Lsh64x8 <t> x y) 3560 // cond: 3561 // result: (AND (SLD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 3562 for { 3563 t := v.Type 3564 x := v.Args[0] 3565 y := v.Args[1] 3566 v.reset(OpS390XAND) 3567 v0 := b.NewValue0(v.Pos, OpS390XSLD, t) 3568 v0.AddArg(x) 3569 v0.AddArg(y) 3570 v.AddArg(v0) 3571 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 3572 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3573 v2.AuxInt = 63 3574 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3575 v3.AddArg(y) 3576 v2.AddArg(v3) 3577 v1.AddArg(v2) 3578 v.AddArg(v1) 3579 return true 3580 } 3581 } 3582 func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { 3583 b := v.Block 3584 _ = b 3585 types := &b.Func.Config.Types 3586 _ = types 3587 // match: (Lsh8x16 <t> x y) 3588 // cond: 3589 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 3590 for { 3591 t := v.Type 3592 x := v.Args[0] 3593 y := v.Args[1] 3594 v.reset(OpS390XANDW) 3595 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3596 v0.AddArg(x) 3597 v0.AddArg(y) 3598 v.AddArg(v0) 3599 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3600 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3601 v2.AuxInt = 31 3602 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3603 v3.AddArg(y) 3604 v2.AddArg(v3) 3605 v1.AddArg(v2) 3606 v.AddArg(v1) 3607 return true 3608 } 3609 } 3610 func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { 3611 b := v.Block 3612 _ = b 3613 // match: (Lsh8x32 <t> x y) 3614 // cond: 3615 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 3616 for { 3617 t := v.Type 3618 x := v.Args[0] 3619 y := v.Args[1] 3620 v.reset(OpS390XANDW) 3621 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3622 v0.AddArg(x) 3623 v0.AddArg(y) 3624 v.AddArg(v0) 3625 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3626 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3627 v2.AuxInt = 31 3628 v2.AddArg(y) 3629 v1.AddArg(v2) 3630 v.AddArg(v1) 3631 return true 3632 } 3633 } 3634 func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { 3635 b := v.Block 3636 _ = b 3637 // match: (Lsh8x64 <t> x y) 3638 // cond: 3639 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 3640 for { 3641 t := v.Type 3642 x := v.Args[0] 3643 y := v.Args[1] 3644 v.reset(OpS390XANDW) 3645 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3646 v0.AddArg(x) 3647 v0.AddArg(y) 3648 v.AddArg(v0) 3649 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3650 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 3651 v2.AuxInt = 31 3652 v2.AddArg(y) 3653 v1.AddArg(v2) 3654 v.AddArg(v1) 3655 return true 3656 } 3657 } 3658 func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { 3659 b := v.Block 3660 _ = b 3661 types := &b.Func.Config.Types 3662 _ = types 3663 // match: (Lsh8x8 <t> x y) 3664 // cond: 3665 // result: (ANDW (SLW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [31]))) 3666 for { 3667 t := v.Type 3668 x := v.Args[0] 3669 y := v.Args[1] 3670 v.reset(OpS390XANDW) 3671 v0 := b.NewValue0(v.Pos, OpS390XSLW, t) 3672 v0.AddArg(x) 3673 v0.AddArg(y) 3674 v.AddArg(v0) 3675 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 3676 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 3677 v2.AuxInt = 31 3678 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3679 v3.AddArg(y) 3680 v2.AddArg(v3) 3681 v1.AddArg(v2) 3682 v.AddArg(v1) 3683 return true 3684 } 3685 } 3686 func rewriteValueS390X_OpMod16_0(v *Value) bool { 3687 b := v.Block 3688 _ = b 3689 types := &b.Func.Config.Types 3690 _ = types 3691 // match: (Mod16 x y) 3692 // cond: 3693 // result: (MODW (MOVHreg x) (MOVHreg y)) 3694 for { 3695 x := v.Args[0] 3696 y := v.Args[1] 3697 v.reset(OpS390XMODW) 3698 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 3699 v0.AddArg(x) 3700 v.AddArg(v0) 3701 v1 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 3702 v1.AddArg(y) 3703 v.AddArg(v1) 3704 return true 3705 } 3706 } 3707 func rewriteValueS390X_OpMod16u_0(v *Value) bool { 3708 b := v.Block 3709 _ = b 3710 types := &b.Func.Config.Types 3711 _ = types 3712 // match: (Mod16u x y) 3713 // cond: 3714 // result: (MODWU (MOVHZreg x) (MOVHZreg y)) 3715 for { 3716 x := v.Args[0] 3717 y := v.Args[1] 3718 v.reset(OpS390XMODWU) 3719 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3720 v0.AddArg(x) 3721 v.AddArg(v0) 3722 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 3723 v1.AddArg(y) 3724 v.AddArg(v1) 3725 return true 3726 } 3727 } 3728 func rewriteValueS390X_OpMod32_0(v *Value) bool { 3729 b := v.Block 3730 _ = b 3731 types := &b.Func.Config.Types 3732 _ = types 3733 // match: (Mod32 x y) 3734 // cond: 3735 // result: (MODW (MOVWreg x) y) 3736 for { 3737 x := v.Args[0] 3738 y := v.Args[1] 3739 v.reset(OpS390XMODW) 3740 v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, types.Int64) 3741 v0.AddArg(x) 3742 v.AddArg(v0) 3743 v.AddArg(y) 3744 return true 3745 } 3746 } 3747 func rewriteValueS390X_OpMod32u_0(v *Value) bool { 3748 b := v.Block 3749 _ = b 3750 types := &b.Func.Config.Types 3751 _ = types 3752 // match: (Mod32u x y) 3753 // cond: 3754 // result: (MODWU (MOVWZreg x) y) 3755 for { 3756 x := v.Args[0] 3757 y := v.Args[1] 3758 v.reset(OpS390XMODWU) 3759 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 3760 v0.AddArg(x) 3761 v.AddArg(v0) 3762 v.AddArg(y) 3763 return true 3764 } 3765 } 3766 func rewriteValueS390X_OpMod64_0(v *Value) bool { 3767 // match: (Mod64 x y) 3768 // cond: 3769 // result: (MODD x y) 3770 for { 3771 x := v.Args[0] 3772 y := v.Args[1] 3773 v.reset(OpS390XMODD) 3774 v.AddArg(x) 3775 v.AddArg(y) 3776 return true 3777 } 3778 } 3779 func rewriteValueS390X_OpMod64u_0(v *Value) bool { 3780 // match: (Mod64u x y) 3781 // cond: 3782 // result: (MODDU x y) 3783 for { 3784 x := v.Args[0] 3785 y := v.Args[1] 3786 v.reset(OpS390XMODDU) 3787 v.AddArg(x) 3788 v.AddArg(y) 3789 return true 3790 } 3791 } 3792 func rewriteValueS390X_OpMod8_0(v *Value) bool { 3793 b := v.Block 3794 _ = b 3795 types := &b.Func.Config.Types 3796 _ = types 3797 // match: (Mod8 x y) 3798 // cond: 3799 // result: (MODW (MOVBreg x) (MOVBreg y)) 3800 for { 3801 x := v.Args[0] 3802 y := v.Args[1] 3803 v.reset(OpS390XMODW) 3804 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 3805 v0.AddArg(x) 3806 v.AddArg(v0) 3807 v1 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 3808 v1.AddArg(y) 3809 v.AddArg(v1) 3810 return true 3811 } 3812 } 3813 func rewriteValueS390X_OpMod8u_0(v *Value) bool { 3814 b := v.Block 3815 _ = b 3816 types := &b.Func.Config.Types 3817 _ = types 3818 // match: (Mod8u x y) 3819 // cond: 3820 // result: (MODWU (MOVBZreg x) (MOVBZreg y)) 3821 for { 3822 x := v.Args[0] 3823 y := v.Args[1] 3824 v.reset(OpS390XMODWU) 3825 v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3826 v0.AddArg(x) 3827 v.AddArg(v0) 3828 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 3829 v1.AddArg(y) 3830 v.AddArg(v1) 3831 return true 3832 } 3833 } 3834 func rewriteValueS390X_OpMove_0(v *Value) bool { 3835 b := v.Block 3836 _ = b 3837 types := &b.Func.Config.Types 3838 _ = types 3839 // match: (Move [0] _ _ mem) 3840 // cond: 3841 // result: mem 3842 for { 3843 if v.AuxInt != 0 { 3844 break 3845 } 3846 mem := v.Args[2] 3847 v.reset(OpCopy) 3848 v.Type = mem.Type 3849 v.AddArg(mem) 3850 return true 3851 } 3852 // match: (Move [1] dst src mem) 3853 // cond: 3854 // result: (MOVBstore dst (MOVBZload src mem) mem) 3855 for { 3856 if v.AuxInt != 1 { 3857 break 3858 } 3859 dst := v.Args[0] 3860 src := v.Args[1] 3861 mem := v.Args[2] 3862 v.reset(OpS390XMOVBstore) 3863 v.AddArg(dst) 3864 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, types.UInt8) 3865 v0.AddArg(src) 3866 v0.AddArg(mem) 3867 v.AddArg(v0) 3868 v.AddArg(mem) 3869 return true 3870 } 3871 // match: (Move [2] dst src mem) 3872 // cond: 3873 // result: (MOVHstore dst (MOVHZload src mem) mem) 3874 for { 3875 if v.AuxInt != 2 { 3876 break 3877 } 3878 dst := v.Args[0] 3879 src := v.Args[1] 3880 mem := v.Args[2] 3881 v.reset(OpS390XMOVHstore) 3882 v.AddArg(dst) 3883 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 3884 v0.AddArg(src) 3885 v0.AddArg(mem) 3886 v.AddArg(v0) 3887 v.AddArg(mem) 3888 return true 3889 } 3890 // match: (Move [4] dst src mem) 3891 // cond: 3892 // result: (MOVWstore dst (MOVWZload src mem) mem) 3893 for { 3894 if v.AuxInt != 4 { 3895 break 3896 } 3897 dst := v.Args[0] 3898 src := v.Args[1] 3899 mem := v.Args[2] 3900 v.reset(OpS390XMOVWstore) 3901 v.AddArg(dst) 3902 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 3903 v0.AddArg(src) 3904 v0.AddArg(mem) 3905 v.AddArg(v0) 3906 v.AddArg(mem) 3907 return true 3908 } 3909 // match: (Move [8] dst src mem) 3910 // cond: 3911 // result: (MOVDstore dst (MOVDload src mem) mem) 3912 for { 3913 if v.AuxInt != 8 { 3914 break 3915 } 3916 dst := v.Args[0] 3917 src := v.Args[1] 3918 mem := v.Args[2] 3919 v.reset(OpS390XMOVDstore) 3920 v.AddArg(dst) 3921 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3922 v0.AddArg(src) 3923 v0.AddArg(mem) 3924 v.AddArg(v0) 3925 v.AddArg(mem) 3926 return true 3927 } 3928 // match: (Move [16] dst src mem) 3929 // cond: 3930 // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) 3931 for { 3932 if v.AuxInt != 16 { 3933 break 3934 } 3935 dst := v.Args[0] 3936 src := v.Args[1] 3937 mem := v.Args[2] 3938 v.reset(OpS390XMOVDstore) 3939 v.AuxInt = 8 3940 v.AddArg(dst) 3941 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3942 v0.AuxInt = 8 3943 v0.AddArg(src) 3944 v0.AddArg(mem) 3945 v.AddArg(v0) 3946 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, TypeMem) 3947 v1.AddArg(dst) 3948 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3949 v2.AddArg(src) 3950 v2.AddArg(mem) 3951 v1.AddArg(v2) 3952 v1.AddArg(mem) 3953 v.AddArg(v1) 3954 return true 3955 } 3956 // match: (Move [24] dst src mem) 3957 // cond: 3958 // result: (MOVDstore [16] dst (MOVDload [16] src mem) (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem))) 3959 for { 3960 if v.AuxInt != 24 { 3961 break 3962 } 3963 dst := v.Args[0] 3964 src := v.Args[1] 3965 mem := v.Args[2] 3966 v.reset(OpS390XMOVDstore) 3967 v.AuxInt = 16 3968 v.AddArg(dst) 3969 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3970 v0.AuxInt = 16 3971 v0.AddArg(src) 3972 v0.AddArg(mem) 3973 v.AddArg(v0) 3974 v1 := b.NewValue0(v.Pos, OpS390XMOVDstore, TypeMem) 3975 v1.AuxInt = 8 3976 v1.AddArg(dst) 3977 v2 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3978 v2.AuxInt = 8 3979 v2.AddArg(src) 3980 v2.AddArg(mem) 3981 v1.AddArg(v2) 3982 v3 := b.NewValue0(v.Pos, OpS390XMOVDstore, TypeMem) 3983 v3.AddArg(dst) 3984 v4 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 3985 v4.AddArg(src) 3986 v4.AddArg(mem) 3987 v3.AddArg(v4) 3988 v3.AddArg(mem) 3989 v1.AddArg(v3) 3990 v.AddArg(v1) 3991 return true 3992 } 3993 // match: (Move [3] dst src mem) 3994 // cond: 3995 // result: (MOVBstore [2] dst (MOVBZload [2] src mem) (MOVHstore dst (MOVHZload src mem) mem)) 3996 for { 3997 if v.AuxInt != 3 { 3998 break 3999 } 4000 dst := v.Args[0] 4001 src := v.Args[1] 4002 mem := v.Args[2] 4003 v.reset(OpS390XMOVBstore) 4004 v.AuxInt = 2 4005 v.AddArg(dst) 4006 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, types.UInt8) 4007 v0.AuxInt = 2 4008 v0.AddArg(src) 4009 v0.AddArg(mem) 4010 v.AddArg(v0) 4011 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, TypeMem) 4012 v1.AddArg(dst) 4013 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 4014 v2.AddArg(src) 4015 v2.AddArg(mem) 4016 v1.AddArg(v2) 4017 v1.AddArg(mem) 4018 v.AddArg(v1) 4019 return true 4020 } 4021 // match: (Move [5] dst src mem) 4022 // cond: 4023 // result: (MOVBstore [4] dst (MOVBZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4024 for { 4025 if v.AuxInt != 5 { 4026 break 4027 } 4028 dst := v.Args[0] 4029 src := v.Args[1] 4030 mem := v.Args[2] 4031 v.reset(OpS390XMOVBstore) 4032 v.AuxInt = 4 4033 v.AddArg(dst) 4034 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, types.UInt8) 4035 v0.AuxInt = 4 4036 v0.AddArg(src) 4037 v0.AddArg(mem) 4038 v.AddArg(v0) 4039 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, TypeMem) 4040 v1.AddArg(dst) 4041 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 4042 v2.AddArg(src) 4043 v2.AddArg(mem) 4044 v1.AddArg(v2) 4045 v1.AddArg(mem) 4046 v.AddArg(v1) 4047 return true 4048 } 4049 // match: (Move [6] dst src mem) 4050 // cond: 4051 // result: (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem)) 4052 for { 4053 if v.AuxInt != 6 { 4054 break 4055 } 4056 dst := v.Args[0] 4057 src := v.Args[1] 4058 mem := v.Args[2] 4059 v.reset(OpS390XMOVHstore) 4060 v.AuxInt = 4 4061 v.AddArg(dst) 4062 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 4063 v0.AuxInt = 4 4064 v0.AddArg(src) 4065 v0.AddArg(mem) 4066 v.AddArg(v0) 4067 v1 := b.NewValue0(v.Pos, OpS390XMOVWstore, TypeMem) 4068 v1.AddArg(dst) 4069 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 4070 v2.AddArg(src) 4071 v2.AddArg(mem) 4072 v1.AddArg(v2) 4073 v1.AddArg(mem) 4074 v.AddArg(v1) 4075 return true 4076 } 4077 return false 4078 } 4079 func rewriteValueS390X_OpMove_10(v *Value) bool { 4080 b := v.Block 4081 _ = b 4082 types := &b.Func.Config.Types 4083 _ = types 4084 // match: (Move [7] dst src mem) 4085 // cond: 4086 // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) 4087 for { 4088 if v.AuxInt != 7 { 4089 break 4090 } 4091 dst := v.Args[0] 4092 src := v.Args[1] 4093 mem := v.Args[2] 4094 v.reset(OpS390XMOVBstore) 4095 v.AuxInt = 6 4096 v.AddArg(dst) 4097 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, types.UInt8) 4098 v0.AuxInt = 6 4099 v0.AddArg(src) 4100 v0.AddArg(mem) 4101 v.AddArg(v0) 4102 v1 := b.NewValue0(v.Pos, OpS390XMOVHstore, TypeMem) 4103 v1.AuxInt = 4 4104 v1.AddArg(dst) 4105 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 4106 v2.AuxInt = 4 4107 v2.AddArg(src) 4108 v2.AddArg(mem) 4109 v1.AddArg(v2) 4110 v3 := b.NewValue0(v.Pos, OpS390XMOVWstore, TypeMem) 4111 v3.AddArg(dst) 4112 v4 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 4113 v4.AddArg(src) 4114 v4.AddArg(mem) 4115 v3.AddArg(v4) 4116 v3.AddArg(mem) 4117 v1.AddArg(v3) 4118 v.AddArg(v1) 4119 return true 4120 } 4121 // match: (Move [s] dst src mem) 4122 // cond: s > 0 && s <= 256 4123 // result: (MVC [makeValAndOff(s, 0)] dst src mem) 4124 for { 4125 s := v.AuxInt 4126 dst := v.Args[0] 4127 src := v.Args[1] 4128 mem := v.Args[2] 4129 if !(s > 0 && s <= 256) { 4130 break 4131 } 4132 v.reset(OpS390XMVC) 4133 v.AuxInt = makeValAndOff(s, 0) 4134 v.AddArg(dst) 4135 v.AddArg(src) 4136 v.AddArg(mem) 4137 return true 4138 } 4139 // match: (Move [s] dst src mem) 4140 // cond: s > 256 && s <= 512 4141 // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) 4142 for { 4143 s := v.AuxInt 4144 dst := v.Args[0] 4145 src := v.Args[1] 4146 mem := v.Args[2] 4147 if !(s > 256 && s <= 512) { 4148 break 4149 } 4150 v.reset(OpS390XMVC) 4151 v.AuxInt = makeValAndOff(s-256, 256) 4152 v.AddArg(dst) 4153 v.AddArg(src) 4154 v0 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4155 v0.AuxInt = makeValAndOff(256, 0) 4156 v0.AddArg(dst) 4157 v0.AddArg(src) 4158 v0.AddArg(mem) 4159 v.AddArg(v0) 4160 return true 4161 } 4162 // match: (Move [s] dst src mem) 4163 // cond: s > 512 && s <= 768 4164 // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) 4165 for { 4166 s := v.AuxInt 4167 dst := v.Args[0] 4168 src := v.Args[1] 4169 mem := v.Args[2] 4170 if !(s > 512 && s <= 768) { 4171 break 4172 } 4173 v.reset(OpS390XMVC) 4174 v.AuxInt = makeValAndOff(s-512, 512) 4175 v.AddArg(dst) 4176 v.AddArg(src) 4177 v0 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4178 v0.AuxInt = makeValAndOff(256, 256) 4179 v0.AddArg(dst) 4180 v0.AddArg(src) 4181 v1 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4182 v1.AuxInt = makeValAndOff(256, 0) 4183 v1.AddArg(dst) 4184 v1.AddArg(src) 4185 v1.AddArg(mem) 4186 v0.AddArg(v1) 4187 v.AddArg(v0) 4188 return true 4189 } 4190 // match: (Move [s] dst src mem) 4191 // cond: s > 768 && s <= 1024 4192 // result: (MVC [makeValAndOff(s-768, 768)] dst src (MVC [makeValAndOff(256, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))) 4193 for { 4194 s := v.AuxInt 4195 dst := v.Args[0] 4196 src := v.Args[1] 4197 mem := v.Args[2] 4198 if !(s > 768 && s <= 1024) { 4199 break 4200 } 4201 v.reset(OpS390XMVC) 4202 v.AuxInt = makeValAndOff(s-768, 768) 4203 v.AddArg(dst) 4204 v.AddArg(src) 4205 v0 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4206 v0.AuxInt = makeValAndOff(256, 512) 4207 v0.AddArg(dst) 4208 v0.AddArg(src) 4209 v1 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4210 v1.AuxInt = makeValAndOff(256, 256) 4211 v1.AddArg(dst) 4212 v1.AddArg(src) 4213 v2 := b.NewValue0(v.Pos, OpS390XMVC, TypeMem) 4214 v2.AuxInt = makeValAndOff(256, 0) 4215 v2.AddArg(dst) 4216 v2.AddArg(src) 4217 v2.AddArg(mem) 4218 v1.AddArg(v2) 4219 v0.AddArg(v1) 4220 v.AddArg(v0) 4221 return true 4222 } 4223 // match: (Move [s] dst src mem) 4224 // cond: s > 1024 4225 // result: (LoweredMove [s%256] dst src (ADDconst <src.Type> src [(s/256)*256]) mem) 4226 for { 4227 s := v.AuxInt 4228 dst := v.Args[0] 4229 src := v.Args[1] 4230 mem := v.Args[2] 4231 if !(s > 1024) { 4232 break 4233 } 4234 v.reset(OpS390XLoweredMove) 4235 v.AuxInt = s % 256 4236 v.AddArg(dst) 4237 v.AddArg(src) 4238 v0 := b.NewValue0(v.Pos, OpS390XADDconst, src.Type) 4239 v0.AuxInt = (s / 256) * 256 4240 v0.AddArg(src) 4241 v.AddArg(v0) 4242 v.AddArg(mem) 4243 return true 4244 } 4245 return false 4246 } 4247 func rewriteValueS390X_OpMul16_0(v *Value) bool { 4248 // match: (Mul16 x y) 4249 // cond: 4250 // result: (MULLW x y) 4251 for { 4252 x := v.Args[0] 4253 y := v.Args[1] 4254 v.reset(OpS390XMULLW) 4255 v.AddArg(x) 4256 v.AddArg(y) 4257 return true 4258 } 4259 } 4260 func rewriteValueS390X_OpMul32_0(v *Value) bool { 4261 // match: (Mul32 x y) 4262 // cond: 4263 // result: (MULLW x y) 4264 for { 4265 x := v.Args[0] 4266 y := v.Args[1] 4267 v.reset(OpS390XMULLW) 4268 v.AddArg(x) 4269 v.AddArg(y) 4270 return true 4271 } 4272 } 4273 func rewriteValueS390X_OpMul32F_0(v *Value) bool { 4274 // match: (Mul32F x y) 4275 // cond: 4276 // result: (FMULS x y) 4277 for { 4278 x := v.Args[0] 4279 y := v.Args[1] 4280 v.reset(OpS390XFMULS) 4281 v.AddArg(x) 4282 v.AddArg(y) 4283 return true 4284 } 4285 } 4286 func rewriteValueS390X_OpMul64_0(v *Value) bool { 4287 // match: (Mul64 x y) 4288 // cond: 4289 // result: (MULLD x y) 4290 for { 4291 x := v.Args[0] 4292 y := v.Args[1] 4293 v.reset(OpS390XMULLD) 4294 v.AddArg(x) 4295 v.AddArg(y) 4296 return true 4297 } 4298 } 4299 func rewriteValueS390X_OpMul64F_0(v *Value) bool { 4300 // match: (Mul64F x y) 4301 // cond: 4302 // result: (FMUL x y) 4303 for { 4304 x := v.Args[0] 4305 y := v.Args[1] 4306 v.reset(OpS390XFMUL) 4307 v.AddArg(x) 4308 v.AddArg(y) 4309 return true 4310 } 4311 } 4312 func rewriteValueS390X_OpMul8_0(v *Value) bool { 4313 // match: (Mul8 x y) 4314 // cond: 4315 // result: (MULLW x y) 4316 for { 4317 x := v.Args[0] 4318 y := v.Args[1] 4319 v.reset(OpS390XMULLW) 4320 v.AddArg(x) 4321 v.AddArg(y) 4322 return true 4323 } 4324 } 4325 func rewriteValueS390X_OpNeg16_0(v *Value) bool { 4326 b := v.Block 4327 _ = b 4328 types := &b.Func.Config.Types 4329 _ = types 4330 // match: (Neg16 x) 4331 // cond: 4332 // result: (NEGW (MOVHreg x)) 4333 for { 4334 x := v.Args[0] 4335 v.reset(OpS390XNEGW) 4336 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4337 v0.AddArg(x) 4338 v.AddArg(v0) 4339 return true 4340 } 4341 } 4342 func rewriteValueS390X_OpNeg32_0(v *Value) bool { 4343 // match: (Neg32 x) 4344 // cond: 4345 // result: (NEGW x) 4346 for { 4347 x := v.Args[0] 4348 v.reset(OpS390XNEGW) 4349 v.AddArg(x) 4350 return true 4351 } 4352 } 4353 func rewriteValueS390X_OpNeg32F_0(v *Value) bool { 4354 // match: (Neg32F x) 4355 // cond: 4356 // result: (FNEGS x) 4357 for { 4358 x := v.Args[0] 4359 v.reset(OpS390XFNEGS) 4360 v.AddArg(x) 4361 return true 4362 } 4363 } 4364 func rewriteValueS390X_OpNeg64_0(v *Value) bool { 4365 // match: (Neg64 x) 4366 // cond: 4367 // result: (NEG x) 4368 for { 4369 x := v.Args[0] 4370 v.reset(OpS390XNEG) 4371 v.AddArg(x) 4372 return true 4373 } 4374 } 4375 func rewriteValueS390X_OpNeg64F_0(v *Value) bool { 4376 // match: (Neg64F x) 4377 // cond: 4378 // result: (FNEG x) 4379 for { 4380 x := v.Args[0] 4381 v.reset(OpS390XFNEG) 4382 v.AddArg(x) 4383 return true 4384 } 4385 } 4386 func rewriteValueS390X_OpNeg8_0(v *Value) bool { 4387 b := v.Block 4388 _ = b 4389 types := &b.Func.Config.Types 4390 _ = types 4391 // match: (Neg8 x) 4392 // cond: 4393 // result: (NEGW (MOVBreg x)) 4394 for { 4395 x := v.Args[0] 4396 v.reset(OpS390XNEGW) 4397 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4398 v0.AddArg(x) 4399 v.AddArg(v0) 4400 return true 4401 } 4402 } 4403 func rewriteValueS390X_OpNeq16_0(v *Value) bool { 4404 b := v.Block 4405 _ = b 4406 types := &b.Func.Config.Types 4407 _ = types 4408 // match: (Neq16 x y) 4409 // cond: 4410 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVHreg x) (MOVHreg y))) 4411 for { 4412 x := v.Args[0] 4413 y := v.Args[1] 4414 v.reset(OpS390XMOVDNE) 4415 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4416 v0.AuxInt = 0 4417 v.AddArg(v0) 4418 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4419 v1.AuxInt = 1 4420 v.AddArg(v1) 4421 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4422 v3 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4423 v3.AddArg(x) 4424 v2.AddArg(v3) 4425 v4 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4426 v4.AddArg(y) 4427 v2.AddArg(v4) 4428 v.AddArg(v2) 4429 return true 4430 } 4431 } 4432 func rewriteValueS390X_OpNeq32_0(v *Value) bool { 4433 b := v.Block 4434 _ = b 4435 types := &b.Func.Config.Types 4436 _ = types 4437 // match: (Neq32 x y) 4438 // cond: 4439 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) 4440 for { 4441 x := v.Args[0] 4442 y := v.Args[1] 4443 v.reset(OpS390XMOVDNE) 4444 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4445 v0.AuxInt = 0 4446 v.AddArg(v0) 4447 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4448 v1.AuxInt = 1 4449 v.AddArg(v1) 4450 v2 := b.NewValue0(v.Pos, OpS390XCMPW, TypeFlags) 4451 v2.AddArg(x) 4452 v2.AddArg(y) 4453 v.AddArg(v2) 4454 return true 4455 } 4456 } 4457 func rewriteValueS390X_OpNeq32F_0(v *Value) bool { 4458 b := v.Block 4459 _ = b 4460 types := &b.Func.Config.Types 4461 _ = types 4462 // match: (Neq32F x y) 4463 // cond: 4464 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) 4465 for { 4466 x := v.Args[0] 4467 y := v.Args[1] 4468 v.reset(OpS390XMOVDNE) 4469 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4470 v0.AuxInt = 0 4471 v.AddArg(v0) 4472 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4473 v1.AuxInt = 1 4474 v.AddArg(v1) 4475 v2 := b.NewValue0(v.Pos, OpS390XFCMPS, TypeFlags) 4476 v2.AddArg(x) 4477 v2.AddArg(y) 4478 v.AddArg(v2) 4479 return true 4480 } 4481 } 4482 func rewriteValueS390X_OpNeq64_0(v *Value) bool { 4483 b := v.Block 4484 _ = b 4485 types := &b.Func.Config.Types 4486 _ = types 4487 // match: (Neq64 x y) 4488 // cond: 4489 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4490 for { 4491 x := v.Args[0] 4492 y := v.Args[1] 4493 v.reset(OpS390XMOVDNE) 4494 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4495 v0.AuxInt = 0 4496 v.AddArg(v0) 4497 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4498 v1.AuxInt = 1 4499 v.AddArg(v1) 4500 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4501 v2.AddArg(x) 4502 v2.AddArg(y) 4503 v.AddArg(v2) 4504 return true 4505 } 4506 } 4507 func rewriteValueS390X_OpNeq64F_0(v *Value) bool { 4508 b := v.Block 4509 _ = b 4510 types := &b.Func.Config.Types 4511 _ = types 4512 // match: (Neq64F x y) 4513 // cond: 4514 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) 4515 for { 4516 x := v.Args[0] 4517 y := v.Args[1] 4518 v.reset(OpS390XMOVDNE) 4519 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4520 v0.AuxInt = 0 4521 v.AddArg(v0) 4522 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4523 v1.AuxInt = 1 4524 v.AddArg(v1) 4525 v2 := b.NewValue0(v.Pos, OpS390XFCMP, TypeFlags) 4526 v2.AddArg(x) 4527 v2.AddArg(y) 4528 v.AddArg(v2) 4529 return true 4530 } 4531 } 4532 func rewriteValueS390X_OpNeq8_0(v *Value) bool { 4533 b := v.Block 4534 _ = b 4535 types := &b.Func.Config.Types 4536 _ = types 4537 // match: (Neq8 x y) 4538 // cond: 4539 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4540 for { 4541 x := v.Args[0] 4542 y := v.Args[1] 4543 v.reset(OpS390XMOVDNE) 4544 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4545 v0.AuxInt = 0 4546 v.AddArg(v0) 4547 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4548 v1.AuxInt = 1 4549 v.AddArg(v1) 4550 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4551 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4552 v3.AddArg(x) 4553 v2.AddArg(v3) 4554 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4555 v4.AddArg(y) 4556 v2.AddArg(v4) 4557 v.AddArg(v2) 4558 return true 4559 } 4560 } 4561 func rewriteValueS390X_OpNeqB_0(v *Value) bool { 4562 b := v.Block 4563 _ = b 4564 types := &b.Func.Config.Types 4565 _ = types 4566 // match: (NeqB x y) 4567 // cond: 4568 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP (MOVBreg x) (MOVBreg y))) 4569 for { 4570 x := v.Args[0] 4571 y := v.Args[1] 4572 v.reset(OpS390XMOVDNE) 4573 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4574 v0.AuxInt = 0 4575 v.AddArg(v0) 4576 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4577 v1.AuxInt = 1 4578 v.AddArg(v1) 4579 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4580 v3 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4581 v3.AddArg(x) 4582 v2.AddArg(v3) 4583 v4 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 4584 v4.AddArg(y) 4585 v2.AddArg(v4) 4586 v.AddArg(v2) 4587 return true 4588 } 4589 } 4590 func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { 4591 b := v.Block 4592 _ = b 4593 types := &b.Func.Config.Types 4594 _ = types 4595 // match: (NeqPtr x y) 4596 // cond: 4597 // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) 4598 for { 4599 x := v.Args[0] 4600 y := v.Args[1] 4601 v.reset(OpS390XMOVDNE) 4602 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4603 v0.AuxInt = 0 4604 v.AddArg(v0) 4605 v1 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4606 v1.AuxInt = 1 4607 v.AddArg(v1) 4608 v2 := b.NewValue0(v.Pos, OpS390XCMP, TypeFlags) 4609 v2.AddArg(x) 4610 v2.AddArg(y) 4611 v.AddArg(v2) 4612 return true 4613 } 4614 } 4615 func rewriteValueS390X_OpNilCheck_0(v *Value) bool { 4616 // match: (NilCheck ptr mem) 4617 // cond: 4618 // result: (LoweredNilCheck ptr mem) 4619 for { 4620 ptr := v.Args[0] 4621 mem := v.Args[1] 4622 v.reset(OpS390XLoweredNilCheck) 4623 v.AddArg(ptr) 4624 v.AddArg(mem) 4625 return true 4626 } 4627 } 4628 func rewriteValueS390X_OpNot_0(v *Value) bool { 4629 // match: (Not x) 4630 // cond: 4631 // result: (XORWconst [1] x) 4632 for { 4633 x := v.Args[0] 4634 v.reset(OpS390XXORWconst) 4635 v.AuxInt = 1 4636 v.AddArg(x) 4637 return true 4638 } 4639 } 4640 func rewriteValueS390X_OpOffPtr_0(v *Value) bool { 4641 b := v.Block 4642 _ = b 4643 types := &b.Func.Config.Types 4644 _ = types 4645 // match: (OffPtr [off] ptr:(SP)) 4646 // cond: 4647 // result: (MOVDaddr [off] ptr) 4648 for { 4649 off := v.AuxInt 4650 ptr := v.Args[0] 4651 if ptr.Op != OpSP { 4652 break 4653 } 4654 v.reset(OpS390XMOVDaddr) 4655 v.AuxInt = off 4656 v.AddArg(ptr) 4657 return true 4658 } 4659 // match: (OffPtr [off] ptr) 4660 // cond: is32Bit(off) 4661 // result: (ADDconst [off] ptr) 4662 for { 4663 off := v.AuxInt 4664 ptr := v.Args[0] 4665 if !(is32Bit(off)) { 4666 break 4667 } 4668 v.reset(OpS390XADDconst) 4669 v.AuxInt = off 4670 v.AddArg(ptr) 4671 return true 4672 } 4673 // match: (OffPtr [off] ptr) 4674 // cond: 4675 // result: (ADD (MOVDconst [off]) ptr) 4676 for { 4677 off := v.AuxInt 4678 ptr := v.Args[0] 4679 v.reset(OpS390XADD) 4680 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 4681 v0.AuxInt = off 4682 v.AddArg(v0) 4683 v.AddArg(ptr) 4684 return true 4685 } 4686 } 4687 func rewriteValueS390X_OpOr16_0(v *Value) bool { 4688 // match: (Or16 x y) 4689 // cond: 4690 // result: (ORW x y) 4691 for { 4692 x := v.Args[0] 4693 y := v.Args[1] 4694 v.reset(OpS390XORW) 4695 v.AddArg(x) 4696 v.AddArg(y) 4697 return true 4698 } 4699 } 4700 func rewriteValueS390X_OpOr32_0(v *Value) bool { 4701 // match: (Or32 x y) 4702 // cond: 4703 // result: (ORW x y) 4704 for { 4705 x := v.Args[0] 4706 y := v.Args[1] 4707 v.reset(OpS390XORW) 4708 v.AddArg(x) 4709 v.AddArg(y) 4710 return true 4711 } 4712 } 4713 func rewriteValueS390X_OpOr64_0(v *Value) bool { 4714 // match: (Or64 x y) 4715 // cond: 4716 // result: (OR x y) 4717 for { 4718 x := v.Args[0] 4719 y := v.Args[1] 4720 v.reset(OpS390XOR) 4721 v.AddArg(x) 4722 v.AddArg(y) 4723 return true 4724 } 4725 } 4726 func rewriteValueS390X_OpOr8_0(v *Value) bool { 4727 // match: (Or8 x y) 4728 // cond: 4729 // result: (ORW x y) 4730 for { 4731 x := v.Args[0] 4732 y := v.Args[1] 4733 v.reset(OpS390XORW) 4734 v.AddArg(x) 4735 v.AddArg(y) 4736 return true 4737 } 4738 } 4739 func rewriteValueS390X_OpOrB_0(v *Value) bool { 4740 // match: (OrB x y) 4741 // cond: 4742 // result: (ORW x y) 4743 for { 4744 x := v.Args[0] 4745 y := v.Args[1] 4746 v.reset(OpS390XORW) 4747 v.AddArg(x) 4748 v.AddArg(y) 4749 return true 4750 } 4751 } 4752 func rewriteValueS390X_OpRound32F_0(v *Value) bool { 4753 // match: (Round32F x) 4754 // cond: 4755 // result: (LoweredRound32F x) 4756 for { 4757 x := v.Args[0] 4758 v.reset(OpS390XLoweredRound32F) 4759 v.AddArg(x) 4760 return true 4761 } 4762 } 4763 func rewriteValueS390X_OpRound64F_0(v *Value) bool { 4764 // match: (Round64F x) 4765 // cond: 4766 // result: (LoweredRound64F x) 4767 for { 4768 x := v.Args[0] 4769 v.reset(OpS390XLoweredRound64F) 4770 v.AddArg(x) 4771 return true 4772 } 4773 } 4774 func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { 4775 b := v.Block 4776 _ = b 4777 types := &b.Func.Config.Types 4778 _ = types 4779 // match: (Rsh16Ux16 <t> x y) 4780 // cond: 4781 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [15]))) 4782 for { 4783 t := v.Type 4784 x := v.Args[0] 4785 y := v.Args[1] 4786 v.reset(OpS390XANDW) 4787 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4788 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4789 v1.AddArg(x) 4790 v0.AddArg(v1) 4791 v0.AddArg(y) 4792 v.AddArg(v0) 4793 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4794 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4795 v3.AuxInt = 15 4796 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4797 v4.AddArg(y) 4798 v3.AddArg(v4) 4799 v2.AddArg(v3) 4800 v.AddArg(v2) 4801 return true 4802 } 4803 } 4804 func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { 4805 b := v.Block 4806 _ = b 4807 types := &b.Func.Config.Types 4808 _ = types 4809 // match: (Rsh16Ux32 <t> x y) 4810 // cond: 4811 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [15]))) 4812 for { 4813 t := v.Type 4814 x := v.Args[0] 4815 y := v.Args[1] 4816 v.reset(OpS390XANDW) 4817 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4818 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4819 v1.AddArg(x) 4820 v0.AddArg(v1) 4821 v0.AddArg(y) 4822 v.AddArg(v0) 4823 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4824 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4825 v3.AuxInt = 15 4826 v3.AddArg(y) 4827 v2.AddArg(v3) 4828 v.AddArg(v2) 4829 return true 4830 } 4831 } 4832 func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { 4833 b := v.Block 4834 _ = b 4835 types := &b.Func.Config.Types 4836 _ = types 4837 // match: (Rsh16Ux64 <t> x y) 4838 // cond: 4839 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [15]))) 4840 for { 4841 t := v.Type 4842 x := v.Args[0] 4843 y := v.Args[1] 4844 v.reset(OpS390XANDW) 4845 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4846 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4847 v1.AddArg(x) 4848 v0.AddArg(v1) 4849 v0.AddArg(y) 4850 v.AddArg(v0) 4851 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4852 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 4853 v3.AuxInt = 15 4854 v3.AddArg(y) 4855 v2.AddArg(v3) 4856 v.AddArg(v2) 4857 return true 4858 } 4859 } 4860 func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { 4861 b := v.Block 4862 _ = b 4863 types := &b.Func.Config.Types 4864 _ = types 4865 // match: (Rsh16Ux8 <t> x y) 4866 // cond: 4867 // result: (ANDW (SRW <t> (MOVHZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [15]))) 4868 for { 4869 t := v.Type 4870 x := v.Args[0] 4871 y := v.Args[1] 4872 v.reset(OpS390XANDW) 4873 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 4874 v1 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4875 v1.AddArg(x) 4876 v0.AddArg(v1) 4877 v0.AddArg(y) 4878 v.AddArg(v0) 4879 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 4880 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4881 v3.AuxInt = 15 4882 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 4883 v4.AddArg(y) 4884 v3.AddArg(v4) 4885 v2.AddArg(v3) 4886 v.AddArg(v2) 4887 return true 4888 } 4889 } 4890 func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { 4891 b := v.Block 4892 _ = b 4893 types := &b.Func.Config.Types 4894 _ = types 4895 // match: (Rsh16x16 <t> x y) 4896 // cond: 4897 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [15]))))) 4898 for { 4899 t := v.Type 4900 x := v.Args[0] 4901 y := v.Args[1] 4902 v.reset(OpS390XSRAW) 4903 v.Type = t 4904 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4905 v0.AddArg(x) 4906 v.AddArg(v0) 4907 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 4908 v1.AddArg(y) 4909 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 4910 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 4911 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4912 v4.AuxInt = 15 4913 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 4914 v5.AddArg(y) 4915 v4.AddArg(v5) 4916 v3.AddArg(v4) 4917 v2.AddArg(v3) 4918 v1.AddArg(v2) 4919 v.AddArg(v1) 4920 return true 4921 } 4922 } 4923 func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { 4924 b := v.Block 4925 _ = b 4926 types := &b.Func.Config.Types 4927 _ = types 4928 // match: (Rsh16x32 <t> x y) 4929 // cond: 4930 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [15]))))) 4931 for { 4932 t := v.Type 4933 x := v.Args[0] 4934 y := v.Args[1] 4935 v.reset(OpS390XSRAW) 4936 v.Type = t 4937 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4938 v0.AddArg(x) 4939 v.AddArg(v0) 4940 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 4941 v1.AddArg(y) 4942 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 4943 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 4944 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 4945 v4.AuxInt = 15 4946 v4.AddArg(y) 4947 v3.AddArg(v4) 4948 v2.AddArg(v3) 4949 v1.AddArg(v2) 4950 v.AddArg(v1) 4951 return true 4952 } 4953 } 4954 func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { 4955 b := v.Block 4956 _ = b 4957 types := &b.Func.Config.Types 4958 _ = types 4959 // match: (Rsh16x64 <t> x y) 4960 // cond: 4961 // result: (SRAW <t> (MOVHreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [15]))))) 4962 for { 4963 t := v.Type 4964 x := v.Args[0] 4965 y := v.Args[1] 4966 v.reset(OpS390XSRAW) 4967 v.Type = t 4968 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 4969 v0.AddArg(x) 4970 v.AddArg(v0) 4971 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 4972 v1.AddArg(y) 4973 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 4974 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 4975 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 4976 v4.AuxInt = 15 4977 v4.AddArg(y) 4978 v3.AddArg(v4) 4979 v2.AddArg(v3) 4980 v1.AddArg(v2) 4981 v.AddArg(v1) 4982 return true 4983 } 4984 } 4985 func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { 4986 b := v.Block 4987 _ = b 4988 types := &b.Func.Config.Types 4989 _ = types 4990 // match: (Rsh16x8 <t> x y) 4991 // cond: 4992 // result: (SRAW <t> (MOVHreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [15]))))) 4993 for { 4994 t := v.Type 4995 x := v.Args[0] 4996 y := v.Args[1] 4997 v.reset(OpS390XSRAW) 4998 v.Type = t 4999 v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, types.Int64) 5000 v0.AddArg(x) 5001 v.AddArg(v0) 5002 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5003 v1.AddArg(y) 5004 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5005 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5006 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5007 v4.AuxInt = 15 5008 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5009 v5.AddArg(y) 5010 v4.AddArg(v5) 5011 v3.AddArg(v4) 5012 v2.AddArg(v3) 5013 v1.AddArg(v2) 5014 v.AddArg(v1) 5015 return true 5016 } 5017 } 5018 func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { 5019 b := v.Block 5020 _ = b 5021 types := &b.Func.Config.Types 5022 _ = types 5023 // match: (Rsh32Ux16 <t> x y) 5024 // cond: 5025 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [31]))) 5026 for { 5027 t := v.Type 5028 x := v.Args[0] 5029 y := v.Args[1] 5030 v.reset(OpS390XANDW) 5031 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5032 v0.AddArg(x) 5033 v0.AddArg(y) 5034 v.AddArg(v0) 5035 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5036 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5037 v2.AuxInt = 31 5038 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5039 v3.AddArg(y) 5040 v2.AddArg(v3) 5041 v1.AddArg(v2) 5042 v.AddArg(v1) 5043 return true 5044 } 5045 } 5046 func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { 5047 b := v.Block 5048 _ = b 5049 // match: (Rsh32Ux32 <t> x y) 5050 // cond: 5051 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst y [31]))) 5052 for { 5053 t := v.Type 5054 x := v.Args[0] 5055 y := v.Args[1] 5056 v.reset(OpS390XANDW) 5057 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5058 v0.AddArg(x) 5059 v0.AddArg(y) 5060 v.AddArg(v0) 5061 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5062 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5063 v2.AuxInt = 31 5064 v2.AddArg(y) 5065 v1.AddArg(v2) 5066 v.AddArg(v1) 5067 return true 5068 } 5069 } 5070 func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { 5071 b := v.Block 5072 _ = b 5073 // match: (Rsh32Ux64 <t> x y) 5074 // cond: 5075 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPUconst y [31]))) 5076 for { 5077 t := v.Type 5078 x := v.Args[0] 5079 y := v.Args[1] 5080 v.reset(OpS390XANDW) 5081 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5082 v0.AddArg(x) 5083 v0.AddArg(y) 5084 v.AddArg(v0) 5085 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5086 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5087 v2.AuxInt = 31 5088 v2.AddArg(y) 5089 v1.AddArg(v2) 5090 v.AddArg(v1) 5091 return true 5092 } 5093 } 5094 func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { 5095 b := v.Block 5096 _ = b 5097 types := &b.Func.Config.Types 5098 _ = types 5099 // match: (Rsh32Ux8 <t> x y) 5100 // cond: 5101 // result: (ANDW (SRW <t> x y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg 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.Pos, OpS390XSRW, t) 5108 v0.AddArg(x) 5109 v0.AddArg(y) 5110 v.AddArg(v0) 5111 v1 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5112 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5113 v2.AuxInt = 31 5114 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5115 v3.AddArg(y) 5116 v2.AddArg(v3) 5117 v1.AddArg(v2) 5118 v.AddArg(v1) 5119 return true 5120 } 5121 } 5122 func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { 5123 b := v.Block 5124 _ = b 5125 types := &b.Func.Config.Types 5126 _ = types 5127 // match: (Rsh32x16 <t> x y) 5128 // cond: 5129 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [31]))))) 5130 for { 5131 t := v.Type 5132 x := v.Args[0] 5133 y := v.Args[1] 5134 v.reset(OpS390XSRAW) 5135 v.Type = t 5136 v.AddArg(x) 5137 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5138 v0.AddArg(y) 5139 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5140 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5141 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5142 v3.AuxInt = 31 5143 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5144 v4.AddArg(y) 5145 v3.AddArg(v4) 5146 v2.AddArg(v3) 5147 v1.AddArg(v2) 5148 v0.AddArg(v1) 5149 v.AddArg(v0) 5150 return true 5151 } 5152 } 5153 func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { 5154 b := v.Block 5155 _ = b 5156 // match: (Rsh32x32 <t> x y) 5157 // cond: 5158 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [31]))))) 5159 for { 5160 t := v.Type 5161 x := v.Args[0] 5162 y := v.Args[1] 5163 v.reset(OpS390XSRAW) 5164 v.Type = t 5165 v.AddArg(x) 5166 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5167 v0.AddArg(y) 5168 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5169 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5170 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5171 v3.AuxInt = 31 5172 v3.AddArg(y) 5173 v2.AddArg(v3) 5174 v1.AddArg(v2) 5175 v0.AddArg(v1) 5176 v.AddArg(v0) 5177 return true 5178 } 5179 } 5180 func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { 5181 b := v.Block 5182 _ = b 5183 // match: (Rsh32x64 <t> x y) 5184 // cond: 5185 // result: (SRAW <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [31]))))) 5186 for { 5187 t := v.Type 5188 x := v.Args[0] 5189 y := v.Args[1] 5190 v.reset(OpS390XSRAW) 5191 v.Type = t 5192 v.AddArg(x) 5193 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5194 v0.AddArg(y) 5195 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5196 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5197 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5198 v3.AuxInt = 31 5199 v3.AddArg(y) 5200 v2.AddArg(v3) 5201 v1.AddArg(v2) 5202 v0.AddArg(v1) 5203 v.AddArg(v0) 5204 return true 5205 } 5206 } 5207 func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { 5208 b := v.Block 5209 _ = b 5210 types := &b.Func.Config.Types 5211 _ = types 5212 // match: (Rsh32x8 <t> x y) 5213 // cond: 5214 // result: (SRAW <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [31]))))) 5215 for { 5216 t := v.Type 5217 x := v.Args[0] 5218 y := v.Args[1] 5219 v.reset(OpS390XSRAW) 5220 v.Type = t 5221 v.AddArg(x) 5222 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5223 v0.AddArg(y) 5224 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5225 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5226 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5227 v3.AuxInt = 31 5228 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5229 v4.AddArg(y) 5230 v3.AddArg(v4) 5231 v2.AddArg(v3) 5232 v1.AddArg(v2) 5233 v0.AddArg(v1) 5234 v.AddArg(v0) 5235 return true 5236 } 5237 } 5238 func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { 5239 b := v.Block 5240 _ = b 5241 types := &b.Func.Config.Types 5242 _ = types 5243 // match: (Rsh64Ux16 <t> x y) 5244 // cond: 5245 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVHZreg y) [63]))) 5246 for { 5247 t := v.Type 5248 x := v.Args[0] 5249 y := v.Args[1] 5250 v.reset(OpS390XAND) 5251 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5252 v0.AddArg(x) 5253 v0.AddArg(y) 5254 v.AddArg(v0) 5255 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5256 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5257 v2.AuxInt = 63 5258 v3 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5259 v3.AddArg(y) 5260 v2.AddArg(v3) 5261 v1.AddArg(v2) 5262 v.AddArg(v1) 5263 return true 5264 } 5265 } 5266 func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { 5267 b := v.Block 5268 _ = b 5269 // match: (Rsh64Ux32 <t> x y) 5270 // cond: 5271 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst y [63]))) 5272 for { 5273 t := v.Type 5274 x := v.Args[0] 5275 y := v.Args[1] 5276 v.reset(OpS390XAND) 5277 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5278 v0.AddArg(x) 5279 v0.AddArg(y) 5280 v.AddArg(v0) 5281 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5282 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5283 v2.AuxInt = 63 5284 v2.AddArg(y) 5285 v1.AddArg(v2) 5286 v.AddArg(v1) 5287 return true 5288 } 5289 } 5290 func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { 5291 b := v.Block 5292 _ = b 5293 // match: (Rsh64Ux64 <t> x y) 5294 // cond: 5295 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPUconst y [63]))) 5296 for { 5297 t := v.Type 5298 x := v.Args[0] 5299 y := v.Args[1] 5300 v.reset(OpS390XAND) 5301 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5302 v0.AddArg(x) 5303 v0.AddArg(y) 5304 v.AddArg(v0) 5305 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5306 v2 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5307 v2.AuxInt = 63 5308 v2.AddArg(y) 5309 v1.AddArg(v2) 5310 v.AddArg(v1) 5311 return true 5312 } 5313 } 5314 func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { 5315 b := v.Block 5316 _ = b 5317 types := &b.Func.Config.Types 5318 _ = types 5319 // match: (Rsh64Ux8 <t> x y) 5320 // cond: 5321 // result: (AND (SRD <t> x y) (SUBEcarrymask <t> (CMPWUconst (MOVBZreg y) [63]))) 5322 for { 5323 t := v.Type 5324 x := v.Args[0] 5325 y := v.Args[1] 5326 v.reset(OpS390XAND) 5327 v0 := b.NewValue0(v.Pos, OpS390XSRD, t) 5328 v0.AddArg(x) 5329 v0.AddArg(y) 5330 v.AddArg(v0) 5331 v1 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, t) 5332 v2 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5333 v2.AuxInt = 63 5334 v3 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5335 v3.AddArg(y) 5336 v2.AddArg(v3) 5337 v1.AddArg(v2) 5338 v.AddArg(v1) 5339 return true 5340 } 5341 } 5342 func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { 5343 b := v.Block 5344 _ = b 5345 types := &b.Func.Config.Types 5346 _ = types 5347 // match: (Rsh64x16 <t> x y) 5348 // cond: 5349 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [63]))))) 5350 for { 5351 t := v.Type 5352 x := v.Args[0] 5353 y := v.Args[1] 5354 v.reset(OpS390XSRAD) 5355 v.Type = t 5356 v.AddArg(x) 5357 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5358 v0.AddArg(y) 5359 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5360 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5361 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5362 v3.AuxInt = 63 5363 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5364 v4.AddArg(y) 5365 v3.AddArg(v4) 5366 v2.AddArg(v3) 5367 v1.AddArg(v2) 5368 v0.AddArg(v1) 5369 v.AddArg(v0) 5370 return true 5371 } 5372 } 5373 func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { 5374 b := v.Block 5375 _ = b 5376 // match: (Rsh64x32 <t> x y) 5377 // cond: 5378 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [63]))))) 5379 for { 5380 t := v.Type 5381 x := v.Args[0] 5382 y := v.Args[1] 5383 v.reset(OpS390XSRAD) 5384 v.Type = t 5385 v.AddArg(x) 5386 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5387 v0.AddArg(y) 5388 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5389 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5390 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5391 v3.AuxInt = 63 5392 v3.AddArg(y) 5393 v2.AddArg(v3) 5394 v1.AddArg(v2) 5395 v0.AddArg(v1) 5396 v.AddArg(v0) 5397 return true 5398 } 5399 } 5400 func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { 5401 b := v.Block 5402 _ = b 5403 // match: (Rsh64x64 <t> x y) 5404 // cond: 5405 // result: (SRAD <t> x (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [63]))))) 5406 for { 5407 t := v.Type 5408 x := v.Args[0] 5409 y := v.Args[1] 5410 v.reset(OpS390XSRAD) 5411 v.Type = t 5412 v.AddArg(x) 5413 v0 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5414 v0.AddArg(y) 5415 v1 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5416 v2 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5417 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5418 v3.AuxInt = 63 5419 v3.AddArg(y) 5420 v2.AddArg(v3) 5421 v1.AddArg(v2) 5422 v0.AddArg(v1) 5423 v.AddArg(v0) 5424 return true 5425 } 5426 } 5427 func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { 5428 b := v.Block 5429 _ = b 5430 types := &b.Func.Config.Types 5431 _ = types 5432 // match: (Rsh64x8 <t> x y) 5433 // cond: 5434 // result: (SRAD <t> x (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [63]))))) 5435 for { 5436 t := v.Type 5437 x := v.Args[0] 5438 y := v.Args[1] 5439 v.reset(OpS390XSRAD) 5440 v.Type = t 5441 v.AddArg(x) 5442 v0 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5443 v0.AddArg(y) 5444 v1 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5445 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5446 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5447 v3.AuxInt = 63 5448 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5449 v4.AddArg(y) 5450 v3.AddArg(v4) 5451 v2.AddArg(v3) 5452 v1.AddArg(v2) 5453 v0.AddArg(v1) 5454 v.AddArg(v0) 5455 return true 5456 } 5457 } 5458 func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { 5459 b := v.Block 5460 _ = b 5461 types := &b.Func.Config.Types 5462 _ = types 5463 // match: (Rsh8Ux16 <t> x y) 5464 // cond: 5465 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVHZreg y) [7]))) 5466 for { 5467 t := v.Type 5468 x := v.Args[0] 5469 y := v.Args[1] 5470 v.reset(OpS390XANDW) 5471 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5472 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5473 v1.AddArg(x) 5474 v0.AddArg(v1) 5475 v0.AddArg(y) 5476 v.AddArg(v0) 5477 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5478 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5479 v3.AuxInt = 7 5480 v4 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5481 v4.AddArg(y) 5482 v3.AddArg(v4) 5483 v2.AddArg(v3) 5484 v.AddArg(v2) 5485 return true 5486 } 5487 } 5488 func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { 5489 b := v.Block 5490 _ = b 5491 types := &b.Func.Config.Types 5492 _ = types 5493 // match: (Rsh8Ux32 <t> x y) 5494 // cond: 5495 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst y [7]))) 5496 for { 5497 t := v.Type 5498 x := v.Args[0] 5499 y := v.Args[1] 5500 v.reset(OpS390XANDW) 5501 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5502 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5503 v1.AddArg(x) 5504 v0.AddArg(v1) 5505 v0.AddArg(y) 5506 v.AddArg(v0) 5507 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5508 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5509 v3.AuxInt = 7 5510 v3.AddArg(y) 5511 v2.AddArg(v3) 5512 v.AddArg(v2) 5513 return true 5514 } 5515 } 5516 func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { 5517 b := v.Block 5518 _ = b 5519 types := &b.Func.Config.Types 5520 _ = types 5521 // match: (Rsh8Ux64 <t> x y) 5522 // cond: 5523 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPUconst y [7]))) 5524 for { 5525 t := v.Type 5526 x := v.Args[0] 5527 y := v.Args[1] 5528 v.reset(OpS390XANDW) 5529 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5530 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5531 v1.AddArg(x) 5532 v0.AddArg(v1) 5533 v0.AddArg(y) 5534 v.AddArg(v0) 5535 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5536 v3 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5537 v3.AuxInt = 7 5538 v3.AddArg(y) 5539 v2.AddArg(v3) 5540 v.AddArg(v2) 5541 return true 5542 } 5543 } 5544 func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { 5545 b := v.Block 5546 _ = b 5547 types := &b.Func.Config.Types 5548 _ = types 5549 // match: (Rsh8Ux8 <t> x y) 5550 // cond: 5551 // result: (ANDW (SRW <t> (MOVBZreg x) y) (SUBEWcarrymask <t> (CMPWUconst (MOVBZreg y) [7]))) 5552 for { 5553 t := v.Type 5554 x := v.Args[0] 5555 y := v.Args[1] 5556 v.reset(OpS390XANDW) 5557 v0 := b.NewValue0(v.Pos, OpS390XSRW, t) 5558 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5559 v1.AddArg(x) 5560 v0.AddArg(v1) 5561 v0.AddArg(y) 5562 v.AddArg(v0) 5563 v2 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, t) 5564 v3 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5565 v3.AuxInt = 7 5566 v4 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5567 v4.AddArg(y) 5568 v3.AddArg(v4) 5569 v2.AddArg(v3) 5570 v.AddArg(v2) 5571 return true 5572 } 5573 } 5574 func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { 5575 b := v.Block 5576 _ = b 5577 types := &b.Func.Config.Types 5578 _ = types 5579 // match: (Rsh8x16 <t> x y) 5580 // cond: 5581 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVHZreg y) [7]))))) 5582 for { 5583 t := v.Type 5584 x := v.Args[0] 5585 y := v.Args[1] 5586 v.reset(OpS390XSRAW) 5587 v.Type = t 5588 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 5589 v0.AddArg(x) 5590 v.AddArg(v0) 5591 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5592 v1.AddArg(y) 5593 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5594 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5595 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5596 v4.AuxInt = 7 5597 v5 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 5598 v5.AddArg(y) 5599 v4.AddArg(v5) 5600 v3.AddArg(v4) 5601 v2.AddArg(v3) 5602 v1.AddArg(v2) 5603 v.AddArg(v1) 5604 return true 5605 } 5606 } 5607 func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { 5608 b := v.Block 5609 _ = b 5610 types := &b.Func.Config.Types 5611 _ = types 5612 // match: (Rsh8x32 <t> x y) 5613 // cond: 5614 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst y [7]))))) 5615 for { 5616 t := v.Type 5617 x := v.Args[0] 5618 y := v.Args[1] 5619 v.reset(OpS390XSRAW) 5620 v.Type = t 5621 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 5622 v0.AddArg(x) 5623 v.AddArg(v0) 5624 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5625 v1.AddArg(y) 5626 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5627 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5628 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5629 v4.AuxInt = 7 5630 v4.AddArg(y) 5631 v3.AddArg(v4) 5632 v2.AddArg(v3) 5633 v1.AddArg(v2) 5634 v.AddArg(v1) 5635 return true 5636 } 5637 } 5638 func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { 5639 b := v.Block 5640 _ = b 5641 types := &b.Func.Config.Types 5642 _ = types 5643 // match: (Rsh8x64 <t> x y) 5644 // cond: 5645 // result: (SRAW <t> (MOVBreg x) (OR <y.Type> y (NOT <y.Type> (SUBEcarrymask <y.Type> (CMPUconst y [7]))))) 5646 for { 5647 t := v.Type 5648 x := v.Args[0] 5649 y := v.Args[1] 5650 v.reset(OpS390XSRAW) 5651 v.Type = t 5652 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 5653 v0.AddArg(x) 5654 v.AddArg(v0) 5655 v1 := b.NewValue0(v.Pos, OpS390XOR, y.Type) 5656 v1.AddArg(y) 5657 v2 := b.NewValue0(v.Pos, OpS390XNOT, y.Type) 5658 v3 := b.NewValue0(v.Pos, OpS390XSUBEcarrymask, y.Type) 5659 v4 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 5660 v4.AuxInt = 7 5661 v4.AddArg(y) 5662 v3.AddArg(v4) 5663 v2.AddArg(v3) 5664 v1.AddArg(v2) 5665 v.AddArg(v1) 5666 return true 5667 } 5668 } 5669 func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { 5670 b := v.Block 5671 _ = b 5672 types := &b.Func.Config.Types 5673 _ = types 5674 // match: (Rsh8x8 <t> x y) 5675 // cond: 5676 // result: (SRAW <t> (MOVBreg x) (ORW <y.Type> y (NOTW <y.Type> (SUBEWcarrymask <y.Type> (CMPWUconst (MOVBZreg y) [7]))))) 5677 for { 5678 t := v.Type 5679 x := v.Args[0] 5680 y := v.Args[1] 5681 v.reset(OpS390XSRAW) 5682 v.Type = t 5683 v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, types.Int64) 5684 v0.AddArg(x) 5685 v.AddArg(v0) 5686 v1 := b.NewValue0(v.Pos, OpS390XORW, y.Type) 5687 v1.AddArg(y) 5688 v2 := b.NewValue0(v.Pos, OpS390XNOTW, y.Type) 5689 v3 := b.NewValue0(v.Pos, OpS390XSUBEWcarrymask, y.Type) 5690 v4 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 5691 v4.AuxInt = 7 5692 v5 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.UInt64) 5693 v5.AddArg(y) 5694 v4.AddArg(v5) 5695 v3.AddArg(v4) 5696 v2.AddArg(v3) 5697 v1.AddArg(v2) 5698 v.AddArg(v1) 5699 return true 5700 } 5701 } 5702 func rewriteValueS390X_OpS390XADD_0(v *Value) bool { 5703 // match: (ADD x (MOVDconst [c])) 5704 // cond: is32Bit(c) 5705 // result: (ADDconst [c] x) 5706 for { 5707 x := v.Args[0] 5708 v_1 := v.Args[1] 5709 if v_1.Op != OpS390XMOVDconst { 5710 break 5711 } 5712 c := v_1.AuxInt 5713 if !(is32Bit(c)) { 5714 break 5715 } 5716 v.reset(OpS390XADDconst) 5717 v.AuxInt = c 5718 v.AddArg(x) 5719 return true 5720 } 5721 // match: (ADD (MOVDconst [c]) x) 5722 // cond: is32Bit(c) 5723 // result: (ADDconst [c] x) 5724 for { 5725 v_0 := v.Args[0] 5726 if v_0.Op != OpS390XMOVDconst { 5727 break 5728 } 5729 c := v_0.AuxInt 5730 x := v.Args[1] 5731 if !(is32Bit(c)) { 5732 break 5733 } 5734 v.reset(OpS390XADDconst) 5735 v.AuxInt = c 5736 v.AddArg(x) 5737 return true 5738 } 5739 // match: (ADD (SLDconst x [c]) (SRDconst x [d])) 5740 // cond: d == 64-c 5741 // result: (RLLGconst [c] x) 5742 for { 5743 v_0 := v.Args[0] 5744 if v_0.Op != OpS390XSLDconst { 5745 break 5746 } 5747 c := v_0.AuxInt 5748 x := v_0.Args[0] 5749 v_1 := v.Args[1] 5750 if v_1.Op != OpS390XSRDconst { 5751 break 5752 } 5753 d := v_1.AuxInt 5754 if x != v_1.Args[0] { 5755 break 5756 } 5757 if !(d == 64-c) { 5758 break 5759 } 5760 v.reset(OpS390XRLLGconst) 5761 v.AuxInt = c 5762 v.AddArg(x) 5763 return true 5764 } 5765 // match: (ADD (SRDconst x [d]) (SLDconst x [c])) 5766 // cond: d == 64-c 5767 // result: (RLLGconst [c] x) 5768 for { 5769 v_0 := v.Args[0] 5770 if v_0.Op != OpS390XSRDconst { 5771 break 5772 } 5773 d := v_0.AuxInt 5774 x := v_0.Args[0] 5775 v_1 := v.Args[1] 5776 if v_1.Op != OpS390XSLDconst { 5777 break 5778 } 5779 c := v_1.AuxInt 5780 if x != v_1.Args[0] { 5781 break 5782 } 5783 if !(d == 64-c) { 5784 break 5785 } 5786 v.reset(OpS390XRLLGconst) 5787 v.AuxInt = c 5788 v.AddArg(x) 5789 return true 5790 } 5791 // match: (ADD idx (MOVDaddr [c] {s} ptr)) 5792 // cond: ptr.Op != OpSB && idx.Op != OpSB 5793 // result: (MOVDaddridx [c] {s} ptr idx) 5794 for { 5795 idx := v.Args[0] 5796 v_1 := v.Args[1] 5797 if v_1.Op != OpS390XMOVDaddr { 5798 break 5799 } 5800 c := v_1.AuxInt 5801 s := v_1.Aux 5802 ptr := v_1.Args[0] 5803 if !(ptr.Op != OpSB && idx.Op != OpSB) { 5804 break 5805 } 5806 v.reset(OpS390XMOVDaddridx) 5807 v.AuxInt = c 5808 v.Aux = s 5809 v.AddArg(ptr) 5810 v.AddArg(idx) 5811 return true 5812 } 5813 // match: (ADD (MOVDaddr [c] {s} ptr) idx) 5814 // cond: ptr.Op != OpSB && idx.Op != OpSB 5815 // result: (MOVDaddridx [c] {s} ptr idx) 5816 for { 5817 v_0 := v.Args[0] 5818 if v_0.Op != OpS390XMOVDaddr { 5819 break 5820 } 5821 c := v_0.AuxInt 5822 s := v_0.Aux 5823 ptr := v_0.Args[0] 5824 idx := v.Args[1] 5825 if !(ptr.Op != OpSB && idx.Op != OpSB) { 5826 break 5827 } 5828 v.reset(OpS390XMOVDaddridx) 5829 v.AuxInt = c 5830 v.Aux = s 5831 v.AddArg(ptr) 5832 v.AddArg(idx) 5833 return true 5834 } 5835 // match: (ADD x (NEG y)) 5836 // cond: 5837 // result: (SUB x y) 5838 for { 5839 x := v.Args[0] 5840 v_1 := v.Args[1] 5841 if v_1.Op != OpS390XNEG { 5842 break 5843 } 5844 y := v_1.Args[0] 5845 v.reset(OpS390XSUB) 5846 v.AddArg(x) 5847 v.AddArg(y) 5848 return true 5849 } 5850 // match: (ADD (NEG y) x) 5851 // cond: 5852 // result: (SUB x y) 5853 for { 5854 v_0 := v.Args[0] 5855 if v_0.Op != OpS390XNEG { 5856 break 5857 } 5858 y := v_0.Args[0] 5859 x := v.Args[1] 5860 v.reset(OpS390XSUB) 5861 v.AddArg(x) 5862 v.AddArg(y) 5863 return true 5864 } 5865 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 5866 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 5867 // result: (ADDload <t> [off] {sym} x ptr mem) 5868 for { 5869 t := v.Type 5870 x := v.Args[0] 5871 g := v.Args[1] 5872 if g.Op != OpS390XMOVDload { 5873 break 5874 } 5875 off := g.AuxInt 5876 sym := g.Aux 5877 ptr := g.Args[0] 5878 mem := g.Args[1] 5879 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 5880 break 5881 } 5882 v.reset(OpS390XADDload) 5883 v.Type = t 5884 v.AuxInt = off 5885 v.Aux = sym 5886 v.AddArg(x) 5887 v.AddArg(ptr) 5888 v.AddArg(mem) 5889 return true 5890 } 5891 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 5892 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 5893 // result: (ADDload <t> [off] {sym} x ptr mem) 5894 for { 5895 t := v.Type 5896 g := v.Args[0] 5897 if g.Op != OpS390XMOVDload { 5898 break 5899 } 5900 off := g.AuxInt 5901 sym := g.Aux 5902 ptr := g.Args[0] 5903 mem := g.Args[1] 5904 x := v.Args[1] 5905 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 5906 break 5907 } 5908 v.reset(OpS390XADDload) 5909 v.Type = t 5910 v.AuxInt = off 5911 v.Aux = sym 5912 v.AddArg(x) 5913 v.AddArg(ptr) 5914 v.AddArg(mem) 5915 return true 5916 } 5917 return false 5918 } 5919 func rewriteValueS390X_OpS390XADD_10(v *Value) bool { 5920 // match: (ADD <t> g:(MOVDload [off] {sym} ptr mem) x) 5921 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 5922 // result: (ADDload <t> [off] {sym} x ptr mem) 5923 for { 5924 t := v.Type 5925 g := v.Args[0] 5926 if g.Op != OpS390XMOVDload { 5927 break 5928 } 5929 off := g.AuxInt 5930 sym := g.Aux 5931 ptr := g.Args[0] 5932 mem := g.Args[1] 5933 x := v.Args[1] 5934 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 5935 break 5936 } 5937 v.reset(OpS390XADDload) 5938 v.Type = t 5939 v.AuxInt = off 5940 v.Aux = sym 5941 v.AddArg(x) 5942 v.AddArg(ptr) 5943 v.AddArg(mem) 5944 return true 5945 } 5946 // match: (ADD <t> x g:(MOVDload [off] {sym} ptr mem)) 5947 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 5948 // result: (ADDload <t> [off] {sym} x ptr mem) 5949 for { 5950 t := v.Type 5951 x := v.Args[0] 5952 g := v.Args[1] 5953 if g.Op != OpS390XMOVDload { 5954 break 5955 } 5956 off := g.AuxInt 5957 sym := g.Aux 5958 ptr := g.Args[0] 5959 mem := g.Args[1] 5960 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 5961 break 5962 } 5963 v.reset(OpS390XADDload) 5964 v.Type = t 5965 v.AuxInt = off 5966 v.Aux = sym 5967 v.AddArg(x) 5968 v.AddArg(ptr) 5969 v.AddArg(mem) 5970 return true 5971 } 5972 return false 5973 } 5974 func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { 5975 // match: (ADDW x (MOVDconst [c])) 5976 // cond: 5977 // result: (ADDWconst [c] x) 5978 for { 5979 x := v.Args[0] 5980 v_1 := v.Args[1] 5981 if v_1.Op != OpS390XMOVDconst { 5982 break 5983 } 5984 c := v_1.AuxInt 5985 v.reset(OpS390XADDWconst) 5986 v.AuxInt = c 5987 v.AddArg(x) 5988 return true 5989 } 5990 // match: (ADDW (MOVDconst [c]) x) 5991 // cond: 5992 // result: (ADDWconst [c] x) 5993 for { 5994 v_0 := v.Args[0] 5995 if v_0.Op != OpS390XMOVDconst { 5996 break 5997 } 5998 c := v_0.AuxInt 5999 x := v.Args[1] 6000 v.reset(OpS390XADDWconst) 6001 v.AuxInt = c 6002 v.AddArg(x) 6003 return true 6004 } 6005 // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) 6006 // cond: d == 32-c 6007 // result: (RLLconst [c] x) 6008 for { 6009 v_0 := v.Args[0] 6010 if v_0.Op != OpS390XSLWconst { 6011 break 6012 } 6013 c := v_0.AuxInt 6014 x := v_0.Args[0] 6015 v_1 := v.Args[1] 6016 if v_1.Op != OpS390XSRWconst { 6017 break 6018 } 6019 d := v_1.AuxInt 6020 if x != v_1.Args[0] { 6021 break 6022 } 6023 if !(d == 32-c) { 6024 break 6025 } 6026 v.reset(OpS390XRLLconst) 6027 v.AuxInt = c 6028 v.AddArg(x) 6029 return true 6030 } 6031 // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) 6032 // cond: d == 32-c 6033 // result: (RLLconst [c] x) 6034 for { 6035 v_0 := v.Args[0] 6036 if v_0.Op != OpS390XSRWconst { 6037 break 6038 } 6039 d := v_0.AuxInt 6040 x := v_0.Args[0] 6041 v_1 := v.Args[1] 6042 if v_1.Op != OpS390XSLWconst { 6043 break 6044 } 6045 c := v_1.AuxInt 6046 if x != v_1.Args[0] { 6047 break 6048 } 6049 if !(d == 32-c) { 6050 break 6051 } 6052 v.reset(OpS390XRLLconst) 6053 v.AuxInt = c 6054 v.AddArg(x) 6055 return true 6056 } 6057 // match: (ADDW x (NEGW y)) 6058 // cond: 6059 // result: (SUBW x y) 6060 for { 6061 x := v.Args[0] 6062 v_1 := v.Args[1] 6063 if v_1.Op != OpS390XNEGW { 6064 break 6065 } 6066 y := v_1.Args[0] 6067 v.reset(OpS390XSUBW) 6068 v.AddArg(x) 6069 v.AddArg(y) 6070 return true 6071 } 6072 // match: (ADDW (NEGW y) x) 6073 // cond: 6074 // result: (SUBW x y) 6075 for { 6076 v_0 := v.Args[0] 6077 if v_0.Op != OpS390XNEGW { 6078 break 6079 } 6080 y := v_0.Args[0] 6081 x := v.Args[1] 6082 v.reset(OpS390XSUBW) 6083 v.AddArg(x) 6084 v.AddArg(y) 6085 return true 6086 } 6087 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6088 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6089 // result: (ADDWload <t> [off] {sym} x ptr mem) 6090 for { 6091 t := v.Type 6092 x := v.Args[0] 6093 g := v.Args[1] 6094 if g.Op != OpS390XMOVWload { 6095 break 6096 } 6097 off := g.AuxInt 6098 sym := g.Aux 6099 ptr := g.Args[0] 6100 mem := g.Args[1] 6101 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6102 break 6103 } 6104 v.reset(OpS390XADDWload) 6105 v.Type = t 6106 v.AuxInt = off 6107 v.Aux = sym 6108 v.AddArg(x) 6109 v.AddArg(ptr) 6110 v.AddArg(mem) 6111 return true 6112 } 6113 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6114 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6115 // result: (ADDWload <t> [off] {sym} x ptr mem) 6116 for { 6117 t := v.Type 6118 g := v.Args[0] 6119 if g.Op != OpS390XMOVWload { 6120 break 6121 } 6122 off := g.AuxInt 6123 sym := g.Aux 6124 ptr := g.Args[0] 6125 mem := g.Args[1] 6126 x := v.Args[1] 6127 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6128 break 6129 } 6130 v.reset(OpS390XADDWload) 6131 v.Type = t 6132 v.AuxInt = off 6133 v.Aux = sym 6134 v.AddArg(x) 6135 v.AddArg(ptr) 6136 v.AddArg(mem) 6137 return true 6138 } 6139 // match: (ADDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6140 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6141 // result: (ADDWload <t> [off] {sym} x ptr mem) 6142 for { 6143 t := v.Type 6144 g := v.Args[0] 6145 if g.Op != OpS390XMOVWload { 6146 break 6147 } 6148 off := g.AuxInt 6149 sym := g.Aux 6150 ptr := g.Args[0] 6151 mem := g.Args[1] 6152 x := v.Args[1] 6153 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6154 break 6155 } 6156 v.reset(OpS390XADDWload) 6157 v.Type = t 6158 v.AuxInt = off 6159 v.Aux = sym 6160 v.AddArg(x) 6161 v.AddArg(ptr) 6162 v.AddArg(mem) 6163 return true 6164 } 6165 // match: (ADDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6166 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6167 // result: (ADDWload <t> [off] {sym} x ptr mem) 6168 for { 6169 t := v.Type 6170 x := v.Args[0] 6171 g := v.Args[1] 6172 if g.Op != OpS390XMOVWload { 6173 break 6174 } 6175 off := g.AuxInt 6176 sym := g.Aux 6177 ptr := g.Args[0] 6178 mem := g.Args[1] 6179 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6180 break 6181 } 6182 v.reset(OpS390XADDWload) 6183 v.Type = t 6184 v.AuxInt = off 6185 v.Aux = sym 6186 v.AddArg(x) 6187 v.AddArg(ptr) 6188 v.AddArg(mem) 6189 return true 6190 } 6191 return false 6192 } 6193 func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { 6194 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6195 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6196 // result: (ADDWload <t> [off] {sym} x ptr mem) 6197 for { 6198 t := v.Type 6199 x := v.Args[0] 6200 g := v.Args[1] 6201 if g.Op != OpS390XMOVWZload { 6202 break 6203 } 6204 off := g.AuxInt 6205 sym := g.Aux 6206 ptr := g.Args[0] 6207 mem := g.Args[1] 6208 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6209 break 6210 } 6211 v.reset(OpS390XADDWload) 6212 v.Type = t 6213 v.AuxInt = off 6214 v.Aux = sym 6215 v.AddArg(x) 6216 v.AddArg(ptr) 6217 v.AddArg(mem) 6218 return true 6219 } 6220 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6221 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6222 // result: (ADDWload <t> [off] {sym} x ptr mem) 6223 for { 6224 t := v.Type 6225 g := v.Args[0] 6226 if g.Op != OpS390XMOVWZload { 6227 break 6228 } 6229 off := g.AuxInt 6230 sym := g.Aux 6231 ptr := g.Args[0] 6232 mem := g.Args[1] 6233 x := v.Args[1] 6234 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6235 break 6236 } 6237 v.reset(OpS390XADDWload) 6238 v.Type = t 6239 v.AuxInt = off 6240 v.Aux = sym 6241 v.AddArg(x) 6242 v.AddArg(ptr) 6243 v.AddArg(mem) 6244 return true 6245 } 6246 // match: (ADDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6247 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6248 // result: (ADDWload <t> [off] {sym} x ptr mem) 6249 for { 6250 t := v.Type 6251 g := v.Args[0] 6252 if g.Op != OpS390XMOVWZload { 6253 break 6254 } 6255 off := g.AuxInt 6256 sym := g.Aux 6257 ptr := g.Args[0] 6258 mem := g.Args[1] 6259 x := v.Args[1] 6260 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6261 break 6262 } 6263 v.reset(OpS390XADDWload) 6264 v.Type = t 6265 v.AuxInt = off 6266 v.Aux = sym 6267 v.AddArg(x) 6268 v.AddArg(ptr) 6269 v.AddArg(mem) 6270 return true 6271 } 6272 // match: (ADDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6273 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6274 // result: (ADDWload <t> [off] {sym} x ptr mem) 6275 for { 6276 t := v.Type 6277 x := v.Args[0] 6278 g := v.Args[1] 6279 if g.Op != OpS390XMOVWZload { 6280 break 6281 } 6282 off := g.AuxInt 6283 sym := g.Aux 6284 ptr := g.Args[0] 6285 mem := g.Args[1] 6286 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6287 break 6288 } 6289 v.reset(OpS390XADDWload) 6290 v.Type = t 6291 v.AuxInt = off 6292 v.Aux = sym 6293 v.AddArg(x) 6294 v.AddArg(ptr) 6295 v.AddArg(mem) 6296 return true 6297 } 6298 return false 6299 } 6300 func rewriteValueS390X_OpS390XADDWconst_0(v *Value) bool { 6301 // match: (ADDWconst [c] x) 6302 // cond: int32(c)==0 6303 // result: x 6304 for { 6305 c := v.AuxInt 6306 x := v.Args[0] 6307 if !(int32(c) == 0) { 6308 break 6309 } 6310 v.reset(OpCopy) 6311 v.Type = x.Type 6312 v.AddArg(x) 6313 return true 6314 } 6315 // match: (ADDWconst [c] (MOVDconst [d])) 6316 // cond: 6317 // result: (MOVDconst [int64(int32(c+d))]) 6318 for { 6319 c := v.AuxInt 6320 v_0 := v.Args[0] 6321 if v_0.Op != OpS390XMOVDconst { 6322 break 6323 } 6324 d := v_0.AuxInt 6325 v.reset(OpS390XMOVDconst) 6326 v.AuxInt = int64(int32(c + d)) 6327 return true 6328 } 6329 // match: (ADDWconst [c] (ADDWconst [d] x)) 6330 // cond: 6331 // result: (ADDWconst [int64(int32(c+d))] x) 6332 for { 6333 c := v.AuxInt 6334 v_0 := v.Args[0] 6335 if v_0.Op != OpS390XADDWconst { 6336 break 6337 } 6338 d := v_0.AuxInt 6339 x := v_0.Args[0] 6340 v.reset(OpS390XADDWconst) 6341 v.AuxInt = int64(int32(c + d)) 6342 v.AddArg(x) 6343 return true 6344 } 6345 return false 6346 } 6347 func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { 6348 // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) 6349 // cond: ((c+d)&1 == 0) && is32Bit(c+d) 6350 // result: (MOVDaddr [c+d] {s} x) 6351 for { 6352 c := v.AuxInt 6353 v_0 := v.Args[0] 6354 if v_0.Op != OpS390XMOVDaddr { 6355 break 6356 } 6357 d := v_0.AuxInt 6358 s := v_0.Aux 6359 x := v_0.Args[0] 6360 if x.Op != OpSB { 6361 break 6362 } 6363 if !(((c+d)&1 == 0) && is32Bit(c+d)) { 6364 break 6365 } 6366 v.reset(OpS390XMOVDaddr) 6367 v.AuxInt = c + d 6368 v.Aux = s 6369 v.AddArg(x) 6370 return true 6371 } 6372 // match: (ADDconst [c] (MOVDaddr [d] {s} x)) 6373 // cond: x.Op != OpSB && is20Bit(c+d) 6374 // result: (MOVDaddr [c+d] {s} x) 6375 for { 6376 c := v.AuxInt 6377 v_0 := v.Args[0] 6378 if v_0.Op != OpS390XMOVDaddr { 6379 break 6380 } 6381 d := v_0.AuxInt 6382 s := v_0.Aux 6383 x := v_0.Args[0] 6384 if !(x.Op != OpSB && is20Bit(c+d)) { 6385 break 6386 } 6387 v.reset(OpS390XMOVDaddr) 6388 v.AuxInt = c + d 6389 v.Aux = s 6390 v.AddArg(x) 6391 return true 6392 } 6393 // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) 6394 // cond: is20Bit(c+d) 6395 // result: (MOVDaddridx [c+d] {s} x y) 6396 for { 6397 c := v.AuxInt 6398 v_0 := v.Args[0] 6399 if v_0.Op != OpS390XMOVDaddridx { 6400 break 6401 } 6402 d := v_0.AuxInt 6403 s := v_0.Aux 6404 x := v_0.Args[0] 6405 y := v_0.Args[1] 6406 if !(is20Bit(c + d)) { 6407 break 6408 } 6409 v.reset(OpS390XMOVDaddridx) 6410 v.AuxInt = c + d 6411 v.Aux = s 6412 v.AddArg(x) 6413 v.AddArg(y) 6414 return true 6415 } 6416 // match: (ADDconst [0] x) 6417 // cond: 6418 // result: x 6419 for { 6420 if v.AuxInt != 0 { 6421 break 6422 } 6423 x := v.Args[0] 6424 v.reset(OpCopy) 6425 v.Type = x.Type 6426 v.AddArg(x) 6427 return true 6428 } 6429 // match: (ADDconst [c] (MOVDconst [d])) 6430 // cond: 6431 // result: (MOVDconst [c+d]) 6432 for { 6433 c := v.AuxInt 6434 v_0 := v.Args[0] 6435 if v_0.Op != OpS390XMOVDconst { 6436 break 6437 } 6438 d := v_0.AuxInt 6439 v.reset(OpS390XMOVDconst) 6440 v.AuxInt = c + d 6441 return true 6442 } 6443 // match: (ADDconst [c] (ADDconst [d] x)) 6444 // cond: is32Bit(c+d) 6445 // result: (ADDconst [c+d] x) 6446 for { 6447 c := v.AuxInt 6448 v_0 := v.Args[0] 6449 if v_0.Op != OpS390XADDconst { 6450 break 6451 } 6452 d := v_0.AuxInt 6453 x := v_0.Args[0] 6454 if !(is32Bit(c + d)) { 6455 break 6456 } 6457 v.reset(OpS390XADDconst) 6458 v.AuxInt = c + d 6459 v.AddArg(x) 6460 return true 6461 } 6462 return false 6463 } 6464 func rewriteValueS390X_OpS390XAND_0(v *Value) bool { 6465 // match: (AND x (MOVDconst [c])) 6466 // cond: is32Bit(c) && c < 0 6467 // result: (ANDconst [c] x) 6468 for { 6469 x := v.Args[0] 6470 v_1 := v.Args[1] 6471 if v_1.Op != OpS390XMOVDconst { 6472 break 6473 } 6474 c := v_1.AuxInt 6475 if !(is32Bit(c) && c < 0) { 6476 break 6477 } 6478 v.reset(OpS390XANDconst) 6479 v.AuxInt = c 6480 v.AddArg(x) 6481 return true 6482 } 6483 // match: (AND (MOVDconst [c]) x) 6484 // cond: is32Bit(c) && c < 0 6485 // result: (ANDconst [c] x) 6486 for { 6487 v_0 := v.Args[0] 6488 if v_0.Op != OpS390XMOVDconst { 6489 break 6490 } 6491 c := v_0.AuxInt 6492 x := v.Args[1] 6493 if !(is32Bit(c) && c < 0) { 6494 break 6495 } 6496 v.reset(OpS390XANDconst) 6497 v.AuxInt = c 6498 v.AddArg(x) 6499 return true 6500 } 6501 // match: (AND x (MOVDconst [0xFF])) 6502 // cond: 6503 // result: (MOVBZreg x) 6504 for { 6505 x := v.Args[0] 6506 v_1 := v.Args[1] 6507 if v_1.Op != OpS390XMOVDconst { 6508 break 6509 } 6510 if v_1.AuxInt != 0xFF { 6511 break 6512 } 6513 v.reset(OpS390XMOVBZreg) 6514 v.AddArg(x) 6515 return true 6516 } 6517 // match: (AND (MOVDconst [0xFF]) x) 6518 // cond: 6519 // result: (MOVBZreg x) 6520 for { 6521 v_0 := v.Args[0] 6522 if v_0.Op != OpS390XMOVDconst { 6523 break 6524 } 6525 if v_0.AuxInt != 0xFF { 6526 break 6527 } 6528 x := v.Args[1] 6529 v.reset(OpS390XMOVBZreg) 6530 v.AddArg(x) 6531 return true 6532 } 6533 // match: (AND x (MOVDconst [0xFFFF])) 6534 // cond: 6535 // result: (MOVHZreg x) 6536 for { 6537 x := v.Args[0] 6538 v_1 := v.Args[1] 6539 if v_1.Op != OpS390XMOVDconst { 6540 break 6541 } 6542 if v_1.AuxInt != 0xFFFF { 6543 break 6544 } 6545 v.reset(OpS390XMOVHZreg) 6546 v.AddArg(x) 6547 return true 6548 } 6549 // match: (AND (MOVDconst [0xFFFF]) x) 6550 // cond: 6551 // result: (MOVHZreg x) 6552 for { 6553 v_0 := v.Args[0] 6554 if v_0.Op != OpS390XMOVDconst { 6555 break 6556 } 6557 if v_0.AuxInt != 0xFFFF { 6558 break 6559 } 6560 x := v.Args[1] 6561 v.reset(OpS390XMOVHZreg) 6562 v.AddArg(x) 6563 return true 6564 } 6565 // match: (AND x (MOVDconst [0xFFFFFFFF])) 6566 // cond: 6567 // result: (MOVWZreg x) 6568 for { 6569 x := v.Args[0] 6570 v_1 := v.Args[1] 6571 if v_1.Op != OpS390XMOVDconst { 6572 break 6573 } 6574 if v_1.AuxInt != 0xFFFFFFFF { 6575 break 6576 } 6577 v.reset(OpS390XMOVWZreg) 6578 v.AddArg(x) 6579 return true 6580 } 6581 // match: (AND (MOVDconst [0xFFFFFFFF]) x) 6582 // cond: 6583 // result: (MOVWZreg x) 6584 for { 6585 v_0 := v.Args[0] 6586 if v_0.Op != OpS390XMOVDconst { 6587 break 6588 } 6589 if v_0.AuxInt != 0xFFFFFFFF { 6590 break 6591 } 6592 x := v.Args[1] 6593 v.reset(OpS390XMOVWZreg) 6594 v.AddArg(x) 6595 return true 6596 } 6597 // match: (AND (MOVDconst [c]) (MOVDconst [d])) 6598 // cond: 6599 // result: (MOVDconst [c&d]) 6600 for { 6601 v_0 := v.Args[0] 6602 if v_0.Op != OpS390XMOVDconst { 6603 break 6604 } 6605 c := v_0.AuxInt 6606 v_1 := v.Args[1] 6607 if v_1.Op != OpS390XMOVDconst { 6608 break 6609 } 6610 d := v_1.AuxInt 6611 v.reset(OpS390XMOVDconst) 6612 v.AuxInt = c & d 6613 return true 6614 } 6615 // match: (AND (MOVDconst [d]) (MOVDconst [c])) 6616 // cond: 6617 // result: (MOVDconst [c&d]) 6618 for { 6619 v_0 := v.Args[0] 6620 if v_0.Op != OpS390XMOVDconst { 6621 break 6622 } 6623 d := v_0.AuxInt 6624 v_1 := v.Args[1] 6625 if v_1.Op != OpS390XMOVDconst { 6626 break 6627 } 6628 c := v_1.AuxInt 6629 v.reset(OpS390XMOVDconst) 6630 v.AuxInt = c & d 6631 return true 6632 } 6633 return false 6634 } 6635 func rewriteValueS390X_OpS390XAND_10(v *Value) bool { 6636 // match: (AND x x) 6637 // cond: 6638 // result: x 6639 for { 6640 x := v.Args[0] 6641 if x != v.Args[1] { 6642 break 6643 } 6644 v.reset(OpCopy) 6645 v.Type = x.Type 6646 v.AddArg(x) 6647 return true 6648 } 6649 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6650 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6651 // result: (ANDload <t> [off] {sym} x ptr mem) 6652 for { 6653 t := v.Type 6654 x := v.Args[0] 6655 g := v.Args[1] 6656 if g.Op != OpS390XMOVDload { 6657 break 6658 } 6659 off := g.AuxInt 6660 sym := g.Aux 6661 ptr := g.Args[0] 6662 mem := g.Args[1] 6663 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6664 break 6665 } 6666 v.reset(OpS390XANDload) 6667 v.Type = t 6668 v.AuxInt = off 6669 v.Aux = sym 6670 v.AddArg(x) 6671 v.AddArg(ptr) 6672 v.AddArg(mem) 6673 return true 6674 } 6675 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6676 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6677 // result: (ANDload <t> [off] {sym} x ptr mem) 6678 for { 6679 t := v.Type 6680 g := v.Args[0] 6681 if g.Op != OpS390XMOVDload { 6682 break 6683 } 6684 off := g.AuxInt 6685 sym := g.Aux 6686 ptr := g.Args[0] 6687 mem := g.Args[1] 6688 x := v.Args[1] 6689 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6690 break 6691 } 6692 v.reset(OpS390XANDload) 6693 v.Type = t 6694 v.AuxInt = off 6695 v.Aux = sym 6696 v.AddArg(x) 6697 v.AddArg(ptr) 6698 v.AddArg(mem) 6699 return true 6700 } 6701 // match: (AND <t> g:(MOVDload [off] {sym} ptr mem) x) 6702 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6703 // result: (ANDload <t> [off] {sym} x ptr mem) 6704 for { 6705 t := v.Type 6706 g := v.Args[0] 6707 if g.Op != OpS390XMOVDload { 6708 break 6709 } 6710 off := g.AuxInt 6711 sym := g.Aux 6712 ptr := g.Args[0] 6713 mem := g.Args[1] 6714 x := v.Args[1] 6715 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6716 break 6717 } 6718 v.reset(OpS390XANDload) 6719 v.Type = t 6720 v.AuxInt = off 6721 v.Aux = sym 6722 v.AddArg(x) 6723 v.AddArg(ptr) 6724 v.AddArg(mem) 6725 return true 6726 } 6727 // match: (AND <t> x g:(MOVDload [off] {sym} ptr mem)) 6728 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6729 // result: (ANDload <t> [off] {sym} x ptr mem) 6730 for { 6731 t := v.Type 6732 x := v.Args[0] 6733 g := v.Args[1] 6734 if g.Op != OpS390XMOVDload { 6735 break 6736 } 6737 off := g.AuxInt 6738 sym := g.Aux 6739 ptr := g.Args[0] 6740 mem := g.Args[1] 6741 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6742 break 6743 } 6744 v.reset(OpS390XANDload) 6745 v.Type = t 6746 v.AuxInt = off 6747 v.Aux = sym 6748 v.AddArg(x) 6749 v.AddArg(ptr) 6750 v.AddArg(mem) 6751 return true 6752 } 6753 return false 6754 } 6755 func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { 6756 // match: (ANDW x (MOVDconst [c])) 6757 // cond: 6758 // result: (ANDWconst [c] x) 6759 for { 6760 x := v.Args[0] 6761 v_1 := v.Args[1] 6762 if v_1.Op != OpS390XMOVDconst { 6763 break 6764 } 6765 c := v_1.AuxInt 6766 v.reset(OpS390XANDWconst) 6767 v.AuxInt = c 6768 v.AddArg(x) 6769 return true 6770 } 6771 // match: (ANDW (MOVDconst [c]) x) 6772 // cond: 6773 // result: (ANDWconst [c] x) 6774 for { 6775 v_0 := v.Args[0] 6776 if v_0.Op != OpS390XMOVDconst { 6777 break 6778 } 6779 c := v_0.AuxInt 6780 x := v.Args[1] 6781 v.reset(OpS390XANDWconst) 6782 v.AuxInt = c 6783 v.AddArg(x) 6784 return true 6785 } 6786 // match: (ANDW x x) 6787 // cond: 6788 // result: x 6789 for { 6790 x := v.Args[0] 6791 if x != v.Args[1] { 6792 break 6793 } 6794 v.reset(OpCopy) 6795 v.Type = x.Type 6796 v.AddArg(x) 6797 return true 6798 } 6799 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6800 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6801 // result: (ANDWload <t> [off] {sym} x ptr mem) 6802 for { 6803 t := v.Type 6804 x := v.Args[0] 6805 g := v.Args[1] 6806 if g.Op != OpS390XMOVWload { 6807 break 6808 } 6809 off := g.AuxInt 6810 sym := g.Aux 6811 ptr := g.Args[0] 6812 mem := g.Args[1] 6813 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6814 break 6815 } 6816 v.reset(OpS390XANDWload) 6817 v.Type = t 6818 v.AuxInt = off 6819 v.Aux = sym 6820 v.AddArg(x) 6821 v.AddArg(ptr) 6822 v.AddArg(mem) 6823 return true 6824 } 6825 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6826 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6827 // result: (ANDWload <t> [off] {sym} x ptr mem) 6828 for { 6829 t := v.Type 6830 g := v.Args[0] 6831 if g.Op != OpS390XMOVWload { 6832 break 6833 } 6834 off := g.AuxInt 6835 sym := g.Aux 6836 ptr := g.Args[0] 6837 mem := g.Args[1] 6838 x := v.Args[1] 6839 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6840 break 6841 } 6842 v.reset(OpS390XANDWload) 6843 v.Type = t 6844 v.AuxInt = off 6845 v.Aux = sym 6846 v.AddArg(x) 6847 v.AddArg(ptr) 6848 v.AddArg(mem) 6849 return true 6850 } 6851 // match: (ANDW <t> g:(MOVWload [off] {sym} ptr mem) x) 6852 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6853 // result: (ANDWload <t> [off] {sym} x ptr mem) 6854 for { 6855 t := v.Type 6856 g := v.Args[0] 6857 if g.Op != OpS390XMOVWload { 6858 break 6859 } 6860 off := g.AuxInt 6861 sym := g.Aux 6862 ptr := g.Args[0] 6863 mem := g.Args[1] 6864 x := v.Args[1] 6865 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6866 break 6867 } 6868 v.reset(OpS390XANDWload) 6869 v.Type = t 6870 v.AuxInt = off 6871 v.Aux = sym 6872 v.AddArg(x) 6873 v.AddArg(ptr) 6874 v.AddArg(mem) 6875 return true 6876 } 6877 // match: (ANDW <t> x g:(MOVWload [off] {sym} ptr mem)) 6878 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6879 // result: (ANDWload <t> [off] {sym} x ptr mem) 6880 for { 6881 t := v.Type 6882 x := v.Args[0] 6883 g := v.Args[1] 6884 if g.Op != OpS390XMOVWload { 6885 break 6886 } 6887 off := g.AuxInt 6888 sym := g.Aux 6889 ptr := g.Args[0] 6890 mem := g.Args[1] 6891 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6892 break 6893 } 6894 v.reset(OpS390XANDWload) 6895 v.Type = t 6896 v.AuxInt = off 6897 v.Aux = sym 6898 v.AddArg(x) 6899 v.AddArg(ptr) 6900 v.AddArg(mem) 6901 return true 6902 } 6903 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6904 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6905 // result: (ANDWload <t> [off] {sym} x ptr mem) 6906 for { 6907 t := v.Type 6908 x := v.Args[0] 6909 g := v.Args[1] 6910 if g.Op != OpS390XMOVWZload { 6911 break 6912 } 6913 off := g.AuxInt 6914 sym := g.Aux 6915 ptr := g.Args[0] 6916 mem := g.Args[1] 6917 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6918 break 6919 } 6920 v.reset(OpS390XANDWload) 6921 v.Type = t 6922 v.AuxInt = off 6923 v.Aux = sym 6924 v.AddArg(x) 6925 v.AddArg(ptr) 6926 v.AddArg(mem) 6927 return true 6928 } 6929 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6930 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6931 // result: (ANDWload <t> [off] {sym} x ptr mem) 6932 for { 6933 t := v.Type 6934 g := v.Args[0] 6935 if g.Op != OpS390XMOVWZload { 6936 break 6937 } 6938 off := g.AuxInt 6939 sym := g.Aux 6940 ptr := g.Args[0] 6941 mem := g.Args[1] 6942 x := v.Args[1] 6943 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6944 break 6945 } 6946 v.reset(OpS390XANDWload) 6947 v.Type = t 6948 v.AuxInt = off 6949 v.Aux = sym 6950 v.AddArg(x) 6951 v.AddArg(ptr) 6952 v.AddArg(mem) 6953 return true 6954 } 6955 // match: (ANDW <t> g:(MOVWZload [off] {sym} ptr mem) x) 6956 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6957 // result: (ANDWload <t> [off] {sym} x ptr mem) 6958 for { 6959 t := v.Type 6960 g := v.Args[0] 6961 if g.Op != OpS390XMOVWZload { 6962 break 6963 } 6964 off := g.AuxInt 6965 sym := g.Aux 6966 ptr := g.Args[0] 6967 mem := g.Args[1] 6968 x := v.Args[1] 6969 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6970 break 6971 } 6972 v.reset(OpS390XANDWload) 6973 v.Type = t 6974 v.AuxInt = off 6975 v.Aux = sym 6976 v.AddArg(x) 6977 v.AddArg(ptr) 6978 v.AddArg(mem) 6979 return true 6980 } 6981 return false 6982 } 6983 func rewriteValueS390X_OpS390XANDW_10(v *Value) bool { 6984 // match: (ANDW <t> x g:(MOVWZload [off] {sym} ptr mem)) 6985 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 6986 // result: (ANDWload <t> [off] {sym} x ptr mem) 6987 for { 6988 t := v.Type 6989 x := v.Args[0] 6990 g := v.Args[1] 6991 if g.Op != OpS390XMOVWZload { 6992 break 6993 } 6994 off := g.AuxInt 6995 sym := g.Aux 6996 ptr := g.Args[0] 6997 mem := g.Args[1] 6998 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 6999 break 7000 } 7001 v.reset(OpS390XANDWload) 7002 v.Type = t 7003 v.AuxInt = off 7004 v.Aux = sym 7005 v.AddArg(x) 7006 v.AddArg(ptr) 7007 v.AddArg(mem) 7008 return true 7009 } 7010 return false 7011 } 7012 func rewriteValueS390X_OpS390XANDWconst_0(v *Value) bool { 7013 // match: (ANDWconst [c] (ANDWconst [d] x)) 7014 // cond: 7015 // result: (ANDWconst [c & d] x) 7016 for { 7017 c := v.AuxInt 7018 v_0 := v.Args[0] 7019 if v_0.Op != OpS390XANDWconst { 7020 break 7021 } 7022 d := v_0.AuxInt 7023 x := v_0.Args[0] 7024 v.reset(OpS390XANDWconst) 7025 v.AuxInt = c & d 7026 v.AddArg(x) 7027 return true 7028 } 7029 // match: (ANDWconst [0xFF] x) 7030 // cond: 7031 // result: (MOVBZreg x) 7032 for { 7033 if v.AuxInt != 0xFF { 7034 break 7035 } 7036 x := v.Args[0] 7037 v.reset(OpS390XMOVBZreg) 7038 v.AddArg(x) 7039 return true 7040 } 7041 // match: (ANDWconst [0xFFFF] x) 7042 // cond: 7043 // result: (MOVHZreg x) 7044 for { 7045 if v.AuxInt != 0xFFFF { 7046 break 7047 } 7048 x := v.Args[0] 7049 v.reset(OpS390XMOVHZreg) 7050 v.AddArg(x) 7051 return true 7052 } 7053 // match: (ANDWconst [c] _) 7054 // cond: int32(c)==0 7055 // result: (MOVDconst [0]) 7056 for { 7057 c := v.AuxInt 7058 if !(int32(c) == 0) { 7059 break 7060 } 7061 v.reset(OpS390XMOVDconst) 7062 v.AuxInt = 0 7063 return true 7064 } 7065 // match: (ANDWconst [c] x) 7066 // cond: int32(c)==-1 7067 // result: x 7068 for { 7069 c := v.AuxInt 7070 x := v.Args[0] 7071 if !(int32(c) == -1) { 7072 break 7073 } 7074 v.reset(OpCopy) 7075 v.Type = x.Type 7076 v.AddArg(x) 7077 return true 7078 } 7079 // match: (ANDWconst [c] (MOVDconst [d])) 7080 // cond: 7081 // result: (MOVDconst [c&d]) 7082 for { 7083 c := v.AuxInt 7084 v_0 := v.Args[0] 7085 if v_0.Op != OpS390XMOVDconst { 7086 break 7087 } 7088 d := v_0.AuxInt 7089 v.reset(OpS390XMOVDconst) 7090 v.AuxInt = c & d 7091 return true 7092 } 7093 return false 7094 } 7095 func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool { 7096 // match: (ANDconst [c] (ANDconst [d] x)) 7097 // cond: 7098 // result: (ANDconst [c & d] x) 7099 for { 7100 c := v.AuxInt 7101 v_0 := v.Args[0] 7102 if v_0.Op != OpS390XANDconst { 7103 break 7104 } 7105 d := v_0.AuxInt 7106 x := v_0.Args[0] 7107 v.reset(OpS390XANDconst) 7108 v.AuxInt = c & d 7109 v.AddArg(x) 7110 return true 7111 } 7112 // match: (ANDconst [0] _) 7113 // cond: 7114 // result: (MOVDconst [0]) 7115 for { 7116 if v.AuxInt != 0 { 7117 break 7118 } 7119 v.reset(OpS390XMOVDconst) 7120 v.AuxInt = 0 7121 return true 7122 } 7123 // match: (ANDconst [-1] x) 7124 // cond: 7125 // result: x 7126 for { 7127 if v.AuxInt != -1 { 7128 break 7129 } 7130 x := v.Args[0] 7131 v.reset(OpCopy) 7132 v.Type = x.Type 7133 v.AddArg(x) 7134 return true 7135 } 7136 // match: (ANDconst [c] (MOVDconst [d])) 7137 // cond: 7138 // result: (MOVDconst [c&d]) 7139 for { 7140 c := v.AuxInt 7141 v_0 := v.Args[0] 7142 if v_0.Op != OpS390XMOVDconst { 7143 break 7144 } 7145 d := v_0.AuxInt 7146 v.reset(OpS390XMOVDconst) 7147 v.AuxInt = c & d 7148 return true 7149 } 7150 return false 7151 } 7152 func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { 7153 b := v.Block 7154 _ = b 7155 // match: (CMP x (MOVDconst [c])) 7156 // cond: is32Bit(c) 7157 // result: (CMPconst x [c]) 7158 for { 7159 x := v.Args[0] 7160 v_1 := v.Args[1] 7161 if v_1.Op != OpS390XMOVDconst { 7162 break 7163 } 7164 c := v_1.AuxInt 7165 if !(is32Bit(c)) { 7166 break 7167 } 7168 v.reset(OpS390XCMPconst) 7169 v.AuxInt = c 7170 v.AddArg(x) 7171 return true 7172 } 7173 // match: (CMP (MOVDconst [c]) x) 7174 // cond: is32Bit(c) 7175 // result: (InvertFlags (CMPconst x [c])) 7176 for { 7177 v_0 := v.Args[0] 7178 if v_0.Op != OpS390XMOVDconst { 7179 break 7180 } 7181 c := v_0.AuxInt 7182 x := v.Args[1] 7183 if !(is32Bit(c)) { 7184 break 7185 } 7186 v.reset(OpS390XInvertFlags) 7187 v0 := b.NewValue0(v.Pos, OpS390XCMPconst, TypeFlags) 7188 v0.AuxInt = c 7189 v0.AddArg(x) 7190 v.AddArg(v0) 7191 return true 7192 } 7193 return false 7194 } 7195 func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { 7196 b := v.Block 7197 _ = b 7198 // match: (CMPU x (MOVDconst [c])) 7199 // cond: isU32Bit(c) 7200 // result: (CMPUconst x [int64(uint32(c))]) 7201 for { 7202 x := v.Args[0] 7203 v_1 := v.Args[1] 7204 if v_1.Op != OpS390XMOVDconst { 7205 break 7206 } 7207 c := v_1.AuxInt 7208 if !(isU32Bit(c)) { 7209 break 7210 } 7211 v.reset(OpS390XCMPUconst) 7212 v.AuxInt = int64(uint32(c)) 7213 v.AddArg(x) 7214 return true 7215 } 7216 // match: (CMPU (MOVDconst [c]) x) 7217 // cond: isU32Bit(c) 7218 // result: (InvertFlags (CMPUconst x [int64(uint32(c))])) 7219 for { 7220 v_0 := v.Args[0] 7221 if v_0.Op != OpS390XMOVDconst { 7222 break 7223 } 7224 c := v_0.AuxInt 7225 x := v.Args[1] 7226 if !(isU32Bit(c)) { 7227 break 7228 } 7229 v.reset(OpS390XInvertFlags) 7230 v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, TypeFlags) 7231 v0.AuxInt = int64(uint32(c)) 7232 v0.AddArg(x) 7233 v.AddArg(v0) 7234 return true 7235 } 7236 return false 7237 } 7238 func rewriteValueS390X_OpS390XCMPUconst_0(v *Value) bool { 7239 // match: (CMPUconst (MOVDconst [x]) [y]) 7240 // cond: uint64(x)==uint64(y) 7241 // result: (FlagEQ) 7242 for { 7243 y := v.AuxInt 7244 v_0 := v.Args[0] 7245 if v_0.Op != OpS390XMOVDconst { 7246 break 7247 } 7248 x := v_0.AuxInt 7249 if !(uint64(x) == uint64(y)) { 7250 break 7251 } 7252 v.reset(OpS390XFlagEQ) 7253 return true 7254 } 7255 // match: (CMPUconst (MOVDconst [x]) [y]) 7256 // cond: uint64(x)<uint64(y) 7257 // result: (FlagLT) 7258 for { 7259 y := v.AuxInt 7260 v_0 := v.Args[0] 7261 if v_0.Op != OpS390XMOVDconst { 7262 break 7263 } 7264 x := v_0.AuxInt 7265 if !(uint64(x) < uint64(y)) { 7266 break 7267 } 7268 v.reset(OpS390XFlagLT) 7269 return true 7270 } 7271 // match: (CMPUconst (MOVDconst [x]) [y]) 7272 // cond: uint64(x)>uint64(y) 7273 // result: (FlagGT) 7274 for { 7275 y := v.AuxInt 7276 v_0 := v.Args[0] 7277 if v_0.Op != OpS390XMOVDconst { 7278 break 7279 } 7280 x := v_0.AuxInt 7281 if !(uint64(x) > uint64(y)) { 7282 break 7283 } 7284 v.reset(OpS390XFlagGT) 7285 return true 7286 } 7287 return false 7288 } 7289 func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { 7290 b := v.Block 7291 _ = b 7292 // match: (CMPW x (MOVDconst [c])) 7293 // cond: 7294 // result: (CMPWconst x [c]) 7295 for { 7296 x := v.Args[0] 7297 v_1 := v.Args[1] 7298 if v_1.Op != OpS390XMOVDconst { 7299 break 7300 } 7301 c := v_1.AuxInt 7302 v.reset(OpS390XCMPWconst) 7303 v.AuxInt = c 7304 v.AddArg(x) 7305 return true 7306 } 7307 // match: (CMPW (MOVDconst [c]) x) 7308 // cond: 7309 // result: (InvertFlags (CMPWconst x [c])) 7310 for { 7311 v_0 := v.Args[0] 7312 if v_0.Op != OpS390XMOVDconst { 7313 break 7314 } 7315 c := v_0.AuxInt 7316 x := v.Args[1] 7317 v.reset(OpS390XInvertFlags) 7318 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, TypeFlags) 7319 v0.AuxInt = c 7320 v0.AddArg(x) 7321 v.AddArg(v0) 7322 return true 7323 } 7324 return false 7325 } 7326 func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { 7327 b := v.Block 7328 _ = b 7329 // match: (CMPWU x (MOVDconst [c])) 7330 // cond: 7331 // result: (CMPWUconst x [int64(uint32(c))]) 7332 for { 7333 x := v.Args[0] 7334 v_1 := v.Args[1] 7335 if v_1.Op != OpS390XMOVDconst { 7336 break 7337 } 7338 c := v_1.AuxInt 7339 v.reset(OpS390XCMPWUconst) 7340 v.AuxInt = int64(uint32(c)) 7341 v.AddArg(x) 7342 return true 7343 } 7344 // match: (CMPWU (MOVDconst [c]) x) 7345 // cond: 7346 // result: (InvertFlags (CMPWUconst x [int64(uint32(c))])) 7347 for { 7348 v_0 := v.Args[0] 7349 if v_0.Op != OpS390XMOVDconst { 7350 break 7351 } 7352 c := v_0.AuxInt 7353 x := v.Args[1] 7354 v.reset(OpS390XInvertFlags) 7355 v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, TypeFlags) 7356 v0.AuxInt = int64(uint32(c)) 7357 v0.AddArg(x) 7358 v.AddArg(v0) 7359 return true 7360 } 7361 return false 7362 } 7363 func rewriteValueS390X_OpS390XCMPWUconst_0(v *Value) bool { 7364 // match: (CMPWUconst (MOVDconst [x]) [y]) 7365 // cond: uint32(x)==uint32(y) 7366 // result: (FlagEQ) 7367 for { 7368 y := v.AuxInt 7369 v_0 := v.Args[0] 7370 if v_0.Op != OpS390XMOVDconst { 7371 break 7372 } 7373 x := v_0.AuxInt 7374 if !(uint32(x) == uint32(y)) { 7375 break 7376 } 7377 v.reset(OpS390XFlagEQ) 7378 return true 7379 } 7380 // match: (CMPWUconst (MOVDconst [x]) [y]) 7381 // cond: uint32(x)<uint32(y) 7382 // result: (FlagLT) 7383 for { 7384 y := v.AuxInt 7385 v_0 := v.Args[0] 7386 if v_0.Op != OpS390XMOVDconst { 7387 break 7388 } 7389 x := v_0.AuxInt 7390 if !(uint32(x) < uint32(y)) { 7391 break 7392 } 7393 v.reset(OpS390XFlagLT) 7394 return true 7395 } 7396 // match: (CMPWUconst (MOVDconst [x]) [y]) 7397 // cond: uint32(x)>uint32(y) 7398 // result: (FlagGT) 7399 for { 7400 y := v.AuxInt 7401 v_0 := v.Args[0] 7402 if v_0.Op != OpS390XMOVDconst { 7403 break 7404 } 7405 x := v_0.AuxInt 7406 if !(uint32(x) > uint32(y)) { 7407 break 7408 } 7409 v.reset(OpS390XFlagGT) 7410 return true 7411 } 7412 return false 7413 } 7414 func rewriteValueS390X_OpS390XCMPWconst_0(v *Value) bool { 7415 // match: (CMPWconst (MOVDconst [x]) [y]) 7416 // cond: int32(x)==int32(y) 7417 // result: (FlagEQ) 7418 for { 7419 y := v.AuxInt 7420 v_0 := v.Args[0] 7421 if v_0.Op != OpS390XMOVDconst { 7422 break 7423 } 7424 x := v_0.AuxInt 7425 if !(int32(x) == int32(y)) { 7426 break 7427 } 7428 v.reset(OpS390XFlagEQ) 7429 return true 7430 } 7431 // match: (CMPWconst (MOVDconst [x]) [y]) 7432 // cond: int32(x)<int32(y) 7433 // result: (FlagLT) 7434 for { 7435 y := v.AuxInt 7436 v_0 := v.Args[0] 7437 if v_0.Op != OpS390XMOVDconst { 7438 break 7439 } 7440 x := v_0.AuxInt 7441 if !(int32(x) < int32(y)) { 7442 break 7443 } 7444 v.reset(OpS390XFlagLT) 7445 return true 7446 } 7447 // match: (CMPWconst (MOVDconst [x]) [y]) 7448 // cond: int32(x)>int32(y) 7449 // result: (FlagGT) 7450 for { 7451 y := v.AuxInt 7452 v_0 := v.Args[0] 7453 if v_0.Op != OpS390XMOVDconst { 7454 break 7455 } 7456 x := v_0.AuxInt 7457 if !(int32(x) > int32(y)) { 7458 break 7459 } 7460 v.reset(OpS390XFlagGT) 7461 return true 7462 } 7463 // match: (CMPWconst (SRWconst _ [c]) [n]) 7464 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n) 7465 // result: (FlagLT) 7466 for { 7467 n := v.AuxInt 7468 v_0 := v.Args[0] 7469 if v_0.Op != OpS390XSRWconst { 7470 break 7471 } 7472 c := v_0.AuxInt 7473 if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) { 7474 break 7475 } 7476 v.reset(OpS390XFlagLT) 7477 return true 7478 } 7479 // match: (CMPWconst (ANDWconst _ [m]) [n]) 7480 // cond: 0 <= int32(m) && int32(m) < int32(n) 7481 // result: (FlagLT) 7482 for { 7483 n := v.AuxInt 7484 v_0 := v.Args[0] 7485 if v_0.Op != OpS390XANDWconst { 7486 break 7487 } 7488 m := v_0.AuxInt 7489 if !(0 <= int32(m) && int32(m) < int32(n)) { 7490 break 7491 } 7492 v.reset(OpS390XFlagLT) 7493 return true 7494 } 7495 return false 7496 } 7497 func rewriteValueS390X_OpS390XCMPconst_0(v *Value) bool { 7498 // match: (CMPconst (MOVDconst [x]) [y]) 7499 // cond: x==y 7500 // result: (FlagEQ) 7501 for { 7502 y := v.AuxInt 7503 v_0 := v.Args[0] 7504 if v_0.Op != OpS390XMOVDconst { 7505 break 7506 } 7507 x := v_0.AuxInt 7508 if !(x == y) { 7509 break 7510 } 7511 v.reset(OpS390XFlagEQ) 7512 return true 7513 } 7514 // match: (CMPconst (MOVDconst [x]) [y]) 7515 // cond: x<y 7516 // result: (FlagLT) 7517 for { 7518 y := v.AuxInt 7519 v_0 := v.Args[0] 7520 if v_0.Op != OpS390XMOVDconst { 7521 break 7522 } 7523 x := v_0.AuxInt 7524 if !(x < y) { 7525 break 7526 } 7527 v.reset(OpS390XFlagLT) 7528 return true 7529 } 7530 // match: (CMPconst (MOVDconst [x]) [y]) 7531 // cond: x>y 7532 // result: (FlagGT) 7533 for { 7534 y := v.AuxInt 7535 v_0 := v.Args[0] 7536 if v_0.Op != OpS390XMOVDconst { 7537 break 7538 } 7539 x := v_0.AuxInt 7540 if !(x > y) { 7541 break 7542 } 7543 v.reset(OpS390XFlagGT) 7544 return true 7545 } 7546 // match: (CMPconst (MOVBZreg _) [c]) 7547 // cond: 0xFF < c 7548 // result: (FlagLT) 7549 for { 7550 c := v.AuxInt 7551 v_0 := v.Args[0] 7552 if v_0.Op != OpS390XMOVBZreg { 7553 break 7554 } 7555 if !(0xFF < c) { 7556 break 7557 } 7558 v.reset(OpS390XFlagLT) 7559 return true 7560 } 7561 // match: (CMPconst (MOVHZreg _) [c]) 7562 // cond: 0xFFFF < c 7563 // result: (FlagLT) 7564 for { 7565 c := v.AuxInt 7566 v_0 := v.Args[0] 7567 if v_0.Op != OpS390XMOVHZreg { 7568 break 7569 } 7570 if !(0xFFFF < c) { 7571 break 7572 } 7573 v.reset(OpS390XFlagLT) 7574 return true 7575 } 7576 // match: (CMPconst (MOVWZreg _) [c]) 7577 // cond: 0xFFFFFFFF < c 7578 // result: (FlagLT) 7579 for { 7580 c := v.AuxInt 7581 v_0 := v.Args[0] 7582 if v_0.Op != OpS390XMOVWZreg { 7583 break 7584 } 7585 if !(0xFFFFFFFF < c) { 7586 break 7587 } 7588 v.reset(OpS390XFlagLT) 7589 return true 7590 } 7591 // match: (CMPconst (SRDconst _ [c]) [n]) 7592 // cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n) 7593 // result: (FlagLT) 7594 for { 7595 n := v.AuxInt 7596 v_0 := v.Args[0] 7597 if v_0.Op != OpS390XSRDconst { 7598 break 7599 } 7600 c := v_0.AuxInt 7601 if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) { 7602 break 7603 } 7604 v.reset(OpS390XFlagLT) 7605 return true 7606 } 7607 // match: (CMPconst (ANDconst _ [m]) [n]) 7608 // cond: 0 <= m && m < n 7609 // result: (FlagLT) 7610 for { 7611 n := v.AuxInt 7612 v_0 := v.Args[0] 7613 if v_0.Op != OpS390XANDconst { 7614 break 7615 } 7616 m := v_0.AuxInt 7617 if !(0 <= m && m < n) { 7618 break 7619 } 7620 v.reset(OpS390XFlagLT) 7621 return true 7622 } 7623 return false 7624 } 7625 func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { 7626 // match: (FADD (FMUL y z) x) 7627 // cond: 7628 // result: (FMADD x y z) 7629 for { 7630 v_0 := v.Args[0] 7631 if v_0.Op != OpS390XFMUL { 7632 break 7633 } 7634 y := v_0.Args[0] 7635 z := v_0.Args[1] 7636 x := v.Args[1] 7637 v.reset(OpS390XFMADD) 7638 v.AddArg(x) 7639 v.AddArg(y) 7640 v.AddArg(z) 7641 return true 7642 } 7643 // match: (FADD x (FMUL y z)) 7644 // cond: 7645 // result: (FMADD x y z) 7646 for { 7647 x := v.Args[0] 7648 v_1 := v.Args[1] 7649 if v_1.Op != OpS390XFMUL { 7650 break 7651 } 7652 y := v_1.Args[0] 7653 z := v_1.Args[1] 7654 v.reset(OpS390XFMADD) 7655 v.AddArg(x) 7656 v.AddArg(y) 7657 v.AddArg(z) 7658 return true 7659 } 7660 return false 7661 } 7662 func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { 7663 // match: (FADDS (FMULS y z) x) 7664 // cond: 7665 // result: (FMADDS x y z) 7666 for { 7667 v_0 := v.Args[0] 7668 if v_0.Op != OpS390XFMULS { 7669 break 7670 } 7671 y := v_0.Args[0] 7672 z := v_0.Args[1] 7673 x := v.Args[1] 7674 v.reset(OpS390XFMADDS) 7675 v.AddArg(x) 7676 v.AddArg(y) 7677 v.AddArg(z) 7678 return true 7679 } 7680 // match: (FADDS x (FMULS y z)) 7681 // cond: 7682 // result: (FMADDS x y z) 7683 for { 7684 x := v.Args[0] 7685 v_1 := v.Args[1] 7686 if v_1.Op != OpS390XFMULS { 7687 break 7688 } 7689 y := v_1.Args[0] 7690 z := v_1.Args[1] 7691 v.reset(OpS390XFMADDS) 7692 v.AddArg(x) 7693 v.AddArg(y) 7694 v.AddArg(z) 7695 return true 7696 } 7697 return false 7698 } 7699 func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { 7700 // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 7701 // cond: is20Bit(off1+off2) 7702 // result: (FMOVDload [off1+off2] {sym} ptr mem) 7703 for { 7704 off1 := v.AuxInt 7705 sym := v.Aux 7706 v_0 := v.Args[0] 7707 if v_0.Op != OpS390XADDconst { 7708 break 7709 } 7710 off2 := v_0.AuxInt 7711 ptr := v_0.Args[0] 7712 mem := v.Args[1] 7713 if !(is20Bit(off1 + off2)) { 7714 break 7715 } 7716 v.reset(OpS390XFMOVDload) 7717 v.AuxInt = off1 + off2 7718 v.Aux = sym 7719 v.AddArg(ptr) 7720 v.AddArg(mem) 7721 return true 7722 } 7723 // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 7724 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7725 // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 7726 for { 7727 off1 := v.AuxInt 7728 sym1 := v.Aux 7729 v_0 := v.Args[0] 7730 if v_0.Op != OpS390XMOVDaddr { 7731 break 7732 } 7733 off2 := v_0.AuxInt 7734 sym2 := v_0.Aux 7735 base := v_0.Args[0] 7736 mem := v.Args[1] 7737 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7738 break 7739 } 7740 v.reset(OpS390XFMOVDload) 7741 v.AuxInt = off1 + off2 7742 v.Aux = mergeSym(sym1, sym2) 7743 v.AddArg(base) 7744 v.AddArg(mem) 7745 return true 7746 } 7747 // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 7748 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7749 // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 7750 for { 7751 off1 := v.AuxInt 7752 sym1 := v.Aux 7753 v_0 := v.Args[0] 7754 if v_0.Op != OpS390XMOVDaddridx { 7755 break 7756 } 7757 off2 := v_0.AuxInt 7758 sym2 := v_0.Aux 7759 ptr := v_0.Args[0] 7760 idx := v_0.Args[1] 7761 mem := v.Args[1] 7762 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7763 break 7764 } 7765 v.reset(OpS390XFMOVDloadidx) 7766 v.AuxInt = off1 + off2 7767 v.Aux = mergeSym(sym1, sym2) 7768 v.AddArg(ptr) 7769 v.AddArg(idx) 7770 v.AddArg(mem) 7771 return true 7772 } 7773 // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) 7774 // cond: ptr.Op != OpSB 7775 // result: (FMOVDloadidx [off] {sym} ptr idx mem) 7776 for { 7777 off := v.AuxInt 7778 sym := v.Aux 7779 v_0 := v.Args[0] 7780 if v_0.Op != OpS390XADD { 7781 break 7782 } 7783 ptr := v_0.Args[0] 7784 idx := v_0.Args[1] 7785 mem := v.Args[1] 7786 if !(ptr.Op != OpSB) { 7787 break 7788 } 7789 v.reset(OpS390XFMOVDloadidx) 7790 v.AuxInt = off 7791 v.Aux = sym 7792 v.AddArg(ptr) 7793 v.AddArg(idx) 7794 v.AddArg(mem) 7795 return true 7796 } 7797 return false 7798 } 7799 func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { 7800 // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 7801 // cond: 7802 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 7803 for { 7804 c := v.AuxInt 7805 sym := v.Aux 7806 v_0 := v.Args[0] 7807 if v_0.Op != OpS390XADDconst { 7808 break 7809 } 7810 d := v_0.AuxInt 7811 ptr := v_0.Args[0] 7812 idx := v.Args[1] 7813 mem := v.Args[2] 7814 v.reset(OpS390XFMOVDloadidx) 7815 v.AuxInt = c + d 7816 v.Aux = sym 7817 v.AddArg(ptr) 7818 v.AddArg(idx) 7819 v.AddArg(mem) 7820 return true 7821 } 7822 // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 7823 // cond: 7824 // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) 7825 for { 7826 c := v.AuxInt 7827 sym := v.Aux 7828 ptr := v.Args[0] 7829 v_1 := v.Args[1] 7830 if v_1.Op != OpS390XADDconst { 7831 break 7832 } 7833 d := v_1.AuxInt 7834 idx := v_1.Args[0] 7835 mem := v.Args[2] 7836 v.reset(OpS390XFMOVDloadidx) 7837 v.AuxInt = c + d 7838 v.Aux = sym 7839 v.AddArg(ptr) 7840 v.AddArg(idx) 7841 v.AddArg(mem) 7842 return true 7843 } 7844 return false 7845 } 7846 func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { 7847 // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7848 // cond: is20Bit(off1+off2) 7849 // result: (FMOVDstore [off1+off2] {sym} ptr val mem) 7850 for { 7851 off1 := v.AuxInt 7852 sym := v.Aux 7853 v_0 := v.Args[0] 7854 if v_0.Op != OpS390XADDconst { 7855 break 7856 } 7857 off2 := v_0.AuxInt 7858 ptr := v_0.Args[0] 7859 val := v.Args[1] 7860 mem := v.Args[2] 7861 if !(is20Bit(off1 + off2)) { 7862 break 7863 } 7864 v.reset(OpS390XFMOVDstore) 7865 v.AuxInt = off1 + off2 7866 v.Aux = sym 7867 v.AddArg(ptr) 7868 v.AddArg(val) 7869 v.AddArg(mem) 7870 return true 7871 } 7872 // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 7873 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7874 // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 7875 for { 7876 off1 := v.AuxInt 7877 sym1 := v.Aux 7878 v_0 := v.Args[0] 7879 if v_0.Op != OpS390XMOVDaddr { 7880 break 7881 } 7882 off2 := v_0.AuxInt 7883 sym2 := v_0.Aux 7884 base := v_0.Args[0] 7885 val := v.Args[1] 7886 mem := v.Args[2] 7887 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7888 break 7889 } 7890 v.reset(OpS390XFMOVDstore) 7891 v.AuxInt = off1 + off2 7892 v.Aux = mergeSym(sym1, sym2) 7893 v.AddArg(base) 7894 v.AddArg(val) 7895 v.AddArg(mem) 7896 return true 7897 } 7898 // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 7899 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 7900 // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 7901 for { 7902 off1 := v.AuxInt 7903 sym1 := v.Aux 7904 v_0 := v.Args[0] 7905 if v_0.Op != OpS390XMOVDaddridx { 7906 break 7907 } 7908 off2 := v_0.AuxInt 7909 sym2 := v_0.Aux 7910 ptr := v_0.Args[0] 7911 idx := v_0.Args[1] 7912 val := v.Args[1] 7913 mem := v.Args[2] 7914 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 7915 break 7916 } 7917 v.reset(OpS390XFMOVDstoreidx) 7918 v.AuxInt = off1 + off2 7919 v.Aux = mergeSym(sym1, sym2) 7920 v.AddArg(ptr) 7921 v.AddArg(idx) 7922 v.AddArg(val) 7923 v.AddArg(mem) 7924 return true 7925 } 7926 // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) 7927 // cond: ptr.Op != OpSB 7928 // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) 7929 for { 7930 off := v.AuxInt 7931 sym := v.Aux 7932 v_0 := v.Args[0] 7933 if v_0.Op != OpS390XADD { 7934 break 7935 } 7936 ptr := v_0.Args[0] 7937 idx := v_0.Args[1] 7938 val := v.Args[1] 7939 mem := v.Args[2] 7940 if !(ptr.Op != OpSB) { 7941 break 7942 } 7943 v.reset(OpS390XFMOVDstoreidx) 7944 v.AuxInt = off 7945 v.Aux = sym 7946 v.AddArg(ptr) 7947 v.AddArg(idx) 7948 v.AddArg(val) 7949 v.AddArg(mem) 7950 return true 7951 } 7952 return false 7953 } 7954 func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { 7955 // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 7956 // cond: 7957 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 7958 for { 7959 c := v.AuxInt 7960 sym := v.Aux 7961 v_0 := v.Args[0] 7962 if v_0.Op != OpS390XADDconst { 7963 break 7964 } 7965 d := v_0.AuxInt 7966 ptr := v_0.Args[0] 7967 idx := v.Args[1] 7968 val := v.Args[2] 7969 mem := v.Args[3] 7970 v.reset(OpS390XFMOVDstoreidx) 7971 v.AuxInt = c + d 7972 v.Aux = sym 7973 v.AddArg(ptr) 7974 v.AddArg(idx) 7975 v.AddArg(val) 7976 v.AddArg(mem) 7977 return true 7978 } 7979 // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 7980 // cond: 7981 // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) 7982 for { 7983 c := v.AuxInt 7984 sym := v.Aux 7985 ptr := v.Args[0] 7986 v_1 := v.Args[1] 7987 if v_1.Op != OpS390XADDconst { 7988 break 7989 } 7990 d := v_1.AuxInt 7991 idx := v_1.Args[0] 7992 val := v.Args[2] 7993 mem := v.Args[3] 7994 v.reset(OpS390XFMOVDstoreidx) 7995 v.AuxInt = c + d 7996 v.Aux = sym 7997 v.AddArg(ptr) 7998 v.AddArg(idx) 7999 v.AddArg(val) 8000 v.AddArg(mem) 8001 return true 8002 } 8003 return false 8004 } 8005 func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { 8006 // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) 8007 // cond: is20Bit(off1+off2) 8008 // result: (FMOVSload [off1+off2] {sym} ptr mem) 8009 for { 8010 off1 := v.AuxInt 8011 sym := v.Aux 8012 v_0 := v.Args[0] 8013 if v_0.Op != OpS390XADDconst { 8014 break 8015 } 8016 off2 := v_0.AuxInt 8017 ptr := v_0.Args[0] 8018 mem := v.Args[1] 8019 if !(is20Bit(off1 + off2)) { 8020 break 8021 } 8022 v.reset(OpS390XFMOVSload) 8023 v.AuxInt = off1 + off2 8024 v.Aux = sym 8025 v.AddArg(ptr) 8026 v.AddArg(mem) 8027 return true 8028 } 8029 // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8030 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8031 // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8032 for { 8033 off1 := v.AuxInt 8034 sym1 := v.Aux 8035 v_0 := v.Args[0] 8036 if v_0.Op != OpS390XMOVDaddr { 8037 break 8038 } 8039 off2 := v_0.AuxInt 8040 sym2 := v_0.Aux 8041 base := v_0.Args[0] 8042 mem := v.Args[1] 8043 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8044 break 8045 } 8046 v.reset(OpS390XFMOVSload) 8047 v.AuxInt = off1 + off2 8048 v.Aux = mergeSym(sym1, sym2) 8049 v.AddArg(base) 8050 v.AddArg(mem) 8051 return true 8052 } 8053 // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8054 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8055 // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8056 for { 8057 off1 := v.AuxInt 8058 sym1 := v.Aux 8059 v_0 := v.Args[0] 8060 if v_0.Op != OpS390XMOVDaddridx { 8061 break 8062 } 8063 off2 := v_0.AuxInt 8064 sym2 := v_0.Aux 8065 ptr := v_0.Args[0] 8066 idx := v_0.Args[1] 8067 mem := v.Args[1] 8068 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8069 break 8070 } 8071 v.reset(OpS390XFMOVSloadidx) 8072 v.AuxInt = off1 + off2 8073 v.Aux = mergeSym(sym1, sym2) 8074 v.AddArg(ptr) 8075 v.AddArg(idx) 8076 v.AddArg(mem) 8077 return true 8078 } 8079 // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) 8080 // cond: ptr.Op != OpSB 8081 // result: (FMOVSloadidx [off] {sym} ptr idx mem) 8082 for { 8083 off := v.AuxInt 8084 sym := v.Aux 8085 v_0 := v.Args[0] 8086 if v_0.Op != OpS390XADD { 8087 break 8088 } 8089 ptr := v_0.Args[0] 8090 idx := v_0.Args[1] 8091 mem := v.Args[1] 8092 if !(ptr.Op != OpSB) { 8093 break 8094 } 8095 v.reset(OpS390XFMOVSloadidx) 8096 v.AuxInt = off 8097 v.Aux = sym 8098 v.AddArg(ptr) 8099 v.AddArg(idx) 8100 v.AddArg(mem) 8101 return true 8102 } 8103 return false 8104 } 8105 func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { 8106 // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8107 // cond: 8108 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8109 for { 8110 c := v.AuxInt 8111 sym := v.Aux 8112 v_0 := v.Args[0] 8113 if v_0.Op != OpS390XADDconst { 8114 break 8115 } 8116 d := v_0.AuxInt 8117 ptr := v_0.Args[0] 8118 idx := v.Args[1] 8119 mem := v.Args[2] 8120 v.reset(OpS390XFMOVSloadidx) 8121 v.AuxInt = c + d 8122 v.Aux = sym 8123 v.AddArg(ptr) 8124 v.AddArg(idx) 8125 v.AddArg(mem) 8126 return true 8127 } 8128 // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8129 // cond: 8130 // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) 8131 for { 8132 c := v.AuxInt 8133 sym := v.Aux 8134 ptr := v.Args[0] 8135 v_1 := v.Args[1] 8136 if v_1.Op != OpS390XADDconst { 8137 break 8138 } 8139 d := v_1.AuxInt 8140 idx := v_1.Args[0] 8141 mem := v.Args[2] 8142 v.reset(OpS390XFMOVSloadidx) 8143 v.AuxInt = c + d 8144 v.Aux = sym 8145 v.AddArg(ptr) 8146 v.AddArg(idx) 8147 v.AddArg(mem) 8148 return true 8149 } 8150 return false 8151 } 8152 func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { 8153 // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8154 // cond: is20Bit(off1+off2) 8155 // result: (FMOVSstore [off1+off2] {sym} ptr val mem) 8156 for { 8157 off1 := v.AuxInt 8158 sym := v.Aux 8159 v_0 := v.Args[0] 8160 if v_0.Op != OpS390XADDconst { 8161 break 8162 } 8163 off2 := v_0.AuxInt 8164 ptr := v_0.Args[0] 8165 val := v.Args[1] 8166 mem := v.Args[2] 8167 if !(is20Bit(off1 + off2)) { 8168 break 8169 } 8170 v.reset(OpS390XFMOVSstore) 8171 v.AuxInt = off1 + off2 8172 v.Aux = sym 8173 v.AddArg(ptr) 8174 v.AddArg(val) 8175 v.AddArg(mem) 8176 return true 8177 } 8178 // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 8179 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8180 // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 8181 for { 8182 off1 := v.AuxInt 8183 sym1 := v.Aux 8184 v_0 := v.Args[0] 8185 if v_0.Op != OpS390XMOVDaddr { 8186 break 8187 } 8188 off2 := v_0.AuxInt 8189 sym2 := v_0.Aux 8190 base := v_0.Args[0] 8191 val := v.Args[1] 8192 mem := v.Args[2] 8193 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8194 break 8195 } 8196 v.reset(OpS390XFMOVSstore) 8197 v.AuxInt = off1 + off2 8198 v.Aux = mergeSym(sym1, sym2) 8199 v.AddArg(base) 8200 v.AddArg(val) 8201 v.AddArg(mem) 8202 return true 8203 } 8204 // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 8205 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8206 // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 8207 for { 8208 off1 := v.AuxInt 8209 sym1 := v.Aux 8210 v_0 := v.Args[0] 8211 if v_0.Op != OpS390XMOVDaddridx { 8212 break 8213 } 8214 off2 := v_0.AuxInt 8215 sym2 := v_0.Aux 8216 ptr := v_0.Args[0] 8217 idx := v_0.Args[1] 8218 val := v.Args[1] 8219 mem := v.Args[2] 8220 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8221 break 8222 } 8223 v.reset(OpS390XFMOVSstoreidx) 8224 v.AuxInt = off1 + off2 8225 v.Aux = mergeSym(sym1, sym2) 8226 v.AddArg(ptr) 8227 v.AddArg(idx) 8228 v.AddArg(val) 8229 v.AddArg(mem) 8230 return true 8231 } 8232 // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) 8233 // cond: ptr.Op != OpSB 8234 // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) 8235 for { 8236 off := v.AuxInt 8237 sym := v.Aux 8238 v_0 := v.Args[0] 8239 if v_0.Op != OpS390XADD { 8240 break 8241 } 8242 ptr := v_0.Args[0] 8243 idx := v_0.Args[1] 8244 val := v.Args[1] 8245 mem := v.Args[2] 8246 if !(ptr.Op != OpSB) { 8247 break 8248 } 8249 v.reset(OpS390XFMOVSstoreidx) 8250 v.AuxInt = off 8251 v.Aux = sym 8252 v.AddArg(ptr) 8253 v.AddArg(idx) 8254 v.AddArg(val) 8255 v.AddArg(mem) 8256 return true 8257 } 8258 return false 8259 } 8260 func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { 8261 // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 8262 // cond: 8263 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8264 for { 8265 c := v.AuxInt 8266 sym := v.Aux 8267 v_0 := v.Args[0] 8268 if v_0.Op != OpS390XADDconst { 8269 break 8270 } 8271 d := v_0.AuxInt 8272 ptr := v_0.Args[0] 8273 idx := v.Args[1] 8274 val := v.Args[2] 8275 mem := v.Args[3] 8276 v.reset(OpS390XFMOVSstoreidx) 8277 v.AuxInt = c + d 8278 v.Aux = sym 8279 v.AddArg(ptr) 8280 v.AddArg(idx) 8281 v.AddArg(val) 8282 v.AddArg(mem) 8283 return true 8284 } 8285 // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 8286 // cond: 8287 // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) 8288 for { 8289 c := v.AuxInt 8290 sym := v.Aux 8291 ptr := v.Args[0] 8292 v_1 := v.Args[1] 8293 if v_1.Op != OpS390XADDconst { 8294 break 8295 } 8296 d := v_1.AuxInt 8297 idx := v_1.Args[0] 8298 val := v.Args[2] 8299 mem := v.Args[3] 8300 v.reset(OpS390XFMOVSstoreidx) 8301 v.AuxInt = c + d 8302 v.Aux = sym 8303 v.AddArg(ptr) 8304 v.AddArg(idx) 8305 v.AddArg(val) 8306 v.AddArg(mem) 8307 return true 8308 } 8309 return false 8310 } 8311 func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool { 8312 // match: (FSUB (FMUL y z) x) 8313 // cond: 8314 // result: (FMSUB x y z) 8315 for { 8316 v_0 := v.Args[0] 8317 if v_0.Op != OpS390XFMUL { 8318 break 8319 } 8320 y := v_0.Args[0] 8321 z := v_0.Args[1] 8322 x := v.Args[1] 8323 v.reset(OpS390XFMSUB) 8324 v.AddArg(x) 8325 v.AddArg(y) 8326 v.AddArg(z) 8327 return true 8328 } 8329 return false 8330 } 8331 func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { 8332 // match: (FSUBS (FMULS y z) x) 8333 // cond: 8334 // result: (FMSUBS x y z) 8335 for { 8336 v_0 := v.Args[0] 8337 if v_0.Op != OpS390XFMULS { 8338 break 8339 } 8340 y := v_0.Args[0] 8341 z := v_0.Args[1] 8342 x := v.Args[1] 8343 v.reset(OpS390XFMSUBS) 8344 v.AddArg(x) 8345 v.AddArg(y) 8346 v.AddArg(z) 8347 return true 8348 } 8349 return false 8350 } 8351 func rewriteValueS390X_OpS390XLoweredRound32F_0(v *Value) bool { 8352 // match: (LoweredRound32F x:(FMOVSconst)) 8353 // cond: 8354 // result: x 8355 for { 8356 x := v.Args[0] 8357 if x.Op != OpS390XFMOVSconst { 8358 break 8359 } 8360 v.reset(OpCopy) 8361 v.Type = x.Type 8362 v.AddArg(x) 8363 return true 8364 } 8365 return false 8366 } 8367 func rewriteValueS390X_OpS390XLoweredRound64F_0(v *Value) bool { 8368 // match: (LoweredRound64F x:(FMOVDconst)) 8369 // cond: 8370 // result: x 8371 for { 8372 x := v.Args[0] 8373 if x.Op != OpS390XFMOVDconst { 8374 break 8375 } 8376 v.reset(OpCopy) 8377 v.Type = x.Type 8378 v.AddArg(x) 8379 return true 8380 } 8381 return false 8382 } 8383 func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { 8384 // match: (MOVBZload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 8385 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8386 // result: (MOVBZreg x) 8387 for { 8388 off := v.AuxInt 8389 sym := v.Aux 8390 ptr := v.Args[0] 8391 v_1 := v.Args[1] 8392 if v_1.Op != OpS390XMOVBstore { 8393 break 8394 } 8395 off2 := v_1.AuxInt 8396 sym2 := v_1.Aux 8397 ptr2 := v_1.Args[0] 8398 x := v_1.Args[1] 8399 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8400 break 8401 } 8402 v.reset(OpS390XMOVBZreg) 8403 v.AddArg(x) 8404 return true 8405 } 8406 // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) 8407 // cond: is20Bit(off1+off2) 8408 // result: (MOVBZload [off1+off2] {sym} ptr mem) 8409 for { 8410 off1 := v.AuxInt 8411 sym := v.Aux 8412 v_0 := v.Args[0] 8413 if v_0.Op != OpS390XADDconst { 8414 break 8415 } 8416 off2 := v_0.AuxInt 8417 ptr := v_0.Args[0] 8418 mem := v.Args[1] 8419 if !(is20Bit(off1 + off2)) { 8420 break 8421 } 8422 v.reset(OpS390XMOVBZload) 8423 v.AuxInt = off1 + off2 8424 v.Aux = sym 8425 v.AddArg(ptr) 8426 v.AddArg(mem) 8427 return true 8428 } 8429 // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8430 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8431 // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8432 for { 8433 off1 := v.AuxInt 8434 sym1 := v.Aux 8435 v_0 := v.Args[0] 8436 if v_0.Op != OpS390XMOVDaddr { 8437 break 8438 } 8439 off2 := v_0.AuxInt 8440 sym2 := v_0.Aux 8441 base := v_0.Args[0] 8442 mem := v.Args[1] 8443 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8444 break 8445 } 8446 v.reset(OpS390XMOVBZload) 8447 v.AuxInt = off1 + off2 8448 v.Aux = mergeSym(sym1, sym2) 8449 v.AddArg(base) 8450 v.AddArg(mem) 8451 return true 8452 } 8453 // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 8454 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8455 // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 8456 for { 8457 off1 := v.AuxInt 8458 sym1 := v.Aux 8459 v_0 := v.Args[0] 8460 if v_0.Op != OpS390XMOVDaddridx { 8461 break 8462 } 8463 off2 := v_0.AuxInt 8464 sym2 := v_0.Aux 8465 ptr := v_0.Args[0] 8466 idx := v_0.Args[1] 8467 mem := v.Args[1] 8468 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8469 break 8470 } 8471 v.reset(OpS390XMOVBZloadidx) 8472 v.AuxInt = off1 + off2 8473 v.Aux = mergeSym(sym1, sym2) 8474 v.AddArg(ptr) 8475 v.AddArg(idx) 8476 v.AddArg(mem) 8477 return true 8478 } 8479 // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) 8480 // cond: ptr.Op != OpSB 8481 // result: (MOVBZloadidx [off] {sym} ptr idx mem) 8482 for { 8483 off := v.AuxInt 8484 sym := v.Aux 8485 v_0 := v.Args[0] 8486 if v_0.Op != OpS390XADD { 8487 break 8488 } 8489 ptr := v_0.Args[0] 8490 idx := v_0.Args[1] 8491 mem := v.Args[1] 8492 if !(ptr.Op != OpSB) { 8493 break 8494 } 8495 v.reset(OpS390XMOVBZloadidx) 8496 v.AuxInt = off 8497 v.Aux = sym 8498 v.AddArg(ptr) 8499 v.AddArg(idx) 8500 v.AddArg(mem) 8501 return true 8502 } 8503 return false 8504 } 8505 func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { 8506 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 8507 // cond: 8508 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8509 for { 8510 c := v.AuxInt 8511 sym := v.Aux 8512 v_0 := v.Args[0] 8513 if v_0.Op != OpS390XADDconst { 8514 break 8515 } 8516 d := v_0.AuxInt 8517 ptr := v_0.Args[0] 8518 idx := v.Args[1] 8519 mem := v.Args[2] 8520 v.reset(OpS390XMOVBZloadidx) 8521 v.AuxInt = c + d 8522 v.Aux = sym 8523 v.AddArg(ptr) 8524 v.AddArg(idx) 8525 v.AddArg(mem) 8526 return true 8527 } 8528 // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 8529 // cond: 8530 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8531 for { 8532 c := v.AuxInt 8533 sym := v.Aux 8534 idx := v.Args[0] 8535 v_1 := v.Args[1] 8536 if v_1.Op != OpS390XADDconst { 8537 break 8538 } 8539 d := v_1.AuxInt 8540 ptr := v_1.Args[0] 8541 mem := v.Args[2] 8542 v.reset(OpS390XMOVBZloadidx) 8543 v.AuxInt = c + d 8544 v.Aux = sym 8545 v.AddArg(ptr) 8546 v.AddArg(idx) 8547 v.AddArg(mem) 8548 return true 8549 } 8550 // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 8551 // cond: 8552 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8553 for { 8554 c := v.AuxInt 8555 sym := v.Aux 8556 ptr := v.Args[0] 8557 v_1 := v.Args[1] 8558 if v_1.Op != OpS390XADDconst { 8559 break 8560 } 8561 d := v_1.AuxInt 8562 idx := v_1.Args[0] 8563 mem := v.Args[2] 8564 v.reset(OpS390XMOVBZloadidx) 8565 v.AuxInt = c + d 8566 v.Aux = sym 8567 v.AddArg(ptr) 8568 v.AddArg(idx) 8569 v.AddArg(mem) 8570 return true 8571 } 8572 // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 8573 // cond: 8574 // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) 8575 for { 8576 c := v.AuxInt 8577 sym := v.Aux 8578 v_0 := v.Args[0] 8579 if v_0.Op != OpS390XADDconst { 8580 break 8581 } 8582 d := v_0.AuxInt 8583 idx := v_0.Args[0] 8584 ptr := v.Args[1] 8585 mem := v.Args[2] 8586 v.reset(OpS390XMOVBZloadidx) 8587 v.AuxInt = c + d 8588 v.Aux = sym 8589 v.AddArg(ptr) 8590 v.AddArg(idx) 8591 v.AddArg(mem) 8592 return true 8593 } 8594 return false 8595 } 8596 func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool { 8597 // match: (MOVBZreg x:(MOVDLT (MOVDconst [c]) (MOVDconst [d]) _)) 8598 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8599 // result: (MOVDreg x) 8600 for { 8601 x := v.Args[0] 8602 if x.Op != OpS390XMOVDLT { 8603 break 8604 } 8605 x_0 := x.Args[0] 8606 if x_0.Op != OpS390XMOVDconst { 8607 break 8608 } 8609 c := x_0.AuxInt 8610 x_1 := x.Args[1] 8611 if x_1.Op != OpS390XMOVDconst { 8612 break 8613 } 8614 d := x_1.AuxInt 8615 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8616 break 8617 } 8618 v.reset(OpS390XMOVDreg) 8619 v.AddArg(x) 8620 return true 8621 } 8622 // match: (MOVBZreg x:(MOVDLE (MOVDconst [c]) (MOVDconst [d]) _)) 8623 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8624 // result: (MOVDreg x) 8625 for { 8626 x := v.Args[0] 8627 if x.Op != OpS390XMOVDLE { 8628 break 8629 } 8630 x_0 := x.Args[0] 8631 if x_0.Op != OpS390XMOVDconst { 8632 break 8633 } 8634 c := x_0.AuxInt 8635 x_1 := x.Args[1] 8636 if x_1.Op != OpS390XMOVDconst { 8637 break 8638 } 8639 d := x_1.AuxInt 8640 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8641 break 8642 } 8643 v.reset(OpS390XMOVDreg) 8644 v.AddArg(x) 8645 return true 8646 } 8647 // match: (MOVBZreg x:(MOVDGT (MOVDconst [c]) (MOVDconst [d]) _)) 8648 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8649 // result: (MOVDreg x) 8650 for { 8651 x := v.Args[0] 8652 if x.Op != OpS390XMOVDGT { 8653 break 8654 } 8655 x_0 := x.Args[0] 8656 if x_0.Op != OpS390XMOVDconst { 8657 break 8658 } 8659 c := x_0.AuxInt 8660 x_1 := x.Args[1] 8661 if x_1.Op != OpS390XMOVDconst { 8662 break 8663 } 8664 d := x_1.AuxInt 8665 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8666 break 8667 } 8668 v.reset(OpS390XMOVDreg) 8669 v.AddArg(x) 8670 return true 8671 } 8672 // match: (MOVBZreg x:(MOVDGE (MOVDconst [c]) (MOVDconst [d]) _)) 8673 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8674 // result: (MOVDreg x) 8675 for { 8676 x := v.Args[0] 8677 if x.Op != OpS390XMOVDGE { 8678 break 8679 } 8680 x_0 := x.Args[0] 8681 if x_0.Op != OpS390XMOVDconst { 8682 break 8683 } 8684 c := x_0.AuxInt 8685 x_1 := x.Args[1] 8686 if x_1.Op != OpS390XMOVDconst { 8687 break 8688 } 8689 d := x_1.AuxInt 8690 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8691 break 8692 } 8693 v.reset(OpS390XMOVDreg) 8694 v.AddArg(x) 8695 return true 8696 } 8697 // match: (MOVBZreg x:(MOVDEQ (MOVDconst [c]) (MOVDconst [d]) _)) 8698 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8699 // result: (MOVDreg x) 8700 for { 8701 x := v.Args[0] 8702 if x.Op != OpS390XMOVDEQ { 8703 break 8704 } 8705 x_0 := x.Args[0] 8706 if x_0.Op != OpS390XMOVDconst { 8707 break 8708 } 8709 c := x_0.AuxInt 8710 x_1 := x.Args[1] 8711 if x_1.Op != OpS390XMOVDconst { 8712 break 8713 } 8714 d := x_1.AuxInt 8715 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8716 break 8717 } 8718 v.reset(OpS390XMOVDreg) 8719 v.AddArg(x) 8720 return true 8721 } 8722 // match: (MOVBZreg x:(MOVDNE (MOVDconst [c]) (MOVDconst [d]) _)) 8723 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8724 // result: (MOVDreg x) 8725 for { 8726 x := v.Args[0] 8727 if x.Op != OpS390XMOVDNE { 8728 break 8729 } 8730 x_0 := x.Args[0] 8731 if x_0.Op != OpS390XMOVDconst { 8732 break 8733 } 8734 c := x_0.AuxInt 8735 x_1 := x.Args[1] 8736 if x_1.Op != OpS390XMOVDconst { 8737 break 8738 } 8739 d := x_1.AuxInt 8740 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8741 break 8742 } 8743 v.reset(OpS390XMOVDreg) 8744 v.AddArg(x) 8745 return true 8746 } 8747 // match: (MOVBZreg x:(MOVDGTnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 8748 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8749 // result: (MOVDreg x) 8750 for { 8751 x := v.Args[0] 8752 if x.Op != OpS390XMOVDGTnoinv { 8753 break 8754 } 8755 x_0 := x.Args[0] 8756 if x_0.Op != OpS390XMOVDconst { 8757 break 8758 } 8759 c := x_0.AuxInt 8760 x_1 := x.Args[1] 8761 if x_1.Op != OpS390XMOVDconst { 8762 break 8763 } 8764 d := x_1.AuxInt 8765 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8766 break 8767 } 8768 v.reset(OpS390XMOVDreg) 8769 v.AddArg(x) 8770 return true 8771 } 8772 // match: (MOVBZreg x:(MOVDGEnoinv (MOVDconst [c]) (MOVDconst [d]) _)) 8773 // cond: int64(uint8(c)) == c && int64(uint8(d)) == d 8774 // result: (MOVDreg x) 8775 for { 8776 x := v.Args[0] 8777 if x.Op != OpS390XMOVDGEnoinv { 8778 break 8779 } 8780 x_0 := x.Args[0] 8781 if x_0.Op != OpS390XMOVDconst { 8782 break 8783 } 8784 c := x_0.AuxInt 8785 x_1 := x.Args[1] 8786 if x_1.Op != OpS390XMOVDconst { 8787 break 8788 } 8789 d := x_1.AuxInt 8790 if !(int64(uint8(c)) == c && int64(uint8(d)) == d) { 8791 break 8792 } 8793 v.reset(OpS390XMOVDreg) 8794 v.AddArg(x) 8795 return true 8796 } 8797 // match: (MOVBZreg x:(MOVBZload _ _)) 8798 // cond: 8799 // result: (MOVDreg x) 8800 for { 8801 x := v.Args[0] 8802 if x.Op != OpS390XMOVBZload { 8803 break 8804 } 8805 v.reset(OpS390XMOVDreg) 8806 v.AddArg(x) 8807 return true 8808 } 8809 // match: (MOVBZreg x:(Arg <t>)) 8810 // cond: is8BitInt(t) && !isSigned(t) 8811 // result: (MOVDreg x) 8812 for { 8813 x := v.Args[0] 8814 if x.Op != OpArg { 8815 break 8816 } 8817 t := x.Type 8818 if !(is8BitInt(t) && !isSigned(t)) { 8819 break 8820 } 8821 v.reset(OpS390XMOVDreg) 8822 v.AddArg(x) 8823 return true 8824 } 8825 return false 8826 } 8827 func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { 8828 b := v.Block 8829 _ = b 8830 // match: (MOVBZreg x:(MOVBZreg _)) 8831 // cond: 8832 // result: (MOVDreg x) 8833 for { 8834 x := v.Args[0] 8835 if x.Op != OpS390XMOVBZreg { 8836 break 8837 } 8838 v.reset(OpS390XMOVDreg) 8839 v.AddArg(x) 8840 return true 8841 } 8842 // match: (MOVBZreg (MOVDconst [c])) 8843 // cond: 8844 // result: (MOVDconst [int64(uint8(c))]) 8845 for { 8846 v_0 := v.Args[0] 8847 if v_0.Op != OpS390XMOVDconst { 8848 break 8849 } 8850 c := v_0.AuxInt 8851 v.reset(OpS390XMOVDconst) 8852 v.AuxInt = int64(uint8(c)) 8853 return true 8854 } 8855 // match: (MOVBZreg x:(MOVBZload [off] {sym} ptr mem)) 8856 // cond: x.Uses == 1 && clobber(x) 8857 // result: @x.Block (MOVBZload <v.Type> [off] {sym} ptr mem) 8858 for { 8859 x := v.Args[0] 8860 if x.Op != OpS390XMOVBZload { 8861 break 8862 } 8863 off := x.AuxInt 8864 sym := x.Aux 8865 ptr := x.Args[0] 8866 mem := x.Args[1] 8867 if !(x.Uses == 1 && clobber(x)) { 8868 break 8869 } 8870 b = x.Block 8871 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, v.Type) 8872 v.reset(OpCopy) 8873 v.AddArg(v0) 8874 v0.AuxInt = off 8875 v0.Aux = sym 8876 v0.AddArg(ptr) 8877 v0.AddArg(mem) 8878 return true 8879 } 8880 // match: (MOVBZreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) 8881 // cond: x.Uses == 1 && clobber(x) 8882 // result: @x.Block (MOVBZloadidx <v.Type> [off] {sym} ptr idx mem) 8883 for { 8884 x := v.Args[0] 8885 if x.Op != OpS390XMOVBZloadidx { 8886 break 8887 } 8888 off := x.AuxInt 8889 sym := x.Aux 8890 ptr := x.Args[0] 8891 idx := x.Args[1] 8892 mem := x.Args[2] 8893 if !(x.Uses == 1 && clobber(x)) { 8894 break 8895 } 8896 b = x.Block 8897 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, v.Type) 8898 v.reset(OpCopy) 8899 v.AddArg(v0) 8900 v0.AuxInt = off 8901 v0.Aux = sym 8902 v0.AddArg(ptr) 8903 v0.AddArg(idx) 8904 v0.AddArg(mem) 8905 return true 8906 } 8907 return false 8908 } 8909 func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { 8910 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 8911 // cond: is20Bit(off1+off2) 8912 // result: (MOVBload [off1+off2] {sym} ptr mem) 8913 for { 8914 off1 := v.AuxInt 8915 sym := v.Aux 8916 v_0 := v.Args[0] 8917 if v_0.Op != OpS390XADDconst { 8918 break 8919 } 8920 off2 := v_0.AuxInt 8921 ptr := v_0.Args[0] 8922 mem := v.Args[1] 8923 if !(is20Bit(off1 + off2)) { 8924 break 8925 } 8926 v.reset(OpS390XMOVBload) 8927 v.AuxInt = off1 + off2 8928 v.Aux = sym 8929 v.AddArg(ptr) 8930 v.AddArg(mem) 8931 return true 8932 } 8933 // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 8934 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 8935 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) 8936 for { 8937 off1 := v.AuxInt 8938 sym1 := v.Aux 8939 v_0 := v.Args[0] 8940 if v_0.Op != OpS390XMOVDaddr { 8941 break 8942 } 8943 off2 := v_0.AuxInt 8944 sym2 := v_0.Aux 8945 base := v_0.Args[0] 8946 mem := v.Args[1] 8947 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 8948 break 8949 } 8950 v.reset(OpS390XMOVBload) 8951 v.AuxInt = off1 + off2 8952 v.Aux = mergeSym(sym1, sym2) 8953 v.AddArg(base) 8954 v.AddArg(mem) 8955 return true 8956 } 8957 return false 8958 } 8959 func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { 8960 b := v.Block 8961 _ = b 8962 // match: (MOVBreg x:(MOVBload _ _)) 8963 // cond: 8964 // result: (MOVDreg x) 8965 for { 8966 x := v.Args[0] 8967 if x.Op != OpS390XMOVBload { 8968 break 8969 } 8970 v.reset(OpS390XMOVDreg) 8971 v.AddArg(x) 8972 return true 8973 } 8974 // match: (MOVBreg x:(Arg <t>)) 8975 // cond: is8BitInt(t) && isSigned(t) 8976 // result: (MOVDreg x) 8977 for { 8978 x := v.Args[0] 8979 if x.Op != OpArg { 8980 break 8981 } 8982 t := x.Type 8983 if !(is8BitInt(t) && isSigned(t)) { 8984 break 8985 } 8986 v.reset(OpS390XMOVDreg) 8987 v.AddArg(x) 8988 return true 8989 } 8990 // match: (MOVBreg x:(MOVBreg _)) 8991 // cond: 8992 // result: (MOVDreg x) 8993 for { 8994 x := v.Args[0] 8995 if x.Op != OpS390XMOVBreg { 8996 break 8997 } 8998 v.reset(OpS390XMOVDreg) 8999 v.AddArg(x) 9000 return true 9001 } 9002 // match: (MOVBreg (MOVDconst [c])) 9003 // cond: 9004 // result: (MOVDconst [int64(int8(c))]) 9005 for { 9006 v_0 := v.Args[0] 9007 if v_0.Op != OpS390XMOVDconst { 9008 break 9009 } 9010 c := v_0.AuxInt 9011 v.reset(OpS390XMOVDconst) 9012 v.AuxInt = int64(int8(c)) 9013 return true 9014 } 9015 // match: (MOVBreg x:(MOVBZload [off] {sym} ptr mem)) 9016 // cond: x.Uses == 1 && clobber(x) 9017 // result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem) 9018 for { 9019 x := v.Args[0] 9020 if x.Op != OpS390XMOVBZload { 9021 break 9022 } 9023 off := x.AuxInt 9024 sym := x.Aux 9025 ptr := x.Args[0] 9026 mem := x.Args[1] 9027 if !(x.Uses == 1 && clobber(x)) { 9028 break 9029 } 9030 b = x.Block 9031 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, v.Type) 9032 v.reset(OpCopy) 9033 v.AddArg(v0) 9034 v0.AuxInt = off 9035 v0.Aux = sym 9036 v0.AddArg(ptr) 9037 v0.AddArg(mem) 9038 return true 9039 } 9040 return false 9041 } 9042 func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { 9043 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 9044 // cond: 9045 // result: (MOVBstore [off] {sym} ptr x mem) 9046 for { 9047 off := v.AuxInt 9048 sym := v.Aux 9049 ptr := v.Args[0] 9050 v_1 := v.Args[1] 9051 if v_1.Op != OpS390XMOVBreg { 9052 break 9053 } 9054 x := v_1.Args[0] 9055 mem := v.Args[2] 9056 v.reset(OpS390XMOVBstore) 9057 v.AuxInt = off 9058 v.Aux = sym 9059 v.AddArg(ptr) 9060 v.AddArg(x) 9061 v.AddArg(mem) 9062 return true 9063 } 9064 // match: (MOVBstore [off] {sym} ptr (MOVBZreg x) mem) 9065 // cond: 9066 // result: (MOVBstore [off] {sym} ptr x mem) 9067 for { 9068 off := v.AuxInt 9069 sym := v.Aux 9070 ptr := v.Args[0] 9071 v_1 := v.Args[1] 9072 if v_1.Op != OpS390XMOVBZreg { 9073 break 9074 } 9075 x := v_1.Args[0] 9076 mem := v.Args[2] 9077 v.reset(OpS390XMOVBstore) 9078 v.AuxInt = off 9079 v.Aux = sym 9080 v.AddArg(ptr) 9081 v.AddArg(x) 9082 v.AddArg(mem) 9083 return true 9084 } 9085 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9086 // cond: is20Bit(off1+off2) 9087 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 9088 for { 9089 off1 := v.AuxInt 9090 sym := v.Aux 9091 v_0 := v.Args[0] 9092 if v_0.Op != OpS390XADDconst { 9093 break 9094 } 9095 off2 := v_0.AuxInt 9096 ptr := v_0.Args[0] 9097 val := v.Args[1] 9098 mem := v.Args[2] 9099 if !(is20Bit(off1 + off2)) { 9100 break 9101 } 9102 v.reset(OpS390XMOVBstore) 9103 v.AuxInt = off1 + off2 9104 v.Aux = sym 9105 v.AddArg(ptr) 9106 v.AddArg(val) 9107 v.AddArg(mem) 9108 return true 9109 } 9110 // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) 9111 // cond: validOff(off) && ptr.Op != OpSB 9112 // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) 9113 for { 9114 off := v.AuxInt 9115 sym := v.Aux 9116 ptr := v.Args[0] 9117 v_1 := v.Args[1] 9118 if v_1.Op != OpS390XMOVDconst { 9119 break 9120 } 9121 c := v_1.AuxInt 9122 mem := v.Args[2] 9123 if !(validOff(off) && ptr.Op != OpSB) { 9124 break 9125 } 9126 v.reset(OpS390XMOVBstoreconst) 9127 v.AuxInt = makeValAndOff(int64(int8(c)), off) 9128 v.Aux = sym 9129 v.AddArg(ptr) 9130 v.AddArg(mem) 9131 return true 9132 } 9133 // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 9134 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9135 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 9136 for { 9137 off1 := v.AuxInt 9138 sym1 := v.Aux 9139 v_0 := v.Args[0] 9140 if v_0.Op != OpS390XMOVDaddr { 9141 break 9142 } 9143 off2 := v_0.AuxInt 9144 sym2 := v_0.Aux 9145 base := v_0.Args[0] 9146 val := v.Args[1] 9147 mem := v.Args[2] 9148 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9149 break 9150 } 9151 v.reset(OpS390XMOVBstore) 9152 v.AuxInt = off1 + off2 9153 v.Aux = mergeSym(sym1, sym2) 9154 v.AddArg(base) 9155 v.AddArg(val) 9156 v.AddArg(mem) 9157 return true 9158 } 9159 // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 9160 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 9161 // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 9162 for { 9163 off1 := v.AuxInt 9164 sym1 := v.Aux 9165 v_0 := v.Args[0] 9166 if v_0.Op != OpS390XMOVDaddridx { 9167 break 9168 } 9169 off2 := v_0.AuxInt 9170 sym2 := v_0.Aux 9171 ptr := v_0.Args[0] 9172 idx := v_0.Args[1] 9173 val := v.Args[1] 9174 mem := v.Args[2] 9175 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 9176 break 9177 } 9178 v.reset(OpS390XMOVBstoreidx) 9179 v.AuxInt = off1 + off2 9180 v.Aux = mergeSym(sym1, sym2) 9181 v.AddArg(ptr) 9182 v.AddArg(idx) 9183 v.AddArg(val) 9184 v.AddArg(mem) 9185 return true 9186 } 9187 // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) 9188 // cond: ptr.Op != OpSB 9189 // result: (MOVBstoreidx [off] {sym} ptr idx val mem) 9190 for { 9191 off := v.AuxInt 9192 sym := v.Aux 9193 v_0 := v.Args[0] 9194 if v_0.Op != OpS390XADD { 9195 break 9196 } 9197 ptr := v_0.Args[0] 9198 idx := v_0.Args[1] 9199 val := v.Args[1] 9200 mem := v.Args[2] 9201 if !(ptr.Op != OpSB) { 9202 break 9203 } 9204 v.reset(OpS390XMOVBstoreidx) 9205 v.AuxInt = off 9206 v.Aux = sym 9207 v.AddArg(ptr) 9208 v.AddArg(idx) 9209 v.AddArg(val) 9210 v.AddArg(mem) 9211 return true 9212 } 9213 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) 9214 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9215 // result: (MOVHstore [i-1] {s} p w mem) 9216 for { 9217 i := v.AuxInt 9218 s := v.Aux 9219 p := v.Args[0] 9220 w := v.Args[1] 9221 x := v.Args[2] 9222 if x.Op != OpS390XMOVBstore { 9223 break 9224 } 9225 if x.AuxInt != i-1 { 9226 break 9227 } 9228 if x.Aux != s { 9229 break 9230 } 9231 if p != x.Args[0] { 9232 break 9233 } 9234 x_1 := x.Args[1] 9235 if x_1.Op != OpS390XSRDconst { 9236 break 9237 } 9238 if x_1.AuxInt != 8 { 9239 break 9240 } 9241 if w != x_1.Args[0] { 9242 break 9243 } 9244 mem := x.Args[2] 9245 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9246 break 9247 } 9248 v.reset(OpS390XMOVHstore) 9249 v.AuxInt = i - 1 9250 v.Aux = s 9251 v.AddArg(p) 9252 v.AddArg(w) 9253 v.AddArg(mem) 9254 return true 9255 } 9256 // match: (MOVBstore [i] {s} p w0:(SRDconst [j] w) x:(MOVBstore [i-1] {s} p (SRDconst [j+8] w) mem)) 9257 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9258 // result: (MOVHstore [i-1] {s} p w0 mem) 9259 for { 9260 i := v.AuxInt 9261 s := v.Aux 9262 p := v.Args[0] 9263 w0 := v.Args[1] 9264 if w0.Op != OpS390XSRDconst { 9265 break 9266 } 9267 j := w0.AuxInt 9268 w := w0.Args[0] 9269 x := v.Args[2] 9270 if x.Op != OpS390XMOVBstore { 9271 break 9272 } 9273 if x.AuxInt != i-1 { 9274 break 9275 } 9276 if x.Aux != s { 9277 break 9278 } 9279 if p != x.Args[0] { 9280 break 9281 } 9282 x_1 := x.Args[1] 9283 if x_1.Op != OpS390XSRDconst { 9284 break 9285 } 9286 if x_1.AuxInt != j+8 { 9287 break 9288 } 9289 if w != x_1.Args[0] { 9290 break 9291 } 9292 mem := x.Args[2] 9293 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9294 break 9295 } 9296 v.reset(OpS390XMOVHstore) 9297 v.AuxInt = i - 1 9298 v.Aux = s 9299 v.AddArg(p) 9300 v.AddArg(w0) 9301 v.AddArg(mem) 9302 return true 9303 } 9304 // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) 9305 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9306 // result: (MOVHstore [i-1] {s} p w mem) 9307 for { 9308 i := v.AuxInt 9309 s := v.Aux 9310 p := v.Args[0] 9311 w := v.Args[1] 9312 x := v.Args[2] 9313 if x.Op != OpS390XMOVBstore { 9314 break 9315 } 9316 if x.AuxInt != i-1 { 9317 break 9318 } 9319 if x.Aux != s { 9320 break 9321 } 9322 if p != x.Args[0] { 9323 break 9324 } 9325 x_1 := x.Args[1] 9326 if x_1.Op != OpS390XSRWconst { 9327 break 9328 } 9329 if x_1.AuxInt != 8 { 9330 break 9331 } 9332 if w != x_1.Args[0] { 9333 break 9334 } 9335 mem := x.Args[2] 9336 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9337 break 9338 } 9339 v.reset(OpS390XMOVHstore) 9340 v.AuxInt = i - 1 9341 v.Aux = s 9342 v.AddArg(p) 9343 v.AddArg(w) 9344 v.AddArg(mem) 9345 return true 9346 } 9347 return false 9348 } 9349 func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { 9350 // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) 9351 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9352 // result: (MOVHstore [i-1] {s} p w0 mem) 9353 for { 9354 i := v.AuxInt 9355 s := v.Aux 9356 p := v.Args[0] 9357 w0 := v.Args[1] 9358 if w0.Op != OpS390XSRWconst { 9359 break 9360 } 9361 j := w0.AuxInt 9362 w := w0.Args[0] 9363 x := v.Args[2] 9364 if x.Op != OpS390XMOVBstore { 9365 break 9366 } 9367 if x.AuxInt != i-1 { 9368 break 9369 } 9370 if x.Aux != s { 9371 break 9372 } 9373 if p != x.Args[0] { 9374 break 9375 } 9376 x_1 := x.Args[1] 9377 if x_1.Op != OpS390XSRWconst { 9378 break 9379 } 9380 if x_1.AuxInt != j+8 { 9381 break 9382 } 9383 if w != x_1.Args[0] { 9384 break 9385 } 9386 mem := x.Args[2] 9387 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9388 break 9389 } 9390 v.reset(OpS390XMOVHstore) 9391 v.AuxInt = i - 1 9392 v.Aux = s 9393 v.AddArg(p) 9394 v.AddArg(w0) 9395 v.AddArg(mem) 9396 return true 9397 } 9398 // match: (MOVBstore [i] {s} p (SRDconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9399 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9400 // result: (MOVHBRstore [i-1] {s} p w mem) 9401 for { 9402 i := v.AuxInt 9403 s := v.Aux 9404 p := v.Args[0] 9405 v_1 := v.Args[1] 9406 if v_1.Op != OpS390XSRDconst { 9407 break 9408 } 9409 if v_1.AuxInt != 8 { 9410 break 9411 } 9412 w := v_1.Args[0] 9413 x := v.Args[2] 9414 if x.Op != OpS390XMOVBstore { 9415 break 9416 } 9417 if x.AuxInt != i-1 { 9418 break 9419 } 9420 if x.Aux != s { 9421 break 9422 } 9423 if p != x.Args[0] { 9424 break 9425 } 9426 if w != x.Args[1] { 9427 break 9428 } 9429 mem := x.Args[2] 9430 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9431 break 9432 } 9433 v.reset(OpS390XMOVHBRstore) 9434 v.AuxInt = i - 1 9435 v.Aux = s 9436 v.AddArg(p) 9437 v.AddArg(w) 9438 v.AddArg(mem) 9439 return true 9440 } 9441 // match: (MOVBstore [i] {s} p (SRDconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRDconst [j-8] w) mem)) 9442 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9443 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9444 for { 9445 i := v.AuxInt 9446 s := v.Aux 9447 p := v.Args[0] 9448 v_1 := v.Args[1] 9449 if v_1.Op != OpS390XSRDconst { 9450 break 9451 } 9452 j := v_1.AuxInt 9453 w := v_1.Args[0] 9454 x := v.Args[2] 9455 if x.Op != OpS390XMOVBstore { 9456 break 9457 } 9458 if x.AuxInt != i-1 { 9459 break 9460 } 9461 if x.Aux != s { 9462 break 9463 } 9464 if p != x.Args[0] { 9465 break 9466 } 9467 w0 := x.Args[1] 9468 if w0.Op != OpS390XSRDconst { 9469 break 9470 } 9471 if w0.AuxInt != j-8 { 9472 break 9473 } 9474 if w != w0.Args[0] { 9475 break 9476 } 9477 mem := x.Args[2] 9478 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9479 break 9480 } 9481 v.reset(OpS390XMOVHBRstore) 9482 v.AuxInt = i - 1 9483 v.Aux = s 9484 v.AddArg(p) 9485 v.AddArg(w0) 9486 v.AddArg(mem) 9487 return true 9488 } 9489 // match: (MOVBstore [i] {s} p (SRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) 9490 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9491 // result: (MOVHBRstore [i-1] {s} p w mem) 9492 for { 9493 i := v.AuxInt 9494 s := v.Aux 9495 p := v.Args[0] 9496 v_1 := v.Args[1] 9497 if v_1.Op != OpS390XSRWconst { 9498 break 9499 } 9500 if v_1.AuxInt != 8 { 9501 break 9502 } 9503 w := v_1.Args[0] 9504 x := v.Args[2] 9505 if x.Op != OpS390XMOVBstore { 9506 break 9507 } 9508 if x.AuxInt != i-1 { 9509 break 9510 } 9511 if x.Aux != s { 9512 break 9513 } 9514 if p != x.Args[0] { 9515 break 9516 } 9517 if w != x.Args[1] { 9518 break 9519 } 9520 mem := x.Args[2] 9521 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9522 break 9523 } 9524 v.reset(OpS390XMOVHBRstore) 9525 v.AuxInt = i - 1 9526 v.Aux = s 9527 v.AddArg(p) 9528 v.AddArg(w) 9529 v.AddArg(mem) 9530 return true 9531 } 9532 // match: (MOVBstore [i] {s} p (SRWconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SRWconst [j-8] w) mem)) 9533 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 9534 // result: (MOVHBRstore [i-1] {s} p w0 mem) 9535 for { 9536 i := v.AuxInt 9537 s := v.Aux 9538 p := v.Args[0] 9539 v_1 := v.Args[1] 9540 if v_1.Op != OpS390XSRWconst { 9541 break 9542 } 9543 j := v_1.AuxInt 9544 w := v_1.Args[0] 9545 x := v.Args[2] 9546 if x.Op != OpS390XMOVBstore { 9547 break 9548 } 9549 if x.AuxInt != i-1 { 9550 break 9551 } 9552 if x.Aux != s { 9553 break 9554 } 9555 if p != x.Args[0] { 9556 break 9557 } 9558 w0 := x.Args[1] 9559 if w0.Op != OpS390XSRWconst { 9560 break 9561 } 9562 if w0.AuxInt != j-8 { 9563 break 9564 } 9565 if w != w0.Args[0] { 9566 break 9567 } 9568 mem := x.Args[2] 9569 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 9570 break 9571 } 9572 v.reset(OpS390XMOVHBRstore) 9573 v.AuxInt = i - 1 9574 v.Aux = s 9575 v.AddArg(p) 9576 v.AddArg(w0) 9577 v.AddArg(mem) 9578 return true 9579 } 9580 return false 9581 } 9582 func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { 9583 // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) 9584 // cond: ValAndOff(sc).canAdd(off) 9585 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 9586 for { 9587 sc := v.AuxInt 9588 s := v.Aux 9589 v_0 := v.Args[0] 9590 if v_0.Op != OpS390XADDconst { 9591 break 9592 } 9593 off := v_0.AuxInt 9594 ptr := v_0.Args[0] 9595 mem := v.Args[1] 9596 if !(ValAndOff(sc).canAdd(off)) { 9597 break 9598 } 9599 v.reset(OpS390XMOVBstoreconst) 9600 v.AuxInt = ValAndOff(sc).add(off) 9601 v.Aux = s 9602 v.AddArg(ptr) 9603 v.AddArg(mem) 9604 return true 9605 } 9606 // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 9607 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 9608 // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 9609 for { 9610 sc := v.AuxInt 9611 sym1 := v.Aux 9612 v_0 := v.Args[0] 9613 if v_0.Op != OpS390XMOVDaddr { 9614 break 9615 } 9616 off := v_0.AuxInt 9617 sym2 := v_0.Aux 9618 ptr := v_0.Args[0] 9619 mem := v.Args[1] 9620 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 9621 break 9622 } 9623 v.reset(OpS390XMOVBstoreconst) 9624 v.AuxInt = ValAndOff(sc).add(off) 9625 v.Aux = mergeSym(sym1, sym2) 9626 v.AddArg(ptr) 9627 v.AddArg(mem) 9628 return true 9629 } 9630 // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) 9631 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) 9632 // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) 9633 for { 9634 c := v.AuxInt 9635 s := v.Aux 9636 p := v.Args[0] 9637 x := v.Args[1] 9638 if x.Op != OpS390XMOVBstoreconst { 9639 break 9640 } 9641 a := x.AuxInt 9642 if x.Aux != s { 9643 break 9644 } 9645 if p != x.Args[0] { 9646 break 9647 } 9648 mem := x.Args[1] 9649 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { 9650 break 9651 } 9652 v.reset(OpS390XMOVHstoreconst) 9653 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) 9654 v.Aux = s 9655 v.AddArg(p) 9656 v.AddArg(mem) 9657 return true 9658 } 9659 return false 9660 } 9661 func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { 9662 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 9663 // cond: 9664 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9665 for { 9666 c := v.AuxInt 9667 sym := v.Aux 9668 v_0 := v.Args[0] 9669 if v_0.Op != OpS390XADDconst { 9670 break 9671 } 9672 d := v_0.AuxInt 9673 ptr := v_0.Args[0] 9674 idx := v.Args[1] 9675 val := v.Args[2] 9676 mem := v.Args[3] 9677 v.reset(OpS390XMOVBstoreidx) 9678 v.AuxInt = c + d 9679 v.Aux = sym 9680 v.AddArg(ptr) 9681 v.AddArg(idx) 9682 v.AddArg(val) 9683 v.AddArg(mem) 9684 return true 9685 } 9686 // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 9687 // cond: 9688 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9689 for { 9690 c := v.AuxInt 9691 sym := v.Aux 9692 idx := v.Args[0] 9693 v_1 := v.Args[1] 9694 if v_1.Op != OpS390XADDconst { 9695 break 9696 } 9697 d := v_1.AuxInt 9698 ptr := v_1.Args[0] 9699 val := v.Args[2] 9700 mem := v.Args[3] 9701 v.reset(OpS390XMOVBstoreidx) 9702 v.AuxInt = c + d 9703 v.Aux = sym 9704 v.AddArg(ptr) 9705 v.AddArg(idx) 9706 v.AddArg(val) 9707 v.AddArg(mem) 9708 return true 9709 } 9710 // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 9711 // cond: 9712 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9713 for { 9714 c := v.AuxInt 9715 sym := v.Aux 9716 ptr := v.Args[0] 9717 v_1 := v.Args[1] 9718 if v_1.Op != OpS390XADDconst { 9719 break 9720 } 9721 d := v_1.AuxInt 9722 idx := v_1.Args[0] 9723 val := v.Args[2] 9724 mem := v.Args[3] 9725 v.reset(OpS390XMOVBstoreidx) 9726 v.AuxInt = c + d 9727 v.Aux = sym 9728 v.AddArg(ptr) 9729 v.AddArg(idx) 9730 v.AddArg(val) 9731 v.AddArg(mem) 9732 return true 9733 } 9734 // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 9735 // cond: 9736 // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) 9737 for { 9738 c := v.AuxInt 9739 sym := v.Aux 9740 v_0 := v.Args[0] 9741 if v_0.Op != OpS390XADDconst { 9742 break 9743 } 9744 d := v_0.AuxInt 9745 idx := v_0.Args[0] 9746 ptr := v.Args[1] 9747 val := v.Args[2] 9748 mem := v.Args[3] 9749 v.reset(OpS390XMOVBstoreidx) 9750 v.AuxInt = c + d 9751 v.Aux = sym 9752 v.AddArg(ptr) 9753 v.AddArg(idx) 9754 v.AddArg(val) 9755 v.AddArg(mem) 9756 return true 9757 } 9758 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 9759 // cond: x.Uses == 1 && clobber(x) 9760 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9761 for { 9762 i := v.AuxInt 9763 s := v.Aux 9764 p := v.Args[0] 9765 idx := v.Args[1] 9766 w := v.Args[2] 9767 x := v.Args[3] 9768 if x.Op != OpS390XMOVBstoreidx { 9769 break 9770 } 9771 if x.AuxInt != i-1 { 9772 break 9773 } 9774 if x.Aux != s { 9775 break 9776 } 9777 if p != x.Args[0] { 9778 break 9779 } 9780 if idx != x.Args[1] { 9781 break 9782 } 9783 x_2 := x.Args[2] 9784 if x_2.Op != OpS390XSRDconst { 9785 break 9786 } 9787 if x_2.AuxInt != 8 { 9788 break 9789 } 9790 if w != x_2.Args[0] { 9791 break 9792 } 9793 mem := x.Args[3] 9794 if !(x.Uses == 1 && clobber(x)) { 9795 break 9796 } 9797 v.reset(OpS390XMOVHstoreidx) 9798 v.AuxInt = i - 1 9799 v.Aux = s 9800 v.AddArg(p) 9801 v.AddArg(idx) 9802 v.AddArg(w) 9803 v.AddArg(mem) 9804 return true 9805 } 9806 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 9807 // cond: x.Uses == 1 && clobber(x) 9808 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9809 for { 9810 i := v.AuxInt 9811 s := v.Aux 9812 p := v.Args[0] 9813 idx := v.Args[1] 9814 w := v.Args[2] 9815 x := v.Args[3] 9816 if x.Op != OpS390XMOVBstoreidx { 9817 break 9818 } 9819 if x.AuxInt != i-1 { 9820 break 9821 } 9822 if x.Aux != s { 9823 break 9824 } 9825 if idx != x.Args[0] { 9826 break 9827 } 9828 if p != x.Args[1] { 9829 break 9830 } 9831 x_2 := x.Args[2] 9832 if x_2.Op != OpS390XSRDconst { 9833 break 9834 } 9835 if x_2.AuxInt != 8 { 9836 break 9837 } 9838 if w != x_2.Args[0] { 9839 break 9840 } 9841 mem := x.Args[3] 9842 if !(x.Uses == 1 && clobber(x)) { 9843 break 9844 } 9845 v.reset(OpS390XMOVHstoreidx) 9846 v.AuxInt = i - 1 9847 v.Aux = s 9848 v.AddArg(p) 9849 v.AddArg(idx) 9850 v.AddArg(w) 9851 v.AddArg(mem) 9852 return true 9853 } 9854 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) 9855 // cond: x.Uses == 1 && clobber(x) 9856 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9857 for { 9858 i := v.AuxInt 9859 s := v.Aux 9860 idx := v.Args[0] 9861 p := v.Args[1] 9862 w := v.Args[2] 9863 x := v.Args[3] 9864 if x.Op != OpS390XMOVBstoreidx { 9865 break 9866 } 9867 if x.AuxInt != i-1 { 9868 break 9869 } 9870 if x.Aux != s { 9871 break 9872 } 9873 if p != x.Args[0] { 9874 break 9875 } 9876 if idx != x.Args[1] { 9877 break 9878 } 9879 x_2 := x.Args[2] 9880 if x_2.Op != OpS390XSRDconst { 9881 break 9882 } 9883 if x_2.AuxInt != 8 { 9884 break 9885 } 9886 if w != x_2.Args[0] { 9887 break 9888 } 9889 mem := x.Args[3] 9890 if !(x.Uses == 1 && clobber(x)) { 9891 break 9892 } 9893 v.reset(OpS390XMOVHstoreidx) 9894 v.AuxInt = i - 1 9895 v.Aux = s 9896 v.AddArg(p) 9897 v.AddArg(idx) 9898 v.AddArg(w) 9899 v.AddArg(mem) 9900 return true 9901 } 9902 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) 9903 // cond: x.Uses == 1 && clobber(x) 9904 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 9905 for { 9906 i := v.AuxInt 9907 s := v.Aux 9908 idx := v.Args[0] 9909 p := v.Args[1] 9910 w := v.Args[2] 9911 x := v.Args[3] 9912 if x.Op != OpS390XMOVBstoreidx { 9913 break 9914 } 9915 if x.AuxInt != i-1 { 9916 break 9917 } 9918 if x.Aux != s { 9919 break 9920 } 9921 if idx != x.Args[0] { 9922 break 9923 } 9924 if p != x.Args[1] { 9925 break 9926 } 9927 x_2 := x.Args[2] 9928 if x_2.Op != OpS390XSRDconst { 9929 break 9930 } 9931 if x_2.AuxInt != 8 { 9932 break 9933 } 9934 if w != x_2.Args[0] { 9935 break 9936 } 9937 mem := x.Args[3] 9938 if !(x.Uses == 1 && clobber(x)) { 9939 break 9940 } 9941 v.reset(OpS390XMOVHstoreidx) 9942 v.AuxInt = i - 1 9943 v.Aux = s 9944 v.AddArg(p) 9945 v.AddArg(idx) 9946 v.AddArg(w) 9947 v.AddArg(mem) 9948 return true 9949 } 9950 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 9951 // cond: x.Uses == 1 && clobber(x) 9952 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 9953 for { 9954 i := v.AuxInt 9955 s := v.Aux 9956 p := v.Args[0] 9957 idx := v.Args[1] 9958 w0 := v.Args[2] 9959 if w0.Op != OpS390XSRDconst { 9960 break 9961 } 9962 j := w0.AuxInt 9963 w := w0.Args[0] 9964 x := v.Args[3] 9965 if x.Op != OpS390XMOVBstoreidx { 9966 break 9967 } 9968 if x.AuxInt != i-1 { 9969 break 9970 } 9971 if x.Aux != s { 9972 break 9973 } 9974 if p != x.Args[0] { 9975 break 9976 } 9977 if idx != x.Args[1] { 9978 break 9979 } 9980 x_2 := x.Args[2] 9981 if x_2.Op != OpS390XSRDconst { 9982 break 9983 } 9984 if x_2.AuxInt != j+8 { 9985 break 9986 } 9987 if w != x_2.Args[0] { 9988 break 9989 } 9990 mem := x.Args[3] 9991 if !(x.Uses == 1 && clobber(x)) { 9992 break 9993 } 9994 v.reset(OpS390XMOVHstoreidx) 9995 v.AuxInt = i - 1 9996 v.Aux = s 9997 v.AddArg(p) 9998 v.AddArg(idx) 9999 v.AddArg(w0) 10000 v.AddArg(mem) 10001 return true 10002 } 10003 // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10004 // cond: x.Uses == 1 && clobber(x) 10005 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10006 for { 10007 i := v.AuxInt 10008 s := v.Aux 10009 p := v.Args[0] 10010 idx := v.Args[1] 10011 w0 := v.Args[2] 10012 if w0.Op != OpS390XSRDconst { 10013 break 10014 } 10015 j := w0.AuxInt 10016 w := w0.Args[0] 10017 x := v.Args[3] 10018 if x.Op != OpS390XMOVBstoreidx { 10019 break 10020 } 10021 if x.AuxInt != i-1 { 10022 break 10023 } 10024 if x.Aux != s { 10025 break 10026 } 10027 if idx != x.Args[0] { 10028 break 10029 } 10030 if p != x.Args[1] { 10031 break 10032 } 10033 x_2 := x.Args[2] 10034 if x_2.Op != OpS390XSRDconst { 10035 break 10036 } 10037 if x_2.AuxInt != j+8 { 10038 break 10039 } 10040 if w != x_2.Args[0] { 10041 break 10042 } 10043 mem := x.Args[3] 10044 if !(x.Uses == 1 && clobber(x)) { 10045 break 10046 } 10047 v.reset(OpS390XMOVHstoreidx) 10048 v.AuxInt = i - 1 10049 v.Aux = s 10050 v.AddArg(p) 10051 v.AddArg(idx) 10052 v.AddArg(w0) 10053 v.AddArg(mem) 10054 return true 10055 } 10056 return false 10057 } 10058 func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { 10059 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) 10060 // cond: x.Uses == 1 && clobber(x) 10061 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10062 for { 10063 i := v.AuxInt 10064 s := v.Aux 10065 idx := v.Args[0] 10066 p := v.Args[1] 10067 w0 := v.Args[2] 10068 if w0.Op != OpS390XSRDconst { 10069 break 10070 } 10071 j := w0.AuxInt 10072 w := w0.Args[0] 10073 x := v.Args[3] 10074 if x.Op != OpS390XMOVBstoreidx { 10075 break 10076 } 10077 if x.AuxInt != i-1 { 10078 break 10079 } 10080 if x.Aux != s { 10081 break 10082 } 10083 if p != x.Args[0] { 10084 break 10085 } 10086 if idx != x.Args[1] { 10087 break 10088 } 10089 x_2 := x.Args[2] 10090 if x_2.Op != OpS390XSRDconst { 10091 break 10092 } 10093 if x_2.AuxInt != j+8 { 10094 break 10095 } 10096 if w != x_2.Args[0] { 10097 break 10098 } 10099 mem := x.Args[3] 10100 if !(x.Uses == 1 && clobber(x)) { 10101 break 10102 } 10103 v.reset(OpS390XMOVHstoreidx) 10104 v.AuxInt = i - 1 10105 v.Aux = s 10106 v.AddArg(p) 10107 v.AddArg(idx) 10108 v.AddArg(w0) 10109 v.AddArg(mem) 10110 return true 10111 } 10112 // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) 10113 // cond: x.Uses == 1 && clobber(x) 10114 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10115 for { 10116 i := v.AuxInt 10117 s := v.Aux 10118 idx := v.Args[0] 10119 p := v.Args[1] 10120 w0 := v.Args[2] 10121 if w0.Op != OpS390XSRDconst { 10122 break 10123 } 10124 j := w0.AuxInt 10125 w := w0.Args[0] 10126 x := v.Args[3] 10127 if x.Op != OpS390XMOVBstoreidx { 10128 break 10129 } 10130 if x.AuxInt != i-1 { 10131 break 10132 } 10133 if x.Aux != s { 10134 break 10135 } 10136 if idx != x.Args[0] { 10137 break 10138 } 10139 if p != x.Args[1] { 10140 break 10141 } 10142 x_2 := x.Args[2] 10143 if x_2.Op != OpS390XSRDconst { 10144 break 10145 } 10146 if x_2.AuxInt != j+8 { 10147 break 10148 } 10149 if w != x_2.Args[0] { 10150 break 10151 } 10152 mem := x.Args[3] 10153 if !(x.Uses == 1 && clobber(x)) { 10154 break 10155 } 10156 v.reset(OpS390XMOVHstoreidx) 10157 v.AuxInt = i - 1 10158 v.Aux = s 10159 v.AddArg(p) 10160 v.AddArg(idx) 10161 v.AddArg(w0) 10162 v.AddArg(mem) 10163 return true 10164 } 10165 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10166 // cond: x.Uses == 1 && clobber(x) 10167 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10168 for { 10169 i := v.AuxInt 10170 s := v.Aux 10171 p := v.Args[0] 10172 idx := v.Args[1] 10173 w := v.Args[2] 10174 x := v.Args[3] 10175 if x.Op != OpS390XMOVBstoreidx { 10176 break 10177 } 10178 if x.AuxInt != i-1 { 10179 break 10180 } 10181 if x.Aux != s { 10182 break 10183 } 10184 if p != x.Args[0] { 10185 break 10186 } 10187 if idx != x.Args[1] { 10188 break 10189 } 10190 x_2 := x.Args[2] 10191 if x_2.Op != OpS390XSRWconst { 10192 break 10193 } 10194 if x_2.AuxInt != 8 { 10195 break 10196 } 10197 if w != x_2.Args[0] { 10198 break 10199 } 10200 mem := x.Args[3] 10201 if !(x.Uses == 1 && clobber(x)) { 10202 break 10203 } 10204 v.reset(OpS390XMOVHstoreidx) 10205 v.AuxInt = i - 1 10206 v.Aux = s 10207 v.AddArg(p) 10208 v.AddArg(idx) 10209 v.AddArg(w) 10210 v.AddArg(mem) 10211 return true 10212 } 10213 // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10214 // cond: x.Uses == 1 && clobber(x) 10215 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10216 for { 10217 i := v.AuxInt 10218 s := v.Aux 10219 p := v.Args[0] 10220 idx := v.Args[1] 10221 w := v.Args[2] 10222 x := v.Args[3] 10223 if x.Op != OpS390XMOVBstoreidx { 10224 break 10225 } 10226 if x.AuxInt != i-1 { 10227 break 10228 } 10229 if x.Aux != s { 10230 break 10231 } 10232 if idx != x.Args[0] { 10233 break 10234 } 10235 if p != x.Args[1] { 10236 break 10237 } 10238 x_2 := x.Args[2] 10239 if x_2.Op != OpS390XSRWconst { 10240 break 10241 } 10242 if x_2.AuxInt != 8 { 10243 break 10244 } 10245 if w != x_2.Args[0] { 10246 break 10247 } 10248 mem := x.Args[3] 10249 if !(x.Uses == 1 && clobber(x)) { 10250 break 10251 } 10252 v.reset(OpS390XMOVHstoreidx) 10253 v.AuxInt = i - 1 10254 v.Aux = s 10255 v.AddArg(p) 10256 v.AddArg(idx) 10257 v.AddArg(w) 10258 v.AddArg(mem) 10259 return true 10260 } 10261 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) 10262 // cond: x.Uses == 1 && clobber(x) 10263 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10264 for { 10265 i := v.AuxInt 10266 s := v.Aux 10267 idx := v.Args[0] 10268 p := v.Args[1] 10269 w := v.Args[2] 10270 x := v.Args[3] 10271 if x.Op != OpS390XMOVBstoreidx { 10272 break 10273 } 10274 if x.AuxInt != i-1 { 10275 break 10276 } 10277 if x.Aux != s { 10278 break 10279 } 10280 if p != x.Args[0] { 10281 break 10282 } 10283 if idx != x.Args[1] { 10284 break 10285 } 10286 x_2 := x.Args[2] 10287 if x_2.Op != OpS390XSRWconst { 10288 break 10289 } 10290 if x_2.AuxInt != 8 { 10291 break 10292 } 10293 if w != x_2.Args[0] { 10294 break 10295 } 10296 mem := x.Args[3] 10297 if !(x.Uses == 1 && clobber(x)) { 10298 break 10299 } 10300 v.reset(OpS390XMOVHstoreidx) 10301 v.AuxInt = i - 1 10302 v.Aux = s 10303 v.AddArg(p) 10304 v.AddArg(idx) 10305 v.AddArg(w) 10306 v.AddArg(mem) 10307 return true 10308 } 10309 // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) 10310 // cond: x.Uses == 1 && clobber(x) 10311 // result: (MOVHstoreidx [i-1] {s} p idx w mem) 10312 for { 10313 i := v.AuxInt 10314 s := v.Aux 10315 idx := v.Args[0] 10316 p := v.Args[1] 10317 w := v.Args[2] 10318 x := v.Args[3] 10319 if x.Op != OpS390XMOVBstoreidx { 10320 break 10321 } 10322 if x.AuxInt != i-1 { 10323 break 10324 } 10325 if x.Aux != s { 10326 break 10327 } 10328 if idx != x.Args[0] { 10329 break 10330 } 10331 if p != x.Args[1] { 10332 break 10333 } 10334 x_2 := x.Args[2] 10335 if x_2.Op != OpS390XSRWconst { 10336 break 10337 } 10338 if x_2.AuxInt != 8 { 10339 break 10340 } 10341 if w != x_2.Args[0] { 10342 break 10343 } 10344 mem := x.Args[3] 10345 if !(x.Uses == 1 && clobber(x)) { 10346 break 10347 } 10348 v.reset(OpS390XMOVHstoreidx) 10349 v.AuxInt = i - 1 10350 v.Aux = s 10351 v.AddArg(p) 10352 v.AddArg(idx) 10353 v.AddArg(w) 10354 v.AddArg(mem) 10355 return true 10356 } 10357 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 10358 // cond: x.Uses == 1 && clobber(x) 10359 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10360 for { 10361 i := v.AuxInt 10362 s := v.Aux 10363 p := v.Args[0] 10364 idx := v.Args[1] 10365 w0 := v.Args[2] 10366 if w0.Op != OpS390XSRWconst { 10367 break 10368 } 10369 j := w0.AuxInt 10370 w := w0.Args[0] 10371 x := v.Args[3] 10372 if x.Op != OpS390XMOVBstoreidx { 10373 break 10374 } 10375 if x.AuxInt != i-1 { 10376 break 10377 } 10378 if x.Aux != s { 10379 break 10380 } 10381 if p != x.Args[0] { 10382 break 10383 } 10384 if idx != x.Args[1] { 10385 break 10386 } 10387 x_2 := x.Args[2] 10388 if x_2.Op != OpS390XSRWconst { 10389 break 10390 } 10391 if x_2.AuxInt != j+8 { 10392 break 10393 } 10394 if w != x_2.Args[0] { 10395 break 10396 } 10397 mem := x.Args[3] 10398 if !(x.Uses == 1 && clobber(x)) { 10399 break 10400 } 10401 v.reset(OpS390XMOVHstoreidx) 10402 v.AuxInt = i - 1 10403 v.Aux = s 10404 v.AddArg(p) 10405 v.AddArg(idx) 10406 v.AddArg(w0) 10407 v.AddArg(mem) 10408 return true 10409 } 10410 // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10411 // cond: x.Uses == 1 && clobber(x) 10412 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10413 for { 10414 i := v.AuxInt 10415 s := v.Aux 10416 p := v.Args[0] 10417 idx := v.Args[1] 10418 w0 := v.Args[2] 10419 if w0.Op != OpS390XSRWconst { 10420 break 10421 } 10422 j := w0.AuxInt 10423 w := w0.Args[0] 10424 x := v.Args[3] 10425 if x.Op != OpS390XMOVBstoreidx { 10426 break 10427 } 10428 if x.AuxInt != i-1 { 10429 break 10430 } 10431 if x.Aux != s { 10432 break 10433 } 10434 if idx != x.Args[0] { 10435 break 10436 } 10437 if p != x.Args[1] { 10438 break 10439 } 10440 x_2 := x.Args[2] 10441 if x_2.Op != OpS390XSRWconst { 10442 break 10443 } 10444 if x_2.AuxInt != j+8 { 10445 break 10446 } 10447 if w != x_2.Args[0] { 10448 break 10449 } 10450 mem := x.Args[3] 10451 if !(x.Uses == 1 && clobber(x)) { 10452 break 10453 } 10454 v.reset(OpS390XMOVHstoreidx) 10455 v.AuxInt = i - 1 10456 v.Aux = s 10457 v.AddArg(p) 10458 v.AddArg(idx) 10459 v.AddArg(w0) 10460 v.AddArg(mem) 10461 return true 10462 } 10463 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) 10464 // cond: x.Uses == 1 && clobber(x) 10465 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10466 for { 10467 i := v.AuxInt 10468 s := v.Aux 10469 idx := v.Args[0] 10470 p := v.Args[1] 10471 w0 := v.Args[2] 10472 if w0.Op != OpS390XSRWconst { 10473 break 10474 } 10475 j := w0.AuxInt 10476 w := w0.Args[0] 10477 x := v.Args[3] 10478 if x.Op != OpS390XMOVBstoreidx { 10479 break 10480 } 10481 if x.AuxInt != i-1 { 10482 break 10483 } 10484 if x.Aux != s { 10485 break 10486 } 10487 if p != x.Args[0] { 10488 break 10489 } 10490 if idx != x.Args[1] { 10491 break 10492 } 10493 x_2 := x.Args[2] 10494 if x_2.Op != OpS390XSRWconst { 10495 break 10496 } 10497 if x_2.AuxInt != j+8 { 10498 break 10499 } 10500 if w != x_2.Args[0] { 10501 break 10502 } 10503 mem := x.Args[3] 10504 if !(x.Uses == 1 && clobber(x)) { 10505 break 10506 } 10507 v.reset(OpS390XMOVHstoreidx) 10508 v.AuxInt = i - 1 10509 v.Aux = s 10510 v.AddArg(p) 10511 v.AddArg(idx) 10512 v.AddArg(w0) 10513 v.AddArg(mem) 10514 return true 10515 } 10516 // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) 10517 // cond: x.Uses == 1 && clobber(x) 10518 // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) 10519 for { 10520 i := v.AuxInt 10521 s := v.Aux 10522 idx := v.Args[0] 10523 p := v.Args[1] 10524 w0 := v.Args[2] 10525 if w0.Op != OpS390XSRWconst { 10526 break 10527 } 10528 j := w0.AuxInt 10529 w := w0.Args[0] 10530 x := v.Args[3] 10531 if x.Op != OpS390XMOVBstoreidx { 10532 break 10533 } 10534 if x.AuxInt != i-1 { 10535 break 10536 } 10537 if x.Aux != s { 10538 break 10539 } 10540 if idx != x.Args[0] { 10541 break 10542 } 10543 if p != x.Args[1] { 10544 break 10545 } 10546 x_2 := x.Args[2] 10547 if x_2.Op != OpS390XSRWconst { 10548 break 10549 } 10550 if x_2.AuxInt != j+8 { 10551 break 10552 } 10553 if w != x_2.Args[0] { 10554 break 10555 } 10556 mem := x.Args[3] 10557 if !(x.Uses == 1 && clobber(x)) { 10558 break 10559 } 10560 v.reset(OpS390XMOVHstoreidx) 10561 v.AuxInt = i - 1 10562 v.Aux = s 10563 v.AddArg(p) 10564 v.AddArg(idx) 10565 v.AddArg(w0) 10566 v.AddArg(mem) 10567 return true 10568 } 10569 return false 10570 } 10571 func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { 10572 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 10573 // cond: x.Uses == 1 && clobber(x) 10574 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10575 for { 10576 i := v.AuxInt 10577 s := v.Aux 10578 p := v.Args[0] 10579 idx := v.Args[1] 10580 v_2 := v.Args[2] 10581 if v_2.Op != OpS390XSRDconst { 10582 break 10583 } 10584 if v_2.AuxInt != 8 { 10585 break 10586 } 10587 w := v_2.Args[0] 10588 x := v.Args[3] 10589 if x.Op != OpS390XMOVBstoreidx { 10590 break 10591 } 10592 if x.AuxInt != i-1 { 10593 break 10594 } 10595 if x.Aux != s { 10596 break 10597 } 10598 if p != x.Args[0] { 10599 break 10600 } 10601 if idx != x.Args[1] { 10602 break 10603 } 10604 if w != x.Args[2] { 10605 break 10606 } 10607 mem := x.Args[3] 10608 if !(x.Uses == 1 && clobber(x)) { 10609 break 10610 } 10611 v.reset(OpS390XMOVHBRstoreidx) 10612 v.AuxInt = i - 1 10613 v.Aux = s 10614 v.AddArg(p) 10615 v.AddArg(idx) 10616 v.AddArg(w) 10617 v.AddArg(mem) 10618 return true 10619 } 10620 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 10621 // cond: x.Uses == 1 && clobber(x) 10622 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10623 for { 10624 i := v.AuxInt 10625 s := v.Aux 10626 p := v.Args[0] 10627 idx := v.Args[1] 10628 v_2 := v.Args[2] 10629 if v_2.Op != OpS390XSRDconst { 10630 break 10631 } 10632 if v_2.AuxInt != 8 { 10633 break 10634 } 10635 w := v_2.Args[0] 10636 x := v.Args[3] 10637 if x.Op != OpS390XMOVBstoreidx { 10638 break 10639 } 10640 if x.AuxInt != i-1 { 10641 break 10642 } 10643 if x.Aux != s { 10644 break 10645 } 10646 if idx != x.Args[0] { 10647 break 10648 } 10649 if p != x.Args[1] { 10650 break 10651 } 10652 if w != x.Args[2] { 10653 break 10654 } 10655 mem := x.Args[3] 10656 if !(x.Uses == 1 && clobber(x)) { 10657 break 10658 } 10659 v.reset(OpS390XMOVHBRstoreidx) 10660 v.AuxInt = i - 1 10661 v.Aux = s 10662 v.AddArg(p) 10663 v.AddArg(idx) 10664 v.AddArg(w) 10665 v.AddArg(mem) 10666 return true 10667 } 10668 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 10669 // cond: x.Uses == 1 && clobber(x) 10670 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10671 for { 10672 i := v.AuxInt 10673 s := v.Aux 10674 idx := v.Args[0] 10675 p := v.Args[1] 10676 v_2 := v.Args[2] 10677 if v_2.Op != OpS390XSRDconst { 10678 break 10679 } 10680 if v_2.AuxInt != 8 { 10681 break 10682 } 10683 w := v_2.Args[0] 10684 x := v.Args[3] 10685 if x.Op != OpS390XMOVBstoreidx { 10686 break 10687 } 10688 if x.AuxInt != i-1 { 10689 break 10690 } 10691 if x.Aux != s { 10692 break 10693 } 10694 if p != x.Args[0] { 10695 break 10696 } 10697 if idx != x.Args[1] { 10698 break 10699 } 10700 if w != x.Args[2] { 10701 break 10702 } 10703 mem := x.Args[3] 10704 if !(x.Uses == 1 && clobber(x)) { 10705 break 10706 } 10707 v.reset(OpS390XMOVHBRstoreidx) 10708 v.AuxInt = i - 1 10709 v.Aux = s 10710 v.AddArg(p) 10711 v.AddArg(idx) 10712 v.AddArg(w) 10713 v.AddArg(mem) 10714 return true 10715 } 10716 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 10717 // cond: x.Uses == 1 && clobber(x) 10718 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10719 for { 10720 i := v.AuxInt 10721 s := v.Aux 10722 idx := v.Args[0] 10723 p := v.Args[1] 10724 v_2 := v.Args[2] 10725 if v_2.Op != OpS390XSRDconst { 10726 break 10727 } 10728 if v_2.AuxInt != 8 { 10729 break 10730 } 10731 w := v_2.Args[0] 10732 x := v.Args[3] 10733 if x.Op != OpS390XMOVBstoreidx { 10734 break 10735 } 10736 if x.AuxInt != i-1 { 10737 break 10738 } 10739 if x.Aux != s { 10740 break 10741 } 10742 if idx != x.Args[0] { 10743 break 10744 } 10745 if p != x.Args[1] { 10746 break 10747 } 10748 if w != x.Args[2] { 10749 break 10750 } 10751 mem := x.Args[3] 10752 if !(x.Uses == 1 && clobber(x)) { 10753 break 10754 } 10755 v.reset(OpS390XMOVHBRstoreidx) 10756 v.AuxInt = i - 1 10757 v.Aux = s 10758 v.AddArg(p) 10759 v.AddArg(idx) 10760 v.AddArg(w) 10761 v.AddArg(mem) 10762 return true 10763 } 10764 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 10765 // cond: x.Uses == 1 && clobber(x) 10766 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 10767 for { 10768 i := v.AuxInt 10769 s := v.Aux 10770 p := v.Args[0] 10771 idx := v.Args[1] 10772 v_2 := v.Args[2] 10773 if v_2.Op != OpS390XSRDconst { 10774 break 10775 } 10776 j := v_2.AuxInt 10777 w := v_2.Args[0] 10778 x := v.Args[3] 10779 if x.Op != OpS390XMOVBstoreidx { 10780 break 10781 } 10782 if x.AuxInt != i-1 { 10783 break 10784 } 10785 if x.Aux != s { 10786 break 10787 } 10788 if p != x.Args[0] { 10789 break 10790 } 10791 if idx != x.Args[1] { 10792 break 10793 } 10794 w0 := x.Args[2] 10795 if w0.Op != OpS390XSRDconst { 10796 break 10797 } 10798 if w0.AuxInt != j-8 { 10799 break 10800 } 10801 if w != w0.Args[0] { 10802 break 10803 } 10804 mem := x.Args[3] 10805 if !(x.Uses == 1 && clobber(x)) { 10806 break 10807 } 10808 v.reset(OpS390XMOVHBRstoreidx) 10809 v.AuxInt = i - 1 10810 v.Aux = s 10811 v.AddArg(p) 10812 v.AddArg(idx) 10813 v.AddArg(w0) 10814 v.AddArg(mem) 10815 return true 10816 } 10817 // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 10818 // cond: x.Uses == 1 && clobber(x) 10819 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 10820 for { 10821 i := v.AuxInt 10822 s := v.Aux 10823 p := v.Args[0] 10824 idx := v.Args[1] 10825 v_2 := v.Args[2] 10826 if v_2.Op != OpS390XSRDconst { 10827 break 10828 } 10829 j := v_2.AuxInt 10830 w := v_2.Args[0] 10831 x := v.Args[3] 10832 if x.Op != OpS390XMOVBstoreidx { 10833 break 10834 } 10835 if x.AuxInt != i-1 { 10836 break 10837 } 10838 if x.Aux != s { 10839 break 10840 } 10841 if idx != x.Args[0] { 10842 break 10843 } 10844 if p != x.Args[1] { 10845 break 10846 } 10847 w0 := x.Args[2] 10848 if w0.Op != OpS390XSRDconst { 10849 break 10850 } 10851 if w0.AuxInt != j-8 { 10852 break 10853 } 10854 if w != w0.Args[0] { 10855 break 10856 } 10857 mem := x.Args[3] 10858 if !(x.Uses == 1 && clobber(x)) { 10859 break 10860 } 10861 v.reset(OpS390XMOVHBRstoreidx) 10862 v.AuxInt = i - 1 10863 v.Aux = s 10864 v.AddArg(p) 10865 v.AddArg(idx) 10866 v.AddArg(w0) 10867 v.AddArg(mem) 10868 return true 10869 } 10870 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) 10871 // cond: x.Uses == 1 && clobber(x) 10872 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 10873 for { 10874 i := v.AuxInt 10875 s := v.Aux 10876 idx := v.Args[0] 10877 p := v.Args[1] 10878 v_2 := v.Args[2] 10879 if v_2.Op != OpS390XSRDconst { 10880 break 10881 } 10882 j := v_2.AuxInt 10883 w := v_2.Args[0] 10884 x := v.Args[3] 10885 if x.Op != OpS390XMOVBstoreidx { 10886 break 10887 } 10888 if x.AuxInt != i-1 { 10889 break 10890 } 10891 if x.Aux != s { 10892 break 10893 } 10894 if p != x.Args[0] { 10895 break 10896 } 10897 if idx != x.Args[1] { 10898 break 10899 } 10900 w0 := x.Args[2] 10901 if w0.Op != OpS390XSRDconst { 10902 break 10903 } 10904 if w0.AuxInt != j-8 { 10905 break 10906 } 10907 if w != w0.Args[0] { 10908 break 10909 } 10910 mem := x.Args[3] 10911 if !(x.Uses == 1 && clobber(x)) { 10912 break 10913 } 10914 v.reset(OpS390XMOVHBRstoreidx) 10915 v.AuxInt = i - 1 10916 v.Aux = s 10917 v.AddArg(p) 10918 v.AddArg(idx) 10919 v.AddArg(w0) 10920 v.AddArg(mem) 10921 return true 10922 } 10923 // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) 10924 // cond: x.Uses == 1 && clobber(x) 10925 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 10926 for { 10927 i := v.AuxInt 10928 s := v.Aux 10929 idx := v.Args[0] 10930 p := v.Args[1] 10931 v_2 := v.Args[2] 10932 if v_2.Op != OpS390XSRDconst { 10933 break 10934 } 10935 j := v_2.AuxInt 10936 w := v_2.Args[0] 10937 x := v.Args[3] 10938 if x.Op != OpS390XMOVBstoreidx { 10939 break 10940 } 10941 if x.AuxInt != i-1 { 10942 break 10943 } 10944 if x.Aux != s { 10945 break 10946 } 10947 if idx != x.Args[0] { 10948 break 10949 } 10950 if p != x.Args[1] { 10951 break 10952 } 10953 w0 := x.Args[2] 10954 if w0.Op != OpS390XSRDconst { 10955 break 10956 } 10957 if w0.AuxInt != j-8 { 10958 break 10959 } 10960 if w != w0.Args[0] { 10961 break 10962 } 10963 mem := x.Args[3] 10964 if !(x.Uses == 1 && clobber(x)) { 10965 break 10966 } 10967 v.reset(OpS390XMOVHBRstoreidx) 10968 v.AuxInt = i - 1 10969 v.Aux = s 10970 v.AddArg(p) 10971 v.AddArg(idx) 10972 v.AddArg(w0) 10973 v.AddArg(mem) 10974 return true 10975 } 10976 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 10977 // cond: x.Uses == 1 && clobber(x) 10978 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 10979 for { 10980 i := v.AuxInt 10981 s := v.Aux 10982 p := v.Args[0] 10983 idx := v.Args[1] 10984 v_2 := v.Args[2] 10985 if v_2.Op != OpS390XSRWconst { 10986 break 10987 } 10988 if v_2.AuxInt != 8 { 10989 break 10990 } 10991 w := v_2.Args[0] 10992 x := v.Args[3] 10993 if x.Op != OpS390XMOVBstoreidx { 10994 break 10995 } 10996 if x.AuxInt != i-1 { 10997 break 10998 } 10999 if x.Aux != s { 11000 break 11001 } 11002 if p != x.Args[0] { 11003 break 11004 } 11005 if idx != x.Args[1] { 11006 break 11007 } 11008 if w != x.Args[2] { 11009 break 11010 } 11011 mem := x.Args[3] 11012 if !(x.Uses == 1 && clobber(x)) { 11013 break 11014 } 11015 v.reset(OpS390XMOVHBRstoreidx) 11016 v.AuxInt = i - 1 11017 v.Aux = s 11018 v.AddArg(p) 11019 v.AddArg(idx) 11020 v.AddArg(w) 11021 v.AddArg(mem) 11022 return true 11023 } 11024 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11025 // cond: x.Uses == 1 && clobber(x) 11026 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11027 for { 11028 i := v.AuxInt 11029 s := v.Aux 11030 p := v.Args[0] 11031 idx := v.Args[1] 11032 v_2 := v.Args[2] 11033 if v_2.Op != OpS390XSRWconst { 11034 break 11035 } 11036 if v_2.AuxInt != 8 { 11037 break 11038 } 11039 w := v_2.Args[0] 11040 x := v.Args[3] 11041 if x.Op != OpS390XMOVBstoreidx { 11042 break 11043 } 11044 if x.AuxInt != i-1 { 11045 break 11046 } 11047 if x.Aux != s { 11048 break 11049 } 11050 if idx != x.Args[0] { 11051 break 11052 } 11053 if p != x.Args[1] { 11054 break 11055 } 11056 if w != x.Args[2] { 11057 break 11058 } 11059 mem := x.Args[3] 11060 if !(x.Uses == 1 && clobber(x)) { 11061 break 11062 } 11063 v.reset(OpS390XMOVHBRstoreidx) 11064 v.AuxInt = i - 1 11065 v.Aux = s 11066 v.AddArg(p) 11067 v.AddArg(idx) 11068 v.AddArg(w) 11069 v.AddArg(mem) 11070 return true 11071 } 11072 return false 11073 } 11074 func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { 11075 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) 11076 // cond: x.Uses == 1 && clobber(x) 11077 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11078 for { 11079 i := v.AuxInt 11080 s := v.Aux 11081 idx := v.Args[0] 11082 p := v.Args[1] 11083 v_2 := v.Args[2] 11084 if v_2.Op != OpS390XSRWconst { 11085 break 11086 } 11087 if v_2.AuxInt != 8 { 11088 break 11089 } 11090 w := v_2.Args[0] 11091 x := v.Args[3] 11092 if x.Op != OpS390XMOVBstoreidx { 11093 break 11094 } 11095 if x.AuxInt != i-1 { 11096 break 11097 } 11098 if x.Aux != s { 11099 break 11100 } 11101 if p != x.Args[0] { 11102 break 11103 } 11104 if idx != x.Args[1] { 11105 break 11106 } 11107 if w != x.Args[2] { 11108 break 11109 } 11110 mem := x.Args[3] 11111 if !(x.Uses == 1 && clobber(x)) { 11112 break 11113 } 11114 v.reset(OpS390XMOVHBRstoreidx) 11115 v.AuxInt = i - 1 11116 v.Aux = s 11117 v.AddArg(p) 11118 v.AddArg(idx) 11119 v.AddArg(w) 11120 v.AddArg(mem) 11121 return true 11122 } 11123 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) 11124 // cond: x.Uses == 1 && clobber(x) 11125 // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) 11126 for { 11127 i := v.AuxInt 11128 s := v.Aux 11129 idx := v.Args[0] 11130 p := v.Args[1] 11131 v_2 := v.Args[2] 11132 if v_2.Op != OpS390XSRWconst { 11133 break 11134 } 11135 if v_2.AuxInt != 8 { 11136 break 11137 } 11138 w := v_2.Args[0] 11139 x := v.Args[3] 11140 if x.Op != OpS390XMOVBstoreidx { 11141 break 11142 } 11143 if x.AuxInt != i-1 { 11144 break 11145 } 11146 if x.Aux != s { 11147 break 11148 } 11149 if idx != x.Args[0] { 11150 break 11151 } 11152 if p != x.Args[1] { 11153 break 11154 } 11155 if w != x.Args[2] { 11156 break 11157 } 11158 mem := x.Args[3] 11159 if !(x.Uses == 1 && clobber(x)) { 11160 break 11161 } 11162 v.reset(OpS390XMOVHBRstoreidx) 11163 v.AuxInt = i - 1 11164 v.Aux = s 11165 v.AddArg(p) 11166 v.AddArg(idx) 11167 v.AddArg(w) 11168 v.AddArg(mem) 11169 return true 11170 } 11171 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 11172 // cond: x.Uses == 1 && clobber(x) 11173 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11174 for { 11175 i := v.AuxInt 11176 s := v.Aux 11177 p := v.Args[0] 11178 idx := v.Args[1] 11179 v_2 := v.Args[2] 11180 if v_2.Op != OpS390XSRWconst { 11181 break 11182 } 11183 j := v_2.AuxInt 11184 w := v_2.Args[0] 11185 x := v.Args[3] 11186 if x.Op != OpS390XMOVBstoreidx { 11187 break 11188 } 11189 if x.AuxInt != i-1 { 11190 break 11191 } 11192 if x.Aux != s { 11193 break 11194 } 11195 if p != x.Args[0] { 11196 break 11197 } 11198 if idx != x.Args[1] { 11199 break 11200 } 11201 w0 := x.Args[2] 11202 if w0.Op != OpS390XSRWconst { 11203 break 11204 } 11205 if w0.AuxInt != j-8 { 11206 break 11207 } 11208 if w != w0.Args[0] { 11209 break 11210 } 11211 mem := x.Args[3] 11212 if !(x.Uses == 1 && clobber(x)) { 11213 break 11214 } 11215 v.reset(OpS390XMOVHBRstoreidx) 11216 v.AuxInt = i - 1 11217 v.Aux = s 11218 v.AddArg(p) 11219 v.AddArg(idx) 11220 v.AddArg(w0) 11221 v.AddArg(mem) 11222 return true 11223 } 11224 // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11225 // cond: x.Uses == 1 && clobber(x) 11226 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11227 for { 11228 i := v.AuxInt 11229 s := v.Aux 11230 p := v.Args[0] 11231 idx := v.Args[1] 11232 v_2 := v.Args[2] 11233 if v_2.Op != OpS390XSRWconst { 11234 break 11235 } 11236 j := v_2.AuxInt 11237 w := v_2.Args[0] 11238 x := v.Args[3] 11239 if x.Op != OpS390XMOVBstoreidx { 11240 break 11241 } 11242 if x.AuxInt != i-1 { 11243 break 11244 } 11245 if x.Aux != s { 11246 break 11247 } 11248 if idx != x.Args[0] { 11249 break 11250 } 11251 if p != x.Args[1] { 11252 break 11253 } 11254 w0 := x.Args[2] 11255 if w0.Op != OpS390XSRWconst { 11256 break 11257 } 11258 if w0.AuxInt != j-8 { 11259 break 11260 } 11261 if w != w0.Args[0] { 11262 break 11263 } 11264 mem := x.Args[3] 11265 if !(x.Uses == 1 && clobber(x)) { 11266 break 11267 } 11268 v.reset(OpS390XMOVHBRstoreidx) 11269 v.AuxInt = i - 1 11270 v.Aux = s 11271 v.AddArg(p) 11272 v.AddArg(idx) 11273 v.AddArg(w0) 11274 v.AddArg(mem) 11275 return true 11276 } 11277 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) 11278 // cond: x.Uses == 1 && clobber(x) 11279 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11280 for { 11281 i := v.AuxInt 11282 s := v.Aux 11283 idx := v.Args[0] 11284 p := v.Args[1] 11285 v_2 := v.Args[2] 11286 if v_2.Op != OpS390XSRWconst { 11287 break 11288 } 11289 j := v_2.AuxInt 11290 w := v_2.Args[0] 11291 x := v.Args[3] 11292 if x.Op != OpS390XMOVBstoreidx { 11293 break 11294 } 11295 if x.AuxInt != i-1 { 11296 break 11297 } 11298 if x.Aux != s { 11299 break 11300 } 11301 if p != x.Args[0] { 11302 break 11303 } 11304 if idx != x.Args[1] { 11305 break 11306 } 11307 w0 := x.Args[2] 11308 if w0.Op != OpS390XSRWconst { 11309 break 11310 } 11311 if w0.AuxInt != j-8 { 11312 break 11313 } 11314 if w != w0.Args[0] { 11315 break 11316 } 11317 mem := x.Args[3] 11318 if !(x.Uses == 1 && clobber(x)) { 11319 break 11320 } 11321 v.reset(OpS390XMOVHBRstoreidx) 11322 v.AuxInt = i - 1 11323 v.Aux = s 11324 v.AddArg(p) 11325 v.AddArg(idx) 11326 v.AddArg(w0) 11327 v.AddArg(mem) 11328 return true 11329 } 11330 // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) 11331 // cond: x.Uses == 1 && clobber(x) 11332 // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) 11333 for { 11334 i := v.AuxInt 11335 s := v.Aux 11336 idx := v.Args[0] 11337 p := v.Args[1] 11338 v_2 := v.Args[2] 11339 if v_2.Op != OpS390XSRWconst { 11340 break 11341 } 11342 j := v_2.AuxInt 11343 w := v_2.Args[0] 11344 x := v.Args[3] 11345 if x.Op != OpS390XMOVBstoreidx { 11346 break 11347 } 11348 if x.AuxInt != i-1 { 11349 break 11350 } 11351 if x.Aux != s { 11352 break 11353 } 11354 if idx != x.Args[0] { 11355 break 11356 } 11357 if p != x.Args[1] { 11358 break 11359 } 11360 w0 := x.Args[2] 11361 if w0.Op != OpS390XSRWconst { 11362 break 11363 } 11364 if w0.AuxInt != j-8 { 11365 break 11366 } 11367 if w != w0.Args[0] { 11368 break 11369 } 11370 mem := x.Args[3] 11371 if !(x.Uses == 1 && clobber(x)) { 11372 break 11373 } 11374 v.reset(OpS390XMOVHBRstoreidx) 11375 v.AuxInt = i - 1 11376 v.Aux = s 11377 v.AddArg(p) 11378 v.AddArg(idx) 11379 v.AddArg(w0) 11380 v.AddArg(mem) 11381 return true 11382 } 11383 return false 11384 } 11385 func rewriteValueS390X_OpS390XMOVDEQ_0(v *Value) bool { 11386 // match: (MOVDEQ x y (InvertFlags cmp)) 11387 // cond: 11388 // result: (MOVDEQ x y cmp) 11389 for { 11390 x := v.Args[0] 11391 y := v.Args[1] 11392 v_2 := v.Args[2] 11393 if v_2.Op != OpS390XInvertFlags { 11394 break 11395 } 11396 cmp := v_2.Args[0] 11397 v.reset(OpS390XMOVDEQ) 11398 v.AddArg(x) 11399 v.AddArg(y) 11400 v.AddArg(cmp) 11401 return true 11402 } 11403 // match: (MOVDEQ _ x (FlagEQ)) 11404 // cond: 11405 // result: x 11406 for { 11407 x := v.Args[1] 11408 v_2 := v.Args[2] 11409 if v_2.Op != OpS390XFlagEQ { 11410 break 11411 } 11412 v.reset(OpCopy) 11413 v.Type = x.Type 11414 v.AddArg(x) 11415 return true 11416 } 11417 // match: (MOVDEQ y _ (FlagLT)) 11418 // cond: 11419 // result: y 11420 for { 11421 y := v.Args[0] 11422 v_2 := v.Args[2] 11423 if v_2.Op != OpS390XFlagLT { 11424 break 11425 } 11426 v.reset(OpCopy) 11427 v.Type = y.Type 11428 v.AddArg(y) 11429 return true 11430 } 11431 // match: (MOVDEQ y _ (FlagGT)) 11432 // cond: 11433 // result: y 11434 for { 11435 y := v.Args[0] 11436 v_2 := v.Args[2] 11437 if v_2.Op != OpS390XFlagGT { 11438 break 11439 } 11440 v.reset(OpCopy) 11441 v.Type = y.Type 11442 v.AddArg(y) 11443 return true 11444 } 11445 return false 11446 } 11447 func rewriteValueS390X_OpS390XMOVDGE_0(v *Value) bool { 11448 // match: (MOVDGE x y (InvertFlags cmp)) 11449 // cond: 11450 // result: (MOVDLE x y cmp) 11451 for { 11452 x := v.Args[0] 11453 y := v.Args[1] 11454 v_2 := v.Args[2] 11455 if v_2.Op != OpS390XInvertFlags { 11456 break 11457 } 11458 cmp := v_2.Args[0] 11459 v.reset(OpS390XMOVDLE) 11460 v.AddArg(x) 11461 v.AddArg(y) 11462 v.AddArg(cmp) 11463 return true 11464 } 11465 // match: (MOVDGE _ x (FlagEQ)) 11466 // cond: 11467 // result: x 11468 for { 11469 x := v.Args[1] 11470 v_2 := v.Args[2] 11471 if v_2.Op != OpS390XFlagEQ { 11472 break 11473 } 11474 v.reset(OpCopy) 11475 v.Type = x.Type 11476 v.AddArg(x) 11477 return true 11478 } 11479 // match: (MOVDGE y _ (FlagLT)) 11480 // cond: 11481 // result: y 11482 for { 11483 y := v.Args[0] 11484 v_2 := v.Args[2] 11485 if v_2.Op != OpS390XFlagLT { 11486 break 11487 } 11488 v.reset(OpCopy) 11489 v.Type = y.Type 11490 v.AddArg(y) 11491 return true 11492 } 11493 // match: (MOVDGE _ x (FlagGT)) 11494 // cond: 11495 // result: x 11496 for { 11497 x := v.Args[1] 11498 v_2 := v.Args[2] 11499 if v_2.Op != OpS390XFlagGT { 11500 break 11501 } 11502 v.reset(OpCopy) 11503 v.Type = x.Type 11504 v.AddArg(x) 11505 return true 11506 } 11507 return false 11508 } 11509 func rewriteValueS390X_OpS390XMOVDGT_0(v *Value) bool { 11510 // match: (MOVDGT x y (InvertFlags cmp)) 11511 // cond: 11512 // result: (MOVDLT x y cmp) 11513 for { 11514 x := v.Args[0] 11515 y := v.Args[1] 11516 v_2 := v.Args[2] 11517 if v_2.Op != OpS390XInvertFlags { 11518 break 11519 } 11520 cmp := v_2.Args[0] 11521 v.reset(OpS390XMOVDLT) 11522 v.AddArg(x) 11523 v.AddArg(y) 11524 v.AddArg(cmp) 11525 return true 11526 } 11527 // match: (MOVDGT y _ (FlagEQ)) 11528 // cond: 11529 // result: y 11530 for { 11531 y := v.Args[0] 11532 v_2 := v.Args[2] 11533 if v_2.Op != OpS390XFlagEQ { 11534 break 11535 } 11536 v.reset(OpCopy) 11537 v.Type = y.Type 11538 v.AddArg(y) 11539 return true 11540 } 11541 // match: (MOVDGT y _ (FlagLT)) 11542 // cond: 11543 // result: y 11544 for { 11545 y := v.Args[0] 11546 v_2 := v.Args[2] 11547 if v_2.Op != OpS390XFlagLT { 11548 break 11549 } 11550 v.reset(OpCopy) 11551 v.Type = y.Type 11552 v.AddArg(y) 11553 return true 11554 } 11555 // match: (MOVDGT _ x (FlagGT)) 11556 // cond: 11557 // result: x 11558 for { 11559 x := v.Args[1] 11560 v_2 := v.Args[2] 11561 if v_2.Op != OpS390XFlagGT { 11562 break 11563 } 11564 v.reset(OpCopy) 11565 v.Type = x.Type 11566 v.AddArg(x) 11567 return true 11568 } 11569 return false 11570 } 11571 func rewriteValueS390X_OpS390XMOVDLE_0(v *Value) bool { 11572 // match: (MOVDLE x y (InvertFlags cmp)) 11573 // cond: 11574 // result: (MOVDGE x y cmp) 11575 for { 11576 x := v.Args[0] 11577 y := v.Args[1] 11578 v_2 := v.Args[2] 11579 if v_2.Op != OpS390XInvertFlags { 11580 break 11581 } 11582 cmp := v_2.Args[0] 11583 v.reset(OpS390XMOVDGE) 11584 v.AddArg(x) 11585 v.AddArg(y) 11586 v.AddArg(cmp) 11587 return true 11588 } 11589 // match: (MOVDLE _ x (FlagEQ)) 11590 // cond: 11591 // result: x 11592 for { 11593 x := v.Args[1] 11594 v_2 := v.Args[2] 11595 if v_2.Op != OpS390XFlagEQ { 11596 break 11597 } 11598 v.reset(OpCopy) 11599 v.Type = x.Type 11600 v.AddArg(x) 11601 return true 11602 } 11603 // match: (MOVDLE _ x (FlagLT)) 11604 // cond: 11605 // result: x 11606 for { 11607 x := v.Args[1] 11608 v_2 := v.Args[2] 11609 if v_2.Op != OpS390XFlagLT { 11610 break 11611 } 11612 v.reset(OpCopy) 11613 v.Type = x.Type 11614 v.AddArg(x) 11615 return true 11616 } 11617 // match: (MOVDLE y _ (FlagGT)) 11618 // cond: 11619 // result: y 11620 for { 11621 y := v.Args[0] 11622 v_2 := v.Args[2] 11623 if v_2.Op != OpS390XFlagGT { 11624 break 11625 } 11626 v.reset(OpCopy) 11627 v.Type = y.Type 11628 v.AddArg(y) 11629 return true 11630 } 11631 return false 11632 } 11633 func rewriteValueS390X_OpS390XMOVDLT_0(v *Value) bool { 11634 // match: (MOVDLT x y (InvertFlags cmp)) 11635 // cond: 11636 // result: (MOVDGT x y cmp) 11637 for { 11638 x := v.Args[0] 11639 y := v.Args[1] 11640 v_2 := v.Args[2] 11641 if v_2.Op != OpS390XInvertFlags { 11642 break 11643 } 11644 cmp := v_2.Args[0] 11645 v.reset(OpS390XMOVDGT) 11646 v.AddArg(x) 11647 v.AddArg(y) 11648 v.AddArg(cmp) 11649 return true 11650 } 11651 // match: (MOVDLT y _ (FlagEQ)) 11652 // cond: 11653 // result: y 11654 for { 11655 y := v.Args[0] 11656 v_2 := v.Args[2] 11657 if v_2.Op != OpS390XFlagEQ { 11658 break 11659 } 11660 v.reset(OpCopy) 11661 v.Type = y.Type 11662 v.AddArg(y) 11663 return true 11664 } 11665 // match: (MOVDLT _ x (FlagLT)) 11666 // cond: 11667 // result: x 11668 for { 11669 x := v.Args[1] 11670 v_2 := v.Args[2] 11671 if v_2.Op != OpS390XFlagLT { 11672 break 11673 } 11674 v.reset(OpCopy) 11675 v.Type = x.Type 11676 v.AddArg(x) 11677 return true 11678 } 11679 // match: (MOVDLT y _ (FlagGT)) 11680 // cond: 11681 // result: y 11682 for { 11683 y := v.Args[0] 11684 v_2 := v.Args[2] 11685 if v_2.Op != OpS390XFlagGT { 11686 break 11687 } 11688 v.reset(OpCopy) 11689 v.Type = y.Type 11690 v.AddArg(y) 11691 return true 11692 } 11693 return false 11694 } 11695 func rewriteValueS390X_OpS390XMOVDNE_0(v *Value) bool { 11696 // match: (MOVDNE x y (InvertFlags cmp)) 11697 // cond: 11698 // result: (MOVDNE x y cmp) 11699 for { 11700 x := v.Args[0] 11701 y := v.Args[1] 11702 v_2 := v.Args[2] 11703 if v_2.Op != OpS390XInvertFlags { 11704 break 11705 } 11706 cmp := v_2.Args[0] 11707 v.reset(OpS390XMOVDNE) 11708 v.AddArg(x) 11709 v.AddArg(y) 11710 v.AddArg(cmp) 11711 return true 11712 } 11713 // match: (MOVDNE y _ (FlagEQ)) 11714 // cond: 11715 // result: y 11716 for { 11717 y := v.Args[0] 11718 v_2 := v.Args[2] 11719 if v_2.Op != OpS390XFlagEQ { 11720 break 11721 } 11722 v.reset(OpCopy) 11723 v.Type = y.Type 11724 v.AddArg(y) 11725 return true 11726 } 11727 // match: (MOVDNE _ x (FlagLT)) 11728 // cond: 11729 // result: x 11730 for { 11731 x := v.Args[1] 11732 v_2 := v.Args[2] 11733 if v_2.Op != OpS390XFlagLT { 11734 break 11735 } 11736 v.reset(OpCopy) 11737 v.Type = x.Type 11738 v.AddArg(x) 11739 return true 11740 } 11741 // match: (MOVDNE _ x (FlagGT)) 11742 // cond: 11743 // result: x 11744 for { 11745 x := v.Args[1] 11746 v_2 := v.Args[2] 11747 if v_2.Op != OpS390XFlagGT { 11748 break 11749 } 11750 v.reset(OpCopy) 11751 v.Type = x.Type 11752 v.AddArg(x) 11753 return true 11754 } 11755 return false 11756 } 11757 func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { 11758 // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) 11759 // cond: is20Bit(c+d) && x.Op != OpSB 11760 // result: (MOVDaddridx [c+d] {s} x y) 11761 for { 11762 c := v.AuxInt 11763 s := v.Aux 11764 v_0 := v.Args[0] 11765 if v_0.Op != OpS390XADDconst { 11766 break 11767 } 11768 d := v_0.AuxInt 11769 x := v_0.Args[0] 11770 y := v.Args[1] 11771 if !(is20Bit(c+d) && x.Op != OpSB) { 11772 break 11773 } 11774 v.reset(OpS390XMOVDaddridx) 11775 v.AuxInt = c + d 11776 v.Aux = s 11777 v.AddArg(x) 11778 v.AddArg(y) 11779 return true 11780 } 11781 // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) 11782 // cond: is20Bit(c+d) && y.Op != OpSB 11783 // result: (MOVDaddridx [c+d] {s} x y) 11784 for { 11785 c := v.AuxInt 11786 s := v.Aux 11787 x := v.Args[0] 11788 v_1 := v.Args[1] 11789 if v_1.Op != OpS390XADDconst { 11790 break 11791 } 11792 d := v_1.AuxInt 11793 y := v_1.Args[0] 11794 if !(is20Bit(c+d) && y.Op != OpSB) { 11795 break 11796 } 11797 v.reset(OpS390XMOVDaddridx) 11798 v.AuxInt = c + d 11799 v.Aux = s 11800 v.AddArg(x) 11801 v.AddArg(y) 11802 return true 11803 } 11804 // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) 11805 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB 11806 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 11807 for { 11808 off1 := v.AuxInt 11809 sym1 := v.Aux 11810 v_0 := v.Args[0] 11811 if v_0.Op != OpS390XMOVDaddr { 11812 break 11813 } 11814 off2 := v_0.AuxInt 11815 sym2 := v_0.Aux 11816 x := v_0.Args[0] 11817 y := v.Args[1] 11818 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { 11819 break 11820 } 11821 v.reset(OpS390XMOVDaddridx) 11822 v.AuxInt = off1 + off2 11823 v.Aux = mergeSym(sym1, sym2) 11824 v.AddArg(x) 11825 v.AddArg(y) 11826 return true 11827 } 11828 // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) 11829 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB 11830 // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) 11831 for { 11832 off1 := v.AuxInt 11833 sym1 := v.Aux 11834 x := v.Args[0] 11835 v_1 := v.Args[1] 11836 if v_1.Op != OpS390XMOVDaddr { 11837 break 11838 } 11839 off2 := v_1.AuxInt 11840 sym2 := v_1.Aux 11841 y := v_1.Args[0] 11842 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { 11843 break 11844 } 11845 v.reset(OpS390XMOVDaddridx) 11846 v.AuxInt = off1 + off2 11847 v.Aux = mergeSym(sym1, sym2) 11848 v.AddArg(x) 11849 v.AddArg(y) 11850 return true 11851 } 11852 return false 11853 } 11854 func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { 11855 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 11856 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 11857 // result: (MOVDreg x) 11858 for { 11859 off := v.AuxInt 11860 sym := v.Aux 11861 ptr := v.Args[0] 11862 v_1 := v.Args[1] 11863 if v_1.Op != OpS390XMOVDstore { 11864 break 11865 } 11866 off2 := v_1.AuxInt 11867 sym2 := v_1.Aux 11868 ptr2 := v_1.Args[0] 11869 x := v_1.Args[1] 11870 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 11871 break 11872 } 11873 v.reset(OpS390XMOVDreg) 11874 v.AddArg(x) 11875 return true 11876 } 11877 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 11878 // cond: is20Bit(off1+off2) 11879 // result: (MOVDload [off1+off2] {sym} ptr mem) 11880 for { 11881 off1 := v.AuxInt 11882 sym := v.Aux 11883 v_0 := v.Args[0] 11884 if v_0.Op != OpS390XADDconst { 11885 break 11886 } 11887 off2 := v_0.AuxInt 11888 ptr := v_0.Args[0] 11889 mem := v.Args[1] 11890 if !(is20Bit(off1 + off2)) { 11891 break 11892 } 11893 v.reset(OpS390XMOVDload) 11894 v.AuxInt = off1 + off2 11895 v.Aux = sym 11896 v.AddArg(ptr) 11897 v.AddArg(mem) 11898 return true 11899 } 11900 // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 11901 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11902 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) 11903 for { 11904 off1 := v.AuxInt 11905 sym1 := v.Aux 11906 v_0 := v.Args[0] 11907 if v_0.Op != OpS390XMOVDaddr { 11908 break 11909 } 11910 off2 := v_0.AuxInt 11911 sym2 := v_0.Aux 11912 base := v_0.Args[0] 11913 mem := v.Args[1] 11914 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11915 break 11916 } 11917 v.reset(OpS390XMOVDload) 11918 v.AuxInt = off1 + off2 11919 v.Aux = mergeSym(sym1, sym2) 11920 v.AddArg(base) 11921 v.AddArg(mem) 11922 return true 11923 } 11924 // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 11925 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 11926 // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 11927 for { 11928 off1 := v.AuxInt 11929 sym1 := v.Aux 11930 v_0 := v.Args[0] 11931 if v_0.Op != OpS390XMOVDaddridx { 11932 break 11933 } 11934 off2 := v_0.AuxInt 11935 sym2 := v_0.Aux 11936 ptr := v_0.Args[0] 11937 idx := v_0.Args[1] 11938 mem := v.Args[1] 11939 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 11940 break 11941 } 11942 v.reset(OpS390XMOVDloadidx) 11943 v.AuxInt = off1 + off2 11944 v.Aux = mergeSym(sym1, sym2) 11945 v.AddArg(ptr) 11946 v.AddArg(idx) 11947 v.AddArg(mem) 11948 return true 11949 } 11950 // match: (MOVDload [off] {sym} (ADD ptr idx) mem) 11951 // cond: ptr.Op != OpSB 11952 // result: (MOVDloadidx [off] {sym} ptr idx mem) 11953 for { 11954 off := v.AuxInt 11955 sym := v.Aux 11956 v_0 := v.Args[0] 11957 if v_0.Op != OpS390XADD { 11958 break 11959 } 11960 ptr := v_0.Args[0] 11961 idx := v_0.Args[1] 11962 mem := v.Args[1] 11963 if !(ptr.Op != OpSB) { 11964 break 11965 } 11966 v.reset(OpS390XMOVDloadidx) 11967 v.AuxInt = off 11968 v.Aux = sym 11969 v.AddArg(ptr) 11970 v.AddArg(idx) 11971 v.AddArg(mem) 11972 return true 11973 } 11974 return false 11975 } 11976 func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { 11977 // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 11978 // cond: 11979 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 11980 for { 11981 c := v.AuxInt 11982 sym := v.Aux 11983 v_0 := v.Args[0] 11984 if v_0.Op != OpS390XADDconst { 11985 break 11986 } 11987 d := v_0.AuxInt 11988 ptr := v_0.Args[0] 11989 idx := v.Args[1] 11990 mem := v.Args[2] 11991 v.reset(OpS390XMOVDloadidx) 11992 v.AuxInt = c + d 11993 v.Aux = sym 11994 v.AddArg(ptr) 11995 v.AddArg(idx) 11996 v.AddArg(mem) 11997 return true 11998 } 11999 // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 12000 // cond: 12001 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12002 for { 12003 c := v.AuxInt 12004 sym := v.Aux 12005 idx := v.Args[0] 12006 v_1 := v.Args[1] 12007 if v_1.Op != OpS390XADDconst { 12008 break 12009 } 12010 d := v_1.AuxInt 12011 ptr := v_1.Args[0] 12012 mem := v.Args[2] 12013 v.reset(OpS390XMOVDloadidx) 12014 v.AuxInt = c + d 12015 v.Aux = sym 12016 v.AddArg(ptr) 12017 v.AddArg(idx) 12018 v.AddArg(mem) 12019 return true 12020 } 12021 // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 12022 // cond: 12023 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12024 for { 12025 c := v.AuxInt 12026 sym := v.Aux 12027 ptr := v.Args[0] 12028 v_1 := v.Args[1] 12029 if v_1.Op != OpS390XADDconst { 12030 break 12031 } 12032 d := v_1.AuxInt 12033 idx := v_1.Args[0] 12034 mem := v.Args[2] 12035 v.reset(OpS390XMOVDloadidx) 12036 v.AuxInt = c + d 12037 v.Aux = sym 12038 v.AddArg(ptr) 12039 v.AddArg(idx) 12040 v.AddArg(mem) 12041 return true 12042 } 12043 // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 12044 // cond: 12045 // result: (MOVDloadidx [c+d] {sym} ptr idx mem) 12046 for { 12047 c := v.AuxInt 12048 sym := v.Aux 12049 v_0 := v.Args[0] 12050 if v_0.Op != OpS390XADDconst { 12051 break 12052 } 12053 d := v_0.AuxInt 12054 idx := v_0.Args[0] 12055 ptr := v.Args[1] 12056 mem := v.Args[2] 12057 v.reset(OpS390XMOVDloadidx) 12058 v.AuxInt = c + d 12059 v.Aux = sym 12060 v.AddArg(ptr) 12061 v.AddArg(idx) 12062 v.AddArg(mem) 12063 return true 12064 } 12065 return false 12066 } 12067 func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { 12068 b := v.Block 12069 _ = b 12070 // match: (MOVDnop <t> x) 12071 // cond: t.Compare(x.Type) == CMPeq 12072 // result: x 12073 for { 12074 t := v.Type 12075 x := v.Args[0] 12076 if !(t.Compare(x.Type) == CMPeq) { 12077 break 12078 } 12079 v.reset(OpCopy) 12080 v.Type = x.Type 12081 v.AddArg(x) 12082 return true 12083 } 12084 // match: (MOVDnop (MOVDconst [c])) 12085 // cond: 12086 // result: (MOVDconst [c]) 12087 for { 12088 v_0 := v.Args[0] 12089 if v_0.Op != OpS390XMOVDconst { 12090 break 12091 } 12092 c := v_0.AuxInt 12093 v.reset(OpS390XMOVDconst) 12094 v.AuxInt = c 12095 return true 12096 } 12097 // match: (MOVDnop <t> x:(MOVBZload [off] {sym} ptr mem)) 12098 // cond: x.Uses == 1 && clobber(x) 12099 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12100 for { 12101 t := v.Type 12102 x := v.Args[0] 12103 if x.Op != OpS390XMOVBZload { 12104 break 12105 } 12106 off := x.AuxInt 12107 sym := x.Aux 12108 ptr := x.Args[0] 12109 mem := x.Args[1] 12110 if !(x.Uses == 1 && clobber(x)) { 12111 break 12112 } 12113 b = x.Block 12114 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12115 v.reset(OpCopy) 12116 v.AddArg(v0) 12117 v0.AuxInt = off 12118 v0.Aux = sym 12119 v0.AddArg(ptr) 12120 v0.AddArg(mem) 12121 return true 12122 } 12123 // match: (MOVDnop <t> x:(MOVBload [off] {sym} ptr mem)) 12124 // cond: x.Uses == 1 && clobber(x) 12125 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12126 for { 12127 t := v.Type 12128 x := v.Args[0] 12129 if x.Op != OpS390XMOVBload { 12130 break 12131 } 12132 off := x.AuxInt 12133 sym := x.Aux 12134 ptr := x.Args[0] 12135 mem := x.Args[1] 12136 if !(x.Uses == 1 && clobber(x)) { 12137 break 12138 } 12139 b = x.Block 12140 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12141 v.reset(OpCopy) 12142 v.AddArg(v0) 12143 v0.AuxInt = off 12144 v0.Aux = sym 12145 v0.AddArg(ptr) 12146 v0.AddArg(mem) 12147 return true 12148 } 12149 // match: (MOVDnop <t> x:(MOVHZload [off] {sym} ptr mem)) 12150 // cond: x.Uses == 1 && clobber(x) 12151 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12152 for { 12153 t := v.Type 12154 x := v.Args[0] 12155 if x.Op != OpS390XMOVHZload { 12156 break 12157 } 12158 off := x.AuxInt 12159 sym := x.Aux 12160 ptr := x.Args[0] 12161 mem := x.Args[1] 12162 if !(x.Uses == 1 && clobber(x)) { 12163 break 12164 } 12165 b = x.Block 12166 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 12167 v.reset(OpCopy) 12168 v.AddArg(v0) 12169 v0.AuxInt = off 12170 v0.Aux = sym 12171 v0.AddArg(ptr) 12172 v0.AddArg(mem) 12173 return true 12174 } 12175 // match: (MOVDnop <t> x:(MOVHload [off] {sym} ptr mem)) 12176 // cond: x.Uses == 1 && clobber(x) 12177 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 12178 for { 12179 t := v.Type 12180 x := v.Args[0] 12181 if x.Op != OpS390XMOVHload { 12182 break 12183 } 12184 off := x.AuxInt 12185 sym := x.Aux 12186 ptr := x.Args[0] 12187 mem := x.Args[1] 12188 if !(x.Uses == 1 && clobber(x)) { 12189 break 12190 } 12191 b = x.Block 12192 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 12193 v.reset(OpCopy) 12194 v.AddArg(v0) 12195 v0.AuxInt = off 12196 v0.Aux = sym 12197 v0.AddArg(ptr) 12198 v0.AddArg(mem) 12199 return true 12200 } 12201 // match: (MOVDnop <t> x:(MOVWZload [off] {sym} ptr mem)) 12202 // cond: x.Uses == 1 && clobber(x) 12203 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 12204 for { 12205 t := v.Type 12206 x := v.Args[0] 12207 if x.Op != OpS390XMOVWZload { 12208 break 12209 } 12210 off := x.AuxInt 12211 sym := x.Aux 12212 ptr := x.Args[0] 12213 mem := x.Args[1] 12214 if !(x.Uses == 1 && clobber(x)) { 12215 break 12216 } 12217 b = x.Block 12218 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 12219 v.reset(OpCopy) 12220 v.AddArg(v0) 12221 v0.AuxInt = off 12222 v0.Aux = sym 12223 v0.AddArg(ptr) 12224 v0.AddArg(mem) 12225 return true 12226 } 12227 // match: (MOVDnop <t> x:(MOVWload [off] {sym} ptr mem)) 12228 // cond: x.Uses == 1 && clobber(x) 12229 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 12230 for { 12231 t := v.Type 12232 x := v.Args[0] 12233 if x.Op != OpS390XMOVWload { 12234 break 12235 } 12236 off := x.AuxInt 12237 sym := x.Aux 12238 ptr := x.Args[0] 12239 mem := x.Args[1] 12240 if !(x.Uses == 1 && clobber(x)) { 12241 break 12242 } 12243 b = x.Block 12244 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 12245 v.reset(OpCopy) 12246 v.AddArg(v0) 12247 v0.AuxInt = off 12248 v0.Aux = sym 12249 v0.AddArg(ptr) 12250 v0.AddArg(mem) 12251 return true 12252 } 12253 // match: (MOVDnop <t> x:(MOVDload [off] {sym} ptr mem)) 12254 // cond: x.Uses == 1 && clobber(x) 12255 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 12256 for { 12257 t := v.Type 12258 x := v.Args[0] 12259 if x.Op != OpS390XMOVDload { 12260 break 12261 } 12262 off := x.AuxInt 12263 sym := x.Aux 12264 ptr := x.Args[0] 12265 mem := x.Args[1] 12266 if !(x.Uses == 1 && clobber(x)) { 12267 break 12268 } 12269 b = x.Block 12270 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 12271 v.reset(OpCopy) 12272 v.AddArg(v0) 12273 v0.AuxInt = off 12274 v0.Aux = sym 12275 v0.AddArg(ptr) 12276 v0.AddArg(mem) 12277 return true 12278 } 12279 // match: (MOVDnop <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12280 // cond: x.Uses == 1 && clobber(x) 12281 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 12282 for { 12283 t := v.Type 12284 x := v.Args[0] 12285 if x.Op != OpS390XMOVBZloadidx { 12286 break 12287 } 12288 off := x.AuxInt 12289 sym := x.Aux 12290 ptr := x.Args[0] 12291 idx := x.Args[1] 12292 mem := x.Args[2] 12293 if !(x.Uses == 1 && clobber(x)) { 12294 break 12295 } 12296 b = x.Block 12297 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 12298 v.reset(OpCopy) 12299 v.AddArg(v0) 12300 v0.AuxInt = off 12301 v0.Aux = sym 12302 v0.AddArg(ptr) 12303 v0.AddArg(idx) 12304 v0.AddArg(mem) 12305 return true 12306 } 12307 return false 12308 } 12309 func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { 12310 b := v.Block 12311 _ = b 12312 // match: (MOVDnop <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 12313 // cond: x.Uses == 1 && clobber(x) 12314 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 12315 for { 12316 t := v.Type 12317 x := v.Args[0] 12318 if x.Op != OpS390XMOVHZloadidx { 12319 break 12320 } 12321 off := x.AuxInt 12322 sym := x.Aux 12323 ptr := x.Args[0] 12324 idx := x.Args[1] 12325 mem := x.Args[2] 12326 if !(x.Uses == 1 && clobber(x)) { 12327 break 12328 } 12329 b = x.Block 12330 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 12331 v.reset(OpCopy) 12332 v.AddArg(v0) 12333 v0.AuxInt = off 12334 v0.Aux = sym 12335 v0.AddArg(ptr) 12336 v0.AddArg(idx) 12337 v0.AddArg(mem) 12338 return true 12339 } 12340 // match: (MOVDnop <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 12341 // cond: x.Uses == 1 && clobber(x) 12342 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 12343 for { 12344 t := v.Type 12345 x := v.Args[0] 12346 if x.Op != OpS390XMOVWZloadidx { 12347 break 12348 } 12349 off := x.AuxInt 12350 sym := x.Aux 12351 ptr := x.Args[0] 12352 idx := x.Args[1] 12353 mem := x.Args[2] 12354 if !(x.Uses == 1 && clobber(x)) { 12355 break 12356 } 12357 b = x.Block 12358 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 12359 v.reset(OpCopy) 12360 v.AddArg(v0) 12361 v0.AuxInt = off 12362 v0.Aux = sym 12363 v0.AddArg(ptr) 12364 v0.AddArg(idx) 12365 v0.AddArg(mem) 12366 return true 12367 } 12368 // match: (MOVDnop <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 12369 // cond: x.Uses == 1 && clobber(x) 12370 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 12371 for { 12372 t := v.Type 12373 x := v.Args[0] 12374 if x.Op != OpS390XMOVDloadidx { 12375 break 12376 } 12377 off := x.AuxInt 12378 sym := x.Aux 12379 ptr := x.Args[0] 12380 idx := x.Args[1] 12381 mem := x.Args[2] 12382 if !(x.Uses == 1 && clobber(x)) { 12383 break 12384 } 12385 b = x.Block 12386 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 12387 v.reset(OpCopy) 12388 v.AddArg(v0) 12389 v0.AuxInt = off 12390 v0.Aux = sym 12391 v0.AddArg(ptr) 12392 v0.AddArg(idx) 12393 v0.AddArg(mem) 12394 return true 12395 } 12396 return false 12397 } 12398 func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { 12399 b := v.Block 12400 _ = b 12401 // match: (MOVDreg <t> x) 12402 // cond: t.Compare(x.Type) == CMPeq 12403 // result: x 12404 for { 12405 t := v.Type 12406 x := v.Args[0] 12407 if !(t.Compare(x.Type) == CMPeq) { 12408 break 12409 } 12410 v.reset(OpCopy) 12411 v.Type = x.Type 12412 v.AddArg(x) 12413 return true 12414 } 12415 // match: (MOVDreg (MOVDconst [c])) 12416 // cond: 12417 // result: (MOVDconst [c]) 12418 for { 12419 v_0 := v.Args[0] 12420 if v_0.Op != OpS390XMOVDconst { 12421 break 12422 } 12423 c := v_0.AuxInt 12424 v.reset(OpS390XMOVDconst) 12425 v.AuxInt = c 12426 return true 12427 } 12428 // match: (MOVDreg x) 12429 // cond: x.Uses == 1 12430 // result: (MOVDnop x) 12431 for { 12432 x := v.Args[0] 12433 if !(x.Uses == 1) { 12434 break 12435 } 12436 v.reset(OpS390XMOVDnop) 12437 v.AddArg(x) 12438 return true 12439 } 12440 // match: (MOVDreg <t> x:(MOVBZload [off] {sym} ptr mem)) 12441 // cond: x.Uses == 1 && clobber(x) 12442 // result: @x.Block (MOVBZload <t> [off] {sym} ptr mem) 12443 for { 12444 t := v.Type 12445 x := v.Args[0] 12446 if x.Op != OpS390XMOVBZload { 12447 break 12448 } 12449 off := x.AuxInt 12450 sym := x.Aux 12451 ptr := x.Args[0] 12452 mem := x.Args[1] 12453 if !(x.Uses == 1 && clobber(x)) { 12454 break 12455 } 12456 b = x.Block 12457 v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, t) 12458 v.reset(OpCopy) 12459 v.AddArg(v0) 12460 v0.AuxInt = off 12461 v0.Aux = sym 12462 v0.AddArg(ptr) 12463 v0.AddArg(mem) 12464 return true 12465 } 12466 // match: (MOVDreg <t> x:(MOVBload [off] {sym} ptr mem)) 12467 // cond: x.Uses == 1 && clobber(x) 12468 // result: @x.Block (MOVBload <t> [off] {sym} ptr mem) 12469 for { 12470 t := v.Type 12471 x := v.Args[0] 12472 if x.Op != OpS390XMOVBload { 12473 break 12474 } 12475 off := x.AuxInt 12476 sym := x.Aux 12477 ptr := x.Args[0] 12478 mem := x.Args[1] 12479 if !(x.Uses == 1 && clobber(x)) { 12480 break 12481 } 12482 b = x.Block 12483 v0 := b.NewValue0(v.Pos, OpS390XMOVBload, t) 12484 v.reset(OpCopy) 12485 v.AddArg(v0) 12486 v0.AuxInt = off 12487 v0.Aux = sym 12488 v0.AddArg(ptr) 12489 v0.AddArg(mem) 12490 return true 12491 } 12492 // match: (MOVDreg <t> x:(MOVHZload [off] {sym} ptr mem)) 12493 // cond: x.Uses == 1 && clobber(x) 12494 // result: @x.Block (MOVHZload <t> [off] {sym} ptr mem) 12495 for { 12496 t := v.Type 12497 x := v.Args[0] 12498 if x.Op != OpS390XMOVHZload { 12499 break 12500 } 12501 off := x.AuxInt 12502 sym := x.Aux 12503 ptr := x.Args[0] 12504 mem := x.Args[1] 12505 if !(x.Uses == 1 && clobber(x)) { 12506 break 12507 } 12508 b = x.Block 12509 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, t) 12510 v.reset(OpCopy) 12511 v.AddArg(v0) 12512 v0.AuxInt = off 12513 v0.Aux = sym 12514 v0.AddArg(ptr) 12515 v0.AddArg(mem) 12516 return true 12517 } 12518 // match: (MOVDreg <t> x:(MOVHload [off] {sym} ptr mem)) 12519 // cond: x.Uses == 1 && clobber(x) 12520 // result: @x.Block (MOVHload <t> [off] {sym} ptr mem) 12521 for { 12522 t := v.Type 12523 x := v.Args[0] 12524 if x.Op != OpS390XMOVHload { 12525 break 12526 } 12527 off := x.AuxInt 12528 sym := x.Aux 12529 ptr := x.Args[0] 12530 mem := x.Args[1] 12531 if !(x.Uses == 1 && clobber(x)) { 12532 break 12533 } 12534 b = x.Block 12535 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, t) 12536 v.reset(OpCopy) 12537 v.AddArg(v0) 12538 v0.AuxInt = off 12539 v0.Aux = sym 12540 v0.AddArg(ptr) 12541 v0.AddArg(mem) 12542 return true 12543 } 12544 // match: (MOVDreg <t> x:(MOVWZload [off] {sym} ptr mem)) 12545 // cond: x.Uses == 1 && clobber(x) 12546 // result: @x.Block (MOVWZload <t> [off] {sym} ptr mem) 12547 for { 12548 t := v.Type 12549 x := v.Args[0] 12550 if x.Op != OpS390XMOVWZload { 12551 break 12552 } 12553 off := x.AuxInt 12554 sym := x.Aux 12555 ptr := x.Args[0] 12556 mem := x.Args[1] 12557 if !(x.Uses == 1 && clobber(x)) { 12558 break 12559 } 12560 b = x.Block 12561 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, t) 12562 v.reset(OpCopy) 12563 v.AddArg(v0) 12564 v0.AuxInt = off 12565 v0.Aux = sym 12566 v0.AddArg(ptr) 12567 v0.AddArg(mem) 12568 return true 12569 } 12570 // match: (MOVDreg <t> x:(MOVWload [off] {sym} ptr mem)) 12571 // cond: x.Uses == 1 && clobber(x) 12572 // result: @x.Block (MOVWload <t> [off] {sym} ptr mem) 12573 for { 12574 t := v.Type 12575 x := v.Args[0] 12576 if x.Op != OpS390XMOVWload { 12577 break 12578 } 12579 off := x.AuxInt 12580 sym := x.Aux 12581 ptr := x.Args[0] 12582 mem := x.Args[1] 12583 if !(x.Uses == 1 && clobber(x)) { 12584 break 12585 } 12586 b = x.Block 12587 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, t) 12588 v.reset(OpCopy) 12589 v.AddArg(v0) 12590 v0.AuxInt = off 12591 v0.Aux = sym 12592 v0.AddArg(ptr) 12593 v0.AddArg(mem) 12594 return true 12595 } 12596 // match: (MOVDreg <t> x:(MOVDload [off] {sym} ptr mem)) 12597 // cond: x.Uses == 1 && clobber(x) 12598 // result: @x.Block (MOVDload <t> [off] {sym} ptr mem) 12599 for { 12600 t := v.Type 12601 x := v.Args[0] 12602 if x.Op != OpS390XMOVDload { 12603 break 12604 } 12605 off := x.AuxInt 12606 sym := x.Aux 12607 ptr := x.Args[0] 12608 mem := x.Args[1] 12609 if !(x.Uses == 1 && clobber(x)) { 12610 break 12611 } 12612 b = x.Block 12613 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, t) 12614 v.reset(OpCopy) 12615 v.AddArg(v0) 12616 v0.AuxInt = off 12617 v0.Aux = sym 12618 v0.AddArg(ptr) 12619 v0.AddArg(mem) 12620 return true 12621 } 12622 return false 12623 } 12624 func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { 12625 b := v.Block 12626 _ = b 12627 // match: (MOVDreg <t> x:(MOVBZloadidx [off] {sym} ptr idx mem)) 12628 // cond: x.Uses == 1 && clobber(x) 12629 // result: @x.Block (MOVBZloadidx <t> [off] {sym} ptr idx mem) 12630 for { 12631 t := v.Type 12632 x := v.Args[0] 12633 if x.Op != OpS390XMOVBZloadidx { 12634 break 12635 } 12636 off := x.AuxInt 12637 sym := x.Aux 12638 ptr := x.Args[0] 12639 idx := x.Args[1] 12640 mem := x.Args[2] 12641 if !(x.Uses == 1 && clobber(x)) { 12642 break 12643 } 12644 b = x.Block 12645 v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) 12646 v.reset(OpCopy) 12647 v.AddArg(v0) 12648 v0.AuxInt = off 12649 v0.Aux = sym 12650 v0.AddArg(ptr) 12651 v0.AddArg(idx) 12652 v0.AddArg(mem) 12653 return true 12654 } 12655 // match: (MOVDreg <t> x:(MOVHZloadidx [off] {sym} ptr idx mem)) 12656 // cond: x.Uses == 1 && clobber(x) 12657 // result: @x.Block (MOVHZloadidx <t> [off] {sym} ptr idx mem) 12658 for { 12659 t := v.Type 12660 x := v.Args[0] 12661 if x.Op != OpS390XMOVHZloadidx { 12662 break 12663 } 12664 off := x.AuxInt 12665 sym := x.Aux 12666 ptr := x.Args[0] 12667 idx := x.Args[1] 12668 mem := x.Args[2] 12669 if !(x.Uses == 1 && clobber(x)) { 12670 break 12671 } 12672 b = x.Block 12673 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) 12674 v.reset(OpCopy) 12675 v.AddArg(v0) 12676 v0.AuxInt = off 12677 v0.Aux = sym 12678 v0.AddArg(ptr) 12679 v0.AddArg(idx) 12680 v0.AddArg(mem) 12681 return true 12682 } 12683 // match: (MOVDreg <t> x:(MOVWZloadidx [off] {sym} ptr idx mem)) 12684 // cond: x.Uses == 1 && clobber(x) 12685 // result: @x.Block (MOVWZloadidx <t> [off] {sym} ptr idx mem) 12686 for { 12687 t := v.Type 12688 x := v.Args[0] 12689 if x.Op != OpS390XMOVWZloadidx { 12690 break 12691 } 12692 off := x.AuxInt 12693 sym := x.Aux 12694 ptr := x.Args[0] 12695 idx := x.Args[1] 12696 mem := x.Args[2] 12697 if !(x.Uses == 1 && clobber(x)) { 12698 break 12699 } 12700 b = x.Block 12701 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) 12702 v.reset(OpCopy) 12703 v.AddArg(v0) 12704 v0.AuxInt = off 12705 v0.Aux = sym 12706 v0.AddArg(ptr) 12707 v0.AddArg(idx) 12708 v0.AddArg(mem) 12709 return true 12710 } 12711 // match: (MOVDreg <t> x:(MOVDloadidx [off] {sym} ptr idx mem)) 12712 // cond: x.Uses == 1 && clobber(x) 12713 // result: @x.Block (MOVDloadidx <t> [off] {sym} ptr idx mem) 12714 for { 12715 t := v.Type 12716 x := v.Args[0] 12717 if x.Op != OpS390XMOVDloadidx { 12718 break 12719 } 12720 off := x.AuxInt 12721 sym := x.Aux 12722 ptr := x.Args[0] 12723 idx := x.Args[1] 12724 mem := x.Args[2] 12725 if !(x.Uses == 1 && clobber(x)) { 12726 break 12727 } 12728 b = x.Block 12729 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, t) 12730 v.reset(OpCopy) 12731 v.AddArg(v0) 12732 v0.AuxInt = off 12733 v0.Aux = sym 12734 v0.AddArg(ptr) 12735 v0.AddArg(idx) 12736 v0.AddArg(mem) 12737 return true 12738 } 12739 return false 12740 } 12741 func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { 12742 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 12743 // cond: is20Bit(off1+off2) 12744 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 12745 for { 12746 off1 := v.AuxInt 12747 sym := v.Aux 12748 v_0 := v.Args[0] 12749 if v_0.Op != OpS390XADDconst { 12750 break 12751 } 12752 off2 := v_0.AuxInt 12753 ptr := v_0.Args[0] 12754 val := v.Args[1] 12755 mem := v.Args[2] 12756 if !(is20Bit(off1 + off2)) { 12757 break 12758 } 12759 v.reset(OpS390XMOVDstore) 12760 v.AuxInt = off1 + off2 12761 v.Aux = sym 12762 v.AddArg(ptr) 12763 v.AddArg(val) 12764 v.AddArg(mem) 12765 return true 12766 } 12767 // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) 12768 // cond: validValAndOff(c,off) && int64(int16(c)) == c && ptr.Op != OpSB 12769 // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) 12770 for { 12771 off := v.AuxInt 12772 sym := v.Aux 12773 ptr := v.Args[0] 12774 v_1 := v.Args[1] 12775 if v_1.Op != OpS390XMOVDconst { 12776 break 12777 } 12778 c := v_1.AuxInt 12779 mem := v.Args[2] 12780 if !(validValAndOff(c, off) && int64(int16(c)) == c && ptr.Op != OpSB) { 12781 break 12782 } 12783 v.reset(OpS390XMOVDstoreconst) 12784 v.AuxInt = makeValAndOff(c, off) 12785 v.Aux = sym 12786 v.AddArg(ptr) 12787 v.AddArg(mem) 12788 return true 12789 } 12790 // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 12791 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12792 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 12793 for { 12794 off1 := v.AuxInt 12795 sym1 := v.Aux 12796 v_0 := v.Args[0] 12797 if v_0.Op != OpS390XMOVDaddr { 12798 break 12799 } 12800 off2 := v_0.AuxInt 12801 sym2 := v_0.Aux 12802 base := v_0.Args[0] 12803 val := v.Args[1] 12804 mem := v.Args[2] 12805 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12806 break 12807 } 12808 v.reset(OpS390XMOVDstore) 12809 v.AuxInt = off1 + off2 12810 v.Aux = mergeSym(sym1, sym2) 12811 v.AddArg(base) 12812 v.AddArg(val) 12813 v.AddArg(mem) 12814 return true 12815 } 12816 // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 12817 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 12818 // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 12819 for { 12820 off1 := v.AuxInt 12821 sym1 := v.Aux 12822 v_0 := v.Args[0] 12823 if v_0.Op != OpS390XMOVDaddridx { 12824 break 12825 } 12826 off2 := v_0.AuxInt 12827 sym2 := v_0.Aux 12828 ptr := v_0.Args[0] 12829 idx := v_0.Args[1] 12830 val := v.Args[1] 12831 mem := v.Args[2] 12832 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 12833 break 12834 } 12835 v.reset(OpS390XMOVDstoreidx) 12836 v.AuxInt = off1 + off2 12837 v.Aux = mergeSym(sym1, sym2) 12838 v.AddArg(ptr) 12839 v.AddArg(idx) 12840 v.AddArg(val) 12841 v.AddArg(mem) 12842 return true 12843 } 12844 // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) 12845 // cond: ptr.Op != OpSB 12846 // result: (MOVDstoreidx [off] {sym} ptr idx val mem) 12847 for { 12848 off := v.AuxInt 12849 sym := v.Aux 12850 v_0 := v.Args[0] 12851 if v_0.Op != OpS390XADD { 12852 break 12853 } 12854 ptr := v_0.Args[0] 12855 idx := v_0.Args[1] 12856 val := v.Args[1] 12857 mem := v.Args[2] 12858 if !(ptr.Op != OpSB) { 12859 break 12860 } 12861 v.reset(OpS390XMOVDstoreidx) 12862 v.AuxInt = off 12863 v.Aux = sym 12864 v.AddArg(ptr) 12865 v.AddArg(idx) 12866 v.AddArg(val) 12867 v.AddArg(mem) 12868 return true 12869 } 12870 // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) 12871 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) 12872 // result: (STMG2 [i-8] {s} p w0 w1 mem) 12873 for { 12874 i := v.AuxInt 12875 s := v.Aux 12876 p := v.Args[0] 12877 w1 := v.Args[1] 12878 x := v.Args[2] 12879 if x.Op != OpS390XMOVDstore { 12880 break 12881 } 12882 if x.AuxInt != i-8 { 12883 break 12884 } 12885 if x.Aux != s { 12886 break 12887 } 12888 if p != x.Args[0] { 12889 break 12890 } 12891 w0 := x.Args[1] 12892 mem := x.Args[2] 12893 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 12894 break 12895 } 12896 v.reset(OpS390XSTMG2) 12897 v.AuxInt = i - 8 12898 v.Aux = s 12899 v.AddArg(p) 12900 v.AddArg(w0) 12901 v.AddArg(w1) 12902 v.AddArg(mem) 12903 return true 12904 } 12905 // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) 12906 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 12907 // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) 12908 for { 12909 i := v.AuxInt 12910 s := v.Aux 12911 p := v.Args[0] 12912 w2 := v.Args[1] 12913 x := v.Args[2] 12914 if x.Op != OpS390XSTMG2 { 12915 break 12916 } 12917 if x.AuxInt != i-16 { 12918 break 12919 } 12920 if x.Aux != s { 12921 break 12922 } 12923 if p != x.Args[0] { 12924 break 12925 } 12926 w0 := x.Args[1] 12927 w1 := x.Args[2] 12928 mem := x.Args[3] 12929 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 12930 break 12931 } 12932 v.reset(OpS390XSTMG3) 12933 v.AuxInt = i - 16 12934 v.Aux = s 12935 v.AddArg(p) 12936 v.AddArg(w0) 12937 v.AddArg(w1) 12938 v.AddArg(w2) 12939 v.AddArg(mem) 12940 return true 12941 } 12942 // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) 12943 // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) 12944 // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) 12945 for { 12946 i := v.AuxInt 12947 s := v.Aux 12948 p := v.Args[0] 12949 w3 := v.Args[1] 12950 x := v.Args[2] 12951 if x.Op != OpS390XSTMG3 { 12952 break 12953 } 12954 if x.AuxInt != i-24 { 12955 break 12956 } 12957 if x.Aux != s { 12958 break 12959 } 12960 if p != x.Args[0] { 12961 break 12962 } 12963 w0 := x.Args[1] 12964 w1 := x.Args[2] 12965 w2 := x.Args[3] 12966 mem := x.Args[4] 12967 if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { 12968 break 12969 } 12970 v.reset(OpS390XSTMG4) 12971 v.AuxInt = i - 24 12972 v.Aux = s 12973 v.AddArg(p) 12974 v.AddArg(w0) 12975 v.AddArg(w1) 12976 v.AddArg(w2) 12977 v.AddArg(w3) 12978 v.AddArg(mem) 12979 return true 12980 } 12981 return false 12982 } 12983 func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { 12984 // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) 12985 // cond: ValAndOff(sc).canAdd(off) 12986 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 12987 for { 12988 sc := v.AuxInt 12989 s := v.Aux 12990 v_0 := v.Args[0] 12991 if v_0.Op != OpS390XADDconst { 12992 break 12993 } 12994 off := v_0.AuxInt 12995 ptr := v_0.Args[0] 12996 mem := v.Args[1] 12997 if !(ValAndOff(sc).canAdd(off)) { 12998 break 12999 } 13000 v.reset(OpS390XMOVDstoreconst) 13001 v.AuxInt = ValAndOff(sc).add(off) 13002 v.Aux = s 13003 v.AddArg(ptr) 13004 v.AddArg(mem) 13005 return true 13006 } 13007 // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 13008 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 13009 // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 13010 for { 13011 sc := v.AuxInt 13012 sym1 := v.Aux 13013 v_0 := v.Args[0] 13014 if v_0.Op != OpS390XMOVDaddr { 13015 break 13016 } 13017 off := v_0.AuxInt 13018 sym2 := v_0.Aux 13019 ptr := v_0.Args[0] 13020 mem := v.Args[1] 13021 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 13022 break 13023 } 13024 v.reset(OpS390XMOVDstoreconst) 13025 v.AuxInt = ValAndOff(sc).add(off) 13026 v.Aux = mergeSym(sym1, sym2) 13027 v.AddArg(ptr) 13028 v.AddArg(mem) 13029 return true 13030 } 13031 return false 13032 } 13033 func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { 13034 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 13035 // cond: 13036 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13037 for { 13038 c := v.AuxInt 13039 sym := v.Aux 13040 v_0 := v.Args[0] 13041 if v_0.Op != OpS390XADDconst { 13042 break 13043 } 13044 d := v_0.AuxInt 13045 ptr := v_0.Args[0] 13046 idx := v.Args[1] 13047 val := v.Args[2] 13048 mem := v.Args[3] 13049 v.reset(OpS390XMOVDstoreidx) 13050 v.AuxInt = c + d 13051 v.Aux = sym 13052 v.AddArg(ptr) 13053 v.AddArg(idx) 13054 v.AddArg(val) 13055 v.AddArg(mem) 13056 return true 13057 } 13058 // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 13059 // cond: 13060 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13061 for { 13062 c := v.AuxInt 13063 sym := v.Aux 13064 idx := v.Args[0] 13065 v_1 := v.Args[1] 13066 if v_1.Op != OpS390XADDconst { 13067 break 13068 } 13069 d := v_1.AuxInt 13070 ptr := v_1.Args[0] 13071 val := v.Args[2] 13072 mem := v.Args[3] 13073 v.reset(OpS390XMOVDstoreidx) 13074 v.AuxInt = c + d 13075 v.Aux = sym 13076 v.AddArg(ptr) 13077 v.AddArg(idx) 13078 v.AddArg(val) 13079 v.AddArg(mem) 13080 return true 13081 } 13082 // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 13083 // cond: 13084 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13085 for { 13086 c := v.AuxInt 13087 sym := v.Aux 13088 ptr := v.Args[0] 13089 v_1 := v.Args[1] 13090 if v_1.Op != OpS390XADDconst { 13091 break 13092 } 13093 d := v_1.AuxInt 13094 idx := v_1.Args[0] 13095 val := v.Args[2] 13096 mem := v.Args[3] 13097 v.reset(OpS390XMOVDstoreidx) 13098 v.AuxInt = c + d 13099 v.Aux = sym 13100 v.AddArg(ptr) 13101 v.AddArg(idx) 13102 v.AddArg(val) 13103 v.AddArg(mem) 13104 return true 13105 } 13106 // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 13107 // cond: 13108 // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) 13109 for { 13110 c := v.AuxInt 13111 sym := v.Aux 13112 v_0 := v.Args[0] 13113 if v_0.Op != OpS390XADDconst { 13114 break 13115 } 13116 d := v_0.AuxInt 13117 idx := v_0.Args[0] 13118 ptr := v.Args[1] 13119 val := v.Args[2] 13120 mem := v.Args[3] 13121 v.reset(OpS390XMOVDstoreidx) 13122 v.AuxInt = c + d 13123 v.Aux = sym 13124 v.AddArg(ptr) 13125 v.AddArg(idx) 13126 v.AddArg(val) 13127 v.AddArg(mem) 13128 return true 13129 } 13130 return false 13131 } 13132 func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { 13133 // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13134 // cond: x.Uses == 1 && clobber(x) 13135 // result: (MOVWBRstore [i-2] {s} p w mem) 13136 for { 13137 i := v.AuxInt 13138 s := v.Aux 13139 p := v.Args[0] 13140 v_1 := v.Args[1] 13141 if v_1.Op != OpS390XSRDconst { 13142 break 13143 } 13144 if v_1.AuxInt != 16 { 13145 break 13146 } 13147 w := v_1.Args[0] 13148 x := v.Args[2] 13149 if x.Op != OpS390XMOVHBRstore { 13150 break 13151 } 13152 if x.AuxInt != i-2 { 13153 break 13154 } 13155 if x.Aux != s { 13156 break 13157 } 13158 if p != x.Args[0] { 13159 break 13160 } 13161 if w != x.Args[1] { 13162 break 13163 } 13164 mem := x.Args[2] 13165 if !(x.Uses == 1 && clobber(x)) { 13166 break 13167 } 13168 v.reset(OpS390XMOVWBRstore) 13169 v.AuxInt = i - 2 13170 v.Aux = s 13171 v.AddArg(p) 13172 v.AddArg(w) 13173 v.AddArg(mem) 13174 return true 13175 } 13176 // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) 13177 // cond: x.Uses == 1 && clobber(x) 13178 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13179 for { 13180 i := v.AuxInt 13181 s := v.Aux 13182 p := v.Args[0] 13183 v_1 := v.Args[1] 13184 if v_1.Op != OpS390XSRDconst { 13185 break 13186 } 13187 j := v_1.AuxInt 13188 w := v_1.Args[0] 13189 x := v.Args[2] 13190 if x.Op != OpS390XMOVHBRstore { 13191 break 13192 } 13193 if x.AuxInt != i-2 { 13194 break 13195 } 13196 if x.Aux != s { 13197 break 13198 } 13199 if p != x.Args[0] { 13200 break 13201 } 13202 w0 := x.Args[1] 13203 if w0.Op != OpS390XSRDconst { 13204 break 13205 } 13206 if w0.AuxInt != j-16 { 13207 break 13208 } 13209 if w != w0.Args[0] { 13210 break 13211 } 13212 mem := x.Args[2] 13213 if !(x.Uses == 1 && clobber(x)) { 13214 break 13215 } 13216 v.reset(OpS390XMOVWBRstore) 13217 v.AuxInt = i - 2 13218 v.Aux = s 13219 v.AddArg(p) 13220 v.AddArg(w0) 13221 v.AddArg(mem) 13222 return true 13223 } 13224 // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) 13225 // cond: x.Uses == 1 && clobber(x) 13226 // result: (MOVWBRstore [i-2] {s} p w mem) 13227 for { 13228 i := v.AuxInt 13229 s := v.Aux 13230 p := v.Args[0] 13231 v_1 := v.Args[1] 13232 if v_1.Op != OpS390XSRWconst { 13233 break 13234 } 13235 if v_1.AuxInt != 16 { 13236 break 13237 } 13238 w := v_1.Args[0] 13239 x := v.Args[2] 13240 if x.Op != OpS390XMOVHBRstore { 13241 break 13242 } 13243 if x.AuxInt != i-2 { 13244 break 13245 } 13246 if x.Aux != s { 13247 break 13248 } 13249 if p != x.Args[0] { 13250 break 13251 } 13252 if w != x.Args[1] { 13253 break 13254 } 13255 mem := x.Args[2] 13256 if !(x.Uses == 1 && clobber(x)) { 13257 break 13258 } 13259 v.reset(OpS390XMOVWBRstore) 13260 v.AuxInt = i - 2 13261 v.Aux = s 13262 v.AddArg(p) 13263 v.AddArg(w) 13264 v.AddArg(mem) 13265 return true 13266 } 13267 // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) 13268 // cond: x.Uses == 1 && clobber(x) 13269 // result: (MOVWBRstore [i-2] {s} p w0 mem) 13270 for { 13271 i := v.AuxInt 13272 s := v.Aux 13273 p := v.Args[0] 13274 v_1 := v.Args[1] 13275 if v_1.Op != OpS390XSRWconst { 13276 break 13277 } 13278 j := v_1.AuxInt 13279 w := v_1.Args[0] 13280 x := v.Args[2] 13281 if x.Op != OpS390XMOVHBRstore { 13282 break 13283 } 13284 if x.AuxInt != i-2 { 13285 break 13286 } 13287 if x.Aux != s { 13288 break 13289 } 13290 if p != x.Args[0] { 13291 break 13292 } 13293 w0 := x.Args[1] 13294 if w0.Op != OpS390XSRWconst { 13295 break 13296 } 13297 if w0.AuxInt != j-16 { 13298 break 13299 } 13300 if w != w0.Args[0] { 13301 break 13302 } 13303 mem := x.Args[2] 13304 if !(x.Uses == 1 && clobber(x)) { 13305 break 13306 } 13307 v.reset(OpS390XMOVWBRstore) 13308 v.AuxInt = i - 2 13309 v.Aux = s 13310 v.AddArg(p) 13311 v.AddArg(w0) 13312 v.AddArg(mem) 13313 return true 13314 } 13315 return false 13316 } 13317 func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { 13318 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13319 // cond: x.Uses == 1 && clobber(x) 13320 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13321 for { 13322 i := v.AuxInt 13323 s := v.Aux 13324 p := v.Args[0] 13325 idx := v.Args[1] 13326 v_2 := v.Args[2] 13327 if v_2.Op != OpS390XSRDconst { 13328 break 13329 } 13330 if v_2.AuxInt != 16 { 13331 break 13332 } 13333 w := v_2.Args[0] 13334 x := v.Args[3] 13335 if x.Op != OpS390XMOVHBRstoreidx { 13336 break 13337 } 13338 if x.AuxInt != i-2 { 13339 break 13340 } 13341 if x.Aux != s { 13342 break 13343 } 13344 if p != x.Args[0] { 13345 break 13346 } 13347 if idx != x.Args[1] { 13348 break 13349 } 13350 if w != x.Args[2] { 13351 break 13352 } 13353 mem := x.Args[3] 13354 if !(x.Uses == 1 && clobber(x)) { 13355 break 13356 } 13357 v.reset(OpS390XMOVWBRstoreidx) 13358 v.AuxInt = i - 2 13359 v.Aux = s 13360 v.AddArg(p) 13361 v.AddArg(idx) 13362 v.AddArg(w) 13363 v.AddArg(mem) 13364 return true 13365 } 13366 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13367 // cond: x.Uses == 1 && clobber(x) 13368 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13369 for { 13370 i := v.AuxInt 13371 s := v.Aux 13372 p := v.Args[0] 13373 idx := v.Args[1] 13374 v_2 := v.Args[2] 13375 if v_2.Op != OpS390XSRDconst { 13376 break 13377 } 13378 if v_2.AuxInt != 16 { 13379 break 13380 } 13381 w := v_2.Args[0] 13382 x := v.Args[3] 13383 if x.Op != OpS390XMOVHBRstoreidx { 13384 break 13385 } 13386 if x.AuxInt != i-2 { 13387 break 13388 } 13389 if x.Aux != s { 13390 break 13391 } 13392 if idx != x.Args[0] { 13393 break 13394 } 13395 if p != x.Args[1] { 13396 break 13397 } 13398 if w != x.Args[2] { 13399 break 13400 } 13401 mem := x.Args[3] 13402 if !(x.Uses == 1 && clobber(x)) { 13403 break 13404 } 13405 v.reset(OpS390XMOVWBRstoreidx) 13406 v.AuxInt = i - 2 13407 v.Aux = s 13408 v.AddArg(p) 13409 v.AddArg(idx) 13410 v.AddArg(w) 13411 v.AddArg(mem) 13412 return true 13413 } 13414 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13415 // cond: x.Uses == 1 && clobber(x) 13416 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13417 for { 13418 i := v.AuxInt 13419 s := v.Aux 13420 idx := v.Args[0] 13421 p := v.Args[1] 13422 v_2 := v.Args[2] 13423 if v_2.Op != OpS390XSRDconst { 13424 break 13425 } 13426 if v_2.AuxInt != 16 { 13427 break 13428 } 13429 w := v_2.Args[0] 13430 x := v.Args[3] 13431 if x.Op != OpS390XMOVHBRstoreidx { 13432 break 13433 } 13434 if x.AuxInt != i-2 { 13435 break 13436 } 13437 if x.Aux != s { 13438 break 13439 } 13440 if p != x.Args[0] { 13441 break 13442 } 13443 if idx != x.Args[1] { 13444 break 13445 } 13446 if w != x.Args[2] { 13447 break 13448 } 13449 mem := x.Args[3] 13450 if !(x.Uses == 1 && clobber(x)) { 13451 break 13452 } 13453 v.reset(OpS390XMOVWBRstoreidx) 13454 v.AuxInt = i - 2 13455 v.Aux = s 13456 v.AddArg(p) 13457 v.AddArg(idx) 13458 v.AddArg(w) 13459 v.AddArg(mem) 13460 return true 13461 } 13462 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13463 // cond: x.Uses == 1 && clobber(x) 13464 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13465 for { 13466 i := v.AuxInt 13467 s := v.Aux 13468 idx := v.Args[0] 13469 p := v.Args[1] 13470 v_2 := v.Args[2] 13471 if v_2.Op != OpS390XSRDconst { 13472 break 13473 } 13474 if v_2.AuxInt != 16 { 13475 break 13476 } 13477 w := v_2.Args[0] 13478 x := v.Args[3] 13479 if x.Op != OpS390XMOVHBRstoreidx { 13480 break 13481 } 13482 if x.AuxInt != i-2 { 13483 break 13484 } 13485 if x.Aux != s { 13486 break 13487 } 13488 if idx != x.Args[0] { 13489 break 13490 } 13491 if p != x.Args[1] { 13492 break 13493 } 13494 if w != x.Args[2] { 13495 break 13496 } 13497 mem := x.Args[3] 13498 if !(x.Uses == 1 && clobber(x)) { 13499 break 13500 } 13501 v.reset(OpS390XMOVWBRstoreidx) 13502 v.AuxInt = i - 2 13503 v.Aux = s 13504 v.AddArg(p) 13505 v.AddArg(idx) 13506 v.AddArg(w) 13507 v.AddArg(mem) 13508 return true 13509 } 13510 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 13511 // cond: x.Uses == 1 && clobber(x) 13512 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13513 for { 13514 i := v.AuxInt 13515 s := v.Aux 13516 p := v.Args[0] 13517 idx := v.Args[1] 13518 v_2 := v.Args[2] 13519 if v_2.Op != OpS390XSRDconst { 13520 break 13521 } 13522 j := v_2.AuxInt 13523 w := v_2.Args[0] 13524 x := v.Args[3] 13525 if x.Op != OpS390XMOVHBRstoreidx { 13526 break 13527 } 13528 if x.AuxInt != i-2 { 13529 break 13530 } 13531 if x.Aux != s { 13532 break 13533 } 13534 if p != x.Args[0] { 13535 break 13536 } 13537 if idx != x.Args[1] { 13538 break 13539 } 13540 w0 := x.Args[2] 13541 if w0.Op != OpS390XSRDconst { 13542 break 13543 } 13544 if w0.AuxInt != j-16 { 13545 break 13546 } 13547 if w != w0.Args[0] { 13548 break 13549 } 13550 mem := x.Args[3] 13551 if !(x.Uses == 1 && clobber(x)) { 13552 break 13553 } 13554 v.reset(OpS390XMOVWBRstoreidx) 13555 v.AuxInt = i - 2 13556 v.Aux = s 13557 v.AddArg(p) 13558 v.AddArg(idx) 13559 v.AddArg(w0) 13560 v.AddArg(mem) 13561 return true 13562 } 13563 // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 13564 // cond: x.Uses == 1 && clobber(x) 13565 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13566 for { 13567 i := v.AuxInt 13568 s := v.Aux 13569 p := v.Args[0] 13570 idx := v.Args[1] 13571 v_2 := v.Args[2] 13572 if v_2.Op != OpS390XSRDconst { 13573 break 13574 } 13575 j := v_2.AuxInt 13576 w := v_2.Args[0] 13577 x := v.Args[3] 13578 if x.Op != OpS390XMOVHBRstoreidx { 13579 break 13580 } 13581 if x.AuxInt != i-2 { 13582 break 13583 } 13584 if x.Aux != s { 13585 break 13586 } 13587 if idx != x.Args[0] { 13588 break 13589 } 13590 if p != x.Args[1] { 13591 break 13592 } 13593 w0 := x.Args[2] 13594 if w0.Op != OpS390XSRDconst { 13595 break 13596 } 13597 if w0.AuxInt != j-16 { 13598 break 13599 } 13600 if w != w0.Args[0] { 13601 break 13602 } 13603 mem := x.Args[3] 13604 if !(x.Uses == 1 && clobber(x)) { 13605 break 13606 } 13607 v.reset(OpS390XMOVWBRstoreidx) 13608 v.AuxInt = i - 2 13609 v.Aux = s 13610 v.AddArg(p) 13611 v.AddArg(idx) 13612 v.AddArg(w0) 13613 v.AddArg(mem) 13614 return true 13615 } 13616 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) 13617 // cond: x.Uses == 1 && clobber(x) 13618 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13619 for { 13620 i := v.AuxInt 13621 s := v.Aux 13622 idx := v.Args[0] 13623 p := v.Args[1] 13624 v_2 := v.Args[2] 13625 if v_2.Op != OpS390XSRDconst { 13626 break 13627 } 13628 j := v_2.AuxInt 13629 w := v_2.Args[0] 13630 x := v.Args[3] 13631 if x.Op != OpS390XMOVHBRstoreidx { 13632 break 13633 } 13634 if x.AuxInt != i-2 { 13635 break 13636 } 13637 if x.Aux != s { 13638 break 13639 } 13640 if p != x.Args[0] { 13641 break 13642 } 13643 if idx != x.Args[1] { 13644 break 13645 } 13646 w0 := x.Args[2] 13647 if w0.Op != OpS390XSRDconst { 13648 break 13649 } 13650 if w0.AuxInt != j-16 { 13651 break 13652 } 13653 if w != w0.Args[0] { 13654 break 13655 } 13656 mem := x.Args[3] 13657 if !(x.Uses == 1 && clobber(x)) { 13658 break 13659 } 13660 v.reset(OpS390XMOVWBRstoreidx) 13661 v.AuxInt = i - 2 13662 v.Aux = s 13663 v.AddArg(p) 13664 v.AddArg(idx) 13665 v.AddArg(w0) 13666 v.AddArg(mem) 13667 return true 13668 } 13669 // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) 13670 // cond: x.Uses == 1 && clobber(x) 13671 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13672 for { 13673 i := v.AuxInt 13674 s := v.Aux 13675 idx := v.Args[0] 13676 p := v.Args[1] 13677 v_2 := v.Args[2] 13678 if v_2.Op != OpS390XSRDconst { 13679 break 13680 } 13681 j := v_2.AuxInt 13682 w := v_2.Args[0] 13683 x := v.Args[3] 13684 if x.Op != OpS390XMOVHBRstoreidx { 13685 break 13686 } 13687 if x.AuxInt != i-2 { 13688 break 13689 } 13690 if x.Aux != s { 13691 break 13692 } 13693 if idx != x.Args[0] { 13694 break 13695 } 13696 if p != x.Args[1] { 13697 break 13698 } 13699 w0 := x.Args[2] 13700 if w0.Op != OpS390XSRDconst { 13701 break 13702 } 13703 if w0.AuxInt != j-16 { 13704 break 13705 } 13706 if w != w0.Args[0] { 13707 break 13708 } 13709 mem := x.Args[3] 13710 if !(x.Uses == 1 && clobber(x)) { 13711 break 13712 } 13713 v.reset(OpS390XMOVWBRstoreidx) 13714 v.AuxInt = i - 2 13715 v.Aux = s 13716 v.AddArg(p) 13717 v.AddArg(idx) 13718 v.AddArg(w0) 13719 v.AddArg(mem) 13720 return true 13721 } 13722 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13723 // cond: x.Uses == 1 && clobber(x) 13724 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13725 for { 13726 i := v.AuxInt 13727 s := v.Aux 13728 p := v.Args[0] 13729 idx := v.Args[1] 13730 v_2 := v.Args[2] 13731 if v_2.Op != OpS390XSRWconst { 13732 break 13733 } 13734 if v_2.AuxInt != 16 { 13735 break 13736 } 13737 w := v_2.Args[0] 13738 x := v.Args[3] 13739 if x.Op != OpS390XMOVHBRstoreidx { 13740 break 13741 } 13742 if x.AuxInt != i-2 { 13743 break 13744 } 13745 if x.Aux != s { 13746 break 13747 } 13748 if p != x.Args[0] { 13749 break 13750 } 13751 if idx != x.Args[1] { 13752 break 13753 } 13754 if w != x.Args[2] { 13755 break 13756 } 13757 mem := x.Args[3] 13758 if !(x.Uses == 1 && clobber(x)) { 13759 break 13760 } 13761 v.reset(OpS390XMOVWBRstoreidx) 13762 v.AuxInt = i - 2 13763 v.Aux = s 13764 v.AddArg(p) 13765 v.AddArg(idx) 13766 v.AddArg(w) 13767 v.AddArg(mem) 13768 return true 13769 } 13770 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13771 // cond: x.Uses == 1 && clobber(x) 13772 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13773 for { 13774 i := v.AuxInt 13775 s := v.Aux 13776 p := v.Args[0] 13777 idx := v.Args[1] 13778 v_2 := v.Args[2] 13779 if v_2.Op != OpS390XSRWconst { 13780 break 13781 } 13782 if v_2.AuxInt != 16 { 13783 break 13784 } 13785 w := v_2.Args[0] 13786 x := v.Args[3] 13787 if x.Op != OpS390XMOVHBRstoreidx { 13788 break 13789 } 13790 if x.AuxInt != i-2 { 13791 break 13792 } 13793 if x.Aux != s { 13794 break 13795 } 13796 if idx != x.Args[0] { 13797 break 13798 } 13799 if p != x.Args[1] { 13800 break 13801 } 13802 if w != x.Args[2] { 13803 break 13804 } 13805 mem := x.Args[3] 13806 if !(x.Uses == 1 && clobber(x)) { 13807 break 13808 } 13809 v.reset(OpS390XMOVWBRstoreidx) 13810 v.AuxInt = i - 2 13811 v.Aux = s 13812 v.AddArg(p) 13813 v.AddArg(idx) 13814 v.AddArg(w) 13815 v.AddArg(mem) 13816 return true 13817 } 13818 return false 13819 } 13820 func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { 13821 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) 13822 // cond: x.Uses == 1 && clobber(x) 13823 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13824 for { 13825 i := v.AuxInt 13826 s := v.Aux 13827 idx := v.Args[0] 13828 p := v.Args[1] 13829 v_2 := v.Args[2] 13830 if v_2.Op != OpS390XSRWconst { 13831 break 13832 } 13833 if v_2.AuxInt != 16 { 13834 break 13835 } 13836 w := v_2.Args[0] 13837 x := v.Args[3] 13838 if x.Op != OpS390XMOVHBRstoreidx { 13839 break 13840 } 13841 if x.AuxInt != i-2 { 13842 break 13843 } 13844 if x.Aux != s { 13845 break 13846 } 13847 if p != x.Args[0] { 13848 break 13849 } 13850 if idx != x.Args[1] { 13851 break 13852 } 13853 if w != x.Args[2] { 13854 break 13855 } 13856 mem := x.Args[3] 13857 if !(x.Uses == 1 && clobber(x)) { 13858 break 13859 } 13860 v.reset(OpS390XMOVWBRstoreidx) 13861 v.AuxInt = i - 2 13862 v.Aux = s 13863 v.AddArg(p) 13864 v.AddArg(idx) 13865 v.AddArg(w) 13866 v.AddArg(mem) 13867 return true 13868 } 13869 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) 13870 // cond: x.Uses == 1 && clobber(x) 13871 // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) 13872 for { 13873 i := v.AuxInt 13874 s := v.Aux 13875 idx := v.Args[0] 13876 p := v.Args[1] 13877 v_2 := v.Args[2] 13878 if v_2.Op != OpS390XSRWconst { 13879 break 13880 } 13881 if v_2.AuxInt != 16 { 13882 break 13883 } 13884 w := v_2.Args[0] 13885 x := v.Args[3] 13886 if x.Op != OpS390XMOVHBRstoreidx { 13887 break 13888 } 13889 if x.AuxInt != i-2 { 13890 break 13891 } 13892 if x.Aux != s { 13893 break 13894 } 13895 if idx != x.Args[0] { 13896 break 13897 } 13898 if p != x.Args[1] { 13899 break 13900 } 13901 if w != x.Args[2] { 13902 break 13903 } 13904 mem := x.Args[3] 13905 if !(x.Uses == 1 && clobber(x)) { 13906 break 13907 } 13908 v.reset(OpS390XMOVWBRstoreidx) 13909 v.AuxInt = i - 2 13910 v.Aux = s 13911 v.AddArg(p) 13912 v.AddArg(idx) 13913 v.AddArg(w) 13914 v.AddArg(mem) 13915 return true 13916 } 13917 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 13918 // cond: x.Uses == 1 && clobber(x) 13919 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13920 for { 13921 i := v.AuxInt 13922 s := v.Aux 13923 p := v.Args[0] 13924 idx := v.Args[1] 13925 v_2 := v.Args[2] 13926 if v_2.Op != OpS390XSRWconst { 13927 break 13928 } 13929 j := v_2.AuxInt 13930 w := v_2.Args[0] 13931 x := v.Args[3] 13932 if x.Op != OpS390XMOVHBRstoreidx { 13933 break 13934 } 13935 if x.AuxInt != i-2 { 13936 break 13937 } 13938 if x.Aux != s { 13939 break 13940 } 13941 if p != x.Args[0] { 13942 break 13943 } 13944 if idx != x.Args[1] { 13945 break 13946 } 13947 w0 := x.Args[2] 13948 if w0.Op != OpS390XSRWconst { 13949 break 13950 } 13951 if w0.AuxInt != j-16 { 13952 break 13953 } 13954 if w != w0.Args[0] { 13955 break 13956 } 13957 mem := x.Args[3] 13958 if !(x.Uses == 1 && clobber(x)) { 13959 break 13960 } 13961 v.reset(OpS390XMOVWBRstoreidx) 13962 v.AuxInt = i - 2 13963 v.Aux = s 13964 v.AddArg(p) 13965 v.AddArg(idx) 13966 v.AddArg(w0) 13967 v.AddArg(mem) 13968 return true 13969 } 13970 // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 13971 // cond: x.Uses == 1 && clobber(x) 13972 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 13973 for { 13974 i := v.AuxInt 13975 s := v.Aux 13976 p := v.Args[0] 13977 idx := v.Args[1] 13978 v_2 := v.Args[2] 13979 if v_2.Op != OpS390XSRWconst { 13980 break 13981 } 13982 j := v_2.AuxInt 13983 w := v_2.Args[0] 13984 x := v.Args[3] 13985 if x.Op != OpS390XMOVHBRstoreidx { 13986 break 13987 } 13988 if x.AuxInt != i-2 { 13989 break 13990 } 13991 if x.Aux != s { 13992 break 13993 } 13994 if idx != x.Args[0] { 13995 break 13996 } 13997 if p != x.Args[1] { 13998 break 13999 } 14000 w0 := x.Args[2] 14001 if w0.Op != OpS390XSRWconst { 14002 break 14003 } 14004 if w0.AuxInt != j-16 { 14005 break 14006 } 14007 if w != w0.Args[0] { 14008 break 14009 } 14010 mem := x.Args[3] 14011 if !(x.Uses == 1 && clobber(x)) { 14012 break 14013 } 14014 v.reset(OpS390XMOVWBRstoreidx) 14015 v.AuxInt = i - 2 14016 v.Aux = s 14017 v.AddArg(p) 14018 v.AddArg(idx) 14019 v.AddArg(w0) 14020 v.AddArg(mem) 14021 return true 14022 } 14023 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) 14024 // cond: x.Uses == 1 && clobber(x) 14025 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14026 for { 14027 i := v.AuxInt 14028 s := v.Aux 14029 idx := v.Args[0] 14030 p := v.Args[1] 14031 v_2 := v.Args[2] 14032 if v_2.Op != OpS390XSRWconst { 14033 break 14034 } 14035 j := v_2.AuxInt 14036 w := v_2.Args[0] 14037 x := v.Args[3] 14038 if x.Op != OpS390XMOVHBRstoreidx { 14039 break 14040 } 14041 if x.AuxInt != i-2 { 14042 break 14043 } 14044 if x.Aux != s { 14045 break 14046 } 14047 if p != x.Args[0] { 14048 break 14049 } 14050 if idx != x.Args[1] { 14051 break 14052 } 14053 w0 := x.Args[2] 14054 if w0.Op != OpS390XSRWconst { 14055 break 14056 } 14057 if w0.AuxInt != j-16 { 14058 break 14059 } 14060 if w != w0.Args[0] { 14061 break 14062 } 14063 mem := x.Args[3] 14064 if !(x.Uses == 1 && clobber(x)) { 14065 break 14066 } 14067 v.reset(OpS390XMOVWBRstoreidx) 14068 v.AuxInt = i - 2 14069 v.Aux = s 14070 v.AddArg(p) 14071 v.AddArg(idx) 14072 v.AddArg(w0) 14073 v.AddArg(mem) 14074 return true 14075 } 14076 // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) 14077 // cond: x.Uses == 1 && clobber(x) 14078 // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) 14079 for { 14080 i := v.AuxInt 14081 s := v.Aux 14082 idx := v.Args[0] 14083 p := v.Args[1] 14084 v_2 := v.Args[2] 14085 if v_2.Op != OpS390XSRWconst { 14086 break 14087 } 14088 j := v_2.AuxInt 14089 w := v_2.Args[0] 14090 x := v.Args[3] 14091 if x.Op != OpS390XMOVHBRstoreidx { 14092 break 14093 } 14094 if x.AuxInt != i-2 { 14095 break 14096 } 14097 if x.Aux != s { 14098 break 14099 } 14100 if idx != x.Args[0] { 14101 break 14102 } 14103 if p != x.Args[1] { 14104 break 14105 } 14106 w0 := x.Args[2] 14107 if w0.Op != OpS390XSRWconst { 14108 break 14109 } 14110 if w0.AuxInt != j-16 { 14111 break 14112 } 14113 if w != w0.Args[0] { 14114 break 14115 } 14116 mem := x.Args[3] 14117 if !(x.Uses == 1 && clobber(x)) { 14118 break 14119 } 14120 v.reset(OpS390XMOVWBRstoreidx) 14121 v.AuxInt = i - 2 14122 v.Aux = s 14123 v.AddArg(p) 14124 v.AddArg(idx) 14125 v.AddArg(w0) 14126 v.AddArg(mem) 14127 return true 14128 } 14129 return false 14130 } 14131 func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { 14132 // match: (MOVHZload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 14133 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 14134 // result: (MOVHZreg x) 14135 for { 14136 off := v.AuxInt 14137 sym := v.Aux 14138 ptr := v.Args[0] 14139 v_1 := v.Args[1] 14140 if v_1.Op != OpS390XMOVHstore { 14141 break 14142 } 14143 off2 := v_1.AuxInt 14144 sym2 := v_1.Aux 14145 ptr2 := v_1.Args[0] 14146 x := v_1.Args[1] 14147 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 14148 break 14149 } 14150 v.reset(OpS390XMOVHZreg) 14151 v.AddArg(x) 14152 return true 14153 } 14154 // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) 14155 // cond: is20Bit(off1+off2) 14156 // result: (MOVHZload [off1+off2] {sym} ptr mem) 14157 for { 14158 off1 := v.AuxInt 14159 sym := v.Aux 14160 v_0 := v.Args[0] 14161 if v_0.Op != OpS390XADDconst { 14162 break 14163 } 14164 off2 := v_0.AuxInt 14165 ptr := v_0.Args[0] 14166 mem := v.Args[1] 14167 if !(is20Bit(off1 + off2)) { 14168 break 14169 } 14170 v.reset(OpS390XMOVHZload) 14171 v.AuxInt = off1 + off2 14172 v.Aux = sym 14173 v.AddArg(ptr) 14174 v.AddArg(mem) 14175 return true 14176 } 14177 // match: (MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 14178 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14179 // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 14180 for { 14181 off1 := v.AuxInt 14182 sym1 := v.Aux 14183 v_0 := v.Args[0] 14184 if v_0.Op != OpS390XMOVDaddr { 14185 break 14186 } 14187 off2 := v_0.AuxInt 14188 sym2 := v_0.Aux 14189 base := v_0.Args[0] 14190 mem := v.Args[1] 14191 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14192 break 14193 } 14194 v.reset(OpS390XMOVHZload) 14195 v.AuxInt = off1 + off2 14196 v.Aux = mergeSym(sym1, sym2) 14197 v.AddArg(base) 14198 v.AddArg(mem) 14199 return true 14200 } 14201 // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 14202 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14203 // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 14204 for { 14205 off1 := v.AuxInt 14206 sym1 := v.Aux 14207 v_0 := v.Args[0] 14208 if v_0.Op != OpS390XMOVDaddridx { 14209 break 14210 } 14211 off2 := v_0.AuxInt 14212 sym2 := v_0.Aux 14213 ptr := v_0.Args[0] 14214 idx := v_0.Args[1] 14215 mem := v.Args[1] 14216 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14217 break 14218 } 14219 v.reset(OpS390XMOVHZloadidx) 14220 v.AuxInt = off1 + off2 14221 v.Aux = mergeSym(sym1, sym2) 14222 v.AddArg(ptr) 14223 v.AddArg(idx) 14224 v.AddArg(mem) 14225 return true 14226 } 14227 // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) 14228 // cond: ptr.Op != OpSB 14229 // result: (MOVHZloadidx [off] {sym} ptr idx mem) 14230 for { 14231 off := v.AuxInt 14232 sym := v.Aux 14233 v_0 := v.Args[0] 14234 if v_0.Op != OpS390XADD { 14235 break 14236 } 14237 ptr := v_0.Args[0] 14238 idx := v_0.Args[1] 14239 mem := v.Args[1] 14240 if !(ptr.Op != OpSB) { 14241 break 14242 } 14243 v.reset(OpS390XMOVHZloadidx) 14244 v.AuxInt = off 14245 v.Aux = sym 14246 v.AddArg(ptr) 14247 v.AddArg(idx) 14248 v.AddArg(mem) 14249 return true 14250 } 14251 return false 14252 } 14253 func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { 14254 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 14255 // cond: 14256 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14257 for { 14258 c := v.AuxInt 14259 sym := v.Aux 14260 v_0 := v.Args[0] 14261 if v_0.Op != OpS390XADDconst { 14262 break 14263 } 14264 d := v_0.AuxInt 14265 ptr := v_0.Args[0] 14266 idx := v.Args[1] 14267 mem := v.Args[2] 14268 v.reset(OpS390XMOVHZloadidx) 14269 v.AuxInt = c + d 14270 v.Aux = sym 14271 v.AddArg(ptr) 14272 v.AddArg(idx) 14273 v.AddArg(mem) 14274 return true 14275 } 14276 // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 14277 // cond: 14278 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14279 for { 14280 c := v.AuxInt 14281 sym := v.Aux 14282 idx := v.Args[0] 14283 v_1 := v.Args[1] 14284 if v_1.Op != OpS390XADDconst { 14285 break 14286 } 14287 d := v_1.AuxInt 14288 ptr := v_1.Args[0] 14289 mem := v.Args[2] 14290 v.reset(OpS390XMOVHZloadidx) 14291 v.AuxInt = c + d 14292 v.Aux = sym 14293 v.AddArg(ptr) 14294 v.AddArg(idx) 14295 v.AddArg(mem) 14296 return true 14297 } 14298 // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 14299 // cond: 14300 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14301 for { 14302 c := v.AuxInt 14303 sym := v.Aux 14304 ptr := v.Args[0] 14305 v_1 := v.Args[1] 14306 if v_1.Op != OpS390XADDconst { 14307 break 14308 } 14309 d := v_1.AuxInt 14310 idx := v_1.Args[0] 14311 mem := v.Args[2] 14312 v.reset(OpS390XMOVHZloadidx) 14313 v.AuxInt = c + d 14314 v.Aux = sym 14315 v.AddArg(ptr) 14316 v.AddArg(idx) 14317 v.AddArg(mem) 14318 return true 14319 } 14320 // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 14321 // cond: 14322 // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) 14323 for { 14324 c := v.AuxInt 14325 sym := v.Aux 14326 v_0 := v.Args[0] 14327 if v_0.Op != OpS390XADDconst { 14328 break 14329 } 14330 d := v_0.AuxInt 14331 idx := v_0.Args[0] 14332 ptr := v.Args[1] 14333 mem := v.Args[2] 14334 v.reset(OpS390XMOVHZloadidx) 14335 v.AuxInt = c + d 14336 v.Aux = sym 14337 v.AddArg(ptr) 14338 v.AddArg(idx) 14339 v.AddArg(mem) 14340 return true 14341 } 14342 return false 14343 } 14344 func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { 14345 b := v.Block 14346 _ = b 14347 // match: (MOVHZreg x:(MOVBZload _ _)) 14348 // cond: 14349 // result: (MOVDreg x) 14350 for { 14351 x := v.Args[0] 14352 if x.Op != OpS390XMOVBZload { 14353 break 14354 } 14355 v.reset(OpS390XMOVDreg) 14356 v.AddArg(x) 14357 return true 14358 } 14359 // match: (MOVHZreg x:(MOVHZload _ _)) 14360 // cond: 14361 // result: (MOVDreg x) 14362 for { 14363 x := v.Args[0] 14364 if x.Op != OpS390XMOVHZload { 14365 break 14366 } 14367 v.reset(OpS390XMOVDreg) 14368 v.AddArg(x) 14369 return true 14370 } 14371 // match: (MOVHZreg x:(Arg <t>)) 14372 // cond: (is8BitInt(t) || is16BitInt(t)) && !isSigned(t) 14373 // result: (MOVDreg x) 14374 for { 14375 x := v.Args[0] 14376 if x.Op != OpArg { 14377 break 14378 } 14379 t := x.Type 14380 if !((is8BitInt(t) || is16BitInt(t)) && !isSigned(t)) { 14381 break 14382 } 14383 v.reset(OpS390XMOVDreg) 14384 v.AddArg(x) 14385 return true 14386 } 14387 // match: (MOVHZreg x:(MOVBZreg _)) 14388 // cond: 14389 // result: (MOVDreg x) 14390 for { 14391 x := v.Args[0] 14392 if x.Op != OpS390XMOVBZreg { 14393 break 14394 } 14395 v.reset(OpS390XMOVDreg) 14396 v.AddArg(x) 14397 return true 14398 } 14399 // match: (MOVHZreg x:(MOVHZreg _)) 14400 // cond: 14401 // result: (MOVDreg x) 14402 for { 14403 x := v.Args[0] 14404 if x.Op != OpS390XMOVHZreg { 14405 break 14406 } 14407 v.reset(OpS390XMOVDreg) 14408 v.AddArg(x) 14409 return true 14410 } 14411 // match: (MOVHZreg (MOVDconst [c])) 14412 // cond: 14413 // result: (MOVDconst [int64(uint16(c))]) 14414 for { 14415 v_0 := v.Args[0] 14416 if v_0.Op != OpS390XMOVDconst { 14417 break 14418 } 14419 c := v_0.AuxInt 14420 v.reset(OpS390XMOVDconst) 14421 v.AuxInt = int64(uint16(c)) 14422 return true 14423 } 14424 // match: (MOVHZreg x:(MOVHZload [off] {sym} ptr mem)) 14425 // cond: x.Uses == 1 && clobber(x) 14426 // result: @x.Block (MOVHZload <v.Type> [off] {sym} ptr mem) 14427 for { 14428 x := v.Args[0] 14429 if x.Op != OpS390XMOVHZload { 14430 break 14431 } 14432 off := x.AuxInt 14433 sym := x.Aux 14434 ptr := x.Args[0] 14435 mem := x.Args[1] 14436 if !(x.Uses == 1 && clobber(x)) { 14437 break 14438 } 14439 b = x.Block 14440 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, v.Type) 14441 v.reset(OpCopy) 14442 v.AddArg(v0) 14443 v0.AuxInt = off 14444 v0.Aux = sym 14445 v0.AddArg(ptr) 14446 v0.AddArg(mem) 14447 return true 14448 } 14449 // match: (MOVHZreg x:(MOVHZloadidx [off] {sym} ptr idx mem)) 14450 // cond: x.Uses == 1 && clobber(x) 14451 // result: @x.Block (MOVHZloadidx <v.Type> [off] {sym} ptr idx mem) 14452 for { 14453 x := v.Args[0] 14454 if x.Op != OpS390XMOVHZloadidx { 14455 break 14456 } 14457 off := x.AuxInt 14458 sym := x.Aux 14459 ptr := x.Args[0] 14460 idx := x.Args[1] 14461 mem := x.Args[2] 14462 if !(x.Uses == 1 && clobber(x)) { 14463 break 14464 } 14465 b = x.Block 14466 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, v.Type) 14467 v.reset(OpCopy) 14468 v.AddArg(v0) 14469 v0.AuxInt = off 14470 v0.Aux = sym 14471 v0.AddArg(ptr) 14472 v0.AddArg(idx) 14473 v0.AddArg(mem) 14474 return true 14475 } 14476 return false 14477 } 14478 func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { 14479 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 14480 // cond: is20Bit(off1+off2) 14481 // result: (MOVHload [off1+off2] {sym} ptr mem) 14482 for { 14483 off1 := v.AuxInt 14484 sym := v.Aux 14485 v_0 := v.Args[0] 14486 if v_0.Op != OpS390XADDconst { 14487 break 14488 } 14489 off2 := v_0.AuxInt 14490 ptr := v_0.Args[0] 14491 mem := v.Args[1] 14492 if !(is20Bit(off1 + off2)) { 14493 break 14494 } 14495 v.reset(OpS390XMOVHload) 14496 v.AuxInt = off1 + off2 14497 v.Aux = sym 14498 v.AddArg(ptr) 14499 v.AddArg(mem) 14500 return true 14501 } 14502 // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 14503 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14504 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) 14505 for { 14506 off1 := v.AuxInt 14507 sym1 := v.Aux 14508 v_0 := v.Args[0] 14509 if v_0.Op != OpS390XMOVDaddr { 14510 break 14511 } 14512 off2 := v_0.AuxInt 14513 sym2 := v_0.Aux 14514 base := v_0.Args[0] 14515 mem := v.Args[1] 14516 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14517 break 14518 } 14519 v.reset(OpS390XMOVHload) 14520 v.AuxInt = off1 + off2 14521 v.Aux = mergeSym(sym1, sym2) 14522 v.AddArg(base) 14523 v.AddArg(mem) 14524 return true 14525 } 14526 return false 14527 } 14528 func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { 14529 b := v.Block 14530 _ = b 14531 // match: (MOVHreg x:(MOVBload _ _)) 14532 // cond: 14533 // result: (MOVDreg x) 14534 for { 14535 x := v.Args[0] 14536 if x.Op != OpS390XMOVBload { 14537 break 14538 } 14539 v.reset(OpS390XMOVDreg) 14540 v.AddArg(x) 14541 return true 14542 } 14543 // match: (MOVHreg x:(MOVBZload _ _)) 14544 // cond: 14545 // result: (MOVDreg x) 14546 for { 14547 x := v.Args[0] 14548 if x.Op != OpS390XMOVBZload { 14549 break 14550 } 14551 v.reset(OpS390XMOVDreg) 14552 v.AddArg(x) 14553 return true 14554 } 14555 // match: (MOVHreg x:(MOVHload _ _)) 14556 // cond: 14557 // result: (MOVDreg x) 14558 for { 14559 x := v.Args[0] 14560 if x.Op != OpS390XMOVHload { 14561 break 14562 } 14563 v.reset(OpS390XMOVDreg) 14564 v.AddArg(x) 14565 return true 14566 } 14567 // match: (MOVHreg x:(Arg <t>)) 14568 // cond: (is8BitInt(t) || is16BitInt(t)) && isSigned(t) 14569 // result: (MOVDreg x) 14570 for { 14571 x := v.Args[0] 14572 if x.Op != OpArg { 14573 break 14574 } 14575 t := x.Type 14576 if !((is8BitInt(t) || is16BitInt(t)) && isSigned(t)) { 14577 break 14578 } 14579 v.reset(OpS390XMOVDreg) 14580 v.AddArg(x) 14581 return true 14582 } 14583 // match: (MOVHreg x:(MOVBreg _)) 14584 // cond: 14585 // result: (MOVDreg x) 14586 for { 14587 x := v.Args[0] 14588 if x.Op != OpS390XMOVBreg { 14589 break 14590 } 14591 v.reset(OpS390XMOVDreg) 14592 v.AddArg(x) 14593 return true 14594 } 14595 // match: (MOVHreg x:(MOVBZreg _)) 14596 // cond: 14597 // result: (MOVDreg x) 14598 for { 14599 x := v.Args[0] 14600 if x.Op != OpS390XMOVBZreg { 14601 break 14602 } 14603 v.reset(OpS390XMOVDreg) 14604 v.AddArg(x) 14605 return true 14606 } 14607 // match: (MOVHreg x:(MOVHreg _)) 14608 // cond: 14609 // result: (MOVDreg x) 14610 for { 14611 x := v.Args[0] 14612 if x.Op != OpS390XMOVHreg { 14613 break 14614 } 14615 v.reset(OpS390XMOVDreg) 14616 v.AddArg(x) 14617 return true 14618 } 14619 // match: (MOVHreg (MOVDconst [c])) 14620 // cond: 14621 // result: (MOVDconst [int64(int16(c))]) 14622 for { 14623 v_0 := v.Args[0] 14624 if v_0.Op != OpS390XMOVDconst { 14625 break 14626 } 14627 c := v_0.AuxInt 14628 v.reset(OpS390XMOVDconst) 14629 v.AuxInt = int64(int16(c)) 14630 return true 14631 } 14632 // match: (MOVHreg x:(MOVHZload [off] {sym} ptr mem)) 14633 // cond: x.Uses == 1 && clobber(x) 14634 // result: @x.Block (MOVHload <v.Type> [off] {sym} ptr mem) 14635 for { 14636 x := v.Args[0] 14637 if x.Op != OpS390XMOVHZload { 14638 break 14639 } 14640 off := x.AuxInt 14641 sym := x.Aux 14642 ptr := x.Args[0] 14643 mem := x.Args[1] 14644 if !(x.Uses == 1 && clobber(x)) { 14645 break 14646 } 14647 b = x.Block 14648 v0 := b.NewValue0(v.Pos, OpS390XMOVHload, v.Type) 14649 v.reset(OpCopy) 14650 v.AddArg(v0) 14651 v0.AuxInt = off 14652 v0.Aux = sym 14653 v0.AddArg(ptr) 14654 v0.AddArg(mem) 14655 return true 14656 } 14657 return false 14658 } 14659 func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { 14660 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 14661 // cond: 14662 // result: (MOVHstore [off] {sym} ptr x mem) 14663 for { 14664 off := v.AuxInt 14665 sym := v.Aux 14666 ptr := v.Args[0] 14667 v_1 := v.Args[1] 14668 if v_1.Op != OpS390XMOVHreg { 14669 break 14670 } 14671 x := v_1.Args[0] 14672 mem := v.Args[2] 14673 v.reset(OpS390XMOVHstore) 14674 v.AuxInt = off 14675 v.Aux = sym 14676 v.AddArg(ptr) 14677 v.AddArg(x) 14678 v.AddArg(mem) 14679 return true 14680 } 14681 // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) 14682 // cond: 14683 // result: (MOVHstore [off] {sym} ptr x mem) 14684 for { 14685 off := v.AuxInt 14686 sym := v.Aux 14687 ptr := v.Args[0] 14688 v_1 := v.Args[1] 14689 if v_1.Op != OpS390XMOVHZreg { 14690 break 14691 } 14692 x := v_1.Args[0] 14693 mem := v.Args[2] 14694 v.reset(OpS390XMOVHstore) 14695 v.AuxInt = off 14696 v.Aux = sym 14697 v.AddArg(ptr) 14698 v.AddArg(x) 14699 v.AddArg(mem) 14700 return true 14701 } 14702 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 14703 // cond: is20Bit(off1+off2) 14704 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 14705 for { 14706 off1 := v.AuxInt 14707 sym := v.Aux 14708 v_0 := v.Args[0] 14709 if v_0.Op != OpS390XADDconst { 14710 break 14711 } 14712 off2 := v_0.AuxInt 14713 ptr := v_0.Args[0] 14714 val := v.Args[1] 14715 mem := v.Args[2] 14716 if !(is20Bit(off1 + off2)) { 14717 break 14718 } 14719 v.reset(OpS390XMOVHstore) 14720 v.AuxInt = off1 + off2 14721 v.Aux = sym 14722 v.AddArg(ptr) 14723 v.AddArg(val) 14724 v.AddArg(mem) 14725 return true 14726 } 14727 // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) 14728 // cond: validOff(off) && ptr.Op != OpSB 14729 // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) 14730 for { 14731 off := v.AuxInt 14732 sym := v.Aux 14733 ptr := v.Args[0] 14734 v_1 := v.Args[1] 14735 if v_1.Op != OpS390XMOVDconst { 14736 break 14737 } 14738 c := v_1.AuxInt 14739 mem := v.Args[2] 14740 if !(validOff(off) && ptr.Op != OpSB) { 14741 break 14742 } 14743 v.reset(OpS390XMOVHstoreconst) 14744 v.AuxInt = makeValAndOff(int64(int16(c)), off) 14745 v.Aux = sym 14746 v.AddArg(ptr) 14747 v.AddArg(mem) 14748 return true 14749 } 14750 // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 14751 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14752 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 14753 for { 14754 off1 := v.AuxInt 14755 sym1 := v.Aux 14756 v_0 := v.Args[0] 14757 if v_0.Op != OpS390XMOVDaddr { 14758 break 14759 } 14760 off2 := v_0.AuxInt 14761 sym2 := v_0.Aux 14762 base := v_0.Args[0] 14763 val := v.Args[1] 14764 mem := v.Args[2] 14765 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14766 break 14767 } 14768 v.reset(OpS390XMOVHstore) 14769 v.AuxInt = off1 + off2 14770 v.Aux = mergeSym(sym1, sym2) 14771 v.AddArg(base) 14772 v.AddArg(val) 14773 v.AddArg(mem) 14774 return true 14775 } 14776 // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 14777 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 14778 // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 14779 for { 14780 off1 := v.AuxInt 14781 sym1 := v.Aux 14782 v_0 := v.Args[0] 14783 if v_0.Op != OpS390XMOVDaddridx { 14784 break 14785 } 14786 off2 := v_0.AuxInt 14787 sym2 := v_0.Aux 14788 ptr := v_0.Args[0] 14789 idx := v_0.Args[1] 14790 val := v.Args[1] 14791 mem := v.Args[2] 14792 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 14793 break 14794 } 14795 v.reset(OpS390XMOVHstoreidx) 14796 v.AuxInt = off1 + off2 14797 v.Aux = mergeSym(sym1, sym2) 14798 v.AddArg(ptr) 14799 v.AddArg(idx) 14800 v.AddArg(val) 14801 v.AddArg(mem) 14802 return true 14803 } 14804 // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) 14805 // cond: ptr.Op != OpSB 14806 // result: (MOVHstoreidx [off] {sym} ptr idx val mem) 14807 for { 14808 off := v.AuxInt 14809 sym := v.Aux 14810 v_0 := v.Args[0] 14811 if v_0.Op != OpS390XADD { 14812 break 14813 } 14814 ptr := v_0.Args[0] 14815 idx := v_0.Args[1] 14816 val := v.Args[1] 14817 mem := v.Args[2] 14818 if !(ptr.Op != OpSB) { 14819 break 14820 } 14821 v.reset(OpS390XMOVHstoreidx) 14822 v.AuxInt = off 14823 v.Aux = sym 14824 v.AddArg(ptr) 14825 v.AddArg(idx) 14826 v.AddArg(val) 14827 v.AddArg(mem) 14828 return true 14829 } 14830 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) 14831 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 14832 // result: (MOVWstore [i-2] {s} p w mem) 14833 for { 14834 i := v.AuxInt 14835 s := v.Aux 14836 p := v.Args[0] 14837 w := v.Args[1] 14838 x := v.Args[2] 14839 if x.Op != OpS390XMOVHstore { 14840 break 14841 } 14842 if x.AuxInt != i-2 { 14843 break 14844 } 14845 if x.Aux != s { 14846 break 14847 } 14848 if p != x.Args[0] { 14849 break 14850 } 14851 x_1 := x.Args[1] 14852 if x_1.Op != OpS390XSRDconst { 14853 break 14854 } 14855 if x_1.AuxInt != 16 { 14856 break 14857 } 14858 if w != x_1.Args[0] { 14859 break 14860 } 14861 mem := x.Args[2] 14862 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 14863 break 14864 } 14865 v.reset(OpS390XMOVWstore) 14866 v.AuxInt = i - 2 14867 v.Aux = s 14868 v.AddArg(p) 14869 v.AddArg(w) 14870 v.AddArg(mem) 14871 return true 14872 } 14873 // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) 14874 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 14875 // result: (MOVWstore [i-2] {s} p w0 mem) 14876 for { 14877 i := v.AuxInt 14878 s := v.Aux 14879 p := v.Args[0] 14880 w0 := v.Args[1] 14881 if w0.Op != OpS390XSRDconst { 14882 break 14883 } 14884 j := w0.AuxInt 14885 w := w0.Args[0] 14886 x := v.Args[2] 14887 if x.Op != OpS390XMOVHstore { 14888 break 14889 } 14890 if x.AuxInt != i-2 { 14891 break 14892 } 14893 if x.Aux != s { 14894 break 14895 } 14896 if p != x.Args[0] { 14897 break 14898 } 14899 x_1 := x.Args[1] 14900 if x_1.Op != OpS390XSRDconst { 14901 break 14902 } 14903 if x_1.AuxInt != j+16 { 14904 break 14905 } 14906 if w != x_1.Args[0] { 14907 break 14908 } 14909 mem := x.Args[2] 14910 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 14911 break 14912 } 14913 v.reset(OpS390XMOVWstore) 14914 v.AuxInt = i - 2 14915 v.Aux = s 14916 v.AddArg(p) 14917 v.AddArg(w0) 14918 v.AddArg(mem) 14919 return true 14920 } 14921 // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) 14922 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 14923 // result: (MOVWstore [i-2] {s} p w mem) 14924 for { 14925 i := v.AuxInt 14926 s := v.Aux 14927 p := v.Args[0] 14928 w := v.Args[1] 14929 x := v.Args[2] 14930 if x.Op != OpS390XMOVHstore { 14931 break 14932 } 14933 if x.AuxInt != i-2 { 14934 break 14935 } 14936 if x.Aux != s { 14937 break 14938 } 14939 if p != x.Args[0] { 14940 break 14941 } 14942 x_1 := x.Args[1] 14943 if x_1.Op != OpS390XSRWconst { 14944 break 14945 } 14946 if x_1.AuxInt != 16 { 14947 break 14948 } 14949 if w != x_1.Args[0] { 14950 break 14951 } 14952 mem := x.Args[2] 14953 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 14954 break 14955 } 14956 v.reset(OpS390XMOVWstore) 14957 v.AuxInt = i - 2 14958 v.Aux = s 14959 v.AddArg(p) 14960 v.AddArg(w) 14961 v.AddArg(mem) 14962 return true 14963 } 14964 return false 14965 } 14966 func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { 14967 // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) 14968 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 14969 // result: (MOVWstore [i-2] {s} p w0 mem) 14970 for { 14971 i := v.AuxInt 14972 s := v.Aux 14973 p := v.Args[0] 14974 w0 := v.Args[1] 14975 if w0.Op != OpS390XSRWconst { 14976 break 14977 } 14978 j := w0.AuxInt 14979 w := w0.Args[0] 14980 x := v.Args[2] 14981 if x.Op != OpS390XMOVHstore { 14982 break 14983 } 14984 if x.AuxInt != i-2 { 14985 break 14986 } 14987 if x.Aux != s { 14988 break 14989 } 14990 if p != x.Args[0] { 14991 break 14992 } 14993 x_1 := x.Args[1] 14994 if x_1.Op != OpS390XSRWconst { 14995 break 14996 } 14997 if x_1.AuxInt != j+16 { 14998 break 14999 } 15000 if w != x_1.Args[0] { 15001 break 15002 } 15003 mem := x.Args[2] 15004 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 15005 break 15006 } 15007 v.reset(OpS390XMOVWstore) 15008 v.AuxInt = i - 2 15009 v.Aux = s 15010 v.AddArg(p) 15011 v.AddArg(w0) 15012 v.AddArg(mem) 15013 return true 15014 } 15015 return false 15016 } 15017 func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { 15018 // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) 15019 // cond: ValAndOff(sc).canAdd(off) 15020 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 15021 for { 15022 sc := v.AuxInt 15023 s := v.Aux 15024 v_0 := v.Args[0] 15025 if v_0.Op != OpS390XADDconst { 15026 break 15027 } 15028 off := v_0.AuxInt 15029 ptr := v_0.Args[0] 15030 mem := v.Args[1] 15031 if !(ValAndOff(sc).canAdd(off)) { 15032 break 15033 } 15034 v.reset(OpS390XMOVHstoreconst) 15035 v.AuxInt = ValAndOff(sc).add(off) 15036 v.Aux = s 15037 v.AddArg(ptr) 15038 v.AddArg(mem) 15039 return true 15040 } 15041 // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 15042 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 15043 // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 15044 for { 15045 sc := v.AuxInt 15046 sym1 := v.Aux 15047 v_0 := v.Args[0] 15048 if v_0.Op != OpS390XMOVDaddr { 15049 break 15050 } 15051 off := v_0.AuxInt 15052 sym2 := v_0.Aux 15053 ptr := v_0.Args[0] 15054 mem := v.Args[1] 15055 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 15056 break 15057 } 15058 v.reset(OpS390XMOVHstoreconst) 15059 v.AuxInt = ValAndOff(sc).add(off) 15060 v.Aux = mergeSym(sym1, sym2) 15061 v.AddArg(ptr) 15062 v.AddArg(mem) 15063 return true 15064 } 15065 // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) 15066 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) 15067 // result: (MOVWstoreconst [makeValAndOff(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16, ValAndOff(a).Off())] {s} p mem) 15068 for { 15069 c := v.AuxInt 15070 s := v.Aux 15071 p := v.Args[0] 15072 x := v.Args[1] 15073 if x.Op != OpS390XMOVHstoreconst { 15074 break 15075 } 15076 a := x.AuxInt 15077 if x.Aux != s { 15078 break 15079 } 15080 if p != x.Args[0] { 15081 break 15082 } 15083 mem := x.Args[1] 15084 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { 15085 break 15086 } 15087 v.reset(OpS390XMOVWstoreconst) 15088 v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xffff|ValAndOff(a).Val()<<16, ValAndOff(a).Off()) 15089 v.Aux = s 15090 v.AddArg(p) 15091 v.AddArg(mem) 15092 return true 15093 } 15094 return false 15095 } 15096 func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { 15097 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 15098 // cond: 15099 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15100 for { 15101 c := v.AuxInt 15102 sym := v.Aux 15103 v_0 := v.Args[0] 15104 if v_0.Op != OpS390XADDconst { 15105 break 15106 } 15107 d := v_0.AuxInt 15108 ptr := v_0.Args[0] 15109 idx := v.Args[1] 15110 val := v.Args[2] 15111 mem := v.Args[3] 15112 v.reset(OpS390XMOVHstoreidx) 15113 v.AuxInt = c + d 15114 v.Aux = sym 15115 v.AddArg(ptr) 15116 v.AddArg(idx) 15117 v.AddArg(val) 15118 v.AddArg(mem) 15119 return true 15120 } 15121 // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 15122 // cond: 15123 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15124 for { 15125 c := v.AuxInt 15126 sym := v.Aux 15127 idx := v.Args[0] 15128 v_1 := v.Args[1] 15129 if v_1.Op != OpS390XADDconst { 15130 break 15131 } 15132 d := v_1.AuxInt 15133 ptr := v_1.Args[0] 15134 val := v.Args[2] 15135 mem := v.Args[3] 15136 v.reset(OpS390XMOVHstoreidx) 15137 v.AuxInt = c + d 15138 v.Aux = sym 15139 v.AddArg(ptr) 15140 v.AddArg(idx) 15141 v.AddArg(val) 15142 v.AddArg(mem) 15143 return true 15144 } 15145 // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 15146 // cond: 15147 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15148 for { 15149 c := v.AuxInt 15150 sym := v.Aux 15151 ptr := v.Args[0] 15152 v_1 := v.Args[1] 15153 if v_1.Op != OpS390XADDconst { 15154 break 15155 } 15156 d := v_1.AuxInt 15157 idx := v_1.Args[0] 15158 val := v.Args[2] 15159 mem := v.Args[3] 15160 v.reset(OpS390XMOVHstoreidx) 15161 v.AuxInt = c + d 15162 v.Aux = sym 15163 v.AddArg(ptr) 15164 v.AddArg(idx) 15165 v.AddArg(val) 15166 v.AddArg(mem) 15167 return true 15168 } 15169 // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 15170 // cond: 15171 // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) 15172 for { 15173 c := v.AuxInt 15174 sym := v.Aux 15175 v_0 := v.Args[0] 15176 if v_0.Op != OpS390XADDconst { 15177 break 15178 } 15179 d := v_0.AuxInt 15180 idx := v_0.Args[0] 15181 ptr := v.Args[1] 15182 val := v.Args[2] 15183 mem := v.Args[3] 15184 v.reset(OpS390XMOVHstoreidx) 15185 v.AuxInt = c + d 15186 v.Aux = sym 15187 v.AddArg(ptr) 15188 v.AddArg(idx) 15189 v.AddArg(val) 15190 v.AddArg(mem) 15191 return true 15192 } 15193 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15194 // cond: x.Uses == 1 && clobber(x) 15195 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15196 for { 15197 i := v.AuxInt 15198 s := v.Aux 15199 p := v.Args[0] 15200 idx := v.Args[1] 15201 w := v.Args[2] 15202 x := v.Args[3] 15203 if x.Op != OpS390XMOVHstoreidx { 15204 break 15205 } 15206 if x.AuxInt != i-2 { 15207 break 15208 } 15209 if x.Aux != s { 15210 break 15211 } 15212 if p != x.Args[0] { 15213 break 15214 } 15215 if idx != x.Args[1] { 15216 break 15217 } 15218 x_2 := x.Args[2] 15219 if x_2.Op != OpS390XSRDconst { 15220 break 15221 } 15222 if x_2.AuxInt != 16 { 15223 break 15224 } 15225 if w != x_2.Args[0] { 15226 break 15227 } 15228 mem := x.Args[3] 15229 if !(x.Uses == 1 && clobber(x)) { 15230 break 15231 } 15232 v.reset(OpS390XMOVWstoreidx) 15233 v.AuxInt = i - 2 15234 v.Aux = s 15235 v.AddArg(p) 15236 v.AddArg(idx) 15237 v.AddArg(w) 15238 v.AddArg(mem) 15239 return true 15240 } 15241 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15242 // cond: x.Uses == 1 && clobber(x) 15243 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15244 for { 15245 i := v.AuxInt 15246 s := v.Aux 15247 p := v.Args[0] 15248 idx := v.Args[1] 15249 w := v.Args[2] 15250 x := v.Args[3] 15251 if x.Op != OpS390XMOVHstoreidx { 15252 break 15253 } 15254 if x.AuxInt != i-2 { 15255 break 15256 } 15257 if x.Aux != s { 15258 break 15259 } 15260 if idx != x.Args[0] { 15261 break 15262 } 15263 if p != x.Args[1] { 15264 break 15265 } 15266 x_2 := x.Args[2] 15267 if x_2.Op != OpS390XSRDconst { 15268 break 15269 } 15270 if x_2.AuxInt != 16 { 15271 break 15272 } 15273 if w != x_2.Args[0] { 15274 break 15275 } 15276 mem := x.Args[3] 15277 if !(x.Uses == 1 && clobber(x)) { 15278 break 15279 } 15280 v.reset(OpS390XMOVWstoreidx) 15281 v.AuxInt = i - 2 15282 v.Aux = s 15283 v.AddArg(p) 15284 v.AddArg(idx) 15285 v.AddArg(w) 15286 v.AddArg(mem) 15287 return true 15288 } 15289 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) 15290 // cond: x.Uses == 1 && clobber(x) 15291 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15292 for { 15293 i := v.AuxInt 15294 s := v.Aux 15295 idx := v.Args[0] 15296 p := v.Args[1] 15297 w := v.Args[2] 15298 x := v.Args[3] 15299 if x.Op != OpS390XMOVHstoreidx { 15300 break 15301 } 15302 if x.AuxInt != i-2 { 15303 break 15304 } 15305 if x.Aux != s { 15306 break 15307 } 15308 if p != x.Args[0] { 15309 break 15310 } 15311 if idx != x.Args[1] { 15312 break 15313 } 15314 x_2 := x.Args[2] 15315 if x_2.Op != OpS390XSRDconst { 15316 break 15317 } 15318 if x_2.AuxInt != 16 { 15319 break 15320 } 15321 if w != x_2.Args[0] { 15322 break 15323 } 15324 mem := x.Args[3] 15325 if !(x.Uses == 1 && clobber(x)) { 15326 break 15327 } 15328 v.reset(OpS390XMOVWstoreidx) 15329 v.AuxInt = i - 2 15330 v.Aux = s 15331 v.AddArg(p) 15332 v.AddArg(idx) 15333 v.AddArg(w) 15334 v.AddArg(mem) 15335 return true 15336 } 15337 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) 15338 // cond: x.Uses == 1 && clobber(x) 15339 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15340 for { 15341 i := v.AuxInt 15342 s := v.Aux 15343 idx := v.Args[0] 15344 p := v.Args[1] 15345 w := v.Args[2] 15346 x := v.Args[3] 15347 if x.Op != OpS390XMOVHstoreidx { 15348 break 15349 } 15350 if x.AuxInt != i-2 { 15351 break 15352 } 15353 if x.Aux != s { 15354 break 15355 } 15356 if idx != x.Args[0] { 15357 break 15358 } 15359 if p != x.Args[1] { 15360 break 15361 } 15362 x_2 := x.Args[2] 15363 if x_2.Op != OpS390XSRDconst { 15364 break 15365 } 15366 if x_2.AuxInt != 16 { 15367 break 15368 } 15369 if w != x_2.Args[0] { 15370 break 15371 } 15372 mem := x.Args[3] 15373 if !(x.Uses == 1 && clobber(x)) { 15374 break 15375 } 15376 v.reset(OpS390XMOVWstoreidx) 15377 v.AuxInt = i - 2 15378 v.Aux = s 15379 v.AddArg(p) 15380 v.AddArg(idx) 15381 v.AddArg(w) 15382 v.AddArg(mem) 15383 return true 15384 } 15385 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 15386 // cond: x.Uses == 1 && clobber(x) 15387 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15388 for { 15389 i := v.AuxInt 15390 s := v.Aux 15391 p := v.Args[0] 15392 idx := v.Args[1] 15393 w0 := v.Args[2] 15394 if w0.Op != OpS390XSRDconst { 15395 break 15396 } 15397 j := w0.AuxInt 15398 w := w0.Args[0] 15399 x := v.Args[3] 15400 if x.Op != OpS390XMOVHstoreidx { 15401 break 15402 } 15403 if x.AuxInt != i-2 { 15404 break 15405 } 15406 if x.Aux != s { 15407 break 15408 } 15409 if p != x.Args[0] { 15410 break 15411 } 15412 if idx != x.Args[1] { 15413 break 15414 } 15415 x_2 := x.Args[2] 15416 if x_2.Op != OpS390XSRDconst { 15417 break 15418 } 15419 if x_2.AuxInt != j+16 { 15420 break 15421 } 15422 if w != x_2.Args[0] { 15423 break 15424 } 15425 mem := x.Args[3] 15426 if !(x.Uses == 1 && clobber(x)) { 15427 break 15428 } 15429 v.reset(OpS390XMOVWstoreidx) 15430 v.AuxInt = i - 2 15431 v.Aux = s 15432 v.AddArg(p) 15433 v.AddArg(idx) 15434 v.AddArg(w0) 15435 v.AddArg(mem) 15436 return true 15437 } 15438 // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 15439 // cond: x.Uses == 1 && clobber(x) 15440 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15441 for { 15442 i := v.AuxInt 15443 s := v.Aux 15444 p := v.Args[0] 15445 idx := v.Args[1] 15446 w0 := v.Args[2] 15447 if w0.Op != OpS390XSRDconst { 15448 break 15449 } 15450 j := w0.AuxInt 15451 w := w0.Args[0] 15452 x := v.Args[3] 15453 if x.Op != OpS390XMOVHstoreidx { 15454 break 15455 } 15456 if x.AuxInt != i-2 { 15457 break 15458 } 15459 if x.Aux != s { 15460 break 15461 } 15462 if idx != x.Args[0] { 15463 break 15464 } 15465 if p != x.Args[1] { 15466 break 15467 } 15468 x_2 := x.Args[2] 15469 if x_2.Op != OpS390XSRDconst { 15470 break 15471 } 15472 if x_2.AuxInt != j+16 { 15473 break 15474 } 15475 if w != x_2.Args[0] { 15476 break 15477 } 15478 mem := x.Args[3] 15479 if !(x.Uses == 1 && clobber(x)) { 15480 break 15481 } 15482 v.reset(OpS390XMOVWstoreidx) 15483 v.AuxInt = i - 2 15484 v.Aux = s 15485 v.AddArg(p) 15486 v.AddArg(idx) 15487 v.AddArg(w0) 15488 v.AddArg(mem) 15489 return true 15490 } 15491 return false 15492 } 15493 func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { 15494 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) 15495 // cond: x.Uses == 1 && clobber(x) 15496 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15497 for { 15498 i := v.AuxInt 15499 s := v.Aux 15500 idx := v.Args[0] 15501 p := v.Args[1] 15502 w0 := v.Args[2] 15503 if w0.Op != OpS390XSRDconst { 15504 break 15505 } 15506 j := w0.AuxInt 15507 w := w0.Args[0] 15508 x := v.Args[3] 15509 if x.Op != OpS390XMOVHstoreidx { 15510 break 15511 } 15512 if x.AuxInt != i-2 { 15513 break 15514 } 15515 if x.Aux != s { 15516 break 15517 } 15518 if p != x.Args[0] { 15519 break 15520 } 15521 if idx != x.Args[1] { 15522 break 15523 } 15524 x_2 := x.Args[2] 15525 if x_2.Op != OpS390XSRDconst { 15526 break 15527 } 15528 if x_2.AuxInt != j+16 { 15529 break 15530 } 15531 if w != x_2.Args[0] { 15532 break 15533 } 15534 mem := x.Args[3] 15535 if !(x.Uses == 1 && clobber(x)) { 15536 break 15537 } 15538 v.reset(OpS390XMOVWstoreidx) 15539 v.AuxInt = i - 2 15540 v.Aux = s 15541 v.AddArg(p) 15542 v.AddArg(idx) 15543 v.AddArg(w0) 15544 v.AddArg(mem) 15545 return true 15546 } 15547 // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) 15548 // cond: x.Uses == 1 && clobber(x) 15549 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15550 for { 15551 i := v.AuxInt 15552 s := v.Aux 15553 idx := v.Args[0] 15554 p := v.Args[1] 15555 w0 := v.Args[2] 15556 if w0.Op != OpS390XSRDconst { 15557 break 15558 } 15559 j := w0.AuxInt 15560 w := w0.Args[0] 15561 x := v.Args[3] 15562 if x.Op != OpS390XMOVHstoreidx { 15563 break 15564 } 15565 if x.AuxInt != i-2 { 15566 break 15567 } 15568 if x.Aux != s { 15569 break 15570 } 15571 if idx != x.Args[0] { 15572 break 15573 } 15574 if p != x.Args[1] { 15575 break 15576 } 15577 x_2 := x.Args[2] 15578 if x_2.Op != OpS390XSRDconst { 15579 break 15580 } 15581 if x_2.AuxInt != j+16 { 15582 break 15583 } 15584 if w != x_2.Args[0] { 15585 break 15586 } 15587 mem := x.Args[3] 15588 if !(x.Uses == 1 && clobber(x)) { 15589 break 15590 } 15591 v.reset(OpS390XMOVWstoreidx) 15592 v.AuxInt = i - 2 15593 v.Aux = s 15594 v.AddArg(p) 15595 v.AddArg(idx) 15596 v.AddArg(w0) 15597 v.AddArg(mem) 15598 return true 15599 } 15600 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 15601 // cond: x.Uses == 1 && clobber(x) 15602 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15603 for { 15604 i := v.AuxInt 15605 s := v.Aux 15606 p := v.Args[0] 15607 idx := v.Args[1] 15608 w := v.Args[2] 15609 x := v.Args[3] 15610 if x.Op != OpS390XMOVHstoreidx { 15611 break 15612 } 15613 if x.AuxInt != i-2 { 15614 break 15615 } 15616 if x.Aux != s { 15617 break 15618 } 15619 if p != x.Args[0] { 15620 break 15621 } 15622 if idx != x.Args[1] { 15623 break 15624 } 15625 x_2 := x.Args[2] 15626 if x_2.Op != OpS390XSRWconst { 15627 break 15628 } 15629 if x_2.AuxInt != 16 { 15630 break 15631 } 15632 if w != x_2.Args[0] { 15633 break 15634 } 15635 mem := x.Args[3] 15636 if !(x.Uses == 1 && clobber(x)) { 15637 break 15638 } 15639 v.reset(OpS390XMOVWstoreidx) 15640 v.AuxInt = i - 2 15641 v.Aux = s 15642 v.AddArg(p) 15643 v.AddArg(idx) 15644 v.AddArg(w) 15645 v.AddArg(mem) 15646 return true 15647 } 15648 // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 15649 // cond: x.Uses == 1 && clobber(x) 15650 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15651 for { 15652 i := v.AuxInt 15653 s := v.Aux 15654 p := v.Args[0] 15655 idx := v.Args[1] 15656 w := v.Args[2] 15657 x := v.Args[3] 15658 if x.Op != OpS390XMOVHstoreidx { 15659 break 15660 } 15661 if x.AuxInt != i-2 { 15662 break 15663 } 15664 if x.Aux != s { 15665 break 15666 } 15667 if idx != x.Args[0] { 15668 break 15669 } 15670 if p != x.Args[1] { 15671 break 15672 } 15673 x_2 := x.Args[2] 15674 if x_2.Op != OpS390XSRWconst { 15675 break 15676 } 15677 if x_2.AuxInt != 16 { 15678 break 15679 } 15680 if w != x_2.Args[0] { 15681 break 15682 } 15683 mem := x.Args[3] 15684 if !(x.Uses == 1 && clobber(x)) { 15685 break 15686 } 15687 v.reset(OpS390XMOVWstoreidx) 15688 v.AuxInt = i - 2 15689 v.Aux = s 15690 v.AddArg(p) 15691 v.AddArg(idx) 15692 v.AddArg(w) 15693 v.AddArg(mem) 15694 return true 15695 } 15696 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) 15697 // cond: x.Uses == 1 && clobber(x) 15698 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15699 for { 15700 i := v.AuxInt 15701 s := v.Aux 15702 idx := v.Args[0] 15703 p := v.Args[1] 15704 w := v.Args[2] 15705 x := v.Args[3] 15706 if x.Op != OpS390XMOVHstoreidx { 15707 break 15708 } 15709 if x.AuxInt != i-2 { 15710 break 15711 } 15712 if x.Aux != s { 15713 break 15714 } 15715 if p != x.Args[0] { 15716 break 15717 } 15718 if idx != x.Args[1] { 15719 break 15720 } 15721 x_2 := x.Args[2] 15722 if x_2.Op != OpS390XSRWconst { 15723 break 15724 } 15725 if x_2.AuxInt != 16 { 15726 break 15727 } 15728 if w != x_2.Args[0] { 15729 break 15730 } 15731 mem := x.Args[3] 15732 if !(x.Uses == 1 && clobber(x)) { 15733 break 15734 } 15735 v.reset(OpS390XMOVWstoreidx) 15736 v.AuxInt = i - 2 15737 v.Aux = s 15738 v.AddArg(p) 15739 v.AddArg(idx) 15740 v.AddArg(w) 15741 v.AddArg(mem) 15742 return true 15743 } 15744 // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) 15745 // cond: x.Uses == 1 && clobber(x) 15746 // result: (MOVWstoreidx [i-2] {s} p idx w mem) 15747 for { 15748 i := v.AuxInt 15749 s := v.Aux 15750 idx := v.Args[0] 15751 p := v.Args[1] 15752 w := v.Args[2] 15753 x := v.Args[3] 15754 if x.Op != OpS390XMOVHstoreidx { 15755 break 15756 } 15757 if x.AuxInt != i-2 { 15758 break 15759 } 15760 if x.Aux != s { 15761 break 15762 } 15763 if idx != x.Args[0] { 15764 break 15765 } 15766 if p != x.Args[1] { 15767 break 15768 } 15769 x_2 := x.Args[2] 15770 if x_2.Op != OpS390XSRWconst { 15771 break 15772 } 15773 if x_2.AuxInt != 16 { 15774 break 15775 } 15776 if w != x_2.Args[0] { 15777 break 15778 } 15779 mem := x.Args[3] 15780 if !(x.Uses == 1 && clobber(x)) { 15781 break 15782 } 15783 v.reset(OpS390XMOVWstoreidx) 15784 v.AuxInt = i - 2 15785 v.Aux = s 15786 v.AddArg(p) 15787 v.AddArg(idx) 15788 v.AddArg(w) 15789 v.AddArg(mem) 15790 return true 15791 } 15792 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 15793 // cond: x.Uses == 1 && clobber(x) 15794 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15795 for { 15796 i := v.AuxInt 15797 s := v.Aux 15798 p := v.Args[0] 15799 idx := v.Args[1] 15800 w0 := v.Args[2] 15801 if w0.Op != OpS390XSRWconst { 15802 break 15803 } 15804 j := w0.AuxInt 15805 w := w0.Args[0] 15806 x := v.Args[3] 15807 if x.Op != OpS390XMOVHstoreidx { 15808 break 15809 } 15810 if x.AuxInt != i-2 { 15811 break 15812 } 15813 if x.Aux != s { 15814 break 15815 } 15816 if p != x.Args[0] { 15817 break 15818 } 15819 if idx != x.Args[1] { 15820 break 15821 } 15822 x_2 := x.Args[2] 15823 if x_2.Op != OpS390XSRWconst { 15824 break 15825 } 15826 if x_2.AuxInt != j+16 { 15827 break 15828 } 15829 if w != x_2.Args[0] { 15830 break 15831 } 15832 mem := x.Args[3] 15833 if !(x.Uses == 1 && clobber(x)) { 15834 break 15835 } 15836 v.reset(OpS390XMOVWstoreidx) 15837 v.AuxInt = i - 2 15838 v.Aux = s 15839 v.AddArg(p) 15840 v.AddArg(idx) 15841 v.AddArg(w0) 15842 v.AddArg(mem) 15843 return true 15844 } 15845 // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 15846 // cond: x.Uses == 1 && clobber(x) 15847 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15848 for { 15849 i := v.AuxInt 15850 s := v.Aux 15851 p := v.Args[0] 15852 idx := v.Args[1] 15853 w0 := v.Args[2] 15854 if w0.Op != OpS390XSRWconst { 15855 break 15856 } 15857 j := w0.AuxInt 15858 w := w0.Args[0] 15859 x := v.Args[3] 15860 if x.Op != OpS390XMOVHstoreidx { 15861 break 15862 } 15863 if x.AuxInt != i-2 { 15864 break 15865 } 15866 if x.Aux != s { 15867 break 15868 } 15869 if idx != x.Args[0] { 15870 break 15871 } 15872 if p != x.Args[1] { 15873 break 15874 } 15875 x_2 := x.Args[2] 15876 if x_2.Op != OpS390XSRWconst { 15877 break 15878 } 15879 if x_2.AuxInt != j+16 { 15880 break 15881 } 15882 if w != x_2.Args[0] { 15883 break 15884 } 15885 mem := x.Args[3] 15886 if !(x.Uses == 1 && clobber(x)) { 15887 break 15888 } 15889 v.reset(OpS390XMOVWstoreidx) 15890 v.AuxInt = i - 2 15891 v.Aux = s 15892 v.AddArg(p) 15893 v.AddArg(idx) 15894 v.AddArg(w0) 15895 v.AddArg(mem) 15896 return true 15897 } 15898 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) 15899 // cond: x.Uses == 1 && clobber(x) 15900 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15901 for { 15902 i := v.AuxInt 15903 s := v.Aux 15904 idx := v.Args[0] 15905 p := v.Args[1] 15906 w0 := v.Args[2] 15907 if w0.Op != OpS390XSRWconst { 15908 break 15909 } 15910 j := w0.AuxInt 15911 w := w0.Args[0] 15912 x := v.Args[3] 15913 if x.Op != OpS390XMOVHstoreidx { 15914 break 15915 } 15916 if x.AuxInt != i-2 { 15917 break 15918 } 15919 if x.Aux != s { 15920 break 15921 } 15922 if p != x.Args[0] { 15923 break 15924 } 15925 if idx != x.Args[1] { 15926 break 15927 } 15928 x_2 := x.Args[2] 15929 if x_2.Op != OpS390XSRWconst { 15930 break 15931 } 15932 if x_2.AuxInt != j+16 { 15933 break 15934 } 15935 if w != x_2.Args[0] { 15936 break 15937 } 15938 mem := x.Args[3] 15939 if !(x.Uses == 1 && clobber(x)) { 15940 break 15941 } 15942 v.reset(OpS390XMOVWstoreidx) 15943 v.AuxInt = i - 2 15944 v.Aux = s 15945 v.AddArg(p) 15946 v.AddArg(idx) 15947 v.AddArg(w0) 15948 v.AddArg(mem) 15949 return true 15950 } 15951 // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) 15952 // cond: x.Uses == 1 && clobber(x) 15953 // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) 15954 for { 15955 i := v.AuxInt 15956 s := v.Aux 15957 idx := v.Args[0] 15958 p := v.Args[1] 15959 w0 := v.Args[2] 15960 if w0.Op != OpS390XSRWconst { 15961 break 15962 } 15963 j := w0.AuxInt 15964 w := w0.Args[0] 15965 x := v.Args[3] 15966 if x.Op != OpS390XMOVHstoreidx { 15967 break 15968 } 15969 if x.AuxInt != i-2 { 15970 break 15971 } 15972 if x.Aux != s { 15973 break 15974 } 15975 if idx != x.Args[0] { 15976 break 15977 } 15978 if p != x.Args[1] { 15979 break 15980 } 15981 x_2 := x.Args[2] 15982 if x_2.Op != OpS390XSRWconst { 15983 break 15984 } 15985 if x_2.AuxInt != j+16 { 15986 break 15987 } 15988 if w != x_2.Args[0] { 15989 break 15990 } 15991 mem := x.Args[3] 15992 if !(x.Uses == 1 && clobber(x)) { 15993 break 15994 } 15995 v.reset(OpS390XMOVWstoreidx) 15996 v.AuxInt = i - 2 15997 v.Aux = s 15998 v.AddArg(p) 15999 v.AddArg(idx) 16000 v.AddArg(w0) 16001 v.AddArg(mem) 16002 return true 16003 } 16004 return false 16005 } 16006 func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { 16007 // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) 16008 // cond: x.Uses == 1 && clobber(x) 16009 // result: (MOVDBRstore [i-4] {s} p w mem) 16010 for { 16011 i := v.AuxInt 16012 s := v.Aux 16013 p := v.Args[0] 16014 v_1 := v.Args[1] 16015 if v_1.Op != OpS390XSRDconst { 16016 break 16017 } 16018 if v_1.AuxInt != 32 { 16019 break 16020 } 16021 w := v_1.Args[0] 16022 x := v.Args[2] 16023 if x.Op != OpS390XMOVWBRstore { 16024 break 16025 } 16026 if x.AuxInt != i-4 { 16027 break 16028 } 16029 if x.Aux != s { 16030 break 16031 } 16032 if p != x.Args[0] { 16033 break 16034 } 16035 if w != x.Args[1] { 16036 break 16037 } 16038 mem := x.Args[2] 16039 if !(x.Uses == 1 && clobber(x)) { 16040 break 16041 } 16042 v.reset(OpS390XMOVDBRstore) 16043 v.AuxInt = i - 4 16044 v.Aux = s 16045 v.AddArg(p) 16046 v.AddArg(w) 16047 v.AddArg(mem) 16048 return true 16049 } 16050 // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) 16051 // cond: x.Uses == 1 && clobber(x) 16052 // result: (MOVDBRstore [i-4] {s} p w0 mem) 16053 for { 16054 i := v.AuxInt 16055 s := v.Aux 16056 p := v.Args[0] 16057 v_1 := v.Args[1] 16058 if v_1.Op != OpS390XSRDconst { 16059 break 16060 } 16061 j := v_1.AuxInt 16062 w := v_1.Args[0] 16063 x := v.Args[2] 16064 if x.Op != OpS390XMOVWBRstore { 16065 break 16066 } 16067 if x.AuxInt != i-4 { 16068 break 16069 } 16070 if x.Aux != s { 16071 break 16072 } 16073 if p != x.Args[0] { 16074 break 16075 } 16076 w0 := x.Args[1] 16077 if w0.Op != OpS390XSRDconst { 16078 break 16079 } 16080 if w0.AuxInt != j-32 { 16081 break 16082 } 16083 if w != w0.Args[0] { 16084 break 16085 } 16086 mem := x.Args[2] 16087 if !(x.Uses == 1 && clobber(x)) { 16088 break 16089 } 16090 v.reset(OpS390XMOVDBRstore) 16091 v.AuxInt = i - 4 16092 v.Aux = s 16093 v.AddArg(p) 16094 v.AddArg(w0) 16095 v.AddArg(mem) 16096 return true 16097 } 16098 return false 16099 } 16100 func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { 16101 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16102 // cond: x.Uses == 1 && clobber(x) 16103 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16104 for { 16105 i := v.AuxInt 16106 s := v.Aux 16107 p := v.Args[0] 16108 idx := v.Args[1] 16109 v_2 := v.Args[2] 16110 if v_2.Op != OpS390XSRDconst { 16111 break 16112 } 16113 if v_2.AuxInt != 32 { 16114 break 16115 } 16116 w := v_2.Args[0] 16117 x := v.Args[3] 16118 if x.Op != OpS390XMOVWBRstoreidx { 16119 break 16120 } 16121 if x.AuxInt != i-4 { 16122 break 16123 } 16124 if x.Aux != s { 16125 break 16126 } 16127 if p != x.Args[0] { 16128 break 16129 } 16130 if idx != x.Args[1] { 16131 break 16132 } 16133 if w != x.Args[2] { 16134 break 16135 } 16136 mem := x.Args[3] 16137 if !(x.Uses == 1 && clobber(x)) { 16138 break 16139 } 16140 v.reset(OpS390XMOVDBRstoreidx) 16141 v.AuxInt = i - 4 16142 v.Aux = s 16143 v.AddArg(p) 16144 v.AddArg(idx) 16145 v.AddArg(w) 16146 v.AddArg(mem) 16147 return true 16148 } 16149 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16150 // cond: x.Uses == 1 && clobber(x) 16151 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16152 for { 16153 i := v.AuxInt 16154 s := v.Aux 16155 p := v.Args[0] 16156 idx := v.Args[1] 16157 v_2 := v.Args[2] 16158 if v_2.Op != OpS390XSRDconst { 16159 break 16160 } 16161 if v_2.AuxInt != 32 { 16162 break 16163 } 16164 w := v_2.Args[0] 16165 x := v.Args[3] 16166 if x.Op != OpS390XMOVWBRstoreidx { 16167 break 16168 } 16169 if x.AuxInt != i-4 { 16170 break 16171 } 16172 if x.Aux != s { 16173 break 16174 } 16175 if idx != x.Args[0] { 16176 break 16177 } 16178 if p != x.Args[1] { 16179 break 16180 } 16181 if w != x.Args[2] { 16182 break 16183 } 16184 mem := x.Args[3] 16185 if !(x.Uses == 1 && clobber(x)) { 16186 break 16187 } 16188 v.reset(OpS390XMOVDBRstoreidx) 16189 v.AuxInt = i - 4 16190 v.Aux = s 16191 v.AddArg(p) 16192 v.AddArg(idx) 16193 v.AddArg(w) 16194 v.AddArg(mem) 16195 return true 16196 } 16197 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) 16198 // cond: x.Uses == 1 && clobber(x) 16199 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16200 for { 16201 i := v.AuxInt 16202 s := v.Aux 16203 idx := v.Args[0] 16204 p := v.Args[1] 16205 v_2 := v.Args[2] 16206 if v_2.Op != OpS390XSRDconst { 16207 break 16208 } 16209 if v_2.AuxInt != 32 { 16210 break 16211 } 16212 w := v_2.Args[0] 16213 x := v.Args[3] 16214 if x.Op != OpS390XMOVWBRstoreidx { 16215 break 16216 } 16217 if x.AuxInt != i-4 { 16218 break 16219 } 16220 if x.Aux != s { 16221 break 16222 } 16223 if p != x.Args[0] { 16224 break 16225 } 16226 if idx != x.Args[1] { 16227 break 16228 } 16229 if w != x.Args[2] { 16230 break 16231 } 16232 mem := x.Args[3] 16233 if !(x.Uses == 1 && clobber(x)) { 16234 break 16235 } 16236 v.reset(OpS390XMOVDBRstoreidx) 16237 v.AuxInt = i - 4 16238 v.Aux = s 16239 v.AddArg(p) 16240 v.AddArg(idx) 16241 v.AddArg(w) 16242 v.AddArg(mem) 16243 return true 16244 } 16245 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) 16246 // cond: x.Uses == 1 && clobber(x) 16247 // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) 16248 for { 16249 i := v.AuxInt 16250 s := v.Aux 16251 idx := v.Args[0] 16252 p := v.Args[1] 16253 v_2 := v.Args[2] 16254 if v_2.Op != OpS390XSRDconst { 16255 break 16256 } 16257 if v_2.AuxInt != 32 { 16258 break 16259 } 16260 w := v_2.Args[0] 16261 x := v.Args[3] 16262 if x.Op != OpS390XMOVWBRstoreidx { 16263 break 16264 } 16265 if x.AuxInt != i-4 { 16266 break 16267 } 16268 if x.Aux != s { 16269 break 16270 } 16271 if idx != x.Args[0] { 16272 break 16273 } 16274 if p != x.Args[1] { 16275 break 16276 } 16277 if w != x.Args[2] { 16278 break 16279 } 16280 mem := x.Args[3] 16281 if !(x.Uses == 1 && clobber(x)) { 16282 break 16283 } 16284 v.reset(OpS390XMOVDBRstoreidx) 16285 v.AuxInt = i - 4 16286 v.Aux = s 16287 v.AddArg(p) 16288 v.AddArg(idx) 16289 v.AddArg(w) 16290 v.AddArg(mem) 16291 return true 16292 } 16293 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 16294 // cond: x.Uses == 1 && clobber(x) 16295 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16296 for { 16297 i := v.AuxInt 16298 s := v.Aux 16299 p := v.Args[0] 16300 idx := v.Args[1] 16301 v_2 := v.Args[2] 16302 if v_2.Op != OpS390XSRDconst { 16303 break 16304 } 16305 j := v_2.AuxInt 16306 w := v_2.Args[0] 16307 x := v.Args[3] 16308 if x.Op != OpS390XMOVWBRstoreidx { 16309 break 16310 } 16311 if x.AuxInt != i-4 { 16312 break 16313 } 16314 if x.Aux != s { 16315 break 16316 } 16317 if p != x.Args[0] { 16318 break 16319 } 16320 if idx != x.Args[1] { 16321 break 16322 } 16323 w0 := x.Args[2] 16324 if w0.Op != OpS390XSRDconst { 16325 break 16326 } 16327 if w0.AuxInt != j-32 { 16328 break 16329 } 16330 if w != w0.Args[0] { 16331 break 16332 } 16333 mem := x.Args[3] 16334 if !(x.Uses == 1 && clobber(x)) { 16335 break 16336 } 16337 v.reset(OpS390XMOVDBRstoreidx) 16338 v.AuxInt = i - 4 16339 v.Aux = s 16340 v.AddArg(p) 16341 v.AddArg(idx) 16342 v.AddArg(w0) 16343 v.AddArg(mem) 16344 return true 16345 } 16346 // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 16347 // cond: x.Uses == 1 && clobber(x) 16348 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16349 for { 16350 i := v.AuxInt 16351 s := v.Aux 16352 p := v.Args[0] 16353 idx := v.Args[1] 16354 v_2 := v.Args[2] 16355 if v_2.Op != OpS390XSRDconst { 16356 break 16357 } 16358 j := v_2.AuxInt 16359 w := v_2.Args[0] 16360 x := v.Args[3] 16361 if x.Op != OpS390XMOVWBRstoreidx { 16362 break 16363 } 16364 if x.AuxInt != i-4 { 16365 break 16366 } 16367 if x.Aux != s { 16368 break 16369 } 16370 if idx != x.Args[0] { 16371 break 16372 } 16373 if p != x.Args[1] { 16374 break 16375 } 16376 w0 := x.Args[2] 16377 if w0.Op != OpS390XSRDconst { 16378 break 16379 } 16380 if w0.AuxInt != j-32 { 16381 break 16382 } 16383 if w != w0.Args[0] { 16384 break 16385 } 16386 mem := x.Args[3] 16387 if !(x.Uses == 1 && clobber(x)) { 16388 break 16389 } 16390 v.reset(OpS390XMOVDBRstoreidx) 16391 v.AuxInt = i - 4 16392 v.Aux = s 16393 v.AddArg(p) 16394 v.AddArg(idx) 16395 v.AddArg(w0) 16396 v.AddArg(mem) 16397 return true 16398 } 16399 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) 16400 // cond: x.Uses == 1 && clobber(x) 16401 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16402 for { 16403 i := v.AuxInt 16404 s := v.Aux 16405 idx := v.Args[0] 16406 p := v.Args[1] 16407 v_2 := v.Args[2] 16408 if v_2.Op != OpS390XSRDconst { 16409 break 16410 } 16411 j := v_2.AuxInt 16412 w := v_2.Args[0] 16413 x := v.Args[3] 16414 if x.Op != OpS390XMOVWBRstoreidx { 16415 break 16416 } 16417 if x.AuxInt != i-4 { 16418 break 16419 } 16420 if x.Aux != s { 16421 break 16422 } 16423 if p != x.Args[0] { 16424 break 16425 } 16426 if idx != x.Args[1] { 16427 break 16428 } 16429 w0 := x.Args[2] 16430 if w0.Op != OpS390XSRDconst { 16431 break 16432 } 16433 if w0.AuxInt != j-32 { 16434 break 16435 } 16436 if w != w0.Args[0] { 16437 break 16438 } 16439 mem := x.Args[3] 16440 if !(x.Uses == 1 && clobber(x)) { 16441 break 16442 } 16443 v.reset(OpS390XMOVDBRstoreidx) 16444 v.AuxInt = i - 4 16445 v.Aux = s 16446 v.AddArg(p) 16447 v.AddArg(idx) 16448 v.AddArg(w0) 16449 v.AddArg(mem) 16450 return true 16451 } 16452 // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) 16453 // cond: x.Uses == 1 && clobber(x) 16454 // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) 16455 for { 16456 i := v.AuxInt 16457 s := v.Aux 16458 idx := v.Args[0] 16459 p := v.Args[1] 16460 v_2 := v.Args[2] 16461 if v_2.Op != OpS390XSRDconst { 16462 break 16463 } 16464 j := v_2.AuxInt 16465 w := v_2.Args[0] 16466 x := v.Args[3] 16467 if x.Op != OpS390XMOVWBRstoreidx { 16468 break 16469 } 16470 if x.AuxInt != i-4 { 16471 break 16472 } 16473 if x.Aux != s { 16474 break 16475 } 16476 if idx != x.Args[0] { 16477 break 16478 } 16479 if p != x.Args[1] { 16480 break 16481 } 16482 w0 := x.Args[2] 16483 if w0.Op != OpS390XSRDconst { 16484 break 16485 } 16486 if w0.AuxInt != j-32 { 16487 break 16488 } 16489 if w != w0.Args[0] { 16490 break 16491 } 16492 mem := x.Args[3] 16493 if !(x.Uses == 1 && clobber(x)) { 16494 break 16495 } 16496 v.reset(OpS390XMOVDBRstoreidx) 16497 v.AuxInt = i - 4 16498 v.Aux = s 16499 v.AddArg(p) 16500 v.AddArg(idx) 16501 v.AddArg(w0) 16502 v.AddArg(mem) 16503 return true 16504 } 16505 return false 16506 } 16507 func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { 16508 // match: (MOVWZload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 16509 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 16510 // result: (MOVWZreg x) 16511 for { 16512 off := v.AuxInt 16513 sym := v.Aux 16514 ptr := v.Args[0] 16515 v_1 := v.Args[1] 16516 if v_1.Op != OpS390XMOVWstore { 16517 break 16518 } 16519 off2 := v_1.AuxInt 16520 sym2 := v_1.Aux 16521 ptr2 := v_1.Args[0] 16522 x := v_1.Args[1] 16523 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 16524 break 16525 } 16526 v.reset(OpS390XMOVWZreg) 16527 v.AddArg(x) 16528 return true 16529 } 16530 // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) 16531 // cond: is20Bit(off1+off2) 16532 // result: (MOVWZload [off1+off2] {sym} ptr mem) 16533 for { 16534 off1 := v.AuxInt 16535 sym := v.Aux 16536 v_0 := v.Args[0] 16537 if v_0.Op != OpS390XADDconst { 16538 break 16539 } 16540 off2 := v_0.AuxInt 16541 ptr := v_0.Args[0] 16542 mem := v.Args[1] 16543 if !(is20Bit(off1 + off2)) { 16544 break 16545 } 16546 v.reset(OpS390XMOVWZload) 16547 v.AuxInt = off1 + off2 16548 v.Aux = sym 16549 v.AddArg(ptr) 16550 v.AddArg(mem) 16551 return true 16552 } 16553 // match: (MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 16554 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16555 // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) 16556 for { 16557 off1 := v.AuxInt 16558 sym1 := v.Aux 16559 v_0 := v.Args[0] 16560 if v_0.Op != OpS390XMOVDaddr { 16561 break 16562 } 16563 off2 := v_0.AuxInt 16564 sym2 := v_0.Aux 16565 base := v_0.Args[0] 16566 mem := v.Args[1] 16567 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16568 break 16569 } 16570 v.reset(OpS390XMOVWZload) 16571 v.AuxInt = off1 + off2 16572 v.Aux = mergeSym(sym1, sym2) 16573 v.AddArg(base) 16574 v.AddArg(mem) 16575 return true 16576 } 16577 // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) 16578 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16579 // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) 16580 for { 16581 off1 := v.AuxInt 16582 sym1 := v.Aux 16583 v_0 := v.Args[0] 16584 if v_0.Op != OpS390XMOVDaddridx { 16585 break 16586 } 16587 off2 := v_0.AuxInt 16588 sym2 := v_0.Aux 16589 ptr := v_0.Args[0] 16590 idx := v_0.Args[1] 16591 mem := v.Args[1] 16592 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16593 break 16594 } 16595 v.reset(OpS390XMOVWZloadidx) 16596 v.AuxInt = off1 + off2 16597 v.Aux = mergeSym(sym1, sym2) 16598 v.AddArg(ptr) 16599 v.AddArg(idx) 16600 v.AddArg(mem) 16601 return true 16602 } 16603 // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) 16604 // cond: ptr.Op != OpSB 16605 // result: (MOVWZloadidx [off] {sym} ptr idx mem) 16606 for { 16607 off := v.AuxInt 16608 sym := v.Aux 16609 v_0 := v.Args[0] 16610 if v_0.Op != OpS390XADD { 16611 break 16612 } 16613 ptr := v_0.Args[0] 16614 idx := v_0.Args[1] 16615 mem := v.Args[1] 16616 if !(ptr.Op != OpSB) { 16617 break 16618 } 16619 v.reset(OpS390XMOVWZloadidx) 16620 v.AuxInt = off 16621 v.Aux = sym 16622 v.AddArg(ptr) 16623 v.AddArg(idx) 16624 v.AddArg(mem) 16625 return true 16626 } 16627 return false 16628 } 16629 func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { 16630 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) 16631 // cond: 16632 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 16633 for { 16634 c := v.AuxInt 16635 sym := v.Aux 16636 v_0 := v.Args[0] 16637 if v_0.Op != OpS390XADDconst { 16638 break 16639 } 16640 d := v_0.AuxInt 16641 ptr := v_0.Args[0] 16642 idx := v.Args[1] 16643 mem := v.Args[2] 16644 v.reset(OpS390XMOVWZloadidx) 16645 v.AuxInt = c + d 16646 v.Aux = sym 16647 v.AddArg(ptr) 16648 v.AddArg(idx) 16649 v.AddArg(mem) 16650 return true 16651 } 16652 // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) 16653 // cond: 16654 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 16655 for { 16656 c := v.AuxInt 16657 sym := v.Aux 16658 idx := v.Args[0] 16659 v_1 := v.Args[1] 16660 if v_1.Op != OpS390XADDconst { 16661 break 16662 } 16663 d := v_1.AuxInt 16664 ptr := v_1.Args[0] 16665 mem := v.Args[2] 16666 v.reset(OpS390XMOVWZloadidx) 16667 v.AuxInt = c + d 16668 v.Aux = sym 16669 v.AddArg(ptr) 16670 v.AddArg(idx) 16671 v.AddArg(mem) 16672 return true 16673 } 16674 // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) 16675 // cond: 16676 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 16677 for { 16678 c := v.AuxInt 16679 sym := v.Aux 16680 ptr := v.Args[0] 16681 v_1 := v.Args[1] 16682 if v_1.Op != OpS390XADDconst { 16683 break 16684 } 16685 d := v_1.AuxInt 16686 idx := v_1.Args[0] 16687 mem := v.Args[2] 16688 v.reset(OpS390XMOVWZloadidx) 16689 v.AuxInt = c + d 16690 v.Aux = sym 16691 v.AddArg(ptr) 16692 v.AddArg(idx) 16693 v.AddArg(mem) 16694 return true 16695 } 16696 // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) 16697 // cond: 16698 // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) 16699 for { 16700 c := v.AuxInt 16701 sym := v.Aux 16702 v_0 := v.Args[0] 16703 if v_0.Op != OpS390XADDconst { 16704 break 16705 } 16706 d := v_0.AuxInt 16707 idx := v_0.Args[0] 16708 ptr := v.Args[1] 16709 mem := v.Args[2] 16710 v.reset(OpS390XMOVWZloadidx) 16711 v.AuxInt = c + d 16712 v.Aux = sym 16713 v.AddArg(ptr) 16714 v.AddArg(idx) 16715 v.AddArg(mem) 16716 return true 16717 } 16718 return false 16719 } 16720 func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { 16721 b := v.Block 16722 _ = b 16723 // match: (MOVWZreg x:(MOVBZload _ _)) 16724 // cond: 16725 // result: (MOVDreg x) 16726 for { 16727 x := v.Args[0] 16728 if x.Op != OpS390XMOVBZload { 16729 break 16730 } 16731 v.reset(OpS390XMOVDreg) 16732 v.AddArg(x) 16733 return true 16734 } 16735 // match: (MOVWZreg x:(MOVHZload _ _)) 16736 // cond: 16737 // result: (MOVDreg x) 16738 for { 16739 x := v.Args[0] 16740 if x.Op != OpS390XMOVHZload { 16741 break 16742 } 16743 v.reset(OpS390XMOVDreg) 16744 v.AddArg(x) 16745 return true 16746 } 16747 // match: (MOVWZreg x:(MOVWZload _ _)) 16748 // cond: 16749 // result: (MOVDreg x) 16750 for { 16751 x := v.Args[0] 16752 if x.Op != OpS390XMOVWZload { 16753 break 16754 } 16755 v.reset(OpS390XMOVDreg) 16756 v.AddArg(x) 16757 return true 16758 } 16759 // match: (MOVWZreg x:(Arg <t>)) 16760 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) 16761 // result: (MOVDreg x) 16762 for { 16763 x := v.Args[0] 16764 if x.Op != OpArg { 16765 break 16766 } 16767 t := x.Type 16768 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)) { 16769 break 16770 } 16771 v.reset(OpS390XMOVDreg) 16772 v.AddArg(x) 16773 return true 16774 } 16775 // match: (MOVWZreg x:(MOVBZreg _)) 16776 // cond: 16777 // result: (MOVDreg x) 16778 for { 16779 x := v.Args[0] 16780 if x.Op != OpS390XMOVBZreg { 16781 break 16782 } 16783 v.reset(OpS390XMOVDreg) 16784 v.AddArg(x) 16785 return true 16786 } 16787 // match: (MOVWZreg x:(MOVHZreg _)) 16788 // cond: 16789 // result: (MOVDreg x) 16790 for { 16791 x := v.Args[0] 16792 if x.Op != OpS390XMOVHZreg { 16793 break 16794 } 16795 v.reset(OpS390XMOVDreg) 16796 v.AddArg(x) 16797 return true 16798 } 16799 // match: (MOVWZreg x:(MOVWZreg _)) 16800 // cond: 16801 // result: (MOVDreg x) 16802 for { 16803 x := v.Args[0] 16804 if x.Op != OpS390XMOVWZreg { 16805 break 16806 } 16807 v.reset(OpS390XMOVDreg) 16808 v.AddArg(x) 16809 return true 16810 } 16811 // match: (MOVWZreg (MOVDconst [c])) 16812 // cond: 16813 // result: (MOVDconst [int64(uint32(c))]) 16814 for { 16815 v_0 := v.Args[0] 16816 if v_0.Op != OpS390XMOVDconst { 16817 break 16818 } 16819 c := v_0.AuxInt 16820 v.reset(OpS390XMOVDconst) 16821 v.AuxInt = int64(uint32(c)) 16822 return true 16823 } 16824 // match: (MOVWZreg x:(MOVWZload [off] {sym} ptr mem)) 16825 // cond: x.Uses == 1 && clobber(x) 16826 // result: @x.Block (MOVWZload <v.Type> [off] {sym} ptr mem) 16827 for { 16828 x := v.Args[0] 16829 if x.Op != OpS390XMOVWZload { 16830 break 16831 } 16832 off := x.AuxInt 16833 sym := x.Aux 16834 ptr := x.Args[0] 16835 mem := x.Args[1] 16836 if !(x.Uses == 1 && clobber(x)) { 16837 break 16838 } 16839 b = x.Block 16840 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, v.Type) 16841 v.reset(OpCopy) 16842 v.AddArg(v0) 16843 v0.AuxInt = off 16844 v0.Aux = sym 16845 v0.AddArg(ptr) 16846 v0.AddArg(mem) 16847 return true 16848 } 16849 // match: (MOVWZreg x:(MOVWZloadidx [off] {sym} ptr idx mem)) 16850 // cond: x.Uses == 1 && clobber(x) 16851 // result: @x.Block (MOVWZloadidx <v.Type> [off] {sym} ptr idx mem) 16852 for { 16853 x := v.Args[0] 16854 if x.Op != OpS390XMOVWZloadidx { 16855 break 16856 } 16857 off := x.AuxInt 16858 sym := x.Aux 16859 ptr := x.Args[0] 16860 idx := x.Args[1] 16861 mem := x.Args[2] 16862 if !(x.Uses == 1 && clobber(x)) { 16863 break 16864 } 16865 b = x.Block 16866 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, v.Type) 16867 v.reset(OpCopy) 16868 v.AddArg(v0) 16869 v0.AuxInt = off 16870 v0.Aux = sym 16871 v0.AddArg(ptr) 16872 v0.AddArg(idx) 16873 v0.AddArg(mem) 16874 return true 16875 } 16876 return false 16877 } 16878 func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { 16879 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 16880 // cond: is20Bit(off1+off2) 16881 // result: (MOVWload [off1+off2] {sym} ptr mem) 16882 for { 16883 off1 := v.AuxInt 16884 sym := v.Aux 16885 v_0 := v.Args[0] 16886 if v_0.Op != OpS390XADDconst { 16887 break 16888 } 16889 off2 := v_0.AuxInt 16890 ptr := v_0.Args[0] 16891 mem := v.Args[1] 16892 if !(is20Bit(off1 + off2)) { 16893 break 16894 } 16895 v.reset(OpS390XMOVWload) 16896 v.AuxInt = off1 + off2 16897 v.Aux = sym 16898 v.AddArg(ptr) 16899 v.AddArg(mem) 16900 return true 16901 } 16902 // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) 16903 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 16904 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) 16905 for { 16906 off1 := v.AuxInt 16907 sym1 := v.Aux 16908 v_0 := v.Args[0] 16909 if v_0.Op != OpS390XMOVDaddr { 16910 break 16911 } 16912 off2 := v_0.AuxInt 16913 sym2 := v_0.Aux 16914 base := v_0.Args[0] 16915 mem := v.Args[1] 16916 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 16917 break 16918 } 16919 v.reset(OpS390XMOVWload) 16920 v.AuxInt = off1 + off2 16921 v.Aux = mergeSym(sym1, sym2) 16922 v.AddArg(base) 16923 v.AddArg(mem) 16924 return true 16925 } 16926 return false 16927 } 16928 func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { 16929 // match: (MOVWreg x:(MOVBload _ _)) 16930 // cond: 16931 // result: (MOVDreg x) 16932 for { 16933 x := v.Args[0] 16934 if x.Op != OpS390XMOVBload { 16935 break 16936 } 16937 v.reset(OpS390XMOVDreg) 16938 v.AddArg(x) 16939 return true 16940 } 16941 // match: (MOVWreg x:(MOVBZload _ _)) 16942 // cond: 16943 // result: (MOVDreg x) 16944 for { 16945 x := v.Args[0] 16946 if x.Op != OpS390XMOVBZload { 16947 break 16948 } 16949 v.reset(OpS390XMOVDreg) 16950 v.AddArg(x) 16951 return true 16952 } 16953 // match: (MOVWreg x:(MOVHload _ _)) 16954 // cond: 16955 // result: (MOVDreg x) 16956 for { 16957 x := v.Args[0] 16958 if x.Op != OpS390XMOVHload { 16959 break 16960 } 16961 v.reset(OpS390XMOVDreg) 16962 v.AddArg(x) 16963 return true 16964 } 16965 // match: (MOVWreg x:(MOVHZload _ _)) 16966 // cond: 16967 // result: (MOVDreg x) 16968 for { 16969 x := v.Args[0] 16970 if x.Op != OpS390XMOVHZload { 16971 break 16972 } 16973 v.reset(OpS390XMOVDreg) 16974 v.AddArg(x) 16975 return true 16976 } 16977 // match: (MOVWreg x:(MOVWload _ _)) 16978 // cond: 16979 // result: (MOVDreg x) 16980 for { 16981 x := v.Args[0] 16982 if x.Op != OpS390XMOVWload { 16983 break 16984 } 16985 v.reset(OpS390XMOVDreg) 16986 v.AddArg(x) 16987 return true 16988 } 16989 // match: (MOVWreg x:(Arg <t>)) 16990 // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t) 16991 // result: (MOVDreg x) 16992 for { 16993 x := v.Args[0] 16994 if x.Op != OpArg { 16995 break 16996 } 16997 t := x.Type 16998 if !((is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && isSigned(t)) { 16999 break 17000 } 17001 v.reset(OpS390XMOVDreg) 17002 v.AddArg(x) 17003 return true 17004 } 17005 // match: (MOVWreg x:(MOVBreg _)) 17006 // cond: 17007 // result: (MOVDreg x) 17008 for { 17009 x := v.Args[0] 17010 if x.Op != OpS390XMOVBreg { 17011 break 17012 } 17013 v.reset(OpS390XMOVDreg) 17014 v.AddArg(x) 17015 return true 17016 } 17017 // match: (MOVWreg x:(MOVBZreg _)) 17018 // cond: 17019 // result: (MOVDreg x) 17020 for { 17021 x := v.Args[0] 17022 if x.Op != OpS390XMOVBZreg { 17023 break 17024 } 17025 v.reset(OpS390XMOVDreg) 17026 v.AddArg(x) 17027 return true 17028 } 17029 // match: (MOVWreg x:(MOVHreg _)) 17030 // cond: 17031 // result: (MOVDreg x) 17032 for { 17033 x := v.Args[0] 17034 if x.Op != OpS390XMOVHreg { 17035 break 17036 } 17037 v.reset(OpS390XMOVDreg) 17038 v.AddArg(x) 17039 return true 17040 } 17041 // match: (MOVWreg x:(MOVHreg _)) 17042 // cond: 17043 // result: (MOVDreg x) 17044 for { 17045 x := v.Args[0] 17046 if x.Op != OpS390XMOVHreg { 17047 break 17048 } 17049 v.reset(OpS390XMOVDreg) 17050 v.AddArg(x) 17051 return true 17052 } 17053 return false 17054 } 17055 func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { 17056 b := v.Block 17057 _ = b 17058 // match: (MOVWreg x:(MOVWreg _)) 17059 // cond: 17060 // result: (MOVDreg x) 17061 for { 17062 x := v.Args[0] 17063 if x.Op != OpS390XMOVWreg { 17064 break 17065 } 17066 v.reset(OpS390XMOVDreg) 17067 v.AddArg(x) 17068 return true 17069 } 17070 // match: (MOVWreg (MOVDconst [c])) 17071 // cond: 17072 // result: (MOVDconst [int64(int32(c))]) 17073 for { 17074 v_0 := v.Args[0] 17075 if v_0.Op != OpS390XMOVDconst { 17076 break 17077 } 17078 c := v_0.AuxInt 17079 v.reset(OpS390XMOVDconst) 17080 v.AuxInt = int64(int32(c)) 17081 return true 17082 } 17083 // match: (MOVWreg x:(MOVWZload [off] {sym} ptr mem)) 17084 // cond: x.Uses == 1 && clobber(x) 17085 // result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem) 17086 for { 17087 x := v.Args[0] 17088 if x.Op != OpS390XMOVWZload { 17089 break 17090 } 17091 off := x.AuxInt 17092 sym := x.Aux 17093 ptr := x.Args[0] 17094 mem := x.Args[1] 17095 if !(x.Uses == 1 && clobber(x)) { 17096 break 17097 } 17098 b = x.Block 17099 v0 := b.NewValue0(v.Pos, OpS390XMOVWload, v.Type) 17100 v.reset(OpCopy) 17101 v.AddArg(v0) 17102 v0.AuxInt = off 17103 v0.Aux = sym 17104 v0.AddArg(ptr) 17105 v0.AddArg(mem) 17106 return true 17107 } 17108 return false 17109 } 17110 func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { 17111 // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) 17112 // cond: 17113 // result: (MOVWstore [off] {sym} ptr x mem) 17114 for { 17115 off := v.AuxInt 17116 sym := v.Aux 17117 ptr := v.Args[0] 17118 v_1 := v.Args[1] 17119 if v_1.Op != OpS390XMOVWreg { 17120 break 17121 } 17122 x := v_1.Args[0] 17123 mem := v.Args[2] 17124 v.reset(OpS390XMOVWstore) 17125 v.AuxInt = off 17126 v.Aux = sym 17127 v.AddArg(ptr) 17128 v.AddArg(x) 17129 v.AddArg(mem) 17130 return true 17131 } 17132 // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) 17133 // cond: 17134 // result: (MOVWstore [off] {sym} ptr x mem) 17135 for { 17136 off := v.AuxInt 17137 sym := v.Aux 17138 ptr := v.Args[0] 17139 v_1 := v.Args[1] 17140 if v_1.Op != OpS390XMOVWZreg { 17141 break 17142 } 17143 x := v_1.Args[0] 17144 mem := v.Args[2] 17145 v.reset(OpS390XMOVWstore) 17146 v.AuxInt = off 17147 v.Aux = sym 17148 v.AddArg(ptr) 17149 v.AddArg(x) 17150 v.AddArg(mem) 17151 return true 17152 } 17153 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 17154 // cond: is20Bit(off1+off2) 17155 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 17156 for { 17157 off1 := v.AuxInt 17158 sym := v.Aux 17159 v_0 := v.Args[0] 17160 if v_0.Op != OpS390XADDconst { 17161 break 17162 } 17163 off2 := v_0.AuxInt 17164 ptr := v_0.Args[0] 17165 val := v.Args[1] 17166 mem := v.Args[2] 17167 if !(is20Bit(off1 + off2)) { 17168 break 17169 } 17170 v.reset(OpS390XMOVWstore) 17171 v.AuxInt = off1 + off2 17172 v.Aux = sym 17173 v.AddArg(ptr) 17174 v.AddArg(val) 17175 v.AddArg(mem) 17176 return true 17177 } 17178 // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) 17179 // cond: validOff(off) && int64(int16(c)) == c && ptr.Op != OpSB 17180 // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) 17181 for { 17182 off := v.AuxInt 17183 sym := v.Aux 17184 ptr := v.Args[0] 17185 v_1 := v.Args[1] 17186 if v_1.Op != OpS390XMOVDconst { 17187 break 17188 } 17189 c := v_1.AuxInt 17190 mem := v.Args[2] 17191 if !(validOff(off) && int64(int16(c)) == c && ptr.Op != OpSB) { 17192 break 17193 } 17194 v.reset(OpS390XMOVWstoreconst) 17195 v.AuxInt = makeValAndOff(int64(int32(c)), off) 17196 v.Aux = sym 17197 v.AddArg(ptr) 17198 v.AddArg(mem) 17199 return true 17200 } 17201 // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) 17202 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17203 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) 17204 for { 17205 off1 := v.AuxInt 17206 sym1 := v.Aux 17207 v_0 := v.Args[0] 17208 if v_0.Op != OpS390XMOVDaddr { 17209 break 17210 } 17211 off2 := v_0.AuxInt 17212 sym2 := v_0.Aux 17213 base := v_0.Args[0] 17214 val := v.Args[1] 17215 mem := v.Args[2] 17216 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17217 break 17218 } 17219 v.reset(OpS390XMOVWstore) 17220 v.AuxInt = off1 + off2 17221 v.Aux = mergeSym(sym1, sym2) 17222 v.AddArg(base) 17223 v.AddArg(val) 17224 v.AddArg(mem) 17225 return true 17226 } 17227 // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) 17228 // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) 17229 // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) 17230 for { 17231 off1 := v.AuxInt 17232 sym1 := v.Aux 17233 v_0 := v.Args[0] 17234 if v_0.Op != OpS390XMOVDaddridx { 17235 break 17236 } 17237 off2 := v_0.AuxInt 17238 sym2 := v_0.Aux 17239 ptr := v_0.Args[0] 17240 idx := v_0.Args[1] 17241 val := v.Args[1] 17242 mem := v.Args[2] 17243 if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { 17244 break 17245 } 17246 v.reset(OpS390XMOVWstoreidx) 17247 v.AuxInt = off1 + off2 17248 v.Aux = mergeSym(sym1, sym2) 17249 v.AddArg(ptr) 17250 v.AddArg(idx) 17251 v.AddArg(val) 17252 v.AddArg(mem) 17253 return true 17254 } 17255 // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) 17256 // cond: ptr.Op != OpSB 17257 // result: (MOVWstoreidx [off] {sym} ptr idx val mem) 17258 for { 17259 off := v.AuxInt 17260 sym := v.Aux 17261 v_0 := v.Args[0] 17262 if v_0.Op != OpS390XADD { 17263 break 17264 } 17265 ptr := v_0.Args[0] 17266 idx := v_0.Args[1] 17267 val := v.Args[1] 17268 mem := v.Args[2] 17269 if !(ptr.Op != OpSB) { 17270 break 17271 } 17272 v.reset(OpS390XMOVWstoreidx) 17273 v.AuxInt = off 17274 v.Aux = sym 17275 v.AddArg(ptr) 17276 v.AddArg(idx) 17277 v.AddArg(val) 17278 v.AddArg(mem) 17279 return true 17280 } 17281 // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) 17282 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17283 // result: (MOVDstore [i-4] {s} p w mem) 17284 for { 17285 i := v.AuxInt 17286 s := v.Aux 17287 p := v.Args[0] 17288 v_1 := v.Args[1] 17289 if v_1.Op != OpS390XSRDconst { 17290 break 17291 } 17292 if v_1.AuxInt != 32 { 17293 break 17294 } 17295 w := v_1.Args[0] 17296 x := v.Args[2] 17297 if x.Op != OpS390XMOVWstore { 17298 break 17299 } 17300 if x.AuxInt != i-4 { 17301 break 17302 } 17303 if x.Aux != s { 17304 break 17305 } 17306 if p != x.Args[0] { 17307 break 17308 } 17309 if w != x.Args[1] { 17310 break 17311 } 17312 mem := x.Args[2] 17313 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 17314 break 17315 } 17316 v.reset(OpS390XMOVDstore) 17317 v.AuxInt = i - 4 17318 v.Aux = s 17319 v.AddArg(p) 17320 v.AddArg(w) 17321 v.AddArg(mem) 17322 return true 17323 } 17324 // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) 17325 // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) 17326 // result: (MOVDstore [i-4] {s} p w0 mem) 17327 for { 17328 i := v.AuxInt 17329 s := v.Aux 17330 p := v.Args[0] 17331 w0 := v.Args[1] 17332 if w0.Op != OpS390XSRDconst { 17333 break 17334 } 17335 j := w0.AuxInt 17336 w := w0.Args[0] 17337 x := v.Args[2] 17338 if x.Op != OpS390XMOVWstore { 17339 break 17340 } 17341 if x.AuxInt != i-4 { 17342 break 17343 } 17344 if x.Aux != s { 17345 break 17346 } 17347 if p != x.Args[0] { 17348 break 17349 } 17350 x_1 := x.Args[1] 17351 if x_1.Op != OpS390XSRDconst { 17352 break 17353 } 17354 if x_1.AuxInt != j+32 { 17355 break 17356 } 17357 if w != x_1.Args[0] { 17358 break 17359 } 17360 mem := x.Args[2] 17361 if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { 17362 break 17363 } 17364 v.reset(OpS390XMOVDstore) 17365 v.AuxInt = i - 4 17366 v.Aux = s 17367 v.AddArg(p) 17368 v.AddArg(w0) 17369 v.AddArg(mem) 17370 return true 17371 } 17372 // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) 17373 // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) 17374 // result: (STM2 [i-4] {s} p w0 w1 mem) 17375 for { 17376 i := v.AuxInt 17377 s := v.Aux 17378 p := v.Args[0] 17379 w1 := v.Args[1] 17380 x := v.Args[2] 17381 if x.Op != OpS390XMOVWstore { 17382 break 17383 } 17384 if x.AuxInt != i-4 { 17385 break 17386 } 17387 if x.Aux != s { 17388 break 17389 } 17390 if p != x.Args[0] { 17391 break 17392 } 17393 w0 := x.Args[1] 17394 mem := x.Args[2] 17395 if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { 17396 break 17397 } 17398 v.reset(OpS390XSTM2) 17399 v.AuxInt = i - 4 17400 v.Aux = s 17401 v.AddArg(p) 17402 v.AddArg(w0) 17403 v.AddArg(w1) 17404 v.AddArg(mem) 17405 return true 17406 } 17407 return false 17408 } 17409 func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { 17410 // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) 17411 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 17412 // result: (STM3 [i-8] {s} p w0 w1 w2 mem) 17413 for { 17414 i := v.AuxInt 17415 s := v.Aux 17416 p := v.Args[0] 17417 w2 := v.Args[1] 17418 x := v.Args[2] 17419 if x.Op != OpS390XSTM2 { 17420 break 17421 } 17422 if x.AuxInt != i-8 { 17423 break 17424 } 17425 if x.Aux != s { 17426 break 17427 } 17428 if p != x.Args[0] { 17429 break 17430 } 17431 w0 := x.Args[1] 17432 w1 := x.Args[2] 17433 mem := x.Args[3] 17434 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 17435 break 17436 } 17437 v.reset(OpS390XSTM3) 17438 v.AuxInt = i - 8 17439 v.Aux = s 17440 v.AddArg(p) 17441 v.AddArg(w0) 17442 v.AddArg(w1) 17443 v.AddArg(w2) 17444 v.AddArg(mem) 17445 return true 17446 } 17447 // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) 17448 // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) 17449 // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) 17450 for { 17451 i := v.AuxInt 17452 s := v.Aux 17453 p := v.Args[0] 17454 w3 := v.Args[1] 17455 x := v.Args[2] 17456 if x.Op != OpS390XSTM3 { 17457 break 17458 } 17459 if x.AuxInt != i-12 { 17460 break 17461 } 17462 if x.Aux != s { 17463 break 17464 } 17465 if p != x.Args[0] { 17466 break 17467 } 17468 w0 := x.Args[1] 17469 w1 := x.Args[2] 17470 w2 := x.Args[3] 17471 mem := x.Args[4] 17472 if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { 17473 break 17474 } 17475 v.reset(OpS390XSTM4) 17476 v.AuxInt = i - 12 17477 v.Aux = s 17478 v.AddArg(p) 17479 v.AddArg(w0) 17480 v.AddArg(w1) 17481 v.AddArg(w2) 17482 v.AddArg(w3) 17483 v.AddArg(mem) 17484 return true 17485 } 17486 return false 17487 } 17488 func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { 17489 b := v.Block 17490 _ = b 17491 types := &b.Func.Config.Types 17492 _ = types 17493 // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) 17494 // cond: ValAndOff(sc).canAdd(off) 17495 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) 17496 for { 17497 sc := v.AuxInt 17498 s := v.Aux 17499 v_0 := v.Args[0] 17500 if v_0.Op != OpS390XADDconst { 17501 break 17502 } 17503 off := v_0.AuxInt 17504 ptr := v_0.Args[0] 17505 mem := v.Args[1] 17506 if !(ValAndOff(sc).canAdd(off)) { 17507 break 17508 } 17509 v.reset(OpS390XMOVWstoreconst) 17510 v.AuxInt = ValAndOff(sc).add(off) 17511 v.Aux = s 17512 v.AddArg(ptr) 17513 v.AddArg(mem) 17514 return true 17515 } 17516 // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) 17517 // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) 17518 // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) 17519 for { 17520 sc := v.AuxInt 17521 sym1 := v.Aux 17522 v_0 := v.Args[0] 17523 if v_0.Op != OpS390XMOVDaddr { 17524 break 17525 } 17526 off := v_0.AuxInt 17527 sym2 := v_0.Aux 17528 ptr := v_0.Args[0] 17529 mem := v.Args[1] 17530 if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { 17531 break 17532 } 17533 v.reset(OpS390XMOVWstoreconst) 17534 v.AuxInt = ValAndOff(sc).add(off) 17535 v.Aux = mergeSym(sym1, sym2) 17536 v.AddArg(ptr) 17537 v.AddArg(mem) 17538 return true 17539 } 17540 // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) 17541 // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) 17542 // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) 17543 for { 17544 c := v.AuxInt 17545 s := v.Aux 17546 p := v.Args[0] 17547 x := v.Args[1] 17548 if x.Op != OpS390XMOVWstoreconst { 17549 break 17550 } 17551 a := x.AuxInt 17552 if x.Aux != s { 17553 break 17554 } 17555 if p != x.Args[0] { 17556 break 17557 } 17558 mem := x.Args[1] 17559 if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { 17560 break 17561 } 17562 v.reset(OpS390XMOVDstore) 17563 v.AuxInt = ValAndOff(a).Off() 17564 v.Aux = s 17565 v.AddArg(p) 17566 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 17567 v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 17568 v.AddArg(v0) 17569 v.AddArg(mem) 17570 return true 17571 } 17572 return false 17573 } 17574 func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { 17575 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) 17576 // cond: 17577 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 17578 for { 17579 c := v.AuxInt 17580 sym := v.Aux 17581 v_0 := v.Args[0] 17582 if v_0.Op != OpS390XADDconst { 17583 break 17584 } 17585 d := v_0.AuxInt 17586 ptr := v_0.Args[0] 17587 idx := v.Args[1] 17588 val := v.Args[2] 17589 mem := v.Args[3] 17590 v.reset(OpS390XMOVWstoreidx) 17591 v.AuxInt = c + d 17592 v.Aux = sym 17593 v.AddArg(ptr) 17594 v.AddArg(idx) 17595 v.AddArg(val) 17596 v.AddArg(mem) 17597 return true 17598 } 17599 // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) 17600 // cond: 17601 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 17602 for { 17603 c := v.AuxInt 17604 sym := v.Aux 17605 idx := v.Args[0] 17606 v_1 := v.Args[1] 17607 if v_1.Op != OpS390XADDconst { 17608 break 17609 } 17610 d := v_1.AuxInt 17611 ptr := v_1.Args[0] 17612 val := v.Args[2] 17613 mem := v.Args[3] 17614 v.reset(OpS390XMOVWstoreidx) 17615 v.AuxInt = c + d 17616 v.Aux = sym 17617 v.AddArg(ptr) 17618 v.AddArg(idx) 17619 v.AddArg(val) 17620 v.AddArg(mem) 17621 return true 17622 } 17623 // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) 17624 // cond: 17625 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 17626 for { 17627 c := v.AuxInt 17628 sym := v.Aux 17629 ptr := v.Args[0] 17630 v_1 := v.Args[1] 17631 if v_1.Op != OpS390XADDconst { 17632 break 17633 } 17634 d := v_1.AuxInt 17635 idx := v_1.Args[0] 17636 val := v.Args[2] 17637 mem := v.Args[3] 17638 v.reset(OpS390XMOVWstoreidx) 17639 v.AuxInt = c + d 17640 v.Aux = sym 17641 v.AddArg(ptr) 17642 v.AddArg(idx) 17643 v.AddArg(val) 17644 v.AddArg(mem) 17645 return true 17646 } 17647 // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) 17648 // cond: 17649 // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) 17650 for { 17651 c := v.AuxInt 17652 sym := v.Aux 17653 v_0 := v.Args[0] 17654 if v_0.Op != OpS390XADDconst { 17655 break 17656 } 17657 d := v_0.AuxInt 17658 idx := v_0.Args[0] 17659 ptr := v.Args[1] 17660 val := v.Args[2] 17661 mem := v.Args[3] 17662 v.reset(OpS390XMOVWstoreidx) 17663 v.AuxInt = c + d 17664 v.Aux = sym 17665 v.AddArg(ptr) 17666 v.AddArg(idx) 17667 v.AddArg(val) 17668 v.AddArg(mem) 17669 return true 17670 } 17671 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 17672 // cond: x.Uses == 1 && clobber(x) 17673 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 17674 for { 17675 i := v.AuxInt 17676 s := v.Aux 17677 p := v.Args[0] 17678 idx := v.Args[1] 17679 w := v.Args[2] 17680 x := v.Args[3] 17681 if x.Op != OpS390XMOVWstoreidx { 17682 break 17683 } 17684 if x.AuxInt != i-4 { 17685 break 17686 } 17687 if x.Aux != s { 17688 break 17689 } 17690 if p != x.Args[0] { 17691 break 17692 } 17693 if idx != x.Args[1] { 17694 break 17695 } 17696 x_2 := x.Args[2] 17697 if x_2.Op != OpS390XSRDconst { 17698 break 17699 } 17700 if x_2.AuxInt != 32 { 17701 break 17702 } 17703 if w != x_2.Args[0] { 17704 break 17705 } 17706 mem := x.Args[3] 17707 if !(x.Uses == 1 && clobber(x)) { 17708 break 17709 } 17710 v.reset(OpS390XMOVDstoreidx) 17711 v.AuxInt = i - 4 17712 v.Aux = s 17713 v.AddArg(p) 17714 v.AddArg(idx) 17715 v.AddArg(w) 17716 v.AddArg(mem) 17717 return true 17718 } 17719 // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 17720 // cond: x.Uses == 1 && clobber(x) 17721 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 17722 for { 17723 i := v.AuxInt 17724 s := v.Aux 17725 p := v.Args[0] 17726 idx := v.Args[1] 17727 w := v.Args[2] 17728 x := v.Args[3] 17729 if x.Op != OpS390XMOVWstoreidx { 17730 break 17731 } 17732 if x.AuxInt != i-4 { 17733 break 17734 } 17735 if x.Aux != s { 17736 break 17737 } 17738 if idx != x.Args[0] { 17739 break 17740 } 17741 if p != x.Args[1] { 17742 break 17743 } 17744 x_2 := x.Args[2] 17745 if x_2.Op != OpS390XSRDconst { 17746 break 17747 } 17748 if x_2.AuxInt != 32 { 17749 break 17750 } 17751 if w != x_2.Args[0] { 17752 break 17753 } 17754 mem := x.Args[3] 17755 if !(x.Uses == 1 && clobber(x)) { 17756 break 17757 } 17758 v.reset(OpS390XMOVDstoreidx) 17759 v.AuxInt = i - 4 17760 v.Aux = s 17761 v.AddArg(p) 17762 v.AddArg(idx) 17763 v.AddArg(w) 17764 v.AddArg(mem) 17765 return true 17766 } 17767 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) 17768 // cond: x.Uses == 1 && clobber(x) 17769 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 17770 for { 17771 i := v.AuxInt 17772 s := v.Aux 17773 idx := v.Args[0] 17774 p := v.Args[1] 17775 w := v.Args[2] 17776 x := v.Args[3] 17777 if x.Op != OpS390XMOVWstoreidx { 17778 break 17779 } 17780 if x.AuxInt != i-4 { 17781 break 17782 } 17783 if x.Aux != s { 17784 break 17785 } 17786 if p != x.Args[0] { 17787 break 17788 } 17789 if idx != x.Args[1] { 17790 break 17791 } 17792 x_2 := x.Args[2] 17793 if x_2.Op != OpS390XSRDconst { 17794 break 17795 } 17796 if x_2.AuxInt != 32 { 17797 break 17798 } 17799 if w != x_2.Args[0] { 17800 break 17801 } 17802 mem := x.Args[3] 17803 if !(x.Uses == 1 && clobber(x)) { 17804 break 17805 } 17806 v.reset(OpS390XMOVDstoreidx) 17807 v.AuxInt = i - 4 17808 v.Aux = s 17809 v.AddArg(p) 17810 v.AddArg(idx) 17811 v.AddArg(w) 17812 v.AddArg(mem) 17813 return true 17814 } 17815 // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) 17816 // cond: x.Uses == 1 && clobber(x) 17817 // result: (MOVDstoreidx [i-4] {s} p idx w mem) 17818 for { 17819 i := v.AuxInt 17820 s := v.Aux 17821 idx := v.Args[0] 17822 p := v.Args[1] 17823 w := v.Args[2] 17824 x := v.Args[3] 17825 if x.Op != OpS390XMOVWstoreidx { 17826 break 17827 } 17828 if x.AuxInt != i-4 { 17829 break 17830 } 17831 if x.Aux != s { 17832 break 17833 } 17834 if idx != x.Args[0] { 17835 break 17836 } 17837 if p != x.Args[1] { 17838 break 17839 } 17840 x_2 := x.Args[2] 17841 if x_2.Op != OpS390XSRDconst { 17842 break 17843 } 17844 if x_2.AuxInt != 32 { 17845 break 17846 } 17847 if w != x_2.Args[0] { 17848 break 17849 } 17850 mem := x.Args[3] 17851 if !(x.Uses == 1 && clobber(x)) { 17852 break 17853 } 17854 v.reset(OpS390XMOVDstoreidx) 17855 v.AuxInt = i - 4 17856 v.Aux = s 17857 v.AddArg(p) 17858 v.AddArg(idx) 17859 v.AddArg(w) 17860 v.AddArg(mem) 17861 return true 17862 } 17863 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 17864 // cond: x.Uses == 1 && clobber(x) 17865 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 17866 for { 17867 i := v.AuxInt 17868 s := v.Aux 17869 p := v.Args[0] 17870 idx := v.Args[1] 17871 w0 := v.Args[2] 17872 if w0.Op != OpS390XSRDconst { 17873 break 17874 } 17875 j := w0.AuxInt 17876 w := w0.Args[0] 17877 x := v.Args[3] 17878 if x.Op != OpS390XMOVWstoreidx { 17879 break 17880 } 17881 if x.AuxInt != i-4 { 17882 break 17883 } 17884 if x.Aux != s { 17885 break 17886 } 17887 if p != x.Args[0] { 17888 break 17889 } 17890 if idx != x.Args[1] { 17891 break 17892 } 17893 x_2 := x.Args[2] 17894 if x_2.Op != OpS390XSRDconst { 17895 break 17896 } 17897 if x_2.AuxInt != j+32 { 17898 break 17899 } 17900 if w != x_2.Args[0] { 17901 break 17902 } 17903 mem := x.Args[3] 17904 if !(x.Uses == 1 && clobber(x)) { 17905 break 17906 } 17907 v.reset(OpS390XMOVDstoreidx) 17908 v.AuxInt = i - 4 17909 v.Aux = s 17910 v.AddArg(p) 17911 v.AddArg(idx) 17912 v.AddArg(w0) 17913 v.AddArg(mem) 17914 return true 17915 } 17916 // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 17917 // cond: x.Uses == 1 && clobber(x) 17918 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 17919 for { 17920 i := v.AuxInt 17921 s := v.Aux 17922 p := v.Args[0] 17923 idx := v.Args[1] 17924 w0 := v.Args[2] 17925 if w0.Op != OpS390XSRDconst { 17926 break 17927 } 17928 j := w0.AuxInt 17929 w := w0.Args[0] 17930 x := v.Args[3] 17931 if x.Op != OpS390XMOVWstoreidx { 17932 break 17933 } 17934 if x.AuxInt != i-4 { 17935 break 17936 } 17937 if x.Aux != s { 17938 break 17939 } 17940 if idx != x.Args[0] { 17941 break 17942 } 17943 if p != x.Args[1] { 17944 break 17945 } 17946 x_2 := x.Args[2] 17947 if x_2.Op != OpS390XSRDconst { 17948 break 17949 } 17950 if x_2.AuxInt != j+32 { 17951 break 17952 } 17953 if w != x_2.Args[0] { 17954 break 17955 } 17956 mem := x.Args[3] 17957 if !(x.Uses == 1 && clobber(x)) { 17958 break 17959 } 17960 v.reset(OpS390XMOVDstoreidx) 17961 v.AuxInt = i - 4 17962 v.Aux = s 17963 v.AddArg(p) 17964 v.AddArg(idx) 17965 v.AddArg(w0) 17966 v.AddArg(mem) 17967 return true 17968 } 17969 return false 17970 } 17971 func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { 17972 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) 17973 // cond: x.Uses == 1 && clobber(x) 17974 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 17975 for { 17976 i := v.AuxInt 17977 s := v.Aux 17978 idx := v.Args[0] 17979 p := v.Args[1] 17980 w0 := v.Args[2] 17981 if w0.Op != OpS390XSRDconst { 17982 break 17983 } 17984 j := w0.AuxInt 17985 w := w0.Args[0] 17986 x := v.Args[3] 17987 if x.Op != OpS390XMOVWstoreidx { 17988 break 17989 } 17990 if x.AuxInt != i-4 { 17991 break 17992 } 17993 if x.Aux != s { 17994 break 17995 } 17996 if p != x.Args[0] { 17997 break 17998 } 17999 if idx != x.Args[1] { 18000 break 18001 } 18002 x_2 := x.Args[2] 18003 if x_2.Op != OpS390XSRDconst { 18004 break 18005 } 18006 if x_2.AuxInt != j+32 { 18007 break 18008 } 18009 if w != x_2.Args[0] { 18010 break 18011 } 18012 mem := x.Args[3] 18013 if !(x.Uses == 1 && clobber(x)) { 18014 break 18015 } 18016 v.reset(OpS390XMOVDstoreidx) 18017 v.AuxInt = i - 4 18018 v.Aux = s 18019 v.AddArg(p) 18020 v.AddArg(idx) 18021 v.AddArg(w0) 18022 v.AddArg(mem) 18023 return true 18024 } 18025 // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) 18026 // cond: x.Uses == 1 && clobber(x) 18027 // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) 18028 for { 18029 i := v.AuxInt 18030 s := v.Aux 18031 idx := v.Args[0] 18032 p := v.Args[1] 18033 w0 := v.Args[2] 18034 if w0.Op != OpS390XSRDconst { 18035 break 18036 } 18037 j := w0.AuxInt 18038 w := w0.Args[0] 18039 x := v.Args[3] 18040 if x.Op != OpS390XMOVWstoreidx { 18041 break 18042 } 18043 if x.AuxInt != i-4 { 18044 break 18045 } 18046 if x.Aux != s { 18047 break 18048 } 18049 if idx != x.Args[0] { 18050 break 18051 } 18052 if p != x.Args[1] { 18053 break 18054 } 18055 x_2 := x.Args[2] 18056 if x_2.Op != OpS390XSRDconst { 18057 break 18058 } 18059 if x_2.AuxInt != j+32 { 18060 break 18061 } 18062 if w != x_2.Args[0] { 18063 break 18064 } 18065 mem := x.Args[3] 18066 if !(x.Uses == 1 && clobber(x)) { 18067 break 18068 } 18069 v.reset(OpS390XMOVDstoreidx) 18070 v.AuxInt = i - 4 18071 v.Aux = s 18072 v.AddArg(p) 18073 v.AddArg(idx) 18074 v.AddArg(w0) 18075 v.AddArg(mem) 18076 return true 18077 } 18078 return false 18079 } 18080 func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { 18081 // match: (MULLD x (MOVDconst [c])) 18082 // cond: is32Bit(c) 18083 // result: (MULLDconst [c] x) 18084 for { 18085 x := v.Args[0] 18086 v_1 := v.Args[1] 18087 if v_1.Op != OpS390XMOVDconst { 18088 break 18089 } 18090 c := v_1.AuxInt 18091 if !(is32Bit(c)) { 18092 break 18093 } 18094 v.reset(OpS390XMULLDconst) 18095 v.AuxInt = c 18096 v.AddArg(x) 18097 return true 18098 } 18099 // match: (MULLD (MOVDconst [c]) x) 18100 // cond: is32Bit(c) 18101 // result: (MULLDconst [c] x) 18102 for { 18103 v_0 := v.Args[0] 18104 if v_0.Op != OpS390XMOVDconst { 18105 break 18106 } 18107 c := v_0.AuxInt 18108 x := v.Args[1] 18109 if !(is32Bit(c)) { 18110 break 18111 } 18112 v.reset(OpS390XMULLDconst) 18113 v.AuxInt = c 18114 v.AddArg(x) 18115 return true 18116 } 18117 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18118 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18119 // result: (MULLDload <t> [off] {sym} x ptr mem) 18120 for { 18121 t := v.Type 18122 x := v.Args[0] 18123 g := v.Args[1] 18124 if g.Op != OpS390XMOVDload { 18125 break 18126 } 18127 off := g.AuxInt 18128 sym := g.Aux 18129 ptr := g.Args[0] 18130 mem := g.Args[1] 18131 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18132 break 18133 } 18134 v.reset(OpS390XMULLDload) 18135 v.Type = t 18136 v.AuxInt = off 18137 v.Aux = sym 18138 v.AddArg(x) 18139 v.AddArg(ptr) 18140 v.AddArg(mem) 18141 return true 18142 } 18143 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18144 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18145 // result: (MULLDload <t> [off] {sym} x ptr mem) 18146 for { 18147 t := v.Type 18148 g := v.Args[0] 18149 if g.Op != OpS390XMOVDload { 18150 break 18151 } 18152 off := g.AuxInt 18153 sym := g.Aux 18154 ptr := g.Args[0] 18155 mem := g.Args[1] 18156 x := v.Args[1] 18157 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18158 break 18159 } 18160 v.reset(OpS390XMULLDload) 18161 v.Type = t 18162 v.AuxInt = off 18163 v.Aux = sym 18164 v.AddArg(x) 18165 v.AddArg(ptr) 18166 v.AddArg(mem) 18167 return true 18168 } 18169 // match: (MULLD <t> g:(MOVDload [off] {sym} ptr mem) x) 18170 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18171 // result: (MULLDload <t> [off] {sym} x ptr mem) 18172 for { 18173 t := v.Type 18174 g := v.Args[0] 18175 if g.Op != OpS390XMOVDload { 18176 break 18177 } 18178 off := g.AuxInt 18179 sym := g.Aux 18180 ptr := g.Args[0] 18181 mem := g.Args[1] 18182 x := v.Args[1] 18183 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18184 break 18185 } 18186 v.reset(OpS390XMULLDload) 18187 v.Type = t 18188 v.AuxInt = off 18189 v.Aux = sym 18190 v.AddArg(x) 18191 v.AddArg(ptr) 18192 v.AddArg(mem) 18193 return true 18194 } 18195 // match: (MULLD <t> x g:(MOVDload [off] {sym} ptr mem)) 18196 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18197 // result: (MULLDload <t> [off] {sym} x ptr mem) 18198 for { 18199 t := v.Type 18200 x := v.Args[0] 18201 g := v.Args[1] 18202 if g.Op != OpS390XMOVDload { 18203 break 18204 } 18205 off := g.AuxInt 18206 sym := g.Aux 18207 ptr := g.Args[0] 18208 mem := g.Args[1] 18209 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18210 break 18211 } 18212 v.reset(OpS390XMULLDload) 18213 v.Type = t 18214 v.AuxInt = off 18215 v.Aux = sym 18216 v.AddArg(x) 18217 v.AddArg(ptr) 18218 v.AddArg(mem) 18219 return true 18220 } 18221 return false 18222 } 18223 func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { 18224 b := v.Block 18225 _ = b 18226 // match: (MULLDconst [-1] x) 18227 // cond: 18228 // result: (NEG x) 18229 for { 18230 if v.AuxInt != -1 { 18231 break 18232 } 18233 x := v.Args[0] 18234 v.reset(OpS390XNEG) 18235 v.AddArg(x) 18236 return true 18237 } 18238 // match: (MULLDconst [0] _) 18239 // cond: 18240 // result: (MOVDconst [0]) 18241 for { 18242 if v.AuxInt != 0 { 18243 break 18244 } 18245 v.reset(OpS390XMOVDconst) 18246 v.AuxInt = 0 18247 return true 18248 } 18249 // match: (MULLDconst [1] x) 18250 // cond: 18251 // result: x 18252 for { 18253 if v.AuxInt != 1 { 18254 break 18255 } 18256 x := v.Args[0] 18257 v.reset(OpCopy) 18258 v.Type = x.Type 18259 v.AddArg(x) 18260 return true 18261 } 18262 // match: (MULLDconst [c] x) 18263 // cond: isPowerOfTwo(c) 18264 // result: (SLDconst [log2(c)] x) 18265 for { 18266 c := v.AuxInt 18267 x := v.Args[0] 18268 if !(isPowerOfTwo(c)) { 18269 break 18270 } 18271 v.reset(OpS390XSLDconst) 18272 v.AuxInt = log2(c) 18273 v.AddArg(x) 18274 return true 18275 } 18276 // match: (MULLDconst [c] x) 18277 // cond: isPowerOfTwo(c+1) && c >= 15 18278 // result: (SUB (SLDconst <v.Type> [log2(c+1)] x) x) 18279 for { 18280 c := v.AuxInt 18281 x := v.Args[0] 18282 if !(isPowerOfTwo(c+1) && c >= 15) { 18283 break 18284 } 18285 v.reset(OpS390XSUB) 18286 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 18287 v0.AuxInt = log2(c + 1) 18288 v0.AddArg(x) 18289 v.AddArg(v0) 18290 v.AddArg(x) 18291 return true 18292 } 18293 // match: (MULLDconst [c] x) 18294 // cond: isPowerOfTwo(c-1) && c >= 17 18295 // result: (ADD (SLDconst <v.Type> [log2(c-1)] x) x) 18296 for { 18297 c := v.AuxInt 18298 x := v.Args[0] 18299 if !(isPowerOfTwo(c-1) && c >= 17) { 18300 break 18301 } 18302 v.reset(OpS390XADD) 18303 v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 18304 v0.AuxInt = log2(c - 1) 18305 v0.AddArg(x) 18306 v.AddArg(v0) 18307 v.AddArg(x) 18308 return true 18309 } 18310 // match: (MULLDconst [c] (MOVDconst [d])) 18311 // cond: 18312 // result: (MOVDconst [c*d]) 18313 for { 18314 c := v.AuxInt 18315 v_0 := v.Args[0] 18316 if v_0.Op != OpS390XMOVDconst { 18317 break 18318 } 18319 d := v_0.AuxInt 18320 v.reset(OpS390XMOVDconst) 18321 v.AuxInt = c * d 18322 return true 18323 } 18324 return false 18325 } 18326 func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { 18327 // match: (MULLW x (MOVDconst [c])) 18328 // cond: 18329 // result: (MULLWconst [c] x) 18330 for { 18331 x := v.Args[0] 18332 v_1 := v.Args[1] 18333 if v_1.Op != OpS390XMOVDconst { 18334 break 18335 } 18336 c := v_1.AuxInt 18337 v.reset(OpS390XMULLWconst) 18338 v.AuxInt = c 18339 v.AddArg(x) 18340 return true 18341 } 18342 // match: (MULLW (MOVDconst [c]) x) 18343 // cond: 18344 // result: (MULLWconst [c] x) 18345 for { 18346 v_0 := v.Args[0] 18347 if v_0.Op != OpS390XMOVDconst { 18348 break 18349 } 18350 c := v_0.AuxInt 18351 x := v.Args[1] 18352 v.reset(OpS390XMULLWconst) 18353 v.AuxInt = c 18354 v.AddArg(x) 18355 return true 18356 } 18357 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 18358 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18359 // result: (MULLWload <t> [off] {sym} x ptr mem) 18360 for { 18361 t := v.Type 18362 x := v.Args[0] 18363 g := v.Args[1] 18364 if g.Op != OpS390XMOVWload { 18365 break 18366 } 18367 off := g.AuxInt 18368 sym := g.Aux 18369 ptr := g.Args[0] 18370 mem := g.Args[1] 18371 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18372 break 18373 } 18374 v.reset(OpS390XMULLWload) 18375 v.Type = t 18376 v.AuxInt = off 18377 v.Aux = sym 18378 v.AddArg(x) 18379 v.AddArg(ptr) 18380 v.AddArg(mem) 18381 return true 18382 } 18383 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 18384 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18385 // result: (MULLWload <t> [off] {sym} x ptr mem) 18386 for { 18387 t := v.Type 18388 g := v.Args[0] 18389 if g.Op != OpS390XMOVWload { 18390 break 18391 } 18392 off := g.AuxInt 18393 sym := g.Aux 18394 ptr := g.Args[0] 18395 mem := g.Args[1] 18396 x := v.Args[1] 18397 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18398 break 18399 } 18400 v.reset(OpS390XMULLWload) 18401 v.Type = t 18402 v.AuxInt = off 18403 v.Aux = sym 18404 v.AddArg(x) 18405 v.AddArg(ptr) 18406 v.AddArg(mem) 18407 return true 18408 } 18409 // match: (MULLW <t> g:(MOVWload [off] {sym} ptr mem) x) 18410 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18411 // result: (MULLWload <t> [off] {sym} x ptr mem) 18412 for { 18413 t := v.Type 18414 g := v.Args[0] 18415 if g.Op != OpS390XMOVWload { 18416 break 18417 } 18418 off := g.AuxInt 18419 sym := g.Aux 18420 ptr := g.Args[0] 18421 mem := g.Args[1] 18422 x := v.Args[1] 18423 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18424 break 18425 } 18426 v.reset(OpS390XMULLWload) 18427 v.Type = t 18428 v.AuxInt = off 18429 v.Aux = sym 18430 v.AddArg(x) 18431 v.AddArg(ptr) 18432 v.AddArg(mem) 18433 return true 18434 } 18435 // match: (MULLW <t> x g:(MOVWload [off] {sym} ptr mem)) 18436 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18437 // result: (MULLWload <t> [off] {sym} x ptr mem) 18438 for { 18439 t := v.Type 18440 x := v.Args[0] 18441 g := v.Args[1] 18442 if g.Op != OpS390XMOVWload { 18443 break 18444 } 18445 off := g.AuxInt 18446 sym := g.Aux 18447 ptr := g.Args[0] 18448 mem := g.Args[1] 18449 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18450 break 18451 } 18452 v.reset(OpS390XMULLWload) 18453 v.Type = t 18454 v.AuxInt = off 18455 v.Aux = sym 18456 v.AddArg(x) 18457 v.AddArg(ptr) 18458 v.AddArg(mem) 18459 return true 18460 } 18461 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 18462 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18463 // result: (MULLWload <t> [off] {sym} x ptr mem) 18464 for { 18465 t := v.Type 18466 x := v.Args[0] 18467 g := v.Args[1] 18468 if g.Op != OpS390XMOVWZload { 18469 break 18470 } 18471 off := g.AuxInt 18472 sym := g.Aux 18473 ptr := g.Args[0] 18474 mem := g.Args[1] 18475 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18476 break 18477 } 18478 v.reset(OpS390XMULLWload) 18479 v.Type = t 18480 v.AuxInt = off 18481 v.Aux = sym 18482 v.AddArg(x) 18483 v.AddArg(ptr) 18484 v.AddArg(mem) 18485 return true 18486 } 18487 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 18488 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18489 // result: (MULLWload <t> [off] {sym} x ptr mem) 18490 for { 18491 t := v.Type 18492 g := v.Args[0] 18493 if g.Op != OpS390XMOVWZload { 18494 break 18495 } 18496 off := g.AuxInt 18497 sym := g.Aux 18498 ptr := g.Args[0] 18499 mem := g.Args[1] 18500 x := v.Args[1] 18501 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18502 break 18503 } 18504 v.reset(OpS390XMULLWload) 18505 v.Type = t 18506 v.AuxInt = off 18507 v.Aux = sym 18508 v.AddArg(x) 18509 v.AddArg(ptr) 18510 v.AddArg(mem) 18511 return true 18512 } 18513 // match: (MULLW <t> g:(MOVWZload [off] {sym} ptr mem) x) 18514 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18515 // result: (MULLWload <t> [off] {sym} x ptr mem) 18516 for { 18517 t := v.Type 18518 g := v.Args[0] 18519 if g.Op != OpS390XMOVWZload { 18520 break 18521 } 18522 off := g.AuxInt 18523 sym := g.Aux 18524 ptr := g.Args[0] 18525 mem := g.Args[1] 18526 x := v.Args[1] 18527 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18528 break 18529 } 18530 v.reset(OpS390XMULLWload) 18531 v.Type = t 18532 v.AuxInt = off 18533 v.Aux = sym 18534 v.AddArg(x) 18535 v.AddArg(ptr) 18536 v.AddArg(mem) 18537 return true 18538 } 18539 // match: (MULLW <t> x g:(MOVWZload [off] {sym} ptr mem)) 18540 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18541 // result: (MULLWload <t> [off] {sym} x ptr mem) 18542 for { 18543 t := v.Type 18544 x := v.Args[0] 18545 g := v.Args[1] 18546 if g.Op != OpS390XMOVWZload { 18547 break 18548 } 18549 off := g.AuxInt 18550 sym := g.Aux 18551 ptr := g.Args[0] 18552 mem := g.Args[1] 18553 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18554 break 18555 } 18556 v.reset(OpS390XMULLWload) 18557 v.Type = t 18558 v.AuxInt = off 18559 v.Aux = sym 18560 v.AddArg(x) 18561 v.AddArg(ptr) 18562 v.AddArg(mem) 18563 return true 18564 } 18565 return false 18566 } 18567 func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { 18568 b := v.Block 18569 _ = b 18570 // match: (MULLWconst [-1] x) 18571 // cond: 18572 // result: (NEGW x) 18573 for { 18574 if v.AuxInt != -1 { 18575 break 18576 } 18577 x := v.Args[0] 18578 v.reset(OpS390XNEGW) 18579 v.AddArg(x) 18580 return true 18581 } 18582 // match: (MULLWconst [0] _) 18583 // cond: 18584 // result: (MOVDconst [0]) 18585 for { 18586 if v.AuxInt != 0 { 18587 break 18588 } 18589 v.reset(OpS390XMOVDconst) 18590 v.AuxInt = 0 18591 return true 18592 } 18593 // match: (MULLWconst [1] x) 18594 // cond: 18595 // result: x 18596 for { 18597 if v.AuxInt != 1 { 18598 break 18599 } 18600 x := v.Args[0] 18601 v.reset(OpCopy) 18602 v.Type = x.Type 18603 v.AddArg(x) 18604 return true 18605 } 18606 // match: (MULLWconst [c] x) 18607 // cond: isPowerOfTwo(c) 18608 // result: (SLWconst [log2(c)] x) 18609 for { 18610 c := v.AuxInt 18611 x := v.Args[0] 18612 if !(isPowerOfTwo(c)) { 18613 break 18614 } 18615 v.reset(OpS390XSLWconst) 18616 v.AuxInt = log2(c) 18617 v.AddArg(x) 18618 return true 18619 } 18620 // match: (MULLWconst [c] x) 18621 // cond: isPowerOfTwo(c+1) && c >= 15 18622 // result: (SUBW (SLWconst <v.Type> [log2(c+1)] x) x) 18623 for { 18624 c := v.AuxInt 18625 x := v.Args[0] 18626 if !(isPowerOfTwo(c+1) && c >= 15) { 18627 break 18628 } 18629 v.reset(OpS390XSUBW) 18630 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 18631 v0.AuxInt = log2(c + 1) 18632 v0.AddArg(x) 18633 v.AddArg(v0) 18634 v.AddArg(x) 18635 return true 18636 } 18637 // match: (MULLWconst [c] x) 18638 // cond: isPowerOfTwo(c-1) && c >= 17 18639 // result: (ADDW (SLWconst <v.Type> [log2(c-1)] x) x) 18640 for { 18641 c := v.AuxInt 18642 x := v.Args[0] 18643 if !(isPowerOfTwo(c-1) && c >= 17) { 18644 break 18645 } 18646 v.reset(OpS390XADDW) 18647 v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 18648 v0.AuxInt = log2(c - 1) 18649 v0.AddArg(x) 18650 v.AddArg(v0) 18651 v.AddArg(x) 18652 return true 18653 } 18654 // match: (MULLWconst [c] (MOVDconst [d])) 18655 // cond: 18656 // result: (MOVDconst [int64(int32(c*d))]) 18657 for { 18658 c := v.AuxInt 18659 v_0 := v.Args[0] 18660 if v_0.Op != OpS390XMOVDconst { 18661 break 18662 } 18663 d := v_0.AuxInt 18664 v.reset(OpS390XMOVDconst) 18665 v.AuxInt = int64(int32(c * d)) 18666 return true 18667 } 18668 return false 18669 } 18670 func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { 18671 // match: (NEG (MOVDconst [c])) 18672 // cond: 18673 // result: (MOVDconst [-c]) 18674 for { 18675 v_0 := v.Args[0] 18676 if v_0.Op != OpS390XMOVDconst { 18677 break 18678 } 18679 c := v_0.AuxInt 18680 v.reset(OpS390XMOVDconst) 18681 v.AuxInt = -c 18682 return true 18683 } 18684 // match: (NEG (ADDconst [c] (NEG x))) 18685 // cond: c != -(1<<31) 18686 // result: (ADDconst [-c] x) 18687 for { 18688 v_0 := v.Args[0] 18689 if v_0.Op != OpS390XADDconst { 18690 break 18691 } 18692 c := v_0.AuxInt 18693 v_0_0 := v_0.Args[0] 18694 if v_0_0.Op != OpS390XNEG { 18695 break 18696 } 18697 x := v_0_0.Args[0] 18698 if !(c != -(1 << 31)) { 18699 break 18700 } 18701 v.reset(OpS390XADDconst) 18702 v.AuxInt = -c 18703 v.AddArg(x) 18704 return true 18705 } 18706 return false 18707 } 18708 func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { 18709 // match: (NEGW (MOVDconst [c])) 18710 // cond: 18711 // result: (MOVDconst [int64(int32(-c))]) 18712 for { 18713 v_0 := v.Args[0] 18714 if v_0.Op != OpS390XMOVDconst { 18715 break 18716 } 18717 c := v_0.AuxInt 18718 v.reset(OpS390XMOVDconst) 18719 v.AuxInt = int64(int32(-c)) 18720 return true 18721 } 18722 return false 18723 } 18724 func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { 18725 b := v.Block 18726 _ = b 18727 types := &b.Func.Config.Types 18728 _ = types 18729 // match: (NOT x) 18730 // cond: true 18731 // result: (XOR (MOVDconst [-1]) x) 18732 for { 18733 x := v.Args[0] 18734 if !(true) { 18735 break 18736 } 18737 v.reset(OpS390XXOR) 18738 v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, types.UInt64) 18739 v0.AuxInt = -1 18740 v.AddArg(v0) 18741 v.AddArg(x) 18742 return true 18743 } 18744 return false 18745 } 18746 func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { 18747 // match: (NOTW x) 18748 // cond: true 18749 // result: (XORWconst [-1] x) 18750 for { 18751 x := v.Args[0] 18752 if !(true) { 18753 break 18754 } 18755 v.reset(OpS390XXORWconst) 18756 v.AuxInt = -1 18757 v.AddArg(x) 18758 return true 18759 } 18760 return false 18761 } 18762 func rewriteValueS390X_OpS390XOR_0(v *Value) bool { 18763 // match: (OR x (MOVDconst [c])) 18764 // cond: isU32Bit(c) 18765 // result: (ORconst [c] x) 18766 for { 18767 x := v.Args[0] 18768 v_1 := v.Args[1] 18769 if v_1.Op != OpS390XMOVDconst { 18770 break 18771 } 18772 c := v_1.AuxInt 18773 if !(isU32Bit(c)) { 18774 break 18775 } 18776 v.reset(OpS390XORconst) 18777 v.AuxInt = c 18778 v.AddArg(x) 18779 return true 18780 } 18781 // match: (OR (MOVDconst [c]) x) 18782 // cond: isU32Bit(c) 18783 // result: (ORconst [c] x) 18784 for { 18785 v_0 := v.Args[0] 18786 if v_0.Op != OpS390XMOVDconst { 18787 break 18788 } 18789 c := v_0.AuxInt 18790 x := v.Args[1] 18791 if !(isU32Bit(c)) { 18792 break 18793 } 18794 v.reset(OpS390XORconst) 18795 v.AuxInt = c 18796 v.AddArg(x) 18797 return true 18798 } 18799 // match: (OR (SLDconst x [c]) (SRDconst x [d])) 18800 // cond: d == 64-c 18801 // result: (RLLGconst [c] x) 18802 for { 18803 v_0 := v.Args[0] 18804 if v_0.Op != OpS390XSLDconst { 18805 break 18806 } 18807 c := v_0.AuxInt 18808 x := v_0.Args[0] 18809 v_1 := v.Args[1] 18810 if v_1.Op != OpS390XSRDconst { 18811 break 18812 } 18813 d := v_1.AuxInt 18814 if x != v_1.Args[0] { 18815 break 18816 } 18817 if !(d == 64-c) { 18818 break 18819 } 18820 v.reset(OpS390XRLLGconst) 18821 v.AuxInt = c 18822 v.AddArg(x) 18823 return true 18824 } 18825 // match: (OR (SRDconst x [d]) (SLDconst x [c])) 18826 // cond: d == 64-c 18827 // result: (RLLGconst [c] x) 18828 for { 18829 v_0 := v.Args[0] 18830 if v_0.Op != OpS390XSRDconst { 18831 break 18832 } 18833 d := v_0.AuxInt 18834 x := v_0.Args[0] 18835 v_1 := v.Args[1] 18836 if v_1.Op != OpS390XSLDconst { 18837 break 18838 } 18839 c := v_1.AuxInt 18840 if x != v_1.Args[0] { 18841 break 18842 } 18843 if !(d == 64-c) { 18844 break 18845 } 18846 v.reset(OpS390XRLLGconst) 18847 v.AuxInt = c 18848 v.AddArg(x) 18849 return true 18850 } 18851 // match: (OR (MOVDconst [c]) (MOVDconst [d])) 18852 // cond: 18853 // result: (MOVDconst [c|d]) 18854 for { 18855 v_0 := v.Args[0] 18856 if v_0.Op != OpS390XMOVDconst { 18857 break 18858 } 18859 c := v_0.AuxInt 18860 v_1 := v.Args[1] 18861 if v_1.Op != OpS390XMOVDconst { 18862 break 18863 } 18864 d := v_1.AuxInt 18865 v.reset(OpS390XMOVDconst) 18866 v.AuxInt = c | d 18867 return true 18868 } 18869 // match: (OR (MOVDconst [d]) (MOVDconst [c])) 18870 // cond: 18871 // result: (MOVDconst [c|d]) 18872 for { 18873 v_0 := v.Args[0] 18874 if v_0.Op != OpS390XMOVDconst { 18875 break 18876 } 18877 d := v_0.AuxInt 18878 v_1 := v.Args[1] 18879 if v_1.Op != OpS390XMOVDconst { 18880 break 18881 } 18882 c := v_1.AuxInt 18883 v.reset(OpS390XMOVDconst) 18884 v.AuxInt = c | d 18885 return true 18886 } 18887 // match: (OR x x) 18888 // cond: 18889 // result: x 18890 for { 18891 x := v.Args[0] 18892 if x != v.Args[1] { 18893 break 18894 } 18895 v.reset(OpCopy) 18896 v.Type = x.Type 18897 v.AddArg(x) 18898 return true 18899 } 18900 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 18901 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18902 // result: (ORload <t> [off] {sym} x ptr mem) 18903 for { 18904 t := v.Type 18905 x := v.Args[0] 18906 g := v.Args[1] 18907 if g.Op != OpS390XMOVDload { 18908 break 18909 } 18910 off := g.AuxInt 18911 sym := g.Aux 18912 ptr := g.Args[0] 18913 mem := g.Args[1] 18914 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18915 break 18916 } 18917 v.reset(OpS390XORload) 18918 v.Type = t 18919 v.AuxInt = off 18920 v.Aux = sym 18921 v.AddArg(x) 18922 v.AddArg(ptr) 18923 v.AddArg(mem) 18924 return true 18925 } 18926 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 18927 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18928 // result: (ORload <t> [off] {sym} x ptr mem) 18929 for { 18930 t := v.Type 18931 g := v.Args[0] 18932 if g.Op != OpS390XMOVDload { 18933 break 18934 } 18935 off := g.AuxInt 18936 sym := g.Aux 18937 ptr := g.Args[0] 18938 mem := g.Args[1] 18939 x := v.Args[1] 18940 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18941 break 18942 } 18943 v.reset(OpS390XORload) 18944 v.Type = t 18945 v.AuxInt = off 18946 v.Aux = sym 18947 v.AddArg(x) 18948 v.AddArg(ptr) 18949 v.AddArg(mem) 18950 return true 18951 } 18952 // match: (OR <t> g:(MOVDload [off] {sym} ptr mem) x) 18953 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18954 // result: (ORload <t> [off] {sym} x ptr mem) 18955 for { 18956 t := v.Type 18957 g := v.Args[0] 18958 if g.Op != OpS390XMOVDload { 18959 break 18960 } 18961 off := g.AuxInt 18962 sym := g.Aux 18963 ptr := g.Args[0] 18964 mem := g.Args[1] 18965 x := v.Args[1] 18966 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 18967 break 18968 } 18969 v.reset(OpS390XORload) 18970 v.Type = t 18971 v.AuxInt = off 18972 v.Aux = sym 18973 v.AddArg(x) 18974 v.AddArg(ptr) 18975 v.AddArg(mem) 18976 return true 18977 } 18978 return false 18979 } 18980 func rewriteValueS390X_OpS390XOR_10(v *Value) bool { 18981 b := v.Block 18982 _ = b 18983 types := &b.Func.Config.Types 18984 _ = types 18985 // match: (OR <t> x g:(MOVDload [off] {sym} ptr mem)) 18986 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 18987 // result: (ORload <t> [off] {sym} x ptr mem) 18988 for { 18989 t := v.Type 18990 x := v.Args[0] 18991 g := v.Args[1] 18992 if g.Op != OpS390XMOVDload { 18993 break 18994 } 18995 off := g.AuxInt 18996 sym := g.Aux 18997 ptr := g.Args[0] 18998 mem := g.Args[1] 18999 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 19000 break 19001 } 19002 v.reset(OpS390XORload) 19003 v.Type = t 19004 v.AuxInt = off 19005 v.Aux = sym 19006 v.AddArg(x) 19007 v.AddArg(ptr) 19008 v.AddArg(mem) 19009 return true 19010 } 19011 // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) 19012 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19013 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 19014 for { 19015 x1 := v.Args[0] 19016 if x1.Op != OpS390XMOVBZload { 19017 break 19018 } 19019 i1 := x1.AuxInt 19020 s := x1.Aux 19021 p := x1.Args[0] 19022 mem := x1.Args[1] 19023 sh := v.Args[1] 19024 if sh.Op != OpS390XSLDconst { 19025 break 19026 } 19027 if sh.AuxInt != 8 { 19028 break 19029 } 19030 x0 := sh.Args[0] 19031 if x0.Op != OpS390XMOVBZload { 19032 break 19033 } 19034 i0 := x0.AuxInt 19035 if x0.Aux != s { 19036 break 19037 } 19038 if p != x0.Args[0] { 19039 break 19040 } 19041 if mem != x0.Args[1] { 19042 break 19043 } 19044 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19045 break 19046 } 19047 b = mergePoint(b, x0, x1) 19048 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19049 v.reset(OpCopy) 19050 v.AddArg(v0) 19051 v0.AuxInt = i0 19052 v0.Aux = s 19053 v0.AddArg(p) 19054 v0.AddArg(mem) 19055 return true 19056 } 19057 // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 19058 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19059 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 19060 for { 19061 sh := v.Args[0] 19062 if sh.Op != OpS390XSLDconst { 19063 break 19064 } 19065 if sh.AuxInt != 8 { 19066 break 19067 } 19068 x0 := sh.Args[0] 19069 if x0.Op != OpS390XMOVBZload { 19070 break 19071 } 19072 i0 := x0.AuxInt 19073 s := x0.Aux 19074 p := x0.Args[0] 19075 mem := x0.Args[1] 19076 x1 := v.Args[1] 19077 if x1.Op != OpS390XMOVBZload { 19078 break 19079 } 19080 i1 := x1.AuxInt 19081 if x1.Aux != s { 19082 break 19083 } 19084 if p != x1.Args[0] { 19085 break 19086 } 19087 if mem != x1.Args[1] { 19088 break 19089 } 19090 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19091 break 19092 } 19093 b = mergePoint(b, x0, x1) 19094 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19095 v.reset(OpCopy) 19096 v.AddArg(v0) 19097 v0.AuxInt = i0 19098 v0.Aux = s 19099 v0.AddArg(p) 19100 v0.AddArg(mem) 19101 return true 19102 } 19103 // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) 19104 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19105 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19106 for { 19107 x1 := v.Args[0] 19108 if x1.Op != OpS390XMOVHZload { 19109 break 19110 } 19111 i1 := x1.AuxInt 19112 s := x1.Aux 19113 p := x1.Args[0] 19114 mem := x1.Args[1] 19115 sh := v.Args[1] 19116 if sh.Op != OpS390XSLDconst { 19117 break 19118 } 19119 if sh.AuxInt != 16 { 19120 break 19121 } 19122 x0 := sh.Args[0] 19123 if x0.Op != OpS390XMOVHZload { 19124 break 19125 } 19126 i0 := x0.AuxInt 19127 if x0.Aux != s { 19128 break 19129 } 19130 if p != x0.Args[0] { 19131 break 19132 } 19133 if mem != x0.Args[1] { 19134 break 19135 } 19136 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19137 break 19138 } 19139 b = mergePoint(b, x0, x1) 19140 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19141 v.reset(OpCopy) 19142 v.AddArg(v0) 19143 v0.AuxInt = i0 19144 v0.Aux = s 19145 v0.AddArg(p) 19146 v0.AddArg(mem) 19147 return true 19148 } 19149 // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 19150 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19151 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 19152 for { 19153 sh := v.Args[0] 19154 if sh.Op != OpS390XSLDconst { 19155 break 19156 } 19157 if sh.AuxInt != 16 { 19158 break 19159 } 19160 x0 := sh.Args[0] 19161 if x0.Op != OpS390XMOVHZload { 19162 break 19163 } 19164 i0 := x0.AuxInt 19165 s := x0.Aux 19166 p := x0.Args[0] 19167 mem := x0.Args[1] 19168 x1 := v.Args[1] 19169 if x1.Op != OpS390XMOVHZload { 19170 break 19171 } 19172 i1 := x1.AuxInt 19173 if x1.Aux != s { 19174 break 19175 } 19176 if p != x1.Args[0] { 19177 break 19178 } 19179 if mem != x1.Args[1] { 19180 break 19181 } 19182 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19183 break 19184 } 19185 b = mergePoint(b, x0, x1) 19186 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19187 v.reset(OpCopy) 19188 v.AddArg(v0) 19189 v0.AuxInt = i0 19190 v0.Aux = s 19191 v0.AddArg(p) 19192 v0.AddArg(mem) 19193 return true 19194 } 19195 // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) 19196 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19197 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 19198 for { 19199 x1 := v.Args[0] 19200 if x1.Op != OpS390XMOVWZload { 19201 break 19202 } 19203 i1 := x1.AuxInt 19204 s := x1.Aux 19205 p := x1.Args[0] 19206 mem := x1.Args[1] 19207 sh := v.Args[1] 19208 if sh.Op != OpS390XSLDconst { 19209 break 19210 } 19211 if sh.AuxInt != 32 { 19212 break 19213 } 19214 x0 := sh.Args[0] 19215 if x0.Op != OpS390XMOVWZload { 19216 break 19217 } 19218 i0 := x0.AuxInt 19219 if x0.Aux != s { 19220 break 19221 } 19222 if p != x0.Args[0] { 19223 break 19224 } 19225 if mem != x0.Args[1] { 19226 break 19227 } 19228 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19229 break 19230 } 19231 b = mergePoint(b, x0, x1) 19232 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 19233 v.reset(OpCopy) 19234 v.AddArg(v0) 19235 v0.AuxInt = i0 19236 v0.Aux = s 19237 v0.AddArg(p) 19238 v0.AddArg(mem) 19239 return true 19240 } 19241 // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) 19242 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19243 // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) 19244 for { 19245 sh := v.Args[0] 19246 if sh.Op != OpS390XSLDconst { 19247 break 19248 } 19249 if sh.AuxInt != 32 { 19250 break 19251 } 19252 x0 := sh.Args[0] 19253 if x0.Op != OpS390XMOVWZload { 19254 break 19255 } 19256 i0 := x0.AuxInt 19257 s := x0.Aux 19258 p := x0.Args[0] 19259 mem := x0.Args[1] 19260 x1 := v.Args[1] 19261 if x1.Op != OpS390XMOVWZload { 19262 break 19263 } 19264 i1 := x1.AuxInt 19265 if x1.Aux != s { 19266 break 19267 } 19268 if p != x1.Args[0] { 19269 break 19270 } 19271 if mem != x1.Args[1] { 19272 break 19273 } 19274 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19275 break 19276 } 19277 b = mergePoint(b, x0, x1) 19278 v0 := b.NewValue0(v.Pos, OpS390XMOVDload, types.UInt64) 19279 v.reset(OpCopy) 19280 v.AddArg(v0) 19281 v0.AuxInt = i0 19282 v0.Aux = s 19283 v0.AddArg(p) 19284 v0.AddArg(mem) 19285 return true 19286 } 19287 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 19288 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19289 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 19290 for { 19291 s0 := v.Args[0] 19292 if s0.Op != OpS390XSLDconst { 19293 break 19294 } 19295 j0 := s0.AuxInt 19296 x0 := s0.Args[0] 19297 if x0.Op != OpS390XMOVBZload { 19298 break 19299 } 19300 i0 := x0.AuxInt 19301 s := x0.Aux 19302 p := x0.Args[0] 19303 mem := x0.Args[1] 19304 or := v.Args[1] 19305 if or.Op != OpS390XOR { 19306 break 19307 } 19308 s1 := or.Args[0] 19309 if s1.Op != OpS390XSLDconst { 19310 break 19311 } 19312 j1 := s1.AuxInt 19313 x1 := s1.Args[0] 19314 if x1.Op != OpS390XMOVBZload { 19315 break 19316 } 19317 i1 := x1.AuxInt 19318 if x1.Aux != s { 19319 break 19320 } 19321 if p != x1.Args[0] { 19322 break 19323 } 19324 if mem != x1.Args[1] { 19325 break 19326 } 19327 y := or.Args[1] 19328 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19329 break 19330 } 19331 b = mergePoint(b, x0, x1) 19332 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19333 v.reset(OpCopy) 19334 v.AddArg(v0) 19335 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19336 v1.AuxInt = j1 19337 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19338 v2.AuxInt = i0 19339 v2.Aux = s 19340 v2.AddArg(p) 19341 v2.AddArg(mem) 19342 v1.AddArg(v2) 19343 v0.AddArg(v1) 19344 v0.AddArg(y) 19345 return true 19346 } 19347 // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 19348 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19349 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 19350 for { 19351 s0 := v.Args[0] 19352 if s0.Op != OpS390XSLDconst { 19353 break 19354 } 19355 j0 := s0.AuxInt 19356 x0 := s0.Args[0] 19357 if x0.Op != OpS390XMOVBZload { 19358 break 19359 } 19360 i0 := x0.AuxInt 19361 s := x0.Aux 19362 p := x0.Args[0] 19363 mem := x0.Args[1] 19364 or := v.Args[1] 19365 if or.Op != OpS390XOR { 19366 break 19367 } 19368 y := or.Args[0] 19369 s1 := or.Args[1] 19370 if s1.Op != OpS390XSLDconst { 19371 break 19372 } 19373 j1 := s1.AuxInt 19374 x1 := s1.Args[0] 19375 if x1.Op != OpS390XMOVBZload { 19376 break 19377 } 19378 i1 := x1.AuxInt 19379 if x1.Aux != s { 19380 break 19381 } 19382 if p != x1.Args[0] { 19383 break 19384 } 19385 if mem != x1.Args[1] { 19386 break 19387 } 19388 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19389 break 19390 } 19391 b = mergePoint(b, x0, x1) 19392 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19393 v.reset(OpCopy) 19394 v.AddArg(v0) 19395 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19396 v1.AuxInt = j1 19397 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19398 v2.AuxInt = i0 19399 v2.Aux = s 19400 v2.AddArg(p) 19401 v2.AddArg(mem) 19402 v1.AddArg(v2) 19403 v0.AddArg(v1) 19404 v0.AddArg(y) 19405 return true 19406 } 19407 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 19408 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19409 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 19410 for { 19411 or := v.Args[0] 19412 if or.Op != OpS390XOR { 19413 break 19414 } 19415 s1 := or.Args[0] 19416 if s1.Op != OpS390XSLDconst { 19417 break 19418 } 19419 j1 := s1.AuxInt 19420 x1 := s1.Args[0] 19421 if x1.Op != OpS390XMOVBZload { 19422 break 19423 } 19424 i1 := x1.AuxInt 19425 s := x1.Aux 19426 p := x1.Args[0] 19427 mem := x1.Args[1] 19428 y := or.Args[1] 19429 s0 := v.Args[1] 19430 if s0.Op != OpS390XSLDconst { 19431 break 19432 } 19433 j0 := s0.AuxInt 19434 x0 := s0.Args[0] 19435 if x0.Op != OpS390XMOVBZload { 19436 break 19437 } 19438 i0 := x0.AuxInt 19439 if x0.Aux != s { 19440 break 19441 } 19442 if p != x0.Args[0] { 19443 break 19444 } 19445 if mem != x0.Args[1] { 19446 break 19447 } 19448 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19449 break 19450 } 19451 b = mergePoint(b, x0, x1) 19452 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19453 v.reset(OpCopy) 19454 v.AddArg(v0) 19455 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19456 v1.AuxInt = j1 19457 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19458 v2.AuxInt = i0 19459 v2.Aux = s 19460 v2.AddArg(p) 19461 v2.AddArg(mem) 19462 v1.AddArg(v2) 19463 v0.AddArg(v1) 19464 v0.AddArg(y) 19465 return true 19466 } 19467 return false 19468 } 19469 func rewriteValueS390X_OpS390XOR_20(v *Value) bool { 19470 b := v.Block 19471 _ = b 19472 types := &b.Func.Config.Types 19473 _ = types 19474 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) 19475 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19476 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 19477 for { 19478 or := v.Args[0] 19479 if or.Op != OpS390XOR { 19480 break 19481 } 19482 y := or.Args[0] 19483 s1 := or.Args[1] 19484 if s1.Op != OpS390XSLDconst { 19485 break 19486 } 19487 j1 := s1.AuxInt 19488 x1 := s1.Args[0] 19489 if x1.Op != OpS390XMOVBZload { 19490 break 19491 } 19492 i1 := x1.AuxInt 19493 s := x1.Aux 19494 p := x1.Args[0] 19495 mem := x1.Args[1] 19496 s0 := v.Args[1] 19497 if s0.Op != OpS390XSLDconst { 19498 break 19499 } 19500 j0 := s0.AuxInt 19501 x0 := s0.Args[0] 19502 if x0.Op != OpS390XMOVBZload { 19503 break 19504 } 19505 i0 := x0.AuxInt 19506 if x0.Aux != s { 19507 break 19508 } 19509 if p != x0.Args[0] { 19510 break 19511 } 19512 if mem != x0.Args[1] { 19513 break 19514 } 19515 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19516 break 19517 } 19518 b = mergePoint(b, x0, x1) 19519 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19520 v.reset(OpCopy) 19521 v.AddArg(v0) 19522 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19523 v1.AuxInt = j1 19524 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 19525 v2.AuxInt = i0 19526 v2.Aux = s 19527 v2.AddArg(p) 19528 v2.AddArg(mem) 19529 v1.AddArg(v2) 19530 v0.AddArg(v1) 19531 v0.AddArg(y) 19532 return true 19533 } 19534 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) 19535 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19536 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 19537 for { 19538 s0 := v.Args[0] 19539 if s0.Op != OpS390XSLDconst { 19540 break 19541 } 19542 j0 := s0.AuxInt 19543 x0 := s0.Args[0] 19544 if x0.Op != OpS390XMOVHZload { 19545 break 19546 } 19547 i0 := x0.AuxInt 19548 s := x0.Aux 19549 p := x0.Args[0] 19550 mem := x0.Args[1] 19551 or := v.Args[1] 19552 if or.Op != OpS390XOR { 19553 break 19554 } 19555 s1 := or.Args[0] 19556 if s1.Op != OpS390XSLDconst { 19557 break 19558 } 19559 j1 := s1.AuxInt 19560 x1 := s1.Args[0] 19561 if x1.Op != OpS390XMOVHZload { 19562 break 19563 } 19564 i1 := x1.AuxInt 19565 if x1.Aux != s { 19566 break 19567 } 19568 if p != x1.Args[0] { 19569 break 19570 } 19571 if mem != x1.Args[1] { 19572 break 19573 } 19574 y := or.Args[1] 19575 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19576 break 19577 } 19578 b = mergePoint(b, x0, x1) 19579 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19580 v.reset(OpCopy) 19581 v.AddArg(v0) 19582 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19583 v1.AuxInt = j1 19584 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19585 v2.AuxInt = i0 19586 v2.Aux = s 19587 v2.AddArg(p) 19588 v2.AddArg(mem) 19589 v1.AddArg(v2) 19590 v0.AddArg(v1) 19591 v0.AddArg(y) 19592 return true 19593 } 19594 // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) 19595 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19596 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 19597 for { 19598 s0 := v.Args[0] 19599 if s0.Op != OpS390XSLDconst { 19600 break 19601 } 19602 j0 := s0.AuxInt 19603 x0 := s0.Args[0] 19604 if x0.Op != OpS390XMOVHZload { 19605 break 19606 } 19607 i0 := x0.AuxInt 19608 s := x0.Aux 19609 p := x0.Args[0] 19610 mem := x0.Args[1] 19611 or := v.Args[1] 19612 if or.Op != OpS390XOR { 19613 break 19614 } 19615 y := or.Args[0] 19616 s1 := or.Args[1] 19617 if s1.Op != OpS390XSLDconst { 19618 break 19619 } 19620 j1 := s1.AuxInt 19621 x1 := s1.Args[0] 19622 if x1.Op != OpS390XMOVHZload { 19623 break 19624 } 19625 i1 := x1.AuxInt 19626 if x1.Aux != s { 19627 break 19628 } 19629 if p != x1.Args[0] { 19630 break 19631 } 19632 if mem != x1.Args[1] { 19633 break 19634 } 19635 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19636 break 19637 } 19638 b = mergePoint(b, x0, x1) 19639 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19640 v.reset(OpCopy) 19641 v.AddArg(v0) 19642 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19643 v1.AuxInt = j1 19644 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19645 v2.AuxInt = i0 19646 v2.Aux = s 19647 v2.AddArg(p) 19648 v2.AddArg(mem) 19649 v1.AddArg(v2) 19650 v0.AddArg(v1) 19651 v0.AddArg(y) 19652 return true 19653 } 19654 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 19655 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19656 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 19657 for { 19658 or := v.Args[0] 19659 if or.Op != OpS390XOR { 19660 break 19661 } 19662 s1 := or.Args[0] 19663 if s1.Op != OpS390XSLDconst { 19664 break 19665 } 19666 j1 := s1.AuxInt 19667 x1 := s1.Args[0] 19668 if x1.Op != OpS390XMOVHZload { 19669 break 19670 } 19671 i1 := x1.AuxInt 19672 s := x1.Aux 19673 p := x1.Args[0] 19674 mem := x1.Args[1] 19675 y := or.Args[1] 19676 s0 := v.Args[1] 19677 if s0.Op != OpS390XSLDconst { 19678 break 19679 } 19680 j0 := s0.AuxInt 19681 x0 := s0.Args[0] 19682 if x0.Op != OpS390XMOVHZload { 19683 break 19684 } 19685 i0 := x0.AuxInt 19686 if x0.Aux != s { 19687 break 19688 } 19689 if p != x0.Args[0] { 19690 break 19691 } 19692 if mem != x0.Args[1] { 19693 break 19694 } 19695 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19696 break 19697 } 19698 b = mergePoint(b, x0, x1) 19699 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19700 v.reset(OpCopy) 19701 v.AddArg(v0) 19702 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19703 v1.AuxInt = j1 19704 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19705 v2.AuxInt = i0 19706 v2.Aux = s 19707 v2.AddArg(p) 19708 v2.AddArg(mem) 19709 v1.AddArg(v2) 19710 v0.AddArg(v1) 19711 v0.AddArg(y) 19712 return true 19713 } 19714 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) 19715 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 19716 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y) 19717 for { 19718 or := v.Args[0] 19719 if or.Op != OpS390XOR { 19720 break 19721 } 19722 y := or.Args[0] 19723 s1 := or.Args[1] 19724 if s1.Op != OpS390XSLDconst { 19725 break 19726 } 19727 j1 := s1.AuxInt 19728 x1 := s1.Args[0] 19729 if x1.Op != OpS390XMOVHZload { 19730 break 19731 } 19732 i1 := x1.AuxInt 19733 s := x1.Aux 19734 p := x1.Args[0] 19735 mem := x1.Args[1] 19736 s0 := v.Args[1] 19737 if s0.Op != OpS390XSLDconst { 19738 break 19739 } 19740 j0 := s0.AuxInt 19741 x0 := s0.Args[0] 19742 if x0.Op != OpS390XMOVHZload { 19743 break 19744 } 19745 i0 := x0.AuxInt 19746 if x0.Aux != s { 19747 break 19748 } 19749 if p != x0.Args[0] { 19750 break 19751 } 19752 if mem != x0.Args[1] { 19753 break 19754 } 19755 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 19756 break 19757 } 19758 b = mergePoint(b, x0, x1) 19759 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 19760 v.reset(OpCopy) 19761 v.AddArg(v0) 19762 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 19763 v1.AuxInt = j1 19764 v2 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 19765 v2.AuxInt = i0 19766 v2.Aux = s 19767 v2.AddArg(p) 19768 v2.AddArg(mem) 19769 v1.AddArg(v2) 19770 v0.AddArg(v1) 19771 v0.AddArg(y) 19772 return true 19773 } 19774 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 19775 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19776 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19777 for { 19778 x1 := v.Args[0] 19779 if x1.Op != OpS390XMOVBZloadidx { 19780 break 19781 } 19782 i1 := x1.AuxInt 19783 s := x1.Aux 19784 p := x1.Args[0] 19785 idx := x1.Args[1] 19786 mem := x1.Args[2] 19787 sh := v.Args[1] 19788 if sh.Op != OpS390XSLDconst { 19789 break 19790 } 19791 if sh.AuxInt != 8 { 19792 break 19793 } 19794 x0 := sh.Args[0] 19795 if x0.Op != OpS390XMOVBZloadidx { 19796 break 19797 } 19798 i0 := x0.AuxInt 19799 if x0.Aux != s { 19800 break 19801 } 19802 if p != x0.Args[0] { 19803 break 19804 } 19805 if idx != x0.Args[1] { 19806 break 19807 } 19808 if mem != x0.Args[2] { 19809 break 19810 } 19811 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19812 break 19813 } 19814 b = mergePoint(b, x0, x1) 19815 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19816 v.reset(OpCopy) 19817 v.AddArg(v0) 19818 v0.AuxInt = i0 19819 v0.Aux = s 19820 v0.AddArg(p) 19821 v0.AddArg(idx) 19822 v0.AddArg(mem) 19823 return true 19824 } 19825 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 19826 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19827 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19828 for { 19829 x1 := v.Args[0] 19830 if x1.Op != OpS390XMOVBZloadidx { 19831 break 19832 } 19833 i1 := x1.AuxInt 19834 s := x1.Aux 19835 idx := x1.Args[0] 19836 p := x1.Args[1] 19837 mem := x1.Args[2] 19838 sh := v.Args[1] 19839 if sh.Op != OpS390XSLDconst { 19840 break 19841 } 19842 if sh.AuxInt != 8 { 19843 break 19844 } 19845 x0 := sh.Args[0] 19846 if x0.Op != OpS390XMOVBZloadidx { 19847 break 19848 } 19849 i0 := x0.AuxInt 19850 if x0.Aux != s { 19851 break 19852 } 19853 if p != x0.Args[0] { 19854 break 19855 } 19856 if idx != x0.Args[1] { 19857 break 19858 } 19859 if mem != x0.Args[2] { 19860 break 19861 } 19862 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19863 break 19864 } 19865 b = mergePoint(b, x0, x1) 19866 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19867 v.reset(OpCopy) 19868 v.AddArg(v0) 19869 v0.AuxInt = i0 19870 v0.Aux = s 19871 v0.AddArg(p) 19872 v0.AddArg(idx) 19873 v0.AddArg(mem) 19874 return true 19875 } 19876 // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 19877 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19878 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19879 for { 19880 x1 := v.Args[0] 19881 if x1.Op != OpS390XMOVBZloadidx { 19882 break 19883 } 19884 i1 := x1.AuxInt 19885 s := x1.Aux 19886 p := x1.Args[0] 19887 idx := x1.Args[1] 19888 mem := x1.Args[2] 19889 sh := v.Args[1] 19890 if sh.Op != OpS390XSLDconst { 19891 break 19892 } 19893 if sh.AuxInt != 8 { 19894 break 19895 } 19896 x0 := sh.Args[0] 19897 if x0.Op != OpS390XMOVBZloadidx { 19898 break 19899 } 19900 i0 := x0.AuxInt 19901 if x0.Aux != s { 19902 break 19903 } 19904 if idx != x0.Args[0] { 19905 break 19906 } 19907 if p != x0.Args[1] { 19908 break 19909 } 19910 if mem != x0.Args[2] { 19911 break 19912 } 19913 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19914 break 19915 } 19916 b = mergePoint(b, x0, x1) 19917 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19918 v.reset(OpCopy) 19919 v.AddArg(v0) 19920 v0.AuxInt = i0 19921 v0.Aux = s 19922 v0.AddArg(p) 19923 v0.AddArg(idx) 19924 v0.AddArg(mem) 19925 return true 19926 } 19927 // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 19928 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19929 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19930 for { 19931 x1 := v.Args[0] 19932 if x1.Op != OpS390XMOVBZloadidx { 19933 break 19934 } 19935 i1 := x1.AuxInt 19936 s := x1.Aux 19937 idx := x1.Args[0] 19938 p := x1.Args[1] 19939 mem := x1.Args[2] 19940 sh := v.Args[1] 19941 if sh.Op != OpS390XSLDconst { 19942 break 19943 } 19944 if sh.AuxInt != 8 { 19945 break 19946 } 19947 x0 := sh.Args[0] 19948 if x0.Op != OpS390XMOVBZloadidx { 19949 break 19950 } 19951 i0 := x0.AuxInt 19952 if x0.Aux != s { 19953 break 19954 } 19955 if idx != x0.Args[0] { 19956 break 19957 } 19958 if p != x0.Args[1] { 19959 break 19960 } 19961 if mem != x0.Args[2] { 19962 break 19963 } 19964 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 19965 break 19966 } 19967 b = mergePoint(b, x0, x1) 19968 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 19969 v.reset(OpCopy) 19970 v.AddArg(v0) 19971 v0.AuxInt = i0 19972 v0.Aux = s 19973 v0.AddArg(p) 19974 v0.AddArg(idx) 19975 v0.AddArg(mem) 19976 return true 19977 } 19978 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 19979 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 19980 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 19981 for { 19982 sh := v.Args[0] 19983 if sh.Op != OpS390XSLDconst { 19984 break 19985 } 19986 if sh.AuxInt != 8 { 19987 break 19988 } 19989 x0 := sh.Args[0] 19990 if x0.Op != OpS390XMOVBZloadidx { 19991 break 19992 } 19993 i0 := x0.AuxInt 19994 s := x0.Aux 19995 p := x0.Args[0] 19996 idx := x0.Args[1] 19997 mem := x0.Args[2] 19998 x1 := v.Args[1] 19999 if x1.Op != OpS390XMOVBZloadidx { 20000 break 20001 } 20002 i1 := x1.AuxInt 20003 if x1.Aux != s { 20004 break 20005 } 20006 if p != x1.Args[0] { 20007 break 20008 } 20009 if idx != x1.Args[1] { 20010 break 20011 } 20012 if mem != x1.Args[2] { 20013 break 20014 } 20015 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20016 break 20017 } 20018 b = mergePoint(b, x0, x1) 20019 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 20020 v.reset(OpCopy) 20021 v.AddArg(v0) 20022 v0.AuxInt = i0 20023 v0.Aux = s 20024 v0.AddArg(p) 20025 v0.AddArg(idx) 20026 v0.AddArg(mem) 20027 return true 20028 } 20029 return false 20030 } 20031 func rewriteValueS390X_OpS390XOR_30(v *Value) bool { 20032 b := v.Block 20033 _ = b 20034 types := &b.Func.Config.Types 20035 _ = types 20036 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 20037 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20038 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20039 for { 20040 sh := v.Args[0] 20041 if sh.Op != OpS390XSLDconst { 20042 break 20043 } 20044 if sh.AuxInt != 8 { 20045 break 20046 } 20047 x0 := sh.Args[0] 20048 if x0.Op != OpS390XMOVBZloadidx { 20049 break 20050 } 20051 i0 := x0.AuxInt 20052 s := x0.Aux 20053 idx := x0.Args[0] 20054 p := x0.Args[1] 20055 mem := x0.Args[2] 20056 x1 := v.Args[1] 20057 if x1.Op != OpS390XMOVBZloadidx { 20058 break 20059 } 20060 i1 := x1.AuxInt 20061 if x1.Aux != s { 20062 break 20063 } 20064 if p != x1.Args[0] { 20065 break 20066 } 20067 if idx != x1.Args[1] { 20068 break 20069 } 20070 if mem != x1.Args[2] { 20071 break 20072 } 20073 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20074 break 20075 } 20076 b = mergePoint(b, x0, x1) 20077 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 20078 v.reset(OpCopy) 20079 v.AddArg(v0) 20080 v0.AuxInt = i0 20081 v0.Aux = s 20082 v0.AddArg(p) 20083 v0.AddArg(idx) 20084 v0.AddArg(mem) 20085 return true 20086 } 20087 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 20088 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20089 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20090 for { 20091 sh := v.Args[0] 20092 if sh.Op != OpS390XSLDconst { 20093 break 20094 } 20095 if sh.AuxInt != 8 { 20096 break 20097 } 20098 x0 := sh.Args[0] 20099 if x0.Op != OpS390XMOVBZloadidx { 20100 break 20101 } 20102 i0 := x0.AuxInt 20103 s := x0.Aux 20104 p := x0.Args[0] 20105 idx := x0.Args[1] 20106 mem := x0.Args[2] 20107 x1 := v.Args[1] 20108 if x1.Op != OpS390XMOVBZloadidx { 20109 break 20110 } 20111 i1 := x1.AuxInt 20112 if x1.Aux != s { 20113 break 20114 } 20115 if idx != x1.Args[0] { 20116 break 20117 } 20118 if p != x1.Args[1] { 20119 break 20120 } 20121 if mem != x1.Args[2] { 20122 break 20123 } 20124 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20125 break 20126 } 20127 b = mergePoint(b, x0, x1) 20128 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 20129 v.reset(OpCopy) 20130 v.AddArg(v0) 20131 v0.AuxInt = i0 20132 v0.Aux = s 20133 v0.AddArg(p) 20134 v0.AddArg(idx) 20135 v0.AddArg(mem) 20136 return true 20137 } 20138 // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 20139 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20140 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 20141 for { 20142 sh := v.Args[0] 20143 if sh.Op != OpS390XSLDconst { 20144 break 20145 } 20146 if sh.AuxInt != 8 { 20147 break 20148 } 20149 x0 := sh.Args[0] 20150 if x0.Op != OpS390XMOVBZloadidx { 20151 break 20152 } 20153 i0 := x0.AuxInt 20154 s := x0.Aux 20155 idx := x0.Args[0] 20156 p := x0.Args[1] 20157 mem := x0.Args[2] 20158 x1 := v.Args[1] 20159 if x1.Op != OpS390XMOVBZloadidx { 20160 break 20161 } 20162 i1 := x1.AuxInt 20163 if x1.Aux != s { 20164 break 20165 } 20166 if idx != x1.Args[0] { 20167 break 20168 } 20169 if p != x1.Args[1] { 20170 break 20171 } 20172 if mem != x1.Args[2] { 20173 break 20174 } 20175 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20176 break 20177 } 20178 b = mergePoint(b, x0, x1) 20179 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 20180 v.reset(OpCopy) 20181 v.AddArg(v0) 20182 v0.AuxInt = i0 20183 v0.Aux = s 20184 v0.AddArg(p) 20185 v0.AddArg(idx) 20186 v0.AddArg(mem) 20187 return true 20188 } 20189 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 20190 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20191 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20192 for { 20193 x1 := v.Args[0] 20194 if x1.Op != OpS390XMOVHZloadidx { 20195 break 20196 } 20197 i1 := x1.AuxInt 20198 s := x1.Aux 20199 p := x1.Args[0] 20200 idx := x1.Args[1] 20201 mem := x1.Args[2] 20202 sh := v.Args[1] 20203 if sh.Op != OpS390XSLDconst { 20204 break 20205 } 20206 if sh.AuxInt != 16 { 20207 break 20208 } 20209 x0 := sh.Args[0] 20210 if x0.Op != OpS390XMOVHZloadidx { 20211 break 20212 } 20213 i0 := x0.AuxInt 20214 if x0.Aux != s { 20215 break 20216 } 20217 if p != x0.Args[0] { 20218 break 20219 } 20220 if idx != x0.Args[1] { 20221 break 20222 } 20223 if mem != x0.Args[2] { 20224 break 20225 } 20226 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20227 break 20228 } 20229 b = mergePoint(b, x0, x1) 20230 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20231 v.reset(OpCopy) 20232 v.AddArg(v0) 20233 v0.AuxInt = i0 20234 v0.Aux = s 20235 v0.AddArg(p) 20236 v0.AddArg(idx) 20237 v0.AddArg(mem) 20238 return true 20239 } 20240 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 20241 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20242 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20243 for { 20244 x1 := v.Args[0] 20245 if x1.Op != OpS390XMOVHZloadidx { 20246 break 20247 } 20248 i1 := x1.AuxInt 20249 s := x1.Aux 20250 idx := x1.Args[0] 20251 p := x1.Args[1] 20252 mem := x1.Args[2] 20253 sh := v.Args[1] 20254 if sh.Op != OpS390XSLDconst { 20255 break 20256 } 20257 if sh.AuxInt != 16 { 20258 break 20259 } 20260 x0 := sh.Args[0] 20261 if x0.Op != OpS390XMOVHZloadidx { 20262 break 20263 } 20264 i0 := x0.AuxInt 20265 if x0.Aux != s { 20266 break 20267 } 20268 if p != x0.Args[0] { 20269 break 20270 } 20271 if idx != x0.Args[1] { 20272 break 20273 } 20274 if mem != x0.Args[2] { 20275 break 20276 } 20277 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20278 break 20279 } 20280 b = mergePoint(b, x0, x1) 20281 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20282 v.reset(OpCopy) 20283 v.AddArg(v0) 20284 v0.AuxInt = i0 20285 v0.Aux = s 20286 v0.AddArg(p) 20287 v0.AddArg(idx) 20288 v0.AddArg(mem) 20289 return true 20290 } 20291 // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 20292 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20293 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20294 for { 20295 x1 := v.Args[0] 20296 if x1.Op != OpS390XMOVHZloadidx { 20297 break 20298 } 20299 i1 := x1.AuxInt 20300 s := x1.Aux 20301 p := x1.Args[0] 20302 idx := x1.Args[1] 20303 mem := x1.Args[2] 20304 sh := v.Args[1] 20305 if sh.Op != OpS390XSLDconst { 20306 break 20307 } 20308 if sh.AuxInt != 16 { 20309 break 20310 } 20311 x0 := sh.Args[0] 20312 if x0.Op != OpS390XMOVHZloadidx { 20313 break 20314 } 20315 i0 := x0.AuxInt 20316 if x0.Aux != s { 20317 break 20318 } 20319 if idx != x0.Args[0] { 20320 break 20321 } 20322 if p != x0.Args[1] { 20323 break 20324 } 20325 if mem != x0.Args[2] { 20326 break 20327 } 20328 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20329 break 20330 } 20331 b = mergePoint(b, x0, x1) 20332 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20333 v.reset(OpCopy) 20334 v.AddArg(v0) 20335 v0.AuxInt = i0 20336 v0.Aux = s 20337 v0.AddArg(p) 20338 v0.AddArg(idx) 20339 v0.AddArg(mem) 20340 return true 20341 } 20342 // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 20343 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20344 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20345 for { 20346 x1 := v.Args[0] 20347 if x1.Op != OpS390XMOVHZloadidx { 20348 break 20349 } 20350 i1 := x1.AuxInt 20351 s := x1.Aux 20352 idx := x1.Args[0] 20353 p := x1.Args[1] 20354 mem := x1.Args[2] 20355 sh := v.Args[1] 20356 if sh.Op != OpS390XSLDconst { 20357 break 20358 } 20359 if sh.AuxInt != 16 { 20360 break 20361 } 20362 x0 := sh.Args[0] 20363 if x0.Op != OpS390XMOVHZloadidx { 20364 break 20365 } 20366 i0 := x0.AuxInt 20367 if x0.Aux != s { 20368 break 20369 } 20370 if idx != x0.Args[0] { 20371 break 20372 } 20373 if p != x0.Args[1] { 20374 break 20375 } 20376 if mem != x0.Args[2] { 20377 break 20378 } 20379 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20380 break 20381 } 20382 b = mergePoint(b, x0, x1) 20383 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20384 v.reset(OpCopy) 20385 v.AddArg(v0) 20386 v0.AuxInt = i0 20387 v0.Aux = s 20388 v0.AddArg(p) 20389 v0.AddArg(idx) 20390 v0.AddArg(mem) 20391 return true 20392 } 20393 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 20394 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20395 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20396 for { 20397 sh := v.Args[0] 20398 if sh.Op != OpS390XSLDconst { 20399 break 20400 } 20401 if sh.AuxInt != 16 { 20402 break 20403 } 20404 x0 := sh.Args[0] 20405 if x0.Op != OpS390XMOVHZloadidx { 20406 break 20407 } 20408 i0 := x0.AuxInt 20409 s := x0.Aux 20410 p := x0.Args[0] 20411 idx := x0.Args[1] 20412 mem := x0.Args[2] 20413 x1 := v.Args[1] 20414 if x1.Op != OpS390XMOVHZloadidx { 20415 break 20416 } 20417 i1 := x1.AuxInt 20418 if x1.Aux != s { 20419 break 20420 } 20421 if p != x1.Args[0] { 20422 break 20423 } 20424 if idx != x1.Args[1] { 20425 break 20426 } 20427 if mem != x1.Args[2] { 20428 break 20429 } 20430 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20431 break 20432 } 20433 b = mergePoint(b, x0, x1) 20434 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20435 v.reset(OpCopy) 20436 v.AddArg(v0) 20437 v0.AuxInt = i0 20438 v0.Aux = s 20439 v0.AddArg(p) 20440 v0.AddArg(idx) 20441 v0.AddArg(mem) 20442 return true 20443 } 20444 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 20445 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20446 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20447 for { 20448 sh := v.Args[0] 20449 if sh.Op != OpS390XSLDconst { 20450 break 20451 } 20452 if sh.AuxInt != 16 { 20453 break 20454 } 20455 x0 := sh.Args[0] 20456 if x0.Op != OpS390XMOVHZloadidx { 20457 break 20458 } 20459 i0 := x0.AuxInt 20460 s := x0.Aux 20461 idx := x0.Args[0] 20462 p := x0.Args[1] 20463 mem := x0.Args[2] 20464 x1 := v.Args[1] 20465 if x1.Op != OpS390XMOVHZloadidx { 20466 break 20467 } 20468 i1 := x1.AuxInt 20469 if x1.Aux != s { 20470 break 20471 } 20472 if p != x1.Args[0] { 20473 break 20474 } 20475 if idx != x1.Args[1] { 20476 break 20477 } 20478 if mem != x1.Args[2] { 20479 break 20480 } 20481 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20482 break 20483 } 20484 b = mergePoint(b, x0, x1) 20485 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20486 v.reset(OpCopy) 20487 v.AddArg(v0) 20488 v0.AuxInt = i0 20489 v0.Aux = s 20490 v0.AddArg(p) 20491 v0.AddArg(idx) 20492 v0.AddArg(mem) 20493 return true 20494 } 20495 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 20496 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20497 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20498 for { 20499 sh := v.Args[0] 20500 if sh.Op != OpS390XSLDconst { 20501 break 20502 } 20503 if sh.AuxInt != 16 { 20504 break 20505 } 20506 x0 := sh.Args[0] 20507 if x0.Op != OpS390XMOVHZloadidx { 20508 break 20509 } 20510 i0 := x0.AuxInt 20511 s := x0.Aux 20512 p := x0.Args[0] 20513 idx := x0.Args[1] 20514 mem := x0.Args[2] 20515 x1 := v.Args[1] 20516 if x1.Op != OpS390XMOVHZloadidx { 20517 break 20518 } 20519 i1 := x1.AuxInt 20520 if x1.Aux != s { 20521 break 20522 } 20523 if idx != x1.Args[0] { 20524 break 20525 } 20526 if p != x1.Args[1] { 20527 break 20528 } 20529 if mem != x1.Args[2] { 20530 break 20531 } 20532 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20533 break 20534 } 20535 b = mergePoint(b, x0, x1) 20536 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20537 v.reset(OpCopy) 20538 v.AddArg(v0) 20539 v0.AuxInt = i0 20540 v0.Aux = s 20541 v0.AddArg(p) 20542 v0.AddArg(idx) 20543 v0.AddArg(mem) 20544 return true 20545 } 20546 return false 20547 } 20548 func rewriteValueS390X_OpS390XOR_40(v *Value) bool { 20549 b := v.Block 20550 _ = b 20551 types := &b.Func.Config.Types 20552 _ = types 20553 // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 20554 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20555 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 20556 for { 20557 sh := v.Args[0] 20558 if sh.Op != OpS390XSLDconst { 20559 break 20560 } 20561 if sh.AuxInt != 16 { 20562 break 20563 } 20564 x0 := sh.Args[0] 20565 if x0.Op != OpS390XMOVHZloadidx { 20566 break 20567 } 20568 i0 := x0.AuxInt 20569 s := x0.Aux 20570 idx := x0.Args[0] 20571 p := x0.Args[1] 20572 mem := x0.Args[2] 20573 x1 := v.Args[1] 20574 if x1.Op != OpS390XMOVHZloadidx { 20575 break 20576 } 20577 i1 := x1.AuxInt 20578 if x1.Aux != s { 20579 break 20580 } 20581 if idx != x1.Args[0] { 20582 break 20583 } 20584 if p != x1.Args[1] { 20585 break 20586 } 20587 if mem != x1.Args[2] { 20588 break 20589 } 20590 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20591 break 20592 } 20593 b = mergePoint(b, x0, x1) 20594 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 20595 v.reset(OpCopy) 20596 v.AddArg(v0) 20597 v0.AuxInt = i0 20598 v0.Aux = s 20599 v0.AddArg(p) 20600 v0.AddArg(idx) 20601 v0.AddArg(mem) 20602 return true 20603 } 20604 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 20605 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20606 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20607 for { 20608 x1 := v.Args[0] 20609 if x1.Op != OpS390XMOVWZloadidx { 20610 break 20611 } 20612 i1 := x1.AuxInt 20613 s := x1.Aux 20614 p := x1.Args[0] 20615 idx := x1.Args[1] 20616 mem := x1.Args[2] 20617 sh := v.Args[1] 20618 if sh.Op != OpS390XSLDconst { 20619 break 20620 } 20621 if sh.AuxInt != 32 { 20622 break 20623 } 20624 x0 := sh.Args[0] 20625 if x0.Op != OpS390XMOVWZloadidx { 20626 break 20627 } 20628 i0 := x0.AuxInt 20629 if x0.Aux != s { 20630 break 20631 } 20632 if p != x0.Args[0] { 20633 break 20634 } 20635 if idx != x0.Args[1] { 20636 break 20637 } 20638 if mem != x0.Args[2] { 20639 break 20640 } 20641 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20642 break 20643 } 20644 b = mergePoint(b, x0, x1) 20645 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20646 v.reset(OpCopy) 20647 v.AddArg(v0) 20648 v0.AuxInt = i0 20649 v0.Aux = s 20650 v0.AddArg(p) 20651 v0.AddArg(idx) 20652 v0.AddArg(mem) 20653 return true 20654 } 20655 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) 20656 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20657 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20658 for { 20659 x1 := v.Args[0] 20660 if x1.Op != OpS390XMOVWZloadidx { 20661 break 20662 } 20663 i1 := x1.AuxInt 20664 s := x1.Aux 20665 idx := x1.Args[0] 20666 p := x1.Args[1] 20667 mem := x1.Args[2] 20668 sh := v.Args[1] 20669 if sh.Op != OpS390XSLDconst { 20670 break 20671 } 20672 if sh.AuxInt != 32 { 20673 break 20674 } 20675 x0 := sh.Args[0] 20676 if x0.Op != OpS390XMOVWZloadidx { 20677 break 20678 } 20679 i0 := x0.AuxInt 20680 if x0.Aux != s { 20681 break 20682 } 20683 if p != x0.Args[0] { 20684 break 20685 } 20686 if idx != x0.Args[1] { 20687 break 20688 } 20689 if mem != x0.Args[2] { 20690 break 20691 } 20692 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20693 break 20694 } 20695 b = mergePoint(b, x0, x1) 20696 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20697 v.reset(OpCopy) 20698 v.AddArg(v0) 20699 v0.AuxInt = i0 20700 v0.Aux = s 20701 v0.AddArg(p) 20702 v0.AddArg(idx) 20703 v0.AddArg(mem) 20704 return true 20705 } 20706 // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 20707 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20708 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20709 for { 20710 x1 := v.Args[0] 20711 if x1.Op != OpS390XMOVWZloadidx { 20712 break 20713 } 20714 i1 := x1.AuxInt 20715 s := x1.Aux 20716 p := x1.Args[0] 20717 idx := x1.Args[1] 20718 mem := x1.Args[2] 20719 sh := v.Args[1] 20720 if sh.Op != OpS390XSLDconst { 20721 break 20722 } 20723 if sh.AuxInt != 32 { 20724 break 20725 } 20726 x0 := sh.Args[0] 20727 if x0.Op != OpS390XMOVWZloadidx { 20728 break 20729 } 20730 i0 := x0.AuxInt 20731 if x0.Aux != s { 20732 break 20733 } 20734 if idx != x0.Args[0] { 20735 break 20736 } 20737 if p != x0.Args[1] { 20738 break 20739 } 20740 if mem != x0.Args[2] { 20741 break 20742 } 20743 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20744 break 20745 } 20746 b = mergePoint(b, x0, x1) 20747 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20748 v.reset(OpCopy) 20749 v.AddArg(v0) 20750 v0.AuxInt = i0 20751 v0.Aux = s 20752 v0.AddArg(p) 20753 v0.AddArg(idx) 20754 v0.AddArg(mem) 20755 return true 20756 } 20757 // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) 20758 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20759 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20760 for { 20761 x1 := v.Args[0] 20762 if x1.Op != OpS390XMOVWZloadidx { 20763 break 20764 } 20765 i1 := x1.AuxInt 20766 s := x1.Aux 20767 idx := x1.Args[0] 20768 p := x1.Args[1] 20769 mem := x1.Args[2] 20770 sh := v.Args[1] 20771 if sh.Op != OpS390XSLDconst { 20772 break 20773 } 20774 if sh.AuxInt != 32 { 20775 break 20776 } 20777 x0 := sh.Args[0] 20778 if x0.Op != OpS390XMOVWZloadidx { 20779 break 20780 } 20781 i0 := x0.AuxInt 20782 if x0.Aux != s { 20783 break 20784 } 20785 if idx != x0.Args[0] { 20786 break 20787 } 20788 if p != x0.Args[1] { 20789 break 20790 } 20791 if mem != x0.Args[2] { 20792 break 20793 } 20794 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20795 break 20796 } 20797 b = mergePoint(b, x0, x1) 20798 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20799 v.reset(OpCopy) 20800 v.AddArg(v0) 20801 v0.AuxInt = i0 20802 v0.Aux = s 20803 v0.AddArg(p) 20804 v0.AddArg(idx) 20805 v0.AddArg(mem) 20806 return true 20807 } 20808 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 20809 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20810 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20811 for { 20812 sh := v.Args[0] 20813 if sh.Op != OpS390XSLDconst { 20814 break 20815 } 20816 if sh.AuxInt != 32 { 20817 break 20818 } 20819 x0 := sh.Args[0] 20820 if x0.Op != OpS390XMOVWZloadidx { 20821 break 20822 } 20823 i0 := x0.AuxInt 20824 s := x0.Aux 20825 p := x0.Args[0] 20826 idx := x0.Args[1] 20827 mem := x0.Args[2] 20828 x1 := v.Args[1] 20829 if x1.Op != OpS390XMOVWZloadidx { 20830 break 20831 } 20832 i1 := x1.AuxInt 20833 if x1.Aux != s { 20834 break 20835 } 20836 if p != x1.Args[0] { 20837 break 20838 } 20839 if idx != x1.Args[1] { 20840 break 20841 } 20842 if mem != x1.Args[2] { 20843 break 20844 } 20845 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20846 break 20847 } 20848 b = mergePoint(b, x0, x1) 20849 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20850 v.reset(OpCopy) 20851 v.AddArg(v0) 20852 v0.AuxInt = i0 20853 v0.Aux = s 20854 v0.AddArg(p) 20855 v0.AddArg(idx) 20856 v0.AddArg(mem) 20857 return true 20858 } 20859 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) 20860 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20861 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20862 for { 20863 sh := v.Args[0] 20864 if sh.Op != OpS390XSLDconst { 20865 break 20866 } 20867 if sh.AuxInt != 32 { 20868 break 20869 } 20870 x0 := sh.Args[0] 20871 if x0.Op != OpS390XMOVWZloadidx { 20872 break 20873 } 20874 i0 := x0.AuxInt 20875 s := x0.Aux 20876 idx := x0.Args[0] 20877 p := x0.Args[1] 20878 mem := x0.Args[2] 20879 x1 := v.Args[1] 20880 if x1.Op != OpS390XMOVWZloadidx { 20881 break 20882 } 20883 i1 := x1.AuxInt 20884 if x1.Aux != s { 20885 break 20886 } 20887 if p != x1.Args[0] { 20888 break 20889 } 20890 if idx != x1.Args[1] { 20891 break 20892 } 20893 if mem != x1.Args[2] { 20894 break 20895 } 20896 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20897 break 20898 } 20899 b = mergePoint(b, x0, x1) 20900 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20901 v.reset(OpCopy) 20902 v.AddArg(v0) 20903 v0.AuxInt = i0 20904 v0.Aux = s 20905 v0.AddArg(p) 20906 v0.AddArg(idx) 20907 v0.AddArg(mem) 20908 return true 20909 } 20910 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 20911 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20912 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20913 for { 20914 sh := v.Args[0] 20915 if sh.Op != OpS390XSLDconst { 20916 break 20917 } 20918 if sh.AuxInt != 32 { 20919 break 20920 } 20921 x0 := sh.Args[0] 20922 if x0.Op != OpS390XMOVWZloadidx { 20923 break 20924 } 20925 i0 := x0.AuxInt 20926 s := x0.Aux 20927 p := x0.Args[0] 20928 idx := x0.Args[1] 20929 mem := x0.Args[2] 20930 x1 := v.Args[1] 20931 if x1.Op != OpS390XMOVWZloadidx { 20932 break 20933 } 20934 i1 := x1.AuxInt 20935 if x1.Aux != s { 20936 break 20937 } 20938 if idx != x1.Args[0] { 20939 break 20940 } 20941 if p != x1.Args[1] { 20942 break 20943 } 20944 if mem != x1.Args[2] { 20945 break 20946 } 20947 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20948 break 20949 } 20950 b = mergePoint(b, x0, x1) 20951 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 20952 v.reset(OpCopy) 20953 v.AddArg(v0) 20954 v0.AuxInt = i0 20955 v0.Aux = s 20956 v0.AddArg(p) 20957 v0.AddArg(idx) 20958 v0.AddArg(mem) 20959 return true 20960 } 20961 // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) 20962 // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 20963 // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) 20964 for { 20965 sh := v.Args[0] 20966 if sh.Op != OpS390XSLDconst { 20967 break 20968 } 20969 if sh.AuxInt != 32 { 20970 break 20971 } 20972 x0 := sh.Args[0] 20973 if x0.Op != OpS390XMOVWZloadidx { 20974 break 20975 } 20976 i0 := x0.AuxInt 20977 s := x0.Aux 20978 idx := x0.Args[0] 20979 p := x0.Args[1] 20980 mem := x0.Args[2] 20981 x1 := v.Args[1] 20982 if x1.Op != OpS390XMOVWZloadidx { 20983 break 20984 } 20985 i1 := x1.AuxInt 20986 if x1.Aux != s { 20987 break 20988 } 20989 if idx != x1.Args[0] { 20990 break 20991 } 20992 if p != x1.Args[1] { 20993 break 20994 } 20995 if mem != x1.Args[2] { 20996 break 20997 } 20998 if !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 20999 break 21000 } 21001 b = mergePoint(b, x0, x1) 21002 v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, types.UInt64) 21003 v.reset(OpCopy) 21004 v.AddArg(v0) 21005 v0.AuxInt = i0 21006 v0.Aux = s 21007 v0.AddArg(p) 21008 v0.AddArg(idx) 21009 v0.AddArg(mem) 21010 return true 21011 } 21012 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) 21013 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21014 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21015 for { 21016 s0 := v.Args[0] 21017 if s0.Op != OpS390XSLDconst { 21018 break 21019 } 21020 j0 := s0.AuxInt 21021 x0 := s0.Args[0] 21022 if x0.Op != OpS390XMOVBZloadidx { 21023 break 21024 } 21025 i0 := x0.AuxInt 21026 s := x0.Aux 21027 p := x0.Args[0] 21028 idx := x0.Args[1] 21029 mem := x0.Args[2] 21030 or := v.Args[1] 21031 if or.Op != OpS390XOR { 21032 break 21033 } 21034 s1 := or.Args[0] 21035 if s1.Op != OpS390XSLDconst { 21036 break 21037 } 21038 j1 := s1.AuxInt 21039 x1 := s1.Args[0] 21040 if x1.Op != OpS390XMOVBZloadidx { 21041 break 21042 } 21043 i1 := x1.AuxInt 21044 if x1.Aux != s { 21045 break 21046 } 21047 if p != x1.Args[0] { 21048 break 21049 } 21050 if idx != x1.Args[1] { 21051 break 21052 } 21053 if mem != x1.Args[2] { 21054 break 21055 } 21056 y := or.Args[1] 21057 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21058 break 21059 } 21060 b = mergePoint(b, x0, x1) 21061 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21062 v.reset(OpCopy) 21063 v.AddArg(v0) 21064 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21065 v1.AuxInt = j1 21066 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21067 v2.AuxInt = i0 21068 v2.Aux = s 21069 v2.AddArg(p) 21070 v2.AddArg(idx) 21071 v2.AddArg(mem) 21072 v1.AddArg(v2) 21073 v0.AddArg(v1) 21074 v0.AddArg(y) 21075 return true 21076 } 21077 return false 21078 } 21079 func rewriteValueS390X_OpS390XOR_50(v *Value) bool { 21080 b := v.Block 21081 _ = b 21082 types := &b.Func.Config.Types 21083 _ = types 21084 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) 21085 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21086 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21087 for { 21088 s0 := v.Args[0] 21089 if s0.Op != OpS390XSLDconst { 21090 break 21091 } 21092 j0 := s0.AuxInt 21093 x0 := s0.Args[0] 21094 if x0.Op != OpS390XMOVBZloadidx { 21095 break 21096 } 21097 i0 := x0.AuxInt 21098 s := x0.Aux 21099 idx := x0.Args[0] 21100 p := x0.Args[1] 21101 mem := x0.Args[2] 21102 or := v.Args[1] 21103 if or.Op != OpS390XOR { 21104 break 21105 } 21106 s1 := or.Args[0] 21107 if s1.Op != OpS390XSLDconst { 21108 break 21109 } 21110 j1 := s1.AuxInt 21111 x1 := s1.Args[0] 21112 if x1.Op != OpS390XMOVBZloadidx { 21113 break 21114 } 21115 i1 := x1.AuxInt 21116 if x1.Aux != s { 21117 break 21118 } 21119 if p != x1.Args[0] { 21120 break 21121 } 21122 if idx != x1.Args[1] { 21123 break 21124 } 21125 if mem != x1.Args[2] { 21126 break 21127 } 21128 y := or.Args[1] 21129 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21130 break 21131 } 21132 b = mergePoint(b, x0, x1) 21133 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21134 v.reset(OpCopy) 21135 v.AddArg(v0) 21136 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21137 v1.AuxInt = j1 21138 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21139 v2.AuxInt = i0 21140 v2.Aux = s 21141 v2.AddArg(p) 21142 v2.AddArg(idx) 21143 v2.AddArg(mem) 21144 v1.AddArg(v2) 21145 v0.AddArg(v1) 21146 v0.AddArg(y) 21147 return true 21148 } 21149 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) 21150 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21151 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21152 for { 21153 s0 := v.Args[0] 21154 if s0.Op != OpS390XSLDconst { 21155 break 21156 } 21157 j0 := s0.AuxInt 21158 x0 := s0.Args[0] 21159 if x0.Op != OpS390XMOVBZloadidx { 21160 break 21161 } 21162 i0 := x0.AuxInt 21163 s := x0.Aux 21164 p := x0.Args[0] 21165 idx := x0.Args[1] 21166 mem := x0.Args[2] 21167 or := v.Args[1] 21168 if or.Op != OpS390XOR { 21169 break 21170 } 21171 s1 := or.Args[0] 21172 if s1.Op != OpS390XSLDconst { 21173 break 21174 } 21175 j1 := s1.AuxInt 21176 x1 := s1.Args[0] 21177 if x1.Op != OpS390XMOVBZloadidx { 21178 break 21179 } 21180 i1 := x1.AuxInt 21181 if x1.Aux != s { 21182 break 21183 } 21184 if idx != x1.Args[0] { 21185 break 21186 } 21187 if p != x1.Args[1] { 21188 break 21189 } 21190 if mem != x1.Args[2] { 21191 break 21192 } 21193 y := or.Args[1] 21194 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21195 break 21196 } 21197 b = mergePoint(b, x0, x1) 21198 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21199 v.reset(OpCopy) 21200 v.AddArg(v0) 21201 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21202 v1.AuxInt = j1 21203 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21204 v2.AuxInt = i0 21205 v2.Aux = s 21206 v2.AddArg(p) 21207 v2.AddArg(idx) 21208 v2.AddArg(mem) 21209 v1.AddArg(v2) 21210 v0.AddArg(v1) 21211 v0.AddArg(y) 21212 return true 21213 } 21214 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) 21215 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21216 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21217 for { 21218 s0 := v.Args[0] 21219 if s0.Op != OpS390XSLDconst { 21220 break 21221 } 21222 j0 := s0.AuxInt 21223 x0 := s0.Args[0] 21224 if x0.Op != OpS390XMOVBZloadidx { 21225 break 21226 } 21227 i0 := x0.AuxInt 21228 s := x0.Aux 21229 idx := x0.Args[0] 21230 p := x0.Args[1] 21231 mem := x0.Args[2] 21232 or := v.Args[1] 21233 if or.Op != OpS390XOR { 21234 break 21235 } 21236 s1 := or.Args[0] 21237 if s1.Op != OpS390XSLDconst { 21238 break 21239 } 21240 j1 := s1.AuxInt 21241 x1 := s1.Args[0] 21242 if x1.Op != OpS390XMOVBZloadidx { 21243 break 21244 } 21245 i1 := x1.AuxInt 21246 if x1.Aux != s { 21247 break 21248 } 21249 if idx != x1.Args[0] { 21250 break 21251 } 21252 if p != x1.Args[1] { 21253 break 21254 } 21255 if mem != x1.Args[2] { 21256 break 21257 } 21258 y := or.Args[1] 21259 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21260 break 21261 } 21262 b = mergePoint(b, x0, x1) 21263 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21264 v.reset(OpCopy) 21265 v.AddArg(v0) 21266 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21267 v1.AuxInt = j1 21268 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21269 v2.AuxInt = i0 21270 v2.Aux = s 21271 v2.AddArg(p) 21272 v2.AddArg(idx) 21273 v2.AddArg(mem) 21274 v1.AddArg(v2) 21275 v0.AddArg(v1) 21276 v0.AddArg(y) 21277 return true 21278 } 21279 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) 21280 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21281 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21282 for { 21283 s0 := v.Args[0] 21284 if s0.Op != OpS390XSLDconst { 21285 break 21286 } 21287 j0 := s0.AuxInt 21288 x0 := s0.Args[0] 21289 if x0.Op != OpS390XMOVBZloadidx { 21290 break 21291 } 21292 i0 := x0.AuxInt 21293 s := x0.Aux 21294 p := x0.Args[0] 21295 idx := x0.Args[1] 21296 mem := x0.Args[2] 21297 or := v.Args[1] 21298 if or.Op != OpS390XOR { 21299 break 21300 } 21301 y := or.Args[0] 21302 s1 := or.Args[1] 21303 if s1.Op != OpS390XSLDconst { 21304 break 21305 } 21306 j1 := s1.AuxInt 21307 x1 := s1.Args[0] 21308 if x1.Op != OpS390XMOVBZloadidx { 21309 break 21310 } 21311 i1 := x1.AuxInt 21312 if x1.Aux != s { 21313 break 21314 } 21315 if p != x1.Args[0] { 21316 break 21317 } 21318 if idx != x1.Args[1] { 21319 break 21320 } 21321 if mem != x1.Args[2] { 21322 break 21323 } 21324 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21325 break 21326 } 21327 b = mergePoint(b, x0, x1) 21328 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21329 v.reset(OpCopy) 21330 v.AddArg(v0) 21331 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21332 v1.AuxInt = j1 21333 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21334 v2.AuxInt = i0 21335 v2.Aux = s 21336 v2.AddArg(p) 21337 v2.AddArg(idx) 21338 v2.AddArg(mem) 21339 v1.AddArg(v2) 21340 v0.AddArg(v1) 21341 v0.AddArg(y) 21342 return true 21343 } 21344 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) 21345 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21346 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21347 for { 21348 s0 := v.Args[0] 21349 if s0.Op != OpS390XSLDconst { 21350 break 21351 } 21352 j0 := s0.AuxInt 21353 x0 := s0.Args[0] 21354 if x0.Op != OpS390XMOVBZloadidx { 21355 break 21356 } 21357 i0 := x0.AuxInt 21358 s := x0.Aux 21359 idx := x0.Args[0] 21360 p := x0.Args[1] 21361 mem := x0.Args[2] 21362 or := v.Args[1] 21363 if or.Op != OpS390XOR { 21364 break 21365 } 21366 y := or.Args[0] 21367 s1 := or.Args[1] 21368 if s1.Op != OpS390XSLDconst { 21369 break 21370 } 21371 j1 := s1.AuxInt 21372 x1 := s1.Args[0] 21373 if x1.Op != OpS390XMOVBZloadidx { 21374 break 21375 } 21376 i1 := x1.AuxInt 21377 if x1.Aux != s { 21378 break 21379 } 21380 if p != x1.Args[0] { 21381 break 21382 } 21383 if idx != x1.Args[1] { 21384 break 21385 } 21386 if mem != x1.Args[2] { 21387 break 21388 } 21389 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21390 break 21391 } 21392 b = mergePoint(b, x0, x1) 21393 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21394 v.reset(OpCopy) 21395 v.AddArg(v0) 21396 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21397 v1.AuxInt = j1 21398 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21399 v2.AuxInt = i0 21400 v2.Aux = s 21401 v2.AddArg(p) 21402 v2.AddArg(idx) 21403 v2.AddArg(mem) 21404 v1.AddArg(v2) 21405 v0.AddArg(v1) 21406 v0.AddArg(y) 21407 return true 21408 } 21409 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) 21410 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21411 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21412 for { 21413 s0 := v.Args[0] 21414 if s0.Op != OpS390XSLDconst { 21415 break 21416 } 21417 j0 := s0.AuxInt 21418 x0 := s0.Args[0] 21419 if x0.Op != OpS390XMOVBZloadidx { 21420 break 21421 } 21422 i0 := x0.AuxInt 21423 s := x0.Aux 21424 p := x0.Args[0] 21425 idx := x0.Args[1] 21426 mem := x0.Args[2] 21427 or := v.Args[1] 21428 if or.Op != OpS390XOR { 21429 break 21430 } 21431 y := or.Args[0] 21432 s1 := or.Args[1] 21433 if s1.Op != OpS390XSLDconst { 21434 break 21435 } 21436 j1 := s1.AuxInt 21437 x1 := s1.Args[0] 21438 if x1.Op != OpS390XMOVBZloadidx { 21439 break 21440 } 21441 i1 := x1.AuxInt 21442 if x1.Aux != s { 21443 break 21444 } 21445 if idx != x1.Args[0] { 21446 break 21447 } 21448 if p != x1.Args[1] { 21449 break 21450 } 21451 if mem != x1.Args[2] { 21452 break 21453 } 21454 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21455 break 21456 } 21457 b = mergePoint(b, x0, x1) 21458 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21459 v.reset(OpCopy) 21460 v.AddArg(v0) 21461 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21462 v1.AuxInt = j1 21463 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21464 v2.AuxInt = i0 21465 v2.Aux = s 21466 v2.AddArg(p) 21467 v2.AddArg(idx) 21468 v2.AddArg(mem) 21469 v1.AddArg(v2) 21470 v0.AddArg(v1) 21471 v0.AddArg(y) 21472 return true 21473 } 21474 // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) 21475 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21476 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21477 for { 21478 s0 := v.Args[0] 21479 if s0.Op != OpS390XSLDconst { 21480 break 21481 } 21482 j0 := s0.AuxInt 21483 x0 := s0.Args[0] 21484 if x0.Op != OpS390XMOVBZloadidx { 21485 break 21486 } 21487 i0 := x0.AuxInt 21488 s := x0.Aux 21489 idx := x0.Args[0] 21490 p := x0.Args[1] 21491 mem := x0.Args[2] 21492 or := v.Args[1] 21493 if or.Op != OpS390XOR { 21494 break 21495 } 21496 y := or.Args[0] 21497 s1 := or.Args[1] 21498 if s1.Op != OpS390XSLDconst { 21499 break 21500 } 21501 j1 := s1.AuxInt 21502 x1 := s1.Args[0] 21503 if x1.Op != OpS390XMOVBZloadidx { 21504 break 21505 } 21506 i1 := x1.AuxInt 21507 if x1.Aux != s { 21508 break 21509 } 21510 if idx != x1.Args[0] { 21511 break 21512 } 21513 if p != x1.Args[1] { 21514 break 21515 } 21516 if mem != x1.Args[2] { 21517 break 21518 } 21519 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21520 break 21521 } 21522 b = mergePoint(b, x0, x1) 21523 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21524 v.reset(OpCopy) 21525 v.AddArg(v0) 21526 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21527 v1.AuxInt = j1 21528 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21529 v2.AuxInt = i0 21530 v2.Aux = s 21531 v2.AddArg(p) 21532 v2.AddArg(idx) 21533 v2.AddArg(mem) 21534 v1.AddArg(v2) 21535 v0.AddArg(v1) 21536 v0.AddArg(y) 21537 return true 21538 } 21539 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 21540 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21541 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21542 for { 21543 or := v.Args[0] 21544 if or.Op != OpS390XOR { 21545 break 21546 } 21547 s1 := or.Args[0] 21548 if s1.Op != OpS390XSLDconst { 21549 break 21550 } 21551 j1 := s1.AuxInt 21552 x1 := s1.Args[0] 21553 if x1.Op != OpS390XMOVBZloadidx { 21554 break 21555 } 21556 i1 := x1.AuxInt 21557 s := x1.Aux 21558 p := x1.Args[0] 21559 idx := x1.Args[1] 21560 mem := x1.Args[2] 21561 y := or.Args[1] 21562 s0 := v.Args[1] 21563 if s0.Op != OpS390XSLDconst { 21564 break 21565 } 21566 j0 := s0.AuxInt 21567 x0 := s0.Args[0] 21568 if x0.Op != OpS390XMOVBZloadidx { 21569 break 21570 } 21571 i0 := x0.AuxInt 21572 if x0.Aux != s { 21573 break 21574 } 21575 if p != x0.Args[0] { 21576 break 21577 } 21578 if idx != x0.Args[1] { 21579 break 21580 } 21581 if mem != x0.Args[2] { 21582 break 21583 } 21584 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21585 break 21586 } 21587 b = mergePoint(b, x0, x1) 21588 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21589 v.reset(OpCopy) 21590 v.AddArg(v0) 21591 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21592 v1.AuxInt = j1 21593 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21594 v2.AuxInt = i0 21595 v2.Aux = s 21596 v2.AddArg(p) 21597 v2.AddArg(idx) 21598 v2.AddArg(mem) 21599 v1.AddArg(v2) 21600 v0.AddArg(v1) 21601 v0.AddArg(y) 21602 return true 21603 } 21604 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 21605 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21606 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21607 for { 21608 or := v.Args[0] 21609 if or.Op != OpS390XOR { 21610 break 21611 } 21612 s1 := or.Args[0] 21613 if s1.Op != OpS390XSLDconst { 21614 break 21615 } 21616 j1 := s1.AuxInt 21617 x1 := s1.Args[0] 21618 if x1.Op != OpS390XMOVBZloadidx { 21619 break 21620 } 21621 i1 := x1.AuxInt 21622 s := x1.Aux 21623 idx := x1.Args[0] 21624 p := x1.Args[1] 21625 mem := x1.Args[2] 21626 y := or.Args[1] 21627 s0 := v.Args[1] 21628 if s0.Op != OpS390XSLDconst { 21629 break 21630 } 21631 j0 := s0.AuxInt 21632 x0 := s0.Args[0] 21633 if x0.Op != OpS390XMOVBZloadidx { 21634 break 21635 } 21636 i0 := x0.AuxInt 21637 if x0.Aux != s { 21638 break 21639 } 21640 if p != x0.Args[0] { 21641 break 21642 } 21643 if idx != x0.Args[1] { 21644 break 21645 } 21646 if mem != x0.Args[2] { 21647 break 21648 } 21649 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21650 break 21651 } 21652 b = mergePoint(b, x0, x1) 21653 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21654 v.reset(OpCopy) 21655 v.AddArg(v0) 21656 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21657 v1.AuxInt = j1 21658 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21659 v2.AuxInt = i0 21660 v2.Aux = s 21661 v2.AddArg(p) 21662 v2.AddArg(idx) 21663 v2.AddArg(mem) 21664 v1.AddArg(v2) 21665 v0.AddArg(v1) 21666 v0.AddArg(y) 21667 return true 21668 } 21669 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 21670 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21671 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21672 for { 21673 or := v.Args[0] 21674 if or.Op != OpS390XOR { 21675 break 21676 } 21677 y := or.Args[0] 21678 s1 := or.Args[1] 21679 if s1.Op != OpS390XSLDconst { 21680 break 21681 } 21682 j1 := s1.AuxInt 21683 x1 := s1.Args[0] 21684 if x1.Op != OpS390XMOVBZloadidx { 21685 break 21686 } 21687 i1 := x1.AuxInt 21688 s := x1.Aux 21689 p := x1.Args[0] 21690 idx := x1.Args[1] 21691 mem := x1.Args[2] 21692 s0 := v.Args[1] 21693 if s0.Op != OpS390XSLDconst { 21694 break 21695 } 21696 j0 := s0.AuxInt 21697 x0 := s0.Args[0] 21698 if x0.Op != OpS390XMOVBZloadidx { 21699 break 21700 } 21701 i0 := x0.AuxInt 21702 if x0.Aux != s { 21703 break 21704 } 21705 if p != x0.Args[0] { 21706 break 21707 } 21708 if idx != x0.Args[1] { 21709 break 21710 } 21711 if mem != x0.Args[2] { 21712 break 21713 } 21714 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21715 break 21716 } 21717 b = mergePoint(b, x0, x1) 21718 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21719 v.reset(OpCopy) 21720 v.AddArg(v0) 21721 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21722 v1.AuxInt = j1 21723 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21724 v2.AuxInt = i0 21725 v2.Aux = s 21726 v2.AddArg(p) 21727 v2.AddArg(idx) 21728 v2.AddArg(mem) 21729 v1.AddArg(v2) 21730 v0.AddArg(v1) 21731 v0.AddArg(y) 21732 return true 21733 } 21734 return false 21735 } 21736 func rewriteValueS390X_OpS390XOR_60(v *Value) bool { 21737 b := v.Block 21738 _ = b 21739 types := &b.Func.Config.Types 21740 _ = types 21741 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 21742 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21743 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21744 for { 21745 or := v.Args[0] 21746 if or.Op != OpS390XOR { 21747 break 21748 } 21749 y := or.Args[0] 21750 s1 := or.Args[1] 21751 if s1.Op != OpS390XSLDconst { 21752 break 21753 } 21754 j1 := s1.AuxInt 21755 x1 := s1.Args[0] 21756 if x1.Op != OpS390XMOVBZloadidx { 21757 break 21758 } 21759 i1 := x1.AuxInt 21760 s := x1.Aux 21761 idx := x1.Args[0] 21762 p := x1.Args[1] 21763 mem := x1.Args[2] 21764 s0 := v.Args[1] 21765 if s0.Op != OpS390XSLDconst { 21766 break 21767 } 21768 j0 := s0.AuxInt 21769 x0 := s0.Args[0] 21770 if x0.Op != OpS390XMOVBZloadidx { 21771 break 21772 } 21773 i0 := x0.AuxInt 21774 if x0.Aux != s { 21775 break 21776 } 21777 if p != x0.Args[0] { 21778 break 21779 } 21780 if idx != x0.Args[1] { 21781 break 21782 } 21783 if mem != x0.Args[2] { 21784 break 21785 } 21786 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21787 break 21788 } 21789 b = mergePoint(b, x0, x1) 21790 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21791 v.reset(OpCopy) 21792 v.AddArg(v0) 21793 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21794 v1.AuxInt = j1 21795 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21796 v2.AuxInt = i0 21797 v2.Aux = s 21798 v2.AddArg(p) 21799 v2.AddArg(idx) 21800 v2.AddArg(mem) 21801 v1.AddArg(v2) 21802 v0.AddArg(v1) 21803 v0.AddArg(y) 21804 return true 21805 } 21806 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 21807 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21808 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21809 for { 21810 or := v.Args[0] 21811 if or.Op != OpS390XOR { 21812 break 21813 } 21814 s1 := or.Args[0] 21815 if s1.Op != OpS390XSLDconst { 21816 break 21817 } 21818 j1 := s1.AuxInt 21819 x1 := s1.Args[0] 21820 if x1.Op != OpS390XMOVBZloadidx { 21821 break 21822 } 21823 i1 := x1.AuxInt 21824 s := x1.Aux 21825 p := x1.Args[0] 21826 idx := x1.Args[1] 21827 mem := x1.Args[2] 21828 y := or.Args[1] 21829 s0 := v.Args[1] 21830 if s0.Op != OpS390XSLDconst { 21831 break 21832 } 21833 j0 := s0.AuxInt 21834 x0 := s0.Args[0] 21835 if x0.Op != OpS390XMOVBZloadidx { 21836 break 21837 } 21838 i0 := x0.AuxInt 21839 if x0.Aux != s { 21840 break 21841 } 21842 if idx != x0.Args[0] { 21843 break 21844 } 21845 if p != x0.Args[1] { 21846 break 21847 } 21848 if mem != x0.Args[2] { 21849 break 21850 } 21851 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21852 break 21853 } 21854 b = mergePoint(b, x0, x1) 21855 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21856 v.reset(OpCopy) 21857 v.AddArg(v0) 21858 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21859 v1.AuxInt = j1 21860 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21861 v2.AuxInt = i0 21862 v2.Aux = s 21863 v2.AddArg(p) 21864 v2.AddArg(idx) 21865 v2.AddArg(mem) 21866 v1.AddArg(v2) 21867 v0.AddArg(v1) 21868 v0.AddArg(y) 21869 return true 21870 } 21871 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 21872 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21873 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21874 for { 21875 or := v.Args[0] 21876 if or.Op != OpS390XOR { 21877 break 21878 } 21879 s1 := or.Args[0] 21880 if s1.Op != OpS390XSLDconst { 21881 break 21882 } 21883 j1 := s1.AuxInt 21884 x1 := s1.Args[0] 21885 if x1.Op != OpS390XMOVBZloadidx { 21886 break 21887 } 21888 i1 := x1.AuxInt 21889 s := x1.Aux 21890 idx := x1.Args[0] 21891 p := x1.Args[1] 21892 mem := x1.Args[2] 21893 y := or.Args[1] 21894 s0 := v.Args[1] 21895 if s0.Op != OpS390XSLDconst { 21896 break 21897 } 21898 j0 := s0.AuxInt 21899 x0 := s0.Args[0] 21900 if x0.Op != OpS390XMOVBZloadidx { 21901 break 21902 } 21903 i0 := x0.AuxInt 21904 if x0.Aux != s { 21905 break 21906 } 21907 if idx != x0.Args[0] { 21908 break 21909 } 21910 if p != x0.Args[1] { 21911 break 21912 } 21913 if mem != x0.Args[2] { 21914 break 21915 } 21916 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21917 break 21918 } 21919 b = mergePoint(b, x0, x1) 21920 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21921 v.reset(OpCopy) 21922 v.AddArg(v0) 21923 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21924 v1.AuxInt = j1 21925 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21926 v2.AuxInt = i0 21927 v2.Aux = s 21928 v2.AddArg(p) 21929 v2.AddArg(idx) 21930 v2.AddArg(mem) 21931 v1.AddArg(v2) 21932 v0.AddArg(v1) 21933 v0.AddArg(y) 21934 return true 21935 } 21936 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 21937 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 21938 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 21939 for { 21940 or := v.Args[0] 21941 if or.Op != OpS390XOR { 21942 break 21943 } 21944 y := or.Args[0] 21945 s1 := or.Args[1] 21946 if s1.Op != OpS390XSLDconst { 21947 break 21948 } 21949 j1 := s1.AuxInt 21950 x1 := s1.Args[0] 21951 if x1.Op != OpS390XMOVBZloadidx { 21952 break 21953 } 21954 i1 := x1.AuxInt 21955 s := x1.Aux 21956 p := x1.Args[0] 21957 idx := x1.Args[1] 21958 mem := x1.Args[2] 21959 s0 := v.Args[1] 21960 if s0.Op != OpS390XSLDconst { 21961 break 21962 } 21963 j0 := s0.AuxInt 21964 x0 := s0.Args[0] 21965 if x0.Op != OpS390XMOVBZloadidx { 21966 break 21967 } 21968 i0 := x0.AuxInt 21969 if x0.Aux != s { 21970 break 21971 } 21972 if idx != x0.Args[0] { 21973 break 21974 } 21975 if p != x0.Args[1] { 21976 break 21977 } 21978 if mem != x0.Args[2] { 21979 break 21980 } 21981 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 21982 break 21983 } 21984 b = mergePoint(b, x0, x1) 21985 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 21986 v.reset(OpCopy) 21987 v.AddArg(v0) 21988 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 21989 v1.AuxInt = j1 21990 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 21991 v2.AuxInt = i0 21992 v2.Aux = s 21993 v2.AddArg(p) 21994 v2.AddArg(idx) 21995 v2.AddArg(mem) 21996 v1.AddArg(v2) 21997 v0.AddArg(v1) 21998 v0.AddArg(y) 21999 return true 22000 } 22001 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 22002 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22003 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 22004 for { 22005 or := v.Args[0] 22006 if or.Op != OpS390XOR { 22007 break 22008 } 22009 y := or.Args[0] 22010 s1 := or.Args[1] 22011 if s1.Op != OpS390XSLDconst { 22012 break 22013 } 22014 j1 := s1.AuxInt 22015 x1 := s1.Args[0] 22016 if x1.Op != OpS390XMOVBZloadidx { 22017 break 22018 } 22019 i1 := x1.AuxInt 22020 s := x1.Aux 22021 idx := x1.Args[0] 22022 p := x1.Args[1] 22023 mem := x1.Args[2] 22024 s0 := v.Args[1] 22025 if s0.Op != OpS390XSLDconst { 22026 break 22027 } 22028 j0 := s0.AuxInt 22029 x0 := s0.Args[0] 22030 if x0.Op != OpS390XMOVBZloadidx { 22031 break 22032 } 22033 i0 := x0.AuxInt 22034 if x0.Aux != s { 22035 break 22036 } 22037 if idx != x0.Args[0] { 22038 break 22039 } 22040 if p != x0.Args[1] { 22041 break 22042 } 22043 if mem != x0.Args[2] { 22044 break 22045 } 22046 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22047 break 22048 } 22049 b = mergePoint(b, x0, x1) 22050 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22051 v.reset(OpCopy) 22052 v.AddArg(v0) 22053 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22054 v1.AuxInt = j1 22055 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 22056 v2.AuxInt = i0 22057 v2.Aux = s 22058 v2.AddArg(p) 22059 v2.AddArg(idx) 22060 v2.AddArg(mem) 22061 v1.AddArg(v2) 22062 v0.AddArg(v1) 22063 v0.AddArg(y) 22064 return true 22065 } 22066 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y)) 22067 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22068 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22069 for { 22070 s0 := v.Args[0] 22071 if s0.Op != OpS390XSLDconst { 22072 break 22073 } 22074 j0 := s0.AuxInt 22075 x0 := s0.Args[0] 22076 if x0.Op != OpS390XMOVHZloadidx { 22077 break 22078 } 22079 i0 := x0.AuxInt 22080 s := x0.Aux 22081 p := x0.Args[0] 22082 idx := x0.Args[1] 22083 mem := x0.Args[2] 22084 or := v.Args[1] 22085 if or.Op != OpS390XOR { 22086 break 22087 } 22088 s1 := or.Args[0] 22089 if s1.Op != OpS390XSLDconst { 22090 break 22091 } 22092 j1 := s1.AuxInt 22093 x1 := s1.Args[0] 22094 if x1.Op != OpS390XMOVHZloadidx { 22095 break 22096 } 22097 i1 := x1.AuxInt 22098 if x1.Aux != s { 22099 break 22100 } 22101 if p != x1.Args[0] { 22102 break 22103 } 22104 if idx != x1.Args[1] { 22105 break 22106 } 22107 if mem != x1.Args[2] { 22108 break 22109 } 22110 y := or.Args[1] 22111 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22112 break 22113 } 22114 b = mergePoint(b, x0, x1) 22115 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22116 v.reset(OpCopy) 22117 v.AddArg(v0) 22118 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22119 v1.AuxInt = j1 22120 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22121 v2.AuxInt = i0 22122 v2.Aux = s 22123 v2.AddArg(p) 22124 v2.AddArg(idx) 22125 v2.AddArg(mem) 22126 v1.AddArg(v2) 22127 v0.AddArg(v1) 22128 v0.AddArg(y) 22129 return true 22130 } 22131 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y)) 22132 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22133 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22134 for { 22135 s0 := v.Args[0] 22136 if s0.Op != OpS390XSLDconst { 22137 break 22138 } 22139 j0 := s0.AuxInt 22140 x0 := s0.Args[0] 22141 if x0.Op != OpS390XMOVHZloadidx { 22142 break 22143 } 22144 i0 := x0.AuxInt 22145 s := x0.Aux 22146 idx := x0.Args[0] 22147 p := x0.Args[1] 22148 mem := x0.Args[2] 22149 or := v.Args[1] 22150 if or.Op != OpS390XOR { 22151 break 22152 } 22153 s1 := or.Args[0] 22154 if s1.Op != OpS390XSLDconst { 22155 break 22156 } 22157 j1 := s1.AuxInt 22158 x1 := s1.Args[0] 22159 if x1.Op != OpS390XMOVHZloadidx { 22160 break 22161 } 22162 i1 := x1.AuxInt 22163 if x1.Aux != s { 22164 break 22165 } 22166 if p != x1.Args[0] { 22167 break 22168 } 22169 if idx != x1.Args[1] { 22170 break 22171 } 22172 if mem != x1.Args[2] { 22173 break 22174 } 22175 y := or.Args[1] 22176 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22177 break 22178 } 22179 b = mergePoint(b, x0, x1) 22180 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22181 v.reset(OpCopy) 22182 v.AddArg(v0) 22183 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22184 v1.AuxInt = j1 22185 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22186 v2.AuxInt = i0 22187 v2.Aux = s 22188 v2.AddArg(p) 22189 v2.AddArg(idx) 22190 v2.AddArg(mem) 22191 v1.AddArg(v2) 22192 v0.AddArg(v1) 22193 v0.AddArg(y) 22194 return true 22195 } 22196 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y)) 22197 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22198 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22199 for { 22200 s0 := v.Args[0] 22201 if s0.Op != OpS390XSLDconst { 22202 break 22203 } 22204 j0 := s0.AuxInt 22205 x0 := s0.Args[0] 22206 if x0.Op != OpS390XMOVHZloadidx { 22207 break 22208 } 22209 i0 := x0.AuxInt 22210 s := x0.Aux 22211 p := x0.Args[0] 22212 idx := x0.Args[1] 22213 mem := x0.Args[2] 22214 or := v.Args[1] 22215 if or.Op != OpS390XOR { 22216 break 22217 } 22218 s1 := or.Args[0] 22219 if s1.Op != OpS390XSLDconst { 22220 break 22221 } 22222 j1 := s1.AuxInt 22223 x1 := s1.Args[0] 22224 if x1.Op != OpS390XMOVHZloadidx { 22225 break 22226 } 22227 i1 := x1.AuxInt 22228 if x1.Aux != s { 22229 break 22230 } 22231 if idx != x1.Args[0] { 22232 break 22233 } 22234 if p != x1.Args[1] { 22235 break 22236 } 22237 if mem != x1.Args[2] { 22238 break 22239 } 22240 y := or.Args[1] 22241 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22242 break 22243 } 22244 b = mergePoint(b, x0, x1) 22245 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22246 v.reset(OpCopy) 22247 v.AddArg(v0) 22248 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22249 v1.AuxInt = j1 22250 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22251 v2.AuxInt = i0 22252 v2.Aux = s 22253 v2.AddArg(p) 22254 v2.AddArg(idx) 22255 v2.AddArg(mem) 22256 v1.AddArg(v2) 22257 v0.AddArg(v1) 22258 v0.AddArg(y) 22259 return true 22260 } 22261 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y)) 22262 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22263 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22264 for { 22265 s0 := v.Args[0] 22266 if s0.Op != OpS390XSLDconst { 22267 break 22268 } 22269 j0 := s0.AuxInt 22270 x0 := s0.Args[0] 22271 if x0.Op != OpS390XMOVHZloadidx { 22272 break 22273 } 22274 i0 := x0.AuxInt 22275 s := x0.Aux 22276 idx := x0.Args[0] 22277 p := x0.Args[1] 22278 mem := x0.Args[2] 22279 or := v.Args[1] 22280 if or.Op != OpS390XOR { 22281 break 22282 } 22283 s1 := or.Args[0] 22284 if s1.Op != OpS390XSLDconst { 22285 break 22286 } 22287 j1 := s1.AuxInt 22288 x1 := s1.Args[0] 22289 if x1.Op != OpS390XMOVHZloadidx { 22290 break 22291 } 22292 i1 := x1.AuxInt 22293 if x1.Aux != s { 22294 break 22295 } 22296 if idx != x1.Args[0] { 22297 break 22298 } 22299 if p != x1.Args[1] { 22300 break 22301 } 22302 if mem != x1.Args[2] { 22303 break 22304 } 22305 y := or.Args[1] 22306 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22307 break 22308 } 22309 b = mergePoint(b, x0, x1) 22310 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22311 v.reset(OpCopy) 22312 v.AddArg(v0) 22313 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22314 v1.AuxInt = j1 22315 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22316 v2.AuxInt = i0 22317 v2.Aux = s 22318 v2.AddArg(p) 22319 v2.AddArg(idx) 22320 v2.AddArg(mem) 22321 v1.AddArg(v2) 22322 v0.AddArg(v1) 22323 v0.AddArg(y) 22324 return true 22325 } 22326 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)))) 22327 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22328 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22329 for { 22330 s0 := v.Args[0] 22331 if s0.Op != OpS390XSLDconst { 22332 break 22333 } 22334 j0 := s0.AuxInt 22335 x0 := s0.Args[0] 22336 if x0.Op != OpS390XMOVHZloadidx { 22337 break 22338 } 22339 i0 := x0.AuxInt 22340 s := x0.Aux 22341 p := x0.Args[0] 22342 idx := x0.Args[1] 22343 mem := x0.Args[2] 22344 or := v.Args[1] 22345 if or.Op != OpS390XOR { 22346 break 22347 } 22348 y := or.Args[0] 22349 s1 := or.Args[1] 22350 if s1.Op != OpS390XSLDconst { 22351 break 22352 } 22353 j1 := s1.AuxInt 22354 x1 := s1.Args[0] 22355 if x1.Op != OpS390XMOVHZloadidx { 22356 break 22357 } 22358 i1 := x1.AuxInt 22359 if x1.Aux != s { 22360 break 22361 } 22362 if p != x1.Args[0] { 22363 break 22364 } 22365 if idx != x1.Args[1] { 22366 break 22367 } 22368 if mem != x1.Args[2] { 22369 break 22370 } 22371 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22372 break 22373 } 22374 b = mergePoint(b, x0, x1) 22375 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22376 v.reset(OpCopy) 22377 v.AddArg(v0) 22378 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22379 v1.AuxInt = j1 22380 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22381 v2.AuxInt = i0 22382 v2.Aux = s 22383 v2.AddArg(p) 22384 v2.AddArg(idx) 22385 v2.AddArg(mem) 22386 v1.AddArg(v2) 22387 v0.AddArg(v1) 22388 v0.AddArg(y) 22389 return true 22390 } 22391 return false 22392 } 22393 func rewriteValueS390X_OpS390XOR_70(v *Value) bool { 22394 b := v.Block 22395 _ = b 22396 types := &b.Func.Config.Types 22397 _ = types 22398 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)))) 22399 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22400 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22401 for { 22402 s0 := v.Args[0] 22403 if s0.Op != OpS390XSLDconst { 22404 break 22405 } 22406 j0 := s0.AuxInt 22407 x0 := s0.Args[0] 22408 if x0.Op != OpS390XMOVHZloadidx { 22409 break 22410 } 22411 i0 := x0.AuxInt 22412 s := x0.Aux 22413 idx := x0.Args[0] 22414 p := x0.Args[1] 22415 mem := x0.Args[2] 22416 or := v.Args[1] 22417 if or.Op != OpS390XOR { 22418 break 22419 } 22420 y := or.Args[0] 22421 s1 := or.Args[1] 22422 if s1.Op != OpS390XSLDconst { 22423 break 22424 } 22425 j1 := s1.AuxInt 22426 x1 := s1.Args[0] 22427 if x1.Op != OpS390XMOVHZloadidx { 22428 break 22429 } 22430 i1 := x1.AuxInt 22431 if x1.Aux != s { 22432 break 22433 } 22434 if p != x1.Args[0] { 22435 break 22436 } 22437 if idx != x1.Args[1] { 22438 break 22439 } 22440 if mem != x1.Args[2] { 22441 break 22442 } 22443 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22444 break 22445 } 22446 b = mergePoint(b, x0, x1) 22447 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22448 v.reset(OpCopy) 22449 v.AddArg(v0) 22450 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22451 v1.AuxInt = j1 22452 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22453 v2.AuxInt = i0 22454 v2.Aux = s 22455 v2.AddArg(p) 22456 v2.AddArg(idx) 22457 v2.AddArg(mem) 22458 v1.AddArg(v2) 22459 v0.AddArg(v1) 22460 v0.AddArg(y) 22461 return true 22462 } 22463 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)))) 22464 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22465 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22466 for { 22467 s0 := v.Args[0] 22468 if s0.Op != OpS390XSLDconst { 22469 break 22470 } 22471 j0 := s0.AuxInt 22472 x0 := s0.Args[0] 22473 if x0.Op != OpS390XMOVHZloadidx { 22474 break 22475 } 22476 i0 := x0.AuxInt 22477 s := x0.Aux 22478 p := x0.Args[0] 22479 idx := x0.Args[1] 22480 mem := x0.Args[2] 22481 or := v.Args[1] 22482 if or.Op != OpS390XOR { 22483 break 22484 } 22485 y := or.Args[0] 22486 s1 := or.Args[1] 22487 if s1.Op != OpS390XSLDconst { 22488 break 22489 } 22490 j1 := s1.AuxInt 22491 x1 := s1.Args[0] 22492 if x1.Op != OpS390XMOVHZloadidx { 22493 break 22494 } 22495 i1 := x1.AuxInt 22496 if x1.Aux != s { 22497 break 22498 } 22499 if idx != x1.Args[0] { 22500 break 22501 } 22502 if p != x1.Args[1] { 22503 break 22504 } 22505 if mem != x1.Args[2] { 22506 break 22507 } 22508 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22509 break 22510 } 22511 b = mergePoint(b, x0, x1) 22512 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22513 v.reset(OpCopy) 22514 v.AddArg(v0) 22515 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22516 v1.AuxInt = j1 22517 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22518 v2.AuxInt = i0 22519 v2.Aux = s 22520 v2.AddArg(p) 22521 v2.AddArg(idx) 22522 v2.AddArg(mem) 22523 v1.AddArg(v2) 22524 v0.AddArg(v1) 22525 v0.AddArg(y) 22526 return true 22527 } 22528 // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)))) 22529 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22530 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22531 for { 22532 s0 := v.Args[0] 22533 if s0.Op != OpS390XSLDconst { 22534 break 22535 } 22536 j0 := s0.AuxInt 22537 x0 := s0.Args[0] 22538 if x0.Op != OpS390XMOVHZloadidx { 22539 break 22540 } 22541 i0 := x0.AuxInt 22542 s := x0.Aux 22543 idx := x0.Args[0] 22544 p := x0.Args[1] 22545 mem := x0.Args[2] 22546 or := v.Args[1] 22547 if or.Op != OpS390XOR { 22548 break 22549 } 22550 y := or.Args[0] 22551 s1 := or.Args[1] 22552 if s1.Op != OpS390XSLDconst { 22553 break 22554 } 22555 j1 := s1.AuxInt 22556 x1 := s1.Args[0] 22557 if x1.Op != OpS390XMOVHZloadidx { 22558 break 22559 } 22560 i1 := x1.AuxInt 22561 if x1.Aux != s { 22562 break 22563 } 22564 if idx != x1.Args[0] { 22565 break 22566 } 22567 if p != x1.Args[1] { 22568 break 22569 } 22570 if mem != x1.Args[2] { 22571 break 22572 } 22573 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22574 break 22575 } 22576 b = mergePoint(b, x0, x1) 22577 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22578 v.reset(OpCopy) 22579 v.AddArg(v0) 22580 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22581 v1.AuxInt = j1 22582 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22583 v2.AuxInt = i0 22584 v2.Aux = s 22585 v2.AddArg(p) 22586 v2.AddArg(idx) 22587 v2.AddArg(mem) 22588 v1.AddArg(v2) 22589 v0.AddArg(v1) 22590 v0.AddArg(y) 22591 return true 22592 } 22593 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) 22594 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22595 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22596 for { 22597 or := v.Args[0] 22598 if or.Op != OpS390XOR { 22599 break 22600 } 22601 s1 := or.Args[0] 22602 if s1.Op != OpS390XSLDconst { 22603 break 22604 } 22605 j1 := s1.AuxInt 22606 x1 := s1.Args[0] 22607 if x1.Op != OpS390XMOVHZloadidx { 22608 break 22609 } 22610 i1 := x1.AuxInt 22611 s := x1.Aux 22612 p := x1.Args[0] 22613 idx := x1.Args[1] 22614 mem := x1.Args[2] 22615 y := or.Args[1] 22616 s0 := v.Args[1] 22617 if s0.Op != OpS390XSLDconst { 22618 break 22619 } 22620 j0 := s0.AuxInt 22621 x0 := s0.Args[0] 22622 if x0.Op != OpS390XMOVHZloadidx { 22623 break 22624 } 22625 i0 := x0.AuxInt 22626 if x0.Aux != s { 22627 break 22628 } 22629 if p != x0.Args[0] { 22630 break 22631 } 22632 if idx != x0.Args[1] { 22633 break 22634 } 22635 if mem != x0.Args[2] { 22636 break 22637 } 22638 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22639 break 22640 } 22641 b = mergePoint(b, x0, x1) 22642 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22643 v.reset(OpCopy) 22644 v.AddArg(v0) 22645 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22646 v1.AuxInt = j1 22647 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22648 v2.AuxInt = i0 22649 v2.Aux = s 22650 v2.AddArg(p) 22651 v2.AddArg(idx) 22652 v2.AddArg(mem) 22653 v1.AddArg(v2) 22654 v0.AddArg(v1) 22655 v0.AddArg(y) 22656 return true 22657 } 22658 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) 22659 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22660 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22661 for { 22662 or := v.Args[0] 22663 if or.Op != OpS390XOR { 22664 break 22665 } 22666 s1 := or.Args[0] 22667 if s1.Op != OpS390XSLDconst { 22668 break 22669 } 22670 j1 := s1.AuxInt 22671 x1 := s1.Args[0] 22672 if x1.Op != OpS390XMOVHZloadidx { 22673 break 22674 } 22675 i1 := x1.AuxInt 22676 s := x1.Aux 22677 idx := x1.Args[0] 22678 p := x1.Args[1] 22679 mem := x1.Args[2] 22680 y := or.Args[1] 22681 s0 := v.Args[1] 22682 if s0.Op != OpS390XSLDconst { 22683 break 22684 } 22685 j0 := s0.AuxInt 22686 x0 := s0.Args[0] 22687 if x0.Op != OpS390XMOVHZloadidx { 22688 break 22689 } 22690 i0 := x0.AuxInt 22691 if x0.Aux != s { 22692 break 22693 } 22694 if p != x0.Args[0] { 22695 break 22696 } 22697 if idx != x0.Args[1] { 22698 break 22699 } 22700 if mem != x0.Args[2] { 22701 break 22702 } 22703 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22704 break 22705 } 22706 b = mergePoint(b, x0, x1) 22707 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22708 v.reset(OpCopy) 22709 v.AddArg(v0) 22710 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22711 v1.AuxInt = j1 22712 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22713 v2.AuxInt = i0 22714 v2.Aux = s 22715 v2.AddArg(p) 22716 v2.AddArg(idx) 22717 v2.AddArg(mem) 22718 v1.AddArg(v2) 22719 v0.AddArg(v1) 22720 v0.AddArg(y) 22721 return true 22722 } 22723 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) 22724 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22725 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22726 for { 22727 or := v.Args[0] 22728 if or.Op != OpS390XOR { 22729 break 22730 } 22731 y := or.Args[0] 22732 s1 := or.Args[1] 22733 if s1.Op != OpS390XSLDconst { 22734 break 22735 } 22736 j1 := s1.AuxInt 22737 x1 := s1.Args[0] 22738 if x1.Op != OpS390XMOVHZloadidx { 22739 break 22740 } 22741 i1 := x1.AuxInt 22742 s := x1.Aux 22743 p := x1.Args[0] 22744 idx := x1.Args[1] 22745 mem := x1.Args[2] 22746 s0 := v.Args[1] 22747 if s0.Op != OpS390XSLDconst { 22748 break 22749 } 22750 j0 := s0.AuxInt 22751 x0 := s0.Args[0] 22752 if x0.Op != OpS390XMOVHZloadidx { 22753 break 22754 } 22755 i0 := x0.AuxInt 22756 if x0.Aux != s { 22757 break 22758 } 22759 if p != x0.Args[0] { 22760 break 22761 } 22762 if idx != x0.Args[1] { 22763 break 22764 } 22765 if mem != x0.Args[2] { 22766 break 22767 } 22768 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22769 break 22770 } 22771 b = mergePoint(b, x0, x1) 22772 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22773 v.reset(OpCopy) 22774 v.AddArg(v0) 22775 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22776 v1.AuxInt = j1 22777 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22778 v2.AuxInt = i0 22779 v2.Aux = s 22780 v2.AddArg(p) 22781 v2.AddArg(idx) 22782 v2.AddArg(mem) 22783 v1.AddArg(v2) 22784 v0.AddArg(v1) 22785 v0.AddArg(y) 22786 return true 22787 } 22788 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) 22789 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22790 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22791 for { 22792 or := v.Args[0] 22793 if or.Op != OpS390XOR { 22794 break 22795 } 22796 y := or.Args[0] 22797 s1 := or.Args[1] 22798 if s1.Op != OpS390XSLDconst { 22799 break 22800 } 22801 j1 := s1.AuxInt 22802 x1 := s1.Args[0] 22803 if x1.Op != OpS390XMOVHZloadidx { 22804 break 22805 } 22806 i1 := x1.AuxInt 22807 s := x1.Aux 22808 idx := x1.Args[0] 22809 p := x1.Args[1] 22810 mem := x1.Args[2] 22811 s0 := v.Args[1] 22812 if s0.Op != OpS390XSLDconst { 22813 break 22814 } 22815 j0 := s0.AuxInt 22816 x0 := s0.Args[0] 22817 if x0.Op != OpS390XMOVHZloadidx { 22818 break 22819 } 22820 i0 := x0.AuxInt 22821 if x0.Aux != s { 22822 break 22823 } 22824 if p != x0.Args[0] { 22825 break 22826 } 22827 if idx != x0.Args[1] { 22828 break 22829 } 22830 if mem != x0.Args[2] { 22831 break 22832 } 22833 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22834 break 22835 } 22836 b = mergePoint(b, x0, x1) 22837 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22838 v.reset(OpCopy) 22839 v.AddArg(v0) 22840 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22841 v1.AuxInt = j1 22842 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22843 v2.AuxInt = i0 22844 v2.Aux = s 22845 v2.AddArg(p) 22846 v2.AddArg(idx) 22847 v2.AddArg(mem) 22848 v1.AddArg(v2) 22849 v0.AddArg(v1) 22850 v0.AddArg(y) 22851 return true 22852 } 22853 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) 22854 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22855 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22856 for { 22857 or := v.Args[0] 22858 if or.Op != OpS390XOR { 22859 break 22860 } 22861 s1 := or.Args[0] 22862 if s1.Op != OpS390XSLDconst { 22863 break 22864 } 22865 j1 := s1.AuxInt 22866 x1 := s1.Args[0] 22867 if x1.Op != OpS390XMOVHZloadidx { 22868 break 22869 } 22870 i1 := x1.AuxInt 22871 s := x1.Aux 22872 p := x1.Args[0] 22873 idx := x1.Args[1] 22874 mem := x1.Args[2] 22875 y := or.Args[1] 22876 s0 := v.Args[1] 22877 if s0.Op != OpS390XSLDconst { 22878 break 22879 } 22880 j0 := s0.AuxInt 22881 x0 := s0.Args[0] 22882 if x0.Op != OpS390XMOVHZloadidx { 22883 break 22884 } 22885 i0 := x0.AuxInt 22886 if x0.Aux != s { 22887 break 22888 } 22889 if idx != x0.Args[0] { 22890 break 22891 } 22892 if p != x0.Args[1] { 22893 break 22894 } 22895 if mem != x0.Args[2] { 22896 break 22897 } 22898 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22899 break 22900 } 22901 b = mergePoint(b, x0, x1) 22902 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22903 v.reset(OpCopy) 22904 v.AddArg(v0) 22905 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22906 v1.AuxInt = j1 22907 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22908 v2.AuxInt = i0 22909 v2.Aux = s 22910 v2.AddArg(p) 22911 v2.AddArg(idx) 22912 v2.AddArg(mem) 22913 v1.AddArg(v2) 22914 v0.AddArg(v1) 22915 v0.AddArg(y) 22916 return true 22917 } 22918 // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) 22919 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22920 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22921 for { 22922 or := v.Args[0] 22923 if or.Op != OpS390XOR { 22924 break 22925 } 22926 s1 := or.Args[0] 22927 if s1.Op != OpS390XSLDconst { 22928 break 22929 } 22930 j1 := s1.AuxInt 22931 x1 := s1.Args[0] 22932 if x1.Op != OpS390XMOVHZloadidx { 22933 break 22934 } 22935 i1 := x1.AuxInt 22936 s := x1.Aux 22937 idx := x1.Args[0] 22938 p := x1.Args[1] 22939 mem := x1.Args[2] 22940 y := or.Args[1] 22941 s0 := v.Args[1] 22942 if s0.Op != OpS390XSLDconst { 22943 break 22944 } 22945 j0 := s0.AuxInt 22946 x0 := s0.Args[0] 22947 if x0.Op != OpS390XMOVHZloadidx { 22948 break 22949 } 22950 i0 := x0.AuxInt 22951 if x0.Aux != s { 22952 break 22953 } 22954 if idx != x0.Args[0] { 22955 break 22956 } 22957 if p != x0.Args[1] { 22958 break 22959 } 22960 if mem != x0.Args[2] { 22961 break 22962 } 22963 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 22964 break 22965 } 22966 b = mergePoint(b, x0, x1) 22967 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 22968 v.reset(OpCopy) 22969 v.AddArg(v0) 22970 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 22971 v1.AuxInt = j1 22972 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 22973 v2.AuxInt = i0 22974 v2.Aux = s 22975 v2.AddArg(p) 22976 v2.AddArg(idx) 22977 v2.AddArg(mem) 22978 v1.AddArg(v2) 22979 v0.AddArg(v1) 22980 v0.AddArg(y) 22981 return true 22982 } 22983 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) 22984 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 22985 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 22986 for { 22987 or := v.Args[0] 22988 if or.Op != OpS390XOR { 22989 break 22990 } 22991 y := or.Args[0] 22992 s1 := or.Args[1] 22993 if s1.Op != OpS390XSLDconst { 22994 break 22995 } 22996 j1 := s1.AuxInt 22997 x1 := s1.Args[0] 22998 if x1.Op != OpS390XMOVHZloadidx { 22999 break 23000 } 23001 i1 := x1.AuxInt 23002 s := x1.Aux 23003 p := x1.Args[0] 23004 idx := x1.Args[1] 23005 mem := x1.Args[2] 23006 s0 := v.Args[1] 23007 if s0.Op != OpS390XSLDconst { 23008 break 23009 } 23010 j0 := s0.AuxInt 23011 x0 := s0.Args[0] 23012 if x0.Op != OpS390XMOVHZloadidx { 23013 break 23014 } 23015 i0 := x0.AuxInt 23016 if x0.Aux != s { 23017 break 23018 } 23019 if idx != x0.Args[0] { 23020 break 23021 } 23022 if p != x0.Args[1] { 23023 break 23024 } 23025 if mem != x0.Args[2] { 23026 break 23027 } 23028 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23029 break 23030 } 23031 b = mergePoint(b, x0, x1) 23032 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23033 v.reset(OpCopy) 23034 v.AddArg(v0) 23035 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23036 v1.AuxInt = j1 23037 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 23038 v2.AuxInt = i0 23039 v2.Aux = s 23040 v2.AddArg(p) 23041 v2.AddArg(idx) 23042 v2.AddArg(mem) 23043 v1.AddArg(v2) 23044 v0.AddArg(v1) 23045 v0.AddArg(y) 23046 return true 23047 } 23048 return false 23049 } 23050 func rewriteValueS390X_OpS390XOR_80(v *Value) bool { 23051 b := v.Block 23052 _ = b 23053 types := &b.Func.Config.Types 23054 _ = types 23055 // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) 23056 // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23057 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) 23058 for { 23059 or := v.Args[0] 23060 if or.Op != OpS390XOR { 23061 break 23062 } 23063 y := or.Args[0] 23064 s1 := or.Args[1] 23065 if s1.Op != OpS390XSLDconst { 23066 break 23067 } 23068 j1 := s1.AuxInt 23069 x1 := s1.Args[0] 23070 if x1.Op != OpS390XMOVHZloadidx { 23071 break 23072 } 23073 i1 := x1.AuxInt 23074 s := x1.Aux 23075 idx := x1.Args[0] 23076 p := x1.Args[1] 23077 mem := x1.Args[2] 23078 s0 := v.Args[1] 23079 if s0.Op != OpS390XSLDconst { 23080 break 23081 } 23082 j0 := s0.AuxInt 23083 x0 := s0.Args[0] 23084 if x0.Op != OpS390XMOVHZloadidx { 23085 break 23086 } 23087 i0 := x0.AuxInt 23088 if x0.Aux != s { 23089 break 23090 } 23091 if idx != x0.Args[0] { 23092 break 23093 } 23094 if p != x0.Args[1] { 23095 break 23096 } 23097 if mem != x0.Args[2] { 23098 break 23099 } 23100 if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23101 break 23102 } 23103 b = mergePoint(b, x0, x1) 23104 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23105 v.reset(OpCopy) 23106 v.AddArg(v0) 23107 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23108 v1.AuxInt = j1 23109 v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 23110 v2.AuxInt = i0 23111 v2.Aux = s 23112 v2.AddArg(p) 23113 v2.AddArg(idx) 23114 v2.AddArg(mem) 23115 v1.AddArg(v2) 23116 v0.AddArg(v1) 23117 v0.AddArg(y) 23118 return true 23119 } 23120 // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) 23121 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 23122 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 23123 for { 23124 x0 := v.Args[0] 23125 if x0.Op != OpS390XMOVBZload { 23126 break 23127 } 23128 i0 := x0.AuxInt 23129 s := x0.Aux 23130 p := x0.Args[0] 23131 mem := x0.Args[1] 23132 sh := v.Args[1] 23133 if sh.Op != OpS390XSLDconst { 23134 break 23135 } 23136 if sh.AuxInt != 8 { 23137 break 23138 } 23139 x1 := sh.Args[0] 23140 if x1.Op != OpS390XMOVBZload { 23141 break 23142 } 23143 i1 := x1.AuxInt 23144 if x1.Aux != s { 23145 break 23146 } 23147 if p != x1.Args[0] { 23148 break 23149 } 23150 if mem != x1.Args[1] { 23151 break 23152 } 23153 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 23154 break 23155 } 23156 b = mergePoint(b, x0, x1) 23157 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23158 v.reset(OpCopy) 23159 v.AddArg(v0) 23160 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23161 v1.AuxInt = i0 23162 v1.Aux = s 23163 v1.AddArg(p) 23164 v1.AddArg(mem) 23165 v0.AddArg(v1) 23166 return true 23167 } 23168 // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 23169 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 23170 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 23171 for { 23172 sh := v.Args[0] 23173 if sh.Op != OpS390XSLDconst { 23174 break 23175 } 23176 if sh.AuxInt != 8 { 23177 break 23178 } 23179 x1 := sh.Args[0] 23180 if x1.Op != OpS390XMOVBZload { 23181 break 23182 } 23183 i1 := x1.AuxInt 23184 s := x1.Aux 23185 p := x1.Args[0] 23186 mem := x1.Args[1] 23187 x0 := v.Args[1] 23188 if x0.Op != OpS390XMOVBZload { 23189 break 23190 } 23191 i0 := x0.AuxInt 23192 if x0.Aux != s { 23193 break 23194 } 23195 if p != x0.Args[0] { 23196 break 23197 } 23198 if mem != x0.Args[1] { 23199 break 23200 } 23201 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 23202 break 23203 } 23204 b = mergePoint(b, x0, x1) 23205 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23206 v.reset(OpCopy) 23207 v.AddArg(v0) 23208 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23209 v1.AuxInt = i0 23210 v1.Aux = s 23211 v1.AddArg(p) 23212 v1.AddArg(mem) 23213 v0.AddArg(v1) 23214 return true 23215 } 23216 // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 23217 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 23218 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 23219 for { 23220 r0 := v.Args[0] 23221 if r0.Op != OpS390XMOVHZreg { 23222 break 23223 } 23224 x0 := r0.Args[0] 23225 if x0.Op != OpS390XMOVHBRload { 23226 break 23227 } 23228 i0 := x0.AuxInt 23229 s := x0.Aux 23230 p := x0.Args[0] 23231 mem := x0.Args[1] 23232 sh := v.Args[1] 23233 if sh.Op != OpS390XSLDconst { 23234 break 23235 } 23236 if sh.AuxInt != 16 { 23237 break 23238 } 23239 r1 := sh.Args[0] 23240 if r1.Op != OpS390XMOVHZreg { 23241 break 23242 } 23243 x1 := r1.Args[0] 23244 if x1.Op != OpS390XMOVHBRload { 23245 break 23246 } 23247 i1 := x1.AuxInt 23248 if x1.Aux != s { 23249 break 23250 } 23251 if p != x1.Args[0] { 23252 break 23253 } 23254 if mem != x1.Args[1] { 23255 break 23256 } 23257 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 23258 break 23259 } 23260 b = mergePoint(b, x0, x1) 23261 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23262 v.reset(OpCopy) 23263 v.AddArg(v0) 23264 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23265 v1.AuxInt = i0 23266 v1.Aux = s 23267 v1.AddArg(p) 23268 v1.AddArg(mem) 23269 v0.AddArg(v1) 23270 return true 23271 } 23272 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 23273 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 23274 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) 23275 for { 23276 sh := v.Args[0] 23277 if sh.Op != OpS390XSLDconst { 23278 break 23279 } 23280 if sh.AuxInt != 16 { 23281 break 23282 } 23283 r1 := sh.Args[0] 23284 if r1.Op != OpS390XMOVHZreg { 23285 break 23286 } 23287 x1 := r1.Args[0] 23288 if x1.Op != OpS390XMOVHBRload { 23289 break 23290 } 23291 i1 := x1.AuxInt 23292 s := x1.Aux 23293 p := x1.Args[0] 23294 mem := x1.Args[1] 23295 r0 := v.Args[1] 23296 if r0.Op != OpS390XMOVHZreg { 23297 break 23298 } 23299 x0 := r0.Args[0] 23300 if x0.Op != OpS390XMOVHBRload { 23301 break 23302 } 23303 i0 := x0.AuxInt 23304 if x0.Aux != s { 23305 break 23306 } 23307 if p != x0.Args[0] { 23308 break 23309 } 23310 if mem != x0.Args[1] { 23311 break 23312 } 23313 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 23314 break 23315 } 23316 b = mergePoint(b, x0, x1) 23317 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23318 v.reset(OpCopy) 23319 v.AddArg(v0) 23320 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23321 v1.AuxInt = i0 23322 v1.Aux = s 23323 v1.AddArg(p) 23324 v1.AddArg(mem) 23325 v0.AddArg(v1) 23326 return true 23327 } 23328 // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) 23329 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 23330 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 23331 for { 23332 r0 := v.Args[0] 23333 if r0.Op != OpS390XMOVWZreg { 23334 break 23335 } 23336 x0 := r0.Args[0] 23337 if x0.Op != OpS390XMOVWBRload { 23338 break 23339 } 23340 i0 := x0.AuxInt 23341 s := x0.Aux 23342 p := x0.Args[0] 23343 mem := x0.Args[1] 23344 sh := v.Args[1] 23345 if sh.Op != OpS390XSLDconst { 23346 break 23347 } 23348 if sh.AuxInt != 32 { 23349 break 23350 } 23351 r1 := sh.Args[0] 23352 if r1.Op != OpS390XMOVWZreg { 23353 break 23354 } 23355 x1 := r1.Args[0] 23356 if x1.Op != OpS390XMOVWBRload { 23357 break 23358 } 23359 i1 := x1.AuxInt 23360 if x1.Aux != s { 23361 break 23362 } 23363 if p != x1.Args[0] { 23364 break 23365 } 23366 if mem != x1.Args[1] { 23367 break 23368 } 23369 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 23370 break 23371 } 23372 b = mergePoint(b, x0, x1) 23373 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, types.UInt64) 23374 v.reset(OpCopy) 23375 v.AddArg(v0) 23376 v0.AuxInt = i0 23377 v0.Aux = s 23378 v0.AddArg(p) 23379 v0.AddArg(mem) 23380 return true 23381 } 23382 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) 23383 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 23384 // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) 23385 for { 23386 sh := v.Args[0] 23387 if sh.Op != OpS390XSLDconst { 23388 break 23389 } 23390 if sh.AuxInt != 32 { 23391 break 23392 } 23393 r1 := sh.Args[0] 23394 if r1.Op != OpS390XMOVWZreg { 23395 break 23396 } 23397 x1 := r1.Args[0] 23398 if x1.Op != OpS390XMOVWBRload { 23399 break 23400 } 23401 i1 := x1.AuxInt 23402 s := x1.Aux 23403 p := x1.Args[0] 23404 mem := x1.Args[1] 23405 r0 := v.Args[1] 23406 if r0.Op != OpS390XMOVWZreg { 23407 break 23408 } 23409 x0 := r0.Args[0] 23410 if x0.Op != OpS390XMOVWBRload { 23411 break 23412 } 23413 i0 := x0.AuxInt 23414 if x0.Aux != s { 23415 break 23416 } 23417 if p != x0.Args[0] { 23418 break 23419 } 23420 if mem != x0.Args[1] { 23421 break 23422 } 23423 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 23424 break 23425 } 23426 b = mergePoint(b, x0, x1) 23427 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRload, types.UInt64) 23428 v.reset(OpCopy) 23429 v.AddArg(v0) 23430 v0.AuxInt = i0 23431 v0.Aux = s 23432 v0.AddArg(p) 23433 v0.AddArg(mem) 23434 return true 23435 } 23436 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 23437 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23438 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 23439 for { 23440 s1 := v.Args[0] 23441 if s1.Op != OpS390XSLDconst { 23442 break 23443 } 23444 j1 := s1.AuxInt 23445 x1 := s1.Args[0] 23446 if x1.Op != OpS390XMOVBZload { 23447 break 23448 } 23449 i1 := x1.AuxInt 23450 s := x1.Aux 23451 p := x1.Args[0] 23452 mem := x1.Args[1] 23453 or := v.Args[1] 23454 if or.Op != OpS390XOR { 23455 break 23456 } 23457 s0 := or.Args[0] 23458 if s0.Op != OpS390XSLDconst { 23459 break 23460 } 23461 j0 := s0.AuxInt 23462 x0 := s0.Args[0] 23463 if x0.Op != OpS390XMOVBZload { 23464 break 23465 } 23466 i0 := x0.AuxInt 23467 if x0.Aux != s { 23468 break 23469 } 23470 if p != x0.Args[0] { 23471 break 23472 } 23473 if mem != x0.Args[1] { 23474 break 23475 } 23476 y := or.Args[1] 23477 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23478 break 23479 } 23480 b = mergePoint(b, x0, x1) 23481 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23482 v.reset(OpCopy) 23483 v.AddArg(v0) 23484 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23485 v1.AuxInt = j0 23486 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23487 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23488 v3.AuxInt = i0 23489 v3.Aux = s 23490 v3.AddArg(p) 23491 v3.AddArg(mem) 23492 v2.AddArg(v3) 23493 v1.AddArg(v2) 23494 v0.AddArg(v1) 23495 v0.AddArg(y) 23496 return true 23497 } 23498 // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 23499 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23500 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 23501 for { 23502 s1 := v.Args[0] 23503 if s1.Op != OpS390XSLDconst { 23504 break 23505 } 23506 j1 := s1.AuxInt 23507 x1 := s1.Args[0] 23508 if x1.Op != OpS390XMOVBZload { 23509 break 23510 } 23511 i1 := x1.AuxInt 23512 s := x1.Aux 23513 p := x1.Args[0] 23514 mem := x1.Args[1] 23515 or := v.Args[1] 23516 if or.Op != OpS390XOR { 23517 break 23518 } 23519 y := or.Args[0] 23520 s0 := or.Args[1] 23521 if s0.Op != OpS390XSLDconst { 23522 break 23523 } 23524 j0 := s0.AuxInt 23525 x0 := s0.Args[0] 23526 if x0.Op != OpS390XMOVBZload { 23527 break 23528 } 23529 i0 := x0.AuxInt 23530 if x0.Aux != s { 23531 break 23532 } 23533 if p != x0.Args[0] { 23534 break 23535 } 23536 if mem != x0.Args[1] { 23537 break 23538 } 23539 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23540 break 23541 } 23542 b = mergePoint(b, x0, x1) 23543 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23544 v.reset(OpCopy) 23545 v.AddArg(v0) 23546 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23547 v1.AuxInt = j0 23548 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23549 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23550 v3.AuxInt = i0 23551 v3.Aux = s 23552 v3.AddArg(p) 23553 v3.AddArg(mem) 23554 v2.AddArg(v3) 23555 v1.AddArg(v2) 23556 v0.AddArg(v1) 23557 v0.AddArg(y) 23558 return true 23559 } 23560 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 23561 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23562 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 23563 for { 23564 or := v.Args[0] 23565 if or.Op != OpS390XOR { 23566 break 23567 } 23568 s0 := or.Args[0] 23569 if s0.Op != OpS390XSLDconst { 23570 break 23571 } 23572 j0 := s0.AuxInt 23573 x0 := s0.Args[0] 23574 if x0.Op != OpS390XMOVBZload { 23575 break 23576 } 23577 i0 := x0.AuxInt 23578 s := x0.Aux 23579 p := x0.Args[0] 23580 mem := x0.Args[1] 23581 y := or.Args[1] 23582 s1 := v.Args[1] 23583 if s1.Op != OpS390XSLDconst { 23584 break 23585 } 23586 j1 := s1.AuxInt 23587 x1 := s1.Args[0] 23588 if x1.Op != OpS390XMOVBZload { 23589 break 23590 } 23591 i1 := x1.AuxInt 23592 if x1.Aux != s { 23593 break 23594 } 23595 if p != x1.Args[0] { 23596 break 23597 } 23598 if mem != x1.Args[1] { 23599 break 23600 } 23601 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23602 break 23603 } 23604 b = mergePoint(b, x0, x1) 23605 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23606 v.reset(OpCopy) 23607 v.AddArg(v0) 23608 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23609 v1.AuxInt = j0 23610 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23611 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23612 v3.AuxInt = i0 23613 v3.Aux = s 23614 v3.AddArg(p) 23615 v3.AddArg(mem) 23616 v2.AddArg(v3) 23617 v1.AddArg(v2) 23618 v0.AddArg(v1) 23619 v0.AddArg(y) 23620 return true 23621 } 23622 return false 23623 } 23624 func rewriteValueS390X_OpS390XOR_90(v *Value) bool { 23625 b := v.Block 23626 _ = b 23627 types := &b.Func.Config.Types 23628 _ = types 23629 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) 23630 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 23631 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 23632 for { 23633 or := v.Args[0] 23634 if or.Op != OpS390XOR { 23635 break 23636 } 23637 y := or.Args[0] 23638 s0 := or.Args[1] 23639 if s0.Op != OpS390XSLDconst { 23640 break 23641 } 23642 j0 := s0.AuxInt 23643 x0 := s0.Args[0] 23644 if x0.Op != OpS390XMOVBZload { 23645 break 23646 } 23647 i0 := x0.AuxInt 23648 s := x0.Aux 23649 p := x0.Args[0] 23650 mem := x0.Args[1] 23651 s1 := v.Args[1] 23652 if s1.Op != OpS390XSLDconst { 23653 break 23654 } 23655 j1 := s1.AuxInt 23656 x1 := s1.Args[0] 23657 if x1.Op != OpS390XMOVBZload { 23658 break 23659 } 23660 i1 := x1.AuxInt 23661 if x1.Aux != s { 23662 break 23663 } 23664 if p != x1.Args[0] { 23665 break 23666 } 23667 if mem != x1.Args[1] { 23668 break 23669 } 23670 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 23671 break 23672 } 23673 b = mergePoint(b, x0, x1) 23674 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23675 v.reset(OpCopy) 23676 v.AddArg(v0) 23677 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23678 v1.AuxInt = j0 23679 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 23680 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 23681 v3.AuxInt = i0 23682 v3.Aux = s 23683 v3.AddArg(p) 23684 v3.AddArg(mem) 23685 v2.AddArg(v3) 23686 v1.AddArg(v2) 23687 v0.AddArg(v1) 23688 v0.AddArg(y) 23689 return true 23690 } 23691 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) y)) 23692 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 23693 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 23694 for { 23695 s1 := v.Args[0] 23696 if s1.Op != OpS390XSLDconst { 23697 break 23698 } 23699 j1 := s1.AuxInt 23700 r1 := s1.Args[0] 23701 if r1.Op != OpS390XMOVHZreg { 23702 break 23703 } 23704 x1 := r1.Args[0] 23705 if x1.Op != OpS390XMOVHBRload { 23706 break 23707 } 23708 i1 := x1.AuxInt 23709 s := x1.Aux 23710 p := x1.Args[0] 23711 mem := x1.Args[1] 23712 or := v.Args[1] 23713 if or.Op != OpS390XOR { 23714 break 23715 } 23716 s0 := or.Args[0] 23717 if s0.Op != OpS390XSLDconst { 23718 break 23719 } 23720 j0 := s0.AuxInt 23721 r0 := s0.Args[0] 23722 if r0.Op != OpS390XMOVHZreg { 23723 break 23724 } 23725 x0 := r0.Args[0] 23726 if x0.Op != OpS390XMOVHBRload { 23727 break 23728 } 23729 i0 := x0.AuxInt 23730 if x0.Aux != s { 23731 break 23732 } 23733 if p != x0.Args[0] { 23734 break 23735 } 23736 if mem != x0.Args[1] { 23737 break 23738 } 23739 y := or.Args[1] 23740 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 23741 break 23742 } 23743 b = mergePoint(b, x0, x1) 23744 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23745 v.reset(OpCopy) 23746 v.AddArg(v0) 23747 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23748 v1.AuxInt = j0 23749 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23750 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23751 v3.AuxInt = i0 23752 v3.Aux = s 23753 v3.AddArg(p) 23754 v3.AddArg(mem) 23755 v2.AddArg(v3) 23756 v1.AddArg(v2) 23757 v0.AddArg(v1) 23758 v0.AddArg(y) 23759 return true 23760 } 23761 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))))) 23762 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 23763 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 23764 for { 23765 s1 := v.Args[0] 23766 if s1.Op != OpS390XSLDconst { 23767 break 23768 } 23769 j1 := s1.AuxInt 23770 r1 := s1.Args[0] 23771 if r1.Op != OpS390XMOVHZreg { 23772 break 23773 } 23774 x1 := r1.Args[0] 23775 if x1.Op != OpS390XMOVHBRload { 23776 break 23777 } 23778 i1 := x1.AuxInt 23779 s := x1.Aux 23780 p := x1.Args[0] 23781 mem := x1.Args[1] 23782 or := v.Args[1] 23783 if or.Op != OpS390XOR { 23784 break 23785 } 23786 y := or.Args[0] 23787 s0 := or.Args[1] 23788 if s0.Op != OpS390XSLDconst { 23789 break 23790 } 23791 j0 := s0.AuxInt 23792 r0 := s0.Args[0] 23793 if r0.Op != OpS390XMOVHZreg { 23794 break 23795 } 23796 x0 := r0.Args[0] 23797 if x0.Op != OpS390XMOVHBRload { 23798 break 23799 } 23800 i0 := x0.AuxInt 23801 if x0.Aux != s { 23802 break 23803 } 23804 if p != x0.Args[0] { 23805 break 23806 } 23807 if mem != x0.Args[1] { 23808 break 23809 } 23810 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 23811 break 23812 } 23813 b = mergePoint(b, x0, x1) 23814 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23815 v.reset(OpCopy) 23816 v.AddArg(v0) 23817 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23818 v1.AuxInt = j0 23819 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23820 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23821 v3.AuxInt = i0 23822 v3.Aux = s 23823 v3.AddArg(p) 23824 v3.AddArg(mem) 23825 v2.AddArg(v3) 23826 v1.AddArg(v2) 23827 v0.AddArg(v1) 23828 v0.AddArg(y) 23829 return true 23830 } 23831 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 23832 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 23833 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 23834 for { 23835 or := v.Args[0] 23836 if or.Op != OpS390XOR { 23837 break 23838 } 23839 s0 := or.Args[0] 23840 if s0.Op != OpS390XSLDconst { 23841 break 23842 } 23843 j0 := s0.AuxInt 23844 r0 := s0.Args[0] 23845 if r0.Op != OpS390XMOVHZreg { 23846 break 23847 } 23848 x0 := r0.Args[0] 23849 if x0.Op != OpS390XMOVHBRload { 23850 break 23851 } 23852 i0 := x0.AuxInt 23853 s := x0.Aux 23854 p := x0.Args[0] 23855 mem := x0.Args[1] 23856 y := or.Args[1] 23857 s1 := v.Args[1] 23858 if s1.Op != OpS390XSLDconst { 23859 break 23860 } 23861 j1 := s1.AuxInt 23862 r1 := s1.Args[0] 23863 if r1.Op != OpS390XMOVHZreg { 23864 break 23865 } 23866 x1 := r1.Args[0] 23867 if x1.Op != OpS390XMOVHBRload { 23868 break 23869 } 23870 i1 := x1.AuxInt 23871 if x1.Aux != s { 23872 break 23873 } 23874 if p != x1.Args[0] { 23875 break 23876 } 23877 if mem != x1.Args[1] { 23878 break 23879 } 23880 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 23881 break 23882 } 23883 b = mergePoint(b, x0, x1) 23884 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23885 v.reset(OpCopy) 23886 v.AddArg(v0) 23887 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23888 v1.AuxInt = j0 23889 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23890 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23891 v3.AuxInt = i0 23892 v3.Aux = s 23893 v3.AddArg(p) 23894 v3.AddArg(mem) 23895 v2.AddArg(v3) 23896 v1.AddArg(v2) 23897 v0.AddArg(v1) 23898 v0.AddArg(y) 23899 return true 23900 } 23901 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 23902 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 23903 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) 23904 for { 23905 or := v.Args[0] 23906 if or.Op != OpS390XOR { 23907 break 23908 } 23909 y := or.Args[0] 23910 s0 := or.Args[1] 23911 if s0.Op != OpS390XSLDconst { 23912 break 23913 } 23914 j0 := s0.AuxInt 23915 r0 := s0.Args[0] 23916 if r0.Op != OpS390XMOVHZreg { 23917 break 23918 } 23919 x0 := r0.Args[0] 23920 if x0.Op != OpS390XMOVHBRload { 23921 break 23922 } 23923 i0 := x0.AuxInt 23924 s := x0.Aux 23925 p := x0.Args[0] 23926 mem := x0.Args[1] 23927 s1 := v.Args[1] 23928 if s1.Op != OpS390XSLDconst { 23929 break 23930 } 23931 j1 := s1.AuxInt 23932 r1 := s1.Args[0] 23933 if r1.Op != OpS390XMOVHZreg { 23934 break 23935 } 23936 x1 := r1.Args[0] 23937 if x1.Op != OpS390XMOVHBRload { 23938 break 23939 } 23940 i1 := x1.AuxInt 23941 if x1.Aux != s { 23942 break 23943 } 23944 if p != x1.Args[0] { 23945 break 23946 } 23947 if mem != x1.Args[1] { 23948 break 23949 } 23950 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 23951 break 23952 } 23953 b = mergePoint(b, x0, x1) 23954 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 23955 v.reset(OpCopy) 23956 v.AddArg(v0) 23957 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 23958 v1.AuxInt = j0 23959 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 23960 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 23961 v3.AuxInt = i0 23962 v3.Aux = s 23963 v3.AddArg(p) 23964 v3.AddArg(mem) 23965 v2.AddArg(v3) 23966 v1.AddArg(v2) 23967 v0.AddArg(v1) 23968 v0.AddArg(y) 23969 return true 23970 } 23971 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 23972 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 23973 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 23974 for { 23975 x0 := v.Args[0] 23976 if x0.Op != OpS390XMOVBZloadidx { 23977 break 23978 } 23979 i0 := x0.AuxInt 23980 s := x0.Aux 23981 p := x0.Args[0] 23982 idx := x0.Args[1] 23983 mem := x0.Args[2] 23984 sh := v.Args[1] 23985 if sh.Op != OpS390XSLDconst { 23986 break 23987 } 23988 if sh.AuxInt != 8 { 23989 break 23990 } 23991 x1 := sh.Args[0] 23992 if x1.Op != OpS390XMOVBZloadidx { 23993 break 23994 } 23995 i1 := x1.AuxInt 23996 if x1.Aux != s { 23997 break 23998 } 23999 if p != x1.Args[0] { 24000 break 24001 } 24002 if idx != x1.Args[1] { 24003 break 24004 } 24005 if mem != x1.Args[2] { 24006 break 24007 } 24008 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24009 break 24010 } 24011 b = mergePoint(b, x0, x1) 24012 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24013 v.reset(OpCopy) 24014 v.AddArg(v0) 24015 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24016 v1.AuxInt = i0 24017 v1.Aux = s 24018 v1.AddArg(p) 24019 v1.AddArg(idx) 24020 v1.AddArg(mem) 24021 v0.AddArg(v1) 24022 return true 24023 } 24024 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 24025 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24026 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24027 for { 24028 x0 := v.Args[0] 24029 if x0.Op != OpS390XMOVBZloadidx { 24030 break 24031 } 24032 i0 := x0.AuxInt 24033 s := x0.Aux 24034 idx := x0.Args[0] 24035 p := x0.Args[1] 24036 mem := x0.Args[2] 24037 sh := v.Args[1] 24038 if sh.Op != OpS390XSLDconst { 24039 break 24040 } 24041 if sh.AuxInt != 8 { 24042 break 24043 } 24044 x1 := sh.Args[0] 24045 if x1.Op != OpS390XMOVBZloadidx { 24046 break 24047 } 24048 i1 := x1.AuxInt 24049 if x1.Aux != s { 24050 break 24051 } 24052 if p != x1.Args[0] { 24053 break 24054 } 24055 if idx != x1.Args[1] { 24056 break 24057 } 24058 if mem != x1.Args[2] { 24059 break 24060 } 24061 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24062 break 24063 } 24064 b = mergePoint(b, x0, x1) 24065 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24066 v.reset(OpCopy) 24067 v.AddArg(v0) 24068 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24069 v1.AuxInt = i0 24070 v1.Aux = s 24071 v1.AddArg(p) 24072 v1.AddArg(idx) 24073 v1.AddArg(mem) 24074 v0.AddArg(v1) 24075 return true 24076 } 24077 // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 24078 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24079 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24080 for { 24081 x0 := v.Args[0] 24082 if x0.Op != OpS390XMOVBZloadidx { 24083 break 24084 } 24085 i0 := x0.AuxInt 24086 s := x0.Aux 24087 p := x0.Args[0] 24088 idx := x0.Args[1] 24089 mem := x0.Args[2] 24090 sh := v.Args[1] 24091 if sh.Op != OpS390XSLDconst { 24092 break 24093 } 24094 if sh.AuxInt != 8 { 24095 break 24096 } 24097 x1 := sh.Args[0] 24098 if x1.Op != OpS390XMOVBZloadidx { 24099 break 24100 } 24101 i1 := x1.AuxInt 24102 if x1.Aux != s { 24103 break 24104 } 24105 if idx != x1.Args[0] { 24106 break 24107 } 24108 if p != x1.Args[1] { 24109 break 24110 } 24111 if mem != x1.Args[2] { 24112 break 24113 } 24114 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24115 break 24116 } 24117 b = mergePoint(b, x0, x1) 24118 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24119 v.reset(OpCopy) 24120 v.AddArg(v0) 24121 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24122 v1.AuxInt = i0 24123 v1.Aux = s 24124 v1.AddArg(p) 24125 v1.AddArg(idx) 24126 v1.AddArg(mem) 24127 v0.AddArg(v1) 24128 return true 24129 } 24130 // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 24131 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24132 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24133 for { 24134 x0 := v.Args[0] 24135 if x0.Op != OpS390XMOVBZloadidx { 24136 break 24137 } 24138 i0 := x0.AuxInt 24139 s := x0.Aux 24140 idx := x0.Args[0] 24141 p := x0.Args[1] 24142 mem := x0.Args[2] 24143 sh := v.Args[1] 24144 if sh.Op != OpS390XSLDconst { 24145 break 24146 } 24147 if sh.AuxInt != 8 { 24148 break 24149 } 24150 x1 := sh.Args[0] 24151 if x1.Op != OpS390XMOVBZloadidx { 24152 break 24153 } 24154 i1 := x1.AuxInt 24155 if x1.Aux != s { 24156 break 24157 } 24158 if idx != x1.Args[0] { 24159 break 24160 } 24161 if p != x1.Args[1] { 24162 break 24163 } 24164 if mem != x1.Args[2] { 24165 break 24166 } 24167 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24168 break 24169 } 24170 b = mergePoint(b, x0, x1) 24171 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24172 v.reset(OpCopy) 24173 v.AddArg(v0) 24174 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24175 v1.AuxInt = i0 24176 v1.Aux = s 24177 v1.AddArg(p) 24178 v1.AddArg(idx) 24179 v1.AddArg(mem) 24180 v0.AddArg(v1) 24181 return true 24182 } 24183 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 24184 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24185 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24186 for { 24187 sh := v.Args[0] 24188 if sh.Op != OpS390XSLDconst { 24189 break 24190 } 24191 if sh.AuxInt != 8 { 24192 break 24193 } 24194 x1 := sh.Args[0] 24195 if x1.Op != OpS390XMOVBZloadidx { 24196 break 24197 } 24198 i1 := x1.AuxInt 24199 s := x1.Aux 24200 p := x1.Args[0] 24201 idx := x1.Args[1] 24202 mem := x1.Args[2] 24203 x0 := v.Args[1] 24204 if x0.Op != OpS390XMOVBZloadidx { 24205 break 24206 } 24207 i0 := x0.AuxInt 24208 if x0.Aux != s { 24209 break 24210 } 24211 if p != x0.Args[0] { 24212 break 24213 } 24214 if idx != x0.Args[1] { 24215 break 24216 } 24217 if mem != x0.Args[2] { 24218 break 24219 } 24220 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24221 break 24222 } 24223 b = mergePoint(b, x0, x1) 24224 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24225 v.reset(OpCopy) 24226 v.AddArg(v0) 24227 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24228 v1.AuxInt = i0 24229 v1.Aux = s 24230 v1.AddArg(p) 24231 v1.AddArg(idx) 24232 v1.AddArg(mem) 24233 v0.AddArg(v1) 24234 return true 24235 } 24236 return false 24237 } 24238 func rewriteValueS390X_OpS390XOR_100(v *Value) bool { 24239 b := v.Block 24240 _ = b 24241 types := &b.Func.Config.Types 24242 _ = types 24243 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 24244 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24245 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24246 for { 24247 sh := v.Args[0] 24248 if sh.Op != OpS390XSLDconst { 24249 break 24250 } 24251 if sh.AuxInt != 8 { 24252 break 24253 } 24254 x1 := sh.Args[0] 24255 if x1.Op != OpS390XMOVBZloadidx { 24256 break 24257 } 24258 i1 := x1.AuxInt 24259 s := x1.Aux 24260 idx := x1.Args[0] 24261 p := x1.Args[1] 24262 mem := x1.Args[2] 24263 x0 := v.Args[1] 24264 if x0.Op != OpS390XMOVBZloadidx { 24265 break 24266 } 24267 i0 := x0.AuxInt 24268 if x0.Aux != s { 24269 break 24270 } 24271 if p != x0.Args[0] { 24272 break 24273 } 24274 if idx != x0.Args[1] { 24275 break 24276 } 24277 if mem != x0.Args[2] { 24278 break 24279 } 24280 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24281 break 24282 } 24283 b = mergePoint(b, x0, x1) 24284 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24285 v.reset(OpCopy) 24286 v.AddArg(v0) 24287 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24288 v1.AuxInt = i0 24289 v1.Aux = s 24290 v1.AddArg(p) 24291 v1.AddArg(idx) 24292 v1.AddArg(mem) 24293 v0.AddArg(v1) 24294 return true 24295 } 24296 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 24297 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24298 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24299 for { 24300 sh := v.Args[0] 24301 if sh.Op != OpS390XSLDconst { 24302 break 24303 } 24304 if sh.AuxInt != 8 { 24305 break 24306 } 24307 x1 := sh.Args[0] 24308 if x1.Op != OpS390XMOVBZloadidx { 24309 break 24310 } 24311 i1 := x1.AuxInt 24312 s := x1.Aux 24313 p := x1.Args[0] 24314 idx := x1.Args[1] 24315 mem := x1.Args[2] 24316 x0 := v.Args[1] 24317 if x0.Op != OpS390XMOVBZloadidx { 24318 break 24319 } 24320 i0 := x0.AuxInt 24321 if x0.Aux != s { 24322 break 24323 } 24324 if idx != x0.Args[0] { 24325 break 24326 } 24327 if p != x0.Args[1] { 24328 break 24329 } 24330 if mem != x0.Args[2] { 24331 break 24332 } 24333 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24334 break 24335 } 24336 b = mergePoint(b, x0, x1) 24337 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24338 v.reset(OpCopy) 24339 v.AddArg(v0) 24340 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24341 v1.AuxInt = i0 24342 v1.Aux = s 24343 v1.AddArg(p) 24344 v1.AddArg(idx) 24345 v1.AddArg(mem) 24346 v0.AddArg(v1) 24347 return true 24348 } 24349 // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 24350 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 24351 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 24352 for { 24353 sh := v.Args[0] 24354 if sh.Op != OpS390XSLDconst { 24355 break 24356 } 24357 if sh.AuxInt != 8 { 24358 break 24359 } 24360 x1 := sh.Args[0] 24361 if x1.Op != OpS390XMOVBZloadidx { 24362 break 24363 } 24364 i1 := x1.AuxInt 24365 s := x1.Aux 24366 idx := x1.Args[0] 24367 p := x1.Args[1] 24368 mem := x1.Args[2] 24369 x0 := v.Args[1] 24370 if x0.Op != OpS390XMOVBZloadidx { 24371 break 24372 } 24373 i0 := x0.AuxInt 24374 if x0.Aux != s { 24375 break 24376 } 24377 if idx != x0.Args[0] { 24378 break 24379 } 24380 if p != x0.Args[1] { 24381 break 24382 } 24383 if mem != x0.Args[2] { 24384 break 24385 } 24386 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 24387 break 24388 } 24389 b = mergePoint(b, x0, x1) 24390 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 24391 v.reset(OpCopy) 24392 v.AddArg(v0) 24393 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 24394 v1.AuxInt = i0 24395 v1.Aux = s 24396 v1.AddArg(p) 24397 v1.AddArg(idx) 24398 v1.AddArg(mem) 24399 v0.AddArg(v1) 24400 return true 24401 } 24402 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 24403 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24404 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24405 for { 24406 r0 := v.Args[0] 24407 if r0.Op != OpS390XMOVHZreg { 24408 break 24409 } 24410 x0 := r0.Args[0] 24411 if x0.Op != OpS390XMOVHBRloadidx { 24412 break 24413 } 24414 i0 := x0.AuxInt 24415 s := x0.Aux 24416 p := x0.Args[0] 24417 idx := x0.Args[1] 24418 mem := x0.Args[2] 24419 sh := v.Args[1] 24420 if sh.Op != OpS390XSLDconst { 24421 break 24422 } 24423 if sh.AuxInt != 16 { 24424 break 24425 } 24426 r1 := sh.Args[0] 24427 if r1.Op != OpS390XMOVHZreg { 24428 break 24429 } 24430 x1 := r1.Args[0] 24431 if x1.Op != OpS390XMOVHBRloadidx { 24432 break 24433 } 24434 i1 := x1.AuxInt 24435 if x1.Aux != s { 24436 break 24437 } 24438 if p != x1.Args[0] { 24439 break 24440 } 24441 if idx != x1.Args[1] { 24442 break 24443 } 24444 if mem != x1.Args[2] { 24445 break 24446 } 24447 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24448 break 24449 } 24450 b = mergePoint(b, x0, x1) 24451 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24452 v.reset(OpCopy) 24453 v.AddArg(v0) 24454 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24455 v1.AuxInt = i0 24456 v1.Aux = s 24457 v1.AddArg(p) 24458 v1.AddArg(idx) 24459 v1.AddArg(mem) 24460 v0.AddArg(v1) 24461 return true 24462 } 24463 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 24464 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24465 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24466 for { 24467 r0 := v.Args[0] 24468 if r0.Op != OpS390XMOVHZreg { 24469 break 24470 } 24471 x0 := r0.Args[0] 24472 if x0.Op != OpS390XMOVHBRloadidx { 24473 break 24474 } 24475 i0 := x0.AuxInt 24476 s := x0.Aux 24477 idx := x0.Args[0] 24478 p := x0.Args[1] 24479 mem := x0.Args[2] 24480 sh := v.Args[1] 24481 if sh.Op != OpS390XSLDconst { 24482 break 24483 } 24484 if sh.AuxInt != 16 { 24485 break 24486 } 24487 r1 := sh.Args[0] 24488 if r1.Op != OpS390XMOVHZreg { 24489 break 24490 } 24491 x1 := r1.Args[0] 24492 if x1.Op != OpS390XMOVHBRloadidx { 24493 break 24494 } 24495 i1 := x1.AuxInt 24496 if x1.Aux != s { 24497 break 24498 } 24499 if p != x1.Args[0] { 24500 break 24501 } 24502 if idx != x1.Args[1] { 24503 break 24504 } 24505 if mem != x1.Args[2] { 24506 break 24507 } 24508 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24509 break 24510 } 24511 b = mergePoint(b, x0, x1) 24512 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24513 v.reset(OpCopy) 24514 v.AddArg(v0) 24515 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24516 v1.AuxInt = i0 24517 v1.Aux = s 24518 v1.AddArg(p) 24519 v1.AddArg(idx) 24520 v1.AddArg(mem) 24521 v0.AddArg(v1) 24522 return true 24523 } 24524 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 24525 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24526 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24527 for { 24528 r0 := v.Args[0] 24529 if r0.Op != OpS390XMOVHZreg { 24530 break 24531 } 24532 x0 := r0.Args[0] 24533 if x0.Op != OpS390XMOVHBRloadidx { 24534 break 24535 } 24536 i0 := x0.AuxInt 24537 s := x0.Aux 24538 p := x0.Args[0] 24539 idx := x0.Args[1] 24540 mem := x0.Args[2] 24541 sh := v.Args[1] 24542 if sh.Op != OpS390XSLDconst { 24543 break 24544 } 24545 if sh.AuxInt != 16 { 24546 break 24547 } 24548 r1 := sh.Args[0] 24549 if r1.Op != OpS390XMOVHZreg { 24550 break 24551 } 24552 x1 := r1.Args[0] 24553 if x1.Op != OpS390XMOVHBRloadidx { 24554 break 24555 } 24556 i1 := x1.AuxInt 24557 if x1.Aux != s { 24558 break 24559 } 24560 if idx != x1.Args[0] { 24561 break 24562 } 24563 if p != x1.Args[1] { 24564 break 24565 } 24566 if mem != x1.Args[2] { 24567 break 24568 } 24569 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24570 break 24571 } 24572 b = mergePoint(b, x0, x1) 24573 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24574 v.reset(OpCopy) 24575 v.AddArg(v0) 24576 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24577 v1.AuxInt = i0 24578 v1.Aux = s 24579 v1.AddArg(p) 24580 v1.AddArg(idx) 24581 v1.AddArg(mem) 24582 v0.AddArg(v1) 24583 return true 24584 } 24585 // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 24586 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24587 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24588 for { 24589 r0 := v.Args[0] 24590 if r0.Op != OpS390XMOVHZreg { 24591 break 24592 } 24593 x0 := r0.Args[0] 24594 if x0.Op != OpS390XMOVHBRloadidx { 24595 break 24596 } 24597 i0 := x0.AuxInt 24598 s := x0.Aux 24599 idx := x0.Args[0] 24600 p := x0.Args[1] 24601 mem := x0.Args[2] 24602 sh := v.Args[1] 24603 if sh.Op != OpS390XSLDconst { 24604 break 24605 } 24606 if sh.AuxInt != 16 { 24607 break 24608 } 24609 r1 := sh.Args[0] 24610 if r1.Op != OpS390XMOVHZreg { 24611 break 24612 } 24613 x1 := r1.Args[0] 24614 if x1.Op != OpS390XMOVHBRloadidx { 24615 break 24616 } 24617 i1 := x1.AuxInt 24618 if x1.Aux != s { 24619 break 24620 } 24621 if idx != x1.Args[0] { 24622 break 24623 } 24624 if p != x1.Args[1] { 24625 break 24626 } 24627 if mem != x1.Args[2] { 24628 break 24629 } 24630 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24631 break 24632 } 24633 b = mergePoint(b, x0, x1) 24634 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24635 v.reset(OpCopy) 24636 v.AddArg(v0) 24637 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24638 v1.AuxInt = i0 24639 v1.Aux = s 24640 v1.AddArg(p) 24641 v1.AddArg(idx) 24642 v1.AddArg(mem) 24643 v0.AddArg(v1) 24644 return true 24645 } 24646 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 24647 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24648 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24649 for { 24650 sh := v.Args[0] 24651 if sh.Op != OpS390XSLDconst { 24652 break 24653 } 24654 if sh.AuxInt != 16 { 24655 break 24656 } 24657 r1 := sh.Args[0] 24658 if r1.Op != OpS390XMOVHZreg { 24659 break 24660 } 24661 x1 := r1.Args[0] 24662 if x1.Op != OpS390XMOVHBRloadidx { 24663 break 24664 } 24665 i1 := x1.AuxInt 24666 s := x1.Aux 24667 p := x1.Args[0] 24668 idx := x1.Args[1] 24669 mem := x1.Args[2] 24670 r0 := v.Args[1] 24671 if r0.Op != OpS390XMOVHZreg { 24672 break 24673 } 24674 x0 := r0.Args[0] 24675 if x0.Op != OpS390XMOVHBRloadidx { 24676 break 24677 } 24678 i0 := x0.AuxInt 24679 if x0.Aux != s { 24680 break 24681 } 24682 if p != x0.Args[0] { 24683 break 24684 } 24685 if idx != x0.Args[1] { 24686 break 24687 } 24688 if mem != x0.Args[2] { 24689 break 24690 } 24691 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24692 break 24693 } 24694 b = mergePoint(b, x0, x1) 24695 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24696 v.reset(OpCopy) 24697 v.AddArg(v0) 24698 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24699 v1.AuxInt = i0 24700 v1.Aux = s 24701 v1.AddArg(p) 24702 v1.AddArg(idx) 24703 v1.AddArg(mem) 24704 v0.AddArg(v1) 24705 return true 24706 } 24707 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 24708 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24709 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24710 for { 24711 sh := v.Args[0] 24712 if sh.Op != OpS390XSLDconst { 24713 break 24714 } 24715 if sh.AuxInt != 16 { 24716 break 24717 } 24718 r1 := sh.Args[0] 24719 if r1.Op != OpS390XMOVHZreg { 24720 break 24721 } 24722 x1 := r1.Args[0] 24723 if x1.Op != OpS390XMOVHBRloadidx { 24724 break 24725 } 24726 i1 := x1.AuxInt 24727 s := x1.Aux 24728 idx := x1.Args[0] 24729 p := x1.Args[1] 24730 mem := x1.Args[2] 24731 r0 := v.Args[1] 24732 if r0.Op != OpS390XMOVHZreg { 24733 break 24734 } 24735 x0 := r0.Args[0] 24736 if x0.Op != OpS390XMOVHBRloadidx { 24737 break 24738 } 24739 i0 := x0.AuxInt 24740 if x0.Aux != s { 24741 break 24742 } 24743 if p != x0.Args[0] { 24744 break 24745 } 24746 if idx != x0.Args[1] { 24747 break 24748 } 24749 if mem != x0.Args[2] { 24750 break 24751 } 24752 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24753 break 24754 } 24755 b = mergePoint(b, x0, x1) 24756 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24757 v.reset(OpCopy) 24758 v.AddArg(v0) 24759 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24760 v1.AuxInt = i0 24761 v1.Aux = s 24762 v1.AddArg(p) 24763 v1.AddArg(idx) 24764 v1.AddArg(mem) 24765 v0.AddArg(v1) 24766 return true 24767 } 24768 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 24769 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24770 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24771 for { 24772 sh := v.Args[0] 24773 if sh.Op != OpS390XSLDconst { 24774 break 24775 } 24776 if sh.AuxInt != 16 { 24777 break 24778 } 24779 r1 := sh.Args[0] 24780 if r1.Op != OpS390XMOVHZreg { 24781 break 24782 } 24783 x1 := r1.Args[0] 24784 if x1.Op != OpS390XMOVHBRloadidx { 24785 break 24786 } 24787 i1 := x1.AuxInt 24788 s := x1.Aux 24789 p := x1.Args[0] 24790 idx := x1.Args[1] 24791 mem := x1.Args[2] 24792 r0 := v.Args[1] 24793 if r0.Op != OpS390XMOVHZreg { 24794 break 24795 } 24796 x0 := r0.Args[0] 24797 if x0.Op != OpS390XMOVHBRloadidx { 24798 break 24799 } 24800 i0 := x0.AuxInt 24801 if x0.Aux != s { 24802 break 24803 } 24804 if idx != x0.Args[0] { 24805 break 24806 } 24807 if p != x0.Args[1] { 24808 break 24809 } 24810 if mem != x0.Args[2] { 24811 break 24812 } 24813 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24814 break 24815 } 24816 b = mergePoint(b, x0, x1) 24817 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24818 v.reset(OpCopy) 24819 v.AddArg(v0) 24820 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24821 v1.AuxInt = i0 24822 v1.Aux = s 24823 v1.AddArg(p) 24824 v1.AddArg(idx) 24825 v1.AddArg(mem) 24826 v0.AddArg(v1) 24827 return true 24828 } 24829 return false 24830 } 24831 func rewriteValueS390X_OpS390XOR_110(v *Value) bool { 24832 b := v.Block 24833 _ = b 24834 types := &b.Func.Config.Types 24835 _ = types 24836 // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 24837 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24838 // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) 24839 for { 24840 sh := v.Args[0] 24841 if sh.Op != OpS390XSLDconst { 24842 break 24843 } 24844 if sh.AuxInt != 16 { 24845 break 24846 } 24847 r1 := sh.Args[0] 24848 if r1.Op != OpS390XMOVHZreg { 24849 break 24850 } 24851 x1 := r1.Args[0] 24852 if x1.Op != OpS390XMOVHBRloadidx { 24853 break 24854 } 24855 i1 := x1.AuxInt 24856 s := x1.Aux 24857 idx := x1.Args[0] 24858 p := x1.Args[1] 24859 mem := x1.Args[2] 24860 r0 := v.Args[1] 24861 if r0.Op != OpS390XMOVHZreg { 24862 break 24863 } 24864 x0 := r0.Args[0] 24865 if x0.Op != OpS390XMOVHBRloadidx { 24866 break 24867 } 24868 i0 := x0.AuxInt 24869 if x0.Aux != s { 24870 break 24871 } 24872 if idx != x0.Args[0] { 24873 break 24874 } 24875 if p != x0.Args[1] { 24876 break 24877 } 24878 if mem != x0.Args[2] { 24879 break 24880 } 24881 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24882 break 24883 } 24884 b = mergePoint(b, x0, x1) 24885 v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 24886 v.reset(OpCopy) 24887 v.AddArg(v0) 24888 v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 24889 v1.AuxInt = i0 24890 v1.Aux = s 24891 v1.AddArg(p) 24892 v1.AddArg(idx) 24893 v1.AddArg(mem) 24894 v0.AddArg(v1) 24895 return true 24896 } 24897 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 24898 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24899 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 24900 for { 24901 r0 := v.Args[0] 24902 if r0.Op != OpS390XMOVWZreg { 24903 break 24904 } 24905 x0 := r0.Args[0] 24906 if x0.Op != OpS390XMOVWBRloadidx { 24907 break 24908 } 24909 i0 := x0.AuxInt 24910 s := x0.Aux 24911 p := x0.Args[0] 24912 idx := x0.Args[1] 24913 mem := x0.Args[2] 24914 sh := v.Args[1] 24915 if sh.Op != OpS390XSLDconst { 24916 break 24917 } 24918 if sh.AuxInt != 32 { 24919 break 24920 } 24921 r1 := sh.Args[0] 24922 if r1.Op != OpS390XMOVWZreg { 24923 break 24924 } 24925 x1 := r1.Args[0] 24926 if x1.Op != OpS390XMOVWBRloadidx { 24927 break 24928 } 24929 i1 := x1.AuxInt 24930 if x1.Aux != s { 24931 break 24932 } 24933 if p != x1.Args[0] { 24934 break 24935 } 24936 if idx != x1.Args[1] { 24937 break 24938 } 24939 if mem != x1.Args[2] { 24940 break 24941 } 24942 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 24943 break 24944 } 24945 b = mergePoint(b, x0, x1) 24946 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 24947 v.reset(OpCopy) 24948 v.AddArg(v0) 24949 v0.AuxInt = i0 24950 v0.Aux = s 24951 v0.AddArg(p) 24952 v0.AddArg(idx) 24953 v0.AddArg(mem) 24954 return true 24955 } 24956 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) 24957 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 24958 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 24959 for { 24960 r0 := v.Args[0] 24961 if r0.Op != OpS390XMOVWZreg { 24962 break 24963 } 24964 x0 := r0.Args[0] 24965 if x0.Op != OpS390XMOVWBRloadidx { 24966 break 24967 } 24968 i0 := x0.AuxInt 24969 s := x0.Aux 24970 idx := x0.Args[0] 24971 p := x0.Args[1] 24972 mem := x0.Args[2] 24973 sh := v.Args[1] 24974 if sh.Op != OpS390XSLDconst { 24975 break 24976 } 24977 if sh.AuxInt != 32 { 24978 break 24979 } 24980 r1 := sh.Args[0] 24981 if r1.Op != OpS390XMOVWZreg { 24982 break 24983 } 24984 x1 := r1.Args[0] 24985 if x1.Op != OpS390XMOVWBRloadidx { 24986 break 24987 } 24988 i1 := x1.AuxInt 24989 if x1.Aux != s { 24990 break 24991 } 24992 if p != x1.Args[0] { 24993 break 24994 } 24995 if idx != x1.Args[1] { 24996 break 24997 } 24998 if mem != x1.Args[2] { 24999 break 25000 } 25001 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25002 break 25003 } 25004 b = mergePoint(b, x0, x1) 25005 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25006 v.reset(OpCopy) 25007 v.AddArg(v0) 25008 v0.AuxInt = i0 25009 v0.Aux = s 25010 v0.AddArg(p) 25011 v0.AddArg(idx) 25012 v0.AddArg(mem) 25013 return true 25014 } 25015 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 25016 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25017 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25018 for { 25019 r0 := v.Args[0] 25020 if r0.Op != OpS390XMOVWZreg { 25021 break 25022 } 25023 x0 := r0.Args[0] 25024 if x0.Op != OpS390XMOVWBRloadidx { 25025 break 25026 } 25027 i0 := x0.AuxInt 25028 s := x0.Aux 25029 p := x0.Args[0] 25030 idx := x0.Args[1] 25031 mem := x0.Args[2] 25032 sh := v.Args[1] 25033 if sh.Op != OpS390XSLDconst { 25034 break 25035 } 25036 if sh.AuxInt != 32 { 25037 break 25038 } 25039 r1 := sh.Args[0] 25040 if r1.Op != OpS390XMOVWZreg { 25041 break 25042 } 25043 x1 := r1.Args[0] 25044 if x1.Op != OpS390XMOVWBRloadidx { 25045 break 25046 } 25047 i1 := x1.AuxInt 25048 if x1.Aux != s { 25049 break 25050 } 25051 if idx != x1.Args[0] { 25052 break 25053 } 25054 if p != x1.Args[1] { 25055 break 25056 } 25057 if mem != x1.Args[2] { 25058 break 25059 } 25060 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25061 break 25062 } 25063 b = mergePoint(b, x0, x1) 25064 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25065 v.reset(OpCopy) 25066 v.AddArg(v0) 25067 v0.AuxInt = i0 25068 v0.Aux = s 25069 v0.AddArg(p) 25070 v0.AddArg(idx) 25071 v0.AddArg(mem) 25072 return true 25073 } 25074 // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) 25075 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25076 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25077 for { 25078 r0 := v.Args[0] 25079 if r0.Op != OpS390XMOVWZreg { 25080 break 25081 } 25082 x0 := r0.Args[0] 25083 if x0.Op != OpS390XMOVWBRloadidx { 25084 break 25085 } 25086 i0 := x0.AuxInt 25087 s := x0.Aux 25088 idx := x0.Args[0] 25089 p := x0.Args[1] 25090 mem := x0.Args[2] 25091 sh := v.Args[1] 25092 if sh.Op != OpS390XSLDconst { 25093 break 25094 } 25095 if sh.AuxInt != 32 { 25096 break 25097 } 25098 r1 := sh.Args[0] 25099 if r1.Op != OpS390XMOVWZreg { 25100 break 25101 } 25102 x1 := r1.Args[0] 25103 if x1.Op != OpS390XMOVWBRloadidx { 25104 break 25105 } 25106 i1 := x1.AuxInt 25107 if x1.Aux != s { 25108 break 25109 } 25110 if idx != x1.Args[0] { 25111 break 25112 } 25113 if p != x1.Args[1] { 25114 break 25115 } 25116 if mem != x1.Args[2] { 25117 break 25118 } 25119 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25120 break 25121 } 25122 b = mergePoint(b, x0, x1) 25123 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25124 v.reset(OpCopy) 25125 v.AddArg(v0) 25126 v0.AuxInt = i0 25127 v0.Aux = s 25128 v0.AddArg(p) 25129 v0.AddArg(idx) 25130 v0.AddArg(mem) 25131 return true 25132 } 25133 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 25134 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25135 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25136 for { 25137 sh := v.Args[0] 25138 if sh.Op != OpS390XSLDconst { 25139 break 25140 } 25141 if sh.AuxInt != 32 { 25142 break 25143 } 25144 r1 := sh.Args[0] 25145 if r1.Op != OpS390XMOVWZreg { 25146 break 25147 } 25148 x1 := r1.Args[0] 25149 if x1.Op != OpS390XMOVWBRloadidx { 25150 break 25151 } 25152 i1 := x1.AuxInt 25153 s := x1.Aux 25154 p := x1.Args[0] 25155 idx := x1.Args[1] 25156 mem := x1.Args[2] 25157 r0 := v.Args[1] 25158 if r0.Op != OpS390XMOVWZreg { 25159 break 25160 } 25161 x0 := r0.Args[0] 25162 if x0.Op != OpS390XMOVWBRloadidx { 25163 break 25164 } 25165 i0 := x0.AuxInt 25166 if x0.Aux != s { 25167 break 25168 } 25169 if p != x0.Args[0] { 25170 break 25171 } 25172 if idx != x0.Args[1] { 25173 break 25174 } 25175 if mem != x0.Args[2] { 25176 break 25177 } 25178 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25179 break 25180 } 25181 b = mergePoint(b, x0, x1) 25182 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25183 v.reset(OpCopy) 25184 v.AddArg(v0) 25185 v0.AuxInt = i0 25186 v0.Aux = s 25187 v0.AddArg(p) 25188 v0.AddArg(idx) 25189 v0.AddArg(mem) 25190 return true 25191 } 25192 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) 25193 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25194 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25195 for { 25196 sh := v.Args[0] 25197 if sh.Op != OpS390XSLDconst { 25198 break 25199 } 25200 if sh.AuxInt != 32 { 25201 break 25202 } 25203 r1 := sh.Args[0] 25204 if r1.Op != OpS390XMOVWZreg { 25205 break 25206 } 25207 x1 := r1.Args[0] 25208 if x1.Op != OpS390XMOVWBRloadidx { 25209 break 25210 } 25211 i1 := x1.AuxInt 25212 s := x1.Aux 25213 idx := x1.Args[0] 25214 p := x1.Args[1] 25215 mem := x1.Args[2] 25216 r0 := v.Args[1] 25217 if r0.Op != OpS390XMOVWZreg { 25218 break 25219 } 25220 x0 := r0.Args[0] 25221 if x0.Op != OpS390XMOVWBRloadidx { 25222 break 25223 } 25224 i0 := x0.AuxInt 25225 if x0.Aux != s { 25226 break 25227 } 25228 if p != x0.Args[0] { 25229 break 25230 } 25231 if idx != x0.Args[1] { 25232 break 25233 } 25234 if mem != x0.Args[2] { 25235 break 25236 } 25237 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25238 break 25239 } 25240 b = mergePoint(b, x0, x1) 25241 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25242 v.reset(OpCopy) 25243 v.AddArg(v0) 25244 v0.AuxInt = i0 25245 v0.Aux = s 25246 v0.AddArg(p) 25247 v0.AddArg(idx) 25248 v0.AddArg(mem) 25249 return true 25250 } 25251 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 25252 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25253 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25254 for { 25255 sh := v.Args[0] 25256 if sh.Op != OpS390XSLDconst { 25257 break 25258 } 25259 if sh.AuxInt != 32 { 25260 break 25261 } 25262 r1 := sh.Args[0] 25263 if r1.Op != OpS390XMOVWZreg { 25264 break 25265 } 25266 x1 := r1.Args[0] 25267 if x1.Op != OpS390XMOVWBRloadidx { 25268 break 25269 } 25270 i1 := x1.AuxInt 25271 s := x1.Aux 25272 p := x1.Args[0] 25273 idx := x1.Args[1] 25274 mem := x1.Args[2] 25275 r0 := v.Args[1] 25276 if r0.Op != OpS390XMOVWZreg { 25277 break 25278 } 25279 x0 := r0.Args[0] 25280 if x0.Op != OpS390XMOVWBRloadidx { 25281 break 25282 } 25283 i0 := x0.AuxInt 25284 if x0.Aux != s { 25285 break 25286 } 25287 if idx != x0.Args[0] { 25288 break 25289 } 25290 if p != x0.Args[1] { 25291 break 25292 } 25293 if mem != x0.Args[2] { 25294 break 25295 } 25296 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25297 break 25298 } 25299 b = mergePoint(b, x0, x1) 25300 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25301 v.reset(OpCopy) 25302 v.AddArg(v0) 25303 v0.AuxInt = i0 25304 v0.Aux = s 25305 v0.AddArg(p) 25306 v0.AddArg(idx) 25307 v0.AddArg(mem) 25308 return true 25309 } 25310 // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) 25311 // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 25312 // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) 25313 for { 25314 sh := v.Args[0] 25315 if sh.Op != OpS390XSLDconst { 25316 break 25317 } 25318 if sh.AuxInt != 32 { 25319 break 25320 } 25321 r1 := sh.Args[0] 25322 if r1.Op != OpS390XMOVWZreg { 25323 break 25324 } 25325 x1 := r1.Args[0] 25326 if x1.Op != OpS390XMOVWBRloadidx { 25327 break 25328 } 25329 i1 := x1.AuxInt 25330 s := x1.Aux 25331 idx := x1.Args[0] 25332 p := x1.Args[1] 25333 mem := x1.Args[2] 25334 r0 := v.Args[1] 25335 if r0.Op != OpS390XMOVWZreg { 25336 break 25337 } 25338 x0 := r0.Args[0] 25339 if x0.Op != OpS390XMOVWBRloadidx { 25340 break 25341 } 25342 i0 := x0.AuxInt 25343 if x0.Aux != s { 25344 break 25345 } 25346 if idx != x0.Args[0] { 25347 break 25348 } 25349 if p != x0.Args[1] { 25350 break 25351 } 25352 if mem != x0.Args[2] { 25353 break 25354 } 25355 if !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 25356 break 25357 } 25358 b = mergePoint(b, x0, x1) 25359 v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, types.Int64) 25360 v.reset(OpCopy) 25361 v.AddArg(v0) 25362 v0.AuxInt = i0 25363 v0.Aux = s 25364 v0.AddArg(p) 25365 v0.AddArg(idx) 25366 v0.AddArg(mem) 25367 return true 25368 } 25369 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) 25370 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25371 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25372 for { 25373 s1 := v.Args[0] 25374 if s1.Op != OpS390XSLDconst { 25375 break 25376 } 25377 j1 := s1.AuxInt 25378 x1 := s1.Args[0] 25379 if x1.Op != OpS390XMOVBZloadidx { 25380 break 25381 } 25382 i1 := x1.AuxInt 25383 s := x1.Aux 25384 p := x1.Args[0] 25385 idx := x1.Args[1] 25386 mem := x1.Args[2] 25387 or := v.Args[1] 25388 if or.Op != OpS390XOR { 25389 break 25390 } 25391 s0 := or.Args[0] 25392 if s0.Op != OpS390XSLDconst { 25393 break 25394 } 25395 j0 := s0.AuxInt 25396 x0 := s0.Args[0] 25397 if x0.Op != OpS390XMOVBZloadidx { 25398 break 25399 } 25400 i0 := x0.AuxInt 25401 if x0.Aux != s { 25402 break 25403 } 25404 if p != x0.Args[0] { 25405 break 25406 } 25407 if idx != x0.Args[1] { 25408 break 25409 } 25410 if mem != x0.Args[2] { 25411 break 25412 } 25413 y := or.Args[1] 25414 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25415 break 25416 } 25417 b = mergePoint(b, x0, x1) 25418 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25419 v.reset(OpCopy) 25420 v.AddArg(v0) 25421 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25422 v1.AuxInt = j0 25423 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25424 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25425 v3.AuxInt = i0 25426 v3.Aux = s 25427 v3.AddArg(p) 25428 v3.AddArg(idx) 25429 v3.AddArg(mem) 25430 v2.AddArg(v3) 25431 v1.AddArg(v2) 25432 v0.AddArg(v1) 25433 v0.AddArg(y) 25434 return true 25435 } 25436 return false 25437 } 25438 func rewriteValueS390X_OpS390XOR_120(v *Value) bool { 25439 b := v.Block 25440 _ = b 25441 types := &b.Func.Config.Types 25442 _ = types 25443 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) 25444 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25445 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25446 for { 25447 s1 := v.Args[0] 25448 if s1.Op != OpS390XSLDconst { 25449 break 25450 } 25451 j1 := s1.AuxInt 25452 x1 := s1.Args[0] 25453 if x1.Op != OpS390XMOVBZloadidx { 25454 break 25455 } 25456 i1 := x1.AuxInt 25457 s := x1.Aux 25458 idx := x1.Args[0] 25459 p := x1.Args[1] 25460 mem := x1.Args[2] 25461 or := v.Args[1] 25462 if or.Op != OpS390XOR { 25463 break 25464 } 25465 s0 := or.Args[0] 25466 if s0.Op != OpS390XSLDconst { 25467 break 25468 } 25469 j0 := s0.AuxInt 25470 x0 := s0.Args[0] 25471 if x0.Op != OpS390XMOVBZloadidx { 25472 break 25473 } 25474 i0 := x0.AuxInt 25475 if x0.Aux != s { 25476 break 25477 } 25478 if p != x0.Args[0] { 25479 break 25480 } 25481 if idx != x0.Args[1] { 25482 break 25483 } 25484 if mem != x0.Args[2] { 25485 break 25486 } 25487 y := or.Args[1] 25488 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25489 break 25490 } 25491 b = mergePoint(b, x0, x1) 25492 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25493 v.reset(OpCopy) 25494 v.AddArg(v0) 25495 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25496 v1.AuxInt = j0 25497 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25498 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25499 v3.AuxInt = i0 25500 v3.Aux = s 25501 v3.AddArg(p) 25502 v3.AddArg(idx) 25503 v3.AddArg(mem) 25504 v2.AddArg(v3) 25505 v1.AddArg(v2) 25506 v0.AddArg(v1) 25507 v0.AddArg(y) 25508 return true 25509 } 25510 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) 25511 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25512 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25513 for { 25514 s1 := v.Args[0] 25515 if s1.Op != OpS390XSLDconst { 25516 break 25517 } 25518 j1 := s1.AuxInt 25519 x1 := s1.Args[0] 25520 if x1.Op != OpS390XMOVBZloadidx { 25521 break 25522 } 25523 i1 := x1.AuxInt 25524 s := x1.Aux 25525 p := x1.Args[0] 25526 idx := x1.Args[1] 25527 mem := x1.Args[2] 25528 or := v.Args[1] 25529 if or.Op != OpS390XOR { 25530 break 25531 } 25532 s0 := or.Args[0] 25533 if s0.Op != OpS390XSLDconst { 25534 break 25535 } 25536 j0 := s0.AuxInt 25537 x0 := s0.Args[0] 25538 if x0.Op != OpS390XMOVBZloadidx { 25539 break 25540 } 25541 i0 := x0.AuxInt 25542 if x0.Aux != s { 25543 break 25544 } 25545 if idx != x0.Args[0] { 25546 break 25547 } 25548 if p != x0.Args[1] { 25549 break 25550 } 25551 if mem != x0.Args[2] { 25552 break 25553 } 25554 y := or.Args[1] 25555 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25556 break 25557 } 25558 b = mergePoint(b, x0, x1) 25559 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25560 v.reset(OpCopy) 25561 v.AddArg(v0) 25562 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25563 v1.AuxInt = j0 25564 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25565 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25566 v3.AuxInt = i0 25567 v3.Aux = s 25568 v3.AddArg(p) 25569 v3.AddArg(idx) 25570 v3.AddArg(mem) 25571 v2.AddArg(v3) 25572 v1.AddArg(v2) 25573 v0.AddArg(v1) 25574 v0.AddArg(y) 25575 return true 25576 } 25577 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) 25578 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25579 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25580 for { 25581 s1 := v.Args[0] 25582 if s1.Op != OpS390XSLDconst { 25583 break 25584 } 25585 j1 := s1.AuxInt 25586 x1 := s1.Args[0] 25587 if x1.Op != OpS390XMOVBZloadidx { 25588 break 25589 } 25590 i1 := x1.AuxInt 25591 s := x1.Aux 25592 idx := x1.Args[0] 25593 p := x1.Args[1] 25594 mem := x1.Args[2] 25595 or := v.Args[1] 25596 if or.Op != OpS390XOR { 25597 break 25598 } 25599 s0 := or.Args[0] 25600 if s0.Op != OpS390XSLDconst { 25601 break 25602 } 25603 j0 := s0.AuxInt 25604 x0 := s0.Args[0] 25605 if x0.Op != OpS390XMOVBZloadidx { 25606 break 25607 } 25608 i0 := x0.AuxInt 25609 if x0.Aux != s { 25610 break 25611 } 25612 if idx != x0.Args[0] { 25613 break 25614 } 25615 if p != x0.Args[1] { 25616 break 25617 } 25618 if mem != x0.Args[2] { 25619 break 25620 } 25621 y := or.Args[1] 25622 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25623 break 25624 } 25625 b = mergePoint(b, x0, x1) 25626 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25627 v.reset(OpCopy) 25628 v.AddArg(v0) 25629 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25630 v1.AuxInt = j0 25631 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25632 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25633 v3.AuxInt = i0 25634 v3.Aux = s 25635 v3.AddArg(p) 25636 v3.AddArg(idx) 25637 v3.AddArg(mem) 25638 v2.AddArg(v3) 25639 v1.AddArg(v2) 25640 v0.AddArg(v1) 25641 v0.AddArg(y) 25642 return true 25643 } 25644 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) 25645 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25646 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25647 for { 25648 s1 := v.Args[0] 25649 if s1.Op != OpS390XSLDconst { 25650 break 25651 } 25652 j1 := s1.AuxInt 25653 x1 := s1.Args[0] 25654 if x1.Op != OpS390XMOVBZloadidx { 25655 break 25656 } 25657 i1 := x1.AuxInt 25658 s := x1.Aux 25659 p := x1.Args[0] 25660 idx := x1.Args[1] 25661 mem := x1.Args[2] 25662 or := v.Args[1] 25663 if or.Op != OpS390XOR { 25664 break 25665 } 25666 y := or.Args[0] 25667 s0 := or.Args[1] 25668 if s0.Op != OpS390XSLDconst { 25669 break 25670 } 25671 j0 := s0.AuxInt 25672 x0 := s0.Args[0] 25673 if x0.Op != OpS390XMOVBZloadidx { 25674 break 25675 } 25676 i0 := x0.AuxInt 25677 if x0.Aux != s { 25678 break 25679 } 25680 if p != x0.Args[0] { 25681 break 25682 } 25683 if idx != x0.Args[1] { 25684 break 25685 } 25686 if mem != x0.Args[2] { 25687 break 25688 } 25689 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25690 break 25691 } 25692 b = mergePoint(b, x0, x1) 25693 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25694 v.reset(OpCopy) 25695 v.AddArg(v0) 25696 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25697 v1.AuxInt = j0 25698 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25699 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25700 v3.AuxInt = i0 25701 v3.Aux = s 25702 v3.AddArg(p) 25703 v3.AddArg(idx) 25704 v3.AddArg(mem) 25705 v2.AddArg(v3) 25706 v1.AddArg(v2) 25707 v0.AddArg(v1) 25708 v0.AddArg(y) 25709 return true 25710 } 25711 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) 25712 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25713 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25714 for { 25715 s1 := v.Args[0] 25716 if s1.Op != OpS390XSLDconst { 25717 break 25718 } 25719 j1 := s1.AuxInt 25720 x1 := s1.Args[0] 25721 if x1.Op != OpS390XMOVBZloadidx { 25722 break 25723 } 25724 i1 := x1.AuxInt 25725 s := x1.Aux 25726 idx := x1.Args[0] 25727 p := x1.Args[1] 25728 mem := x1.Args[2] 25729 or := v.Args[1] 25730 if or.Op != OpS390XOR { 25731 break 25732 } 25733 y := or.Args[0] 25734 s0 := or.Args[1] 25735 if s0.Op != OpS390XSLDconst { 25736 break 25737 } 25738 j0 := s0.AuxInt 25739 x0 := s0.Args[0] 25740 if x0.Op != OpS390XMOVBZloadidx { 25741 break 25742 } 25743 i0 := x0.AuxInt 25744 if x0.Aux != s { 25745 break 25746 } 25747 if p != x0.Args[0] { 25748 break 25749 } 25750 if idx != x0.Args[1] { 25751 break 25752 } 25753 if mem != x0.Args[2] { 25754 break 25755 } 25756 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25757 break 25758 } 25759 b = mergePoint(b, x0, x1) 25760 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25761 v.reset(OpCopy) 25762 v.AddArg(v0) 25763 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25764 v1.AuxInt = j0 25765 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25766 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25767 v3.AuxInt = i0 25768 v3.Aux = s 25769 v3.AddArg(p) 25770 v3.AddArg(idx) 25771 v3.AddArg(mem) 25772 v2.AddArg(v3) 25773 v1.AddArg(v2) 25774 v0.AddArg(v1) 25775 v0.AddArg(y) 25776 return true 25777 } 25778 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) 25779 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25780 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25781 for { 25782 s1 := v.Args[0] 25783 if s1.Op != OpS390XSLDconst { 25784 break 25785 } 25786 j1 := s1.AuxInt 25787 x1 := s1.Args[0] 25788 if x1.Op != OpS390XMOVBZloadidx { 25789 break 25790 } 25791 i1 := x1.AuxInt 25792 s := x1.Aux 25793 p := x1.Args[0] 25794 idx := x1.Args[1] 25795 mem := x1.Args[2] 25796 or := v.Args[1] 25797 if or.Op != OpS390XOR { 25798 break 25799 } 25800 y := or.Args[0] 25801 s0 := or.Args[1] 25802 if s0.Op != OpS390XSLDconst { 25803 break 25804 } 25805 j0 := s0.AuxInt 25806 x0 := s0.Args[0] 25807 if x0.Op != OpS390XMOVBZloadidx { 25808 break 25809 } 25810 i0 := x0.AuxInt 25811 if x0.Aux != s { 25812 break 25813 } 25814 if idx != x0.Args[0] { 25815 break 25816 } 25817 if p != x0.Args[1] { 25818 break 25819 } 25820 if mem != x0.Args[2] { 25821 break 25822 } 25823 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25824 break 25825 } 25826 b = mergePoint(b, x0, x1) 25827 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25828 v.reset(OpCopy) 25829 v.AddArg(v0) 25830 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25831 v1.AuxInt = j0 25832 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25833 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25834 v3.AuxInt = i0 25835 v3.Aux = s 25836 v3.AddArg(p) 25837 v3.AddArg(idx) 25838 v3.AddArg(mem) 25839 v2.AddArg(v3) 25840 v1.AddArg(v2) 25841 v0.AddArg(v1) 25842 v0.AddArg(y) 25843 return true 25844 } 25845 // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) 25846 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25847 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25848 for { 25849 s1 := v.Args[0] 25850 if s1.Op != OpS390XSLDconst { 25851 break 25852 } 25853 j1 := s1.AuxInt 25854 x1 := s1.Args[0] 25855 if x1.Op != OpS390XMOVBZloadidx { 25856 break 25857 } 25858 i1 := x1.AuxInt 25859 s := x1.Aux 25860 idx := x1.Args[0] 25861 p := x1.Args[1] 25862 mem := x1.Args[2] 25863 or := v.Args[1] 25864 if or.Op != OpS390XOR { 25865 break 25866 } 25867 y := or.Args[0] 25868 s0 := or.Args[1] 25869 if s0.Op != OpS390XSLDconst { 25870 break 25871 } 25872 j0 := s0.AuxInt 25873 x0 := s0.Args[0] 25874 if x0.Op != OpS390XMOVBZloadidx { 25875 break 25876 } 25877 i0 := x0.AuxInt 25878 if x0.Aux != s { 25879 break 25880 } 25881 if idx != x0.Args[0] { 25882 break 25883 } 25884 if p != x0.Args[1] { 25885 break 25886 } 25887 if mem != x0.Args[2] { 25888 break 25889 } 25890 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25891 break 25892 } 25893 b = mergePoint(b, x0, x1) 25894 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25895 v.reset(OpCopy) 25896 v.AddArg(v0) 25897 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25898 v1.AuxInt = j0 25899 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25900 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25901 v3.AuxInt = i0 25902 v3.Aux = s 25903 v3.AddArg(p) 25904 v3.AddArg(idx) 25905 v3.AddArg(mem) 25906 v2.AddArg(v3) 25907 v1.AddArg(v2) 25908 v0.AddArg(v1) 25909 v0.AddArg(y) 25910 return true 25911 } 25912 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25913 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25914 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25915 for { 25916 or := v.Args[0] 25917 if or.Op != OpS390XOR { 25918 break 25919 } 25920 s0 := or.Args[0] 25921 if s0.Op != OpS390XSLDconst { 25922 break 25923 } 25924 j0 := s0.AuxInt 25925 x0 := s0.Args[0] 25926 if x0.Op != OpS390XMOVBZloadidx { 25927 break 25928 } 25929 i0 := x0.AuxInt 25930 s := x0.Aux 25931 p := x0.Args[0] 25932 idx := x0.Args[1] 25933 mem := x0.Args[2] 25934 y := or.Args[1] 25935 s1 := v.Args[1] 25936 if s1.Op != OpS390XSLDconst { 25937 break 25938 } 25939 j1 := s1.AuxInt 25940 x1 := s1.Args[0] 25941 if x1.Op != OpS390XMOVBZloadidx { 25942 break 25943 } 25944 i1 := x1.AuxInt 25945 if x1.Aux != s { 25946 break 25947 } 25948 if p != x1.Args[0] { 25949 break 25950 } 25951 if idx != x1.Args[1] { 25952 break 25953 } 25954 if mem != x1.Args[2] { 25955 break 25956 } 25957 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 25958 break 25959 } 25960 b = mergePoint(b, x0, x1) 25961 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 25962 v.reset(OpCopy) 25963 v.AddArg(v0) 25964 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 25965 v1.AuxInt = j0 25966 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 25967 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 25968 v3.AuxInt = i0 25969 v3.Aux = s 25970 v3.AddArg(p) 25971 v3.AddArg(idx) 25972 v3.AddArg(mem) 25973 v2.AddArg(v3) 25974 v1.AddArg(v2) 25975 v0.AddArg(v1) 25976 v0.AddArg(y) 25977 return true 25978 } 25979 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 25980 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 25981 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 25982 for { 25983 or := v.Args[0] 25984 if or.Op != OpS390XOR { 25985 break 25986 } 25987 s0 := or.Args[0] 25988 if s0.Op != OpS390XSLDconst { 25989 break 25990 } 25991 j0 := s0.AuxInt 25992 x0 := s0.Args[0] 25993 if x0.Op != OpS390XMOVBZloadidx { 25994 break 25995 } 25996 i0 := x0.AuxInt 25997 s := x0.Aux 25998 idx := x0.Args[0] 25999 p := x0.Args[1] 26000 mem := x0.Args[2] 26001 y := or.Args[1] 26002 s1 := v.Args[1] 26003 if s1.Op != OpS390XSLDconst { 26004 break 26005 } 26006 j1 := s1.AuxInt 26007 x1 := s1.Args[0] 26008 if x1.Op != OpS390XMOVBZloadidx { 26009 break 26010 } 26011 i1 := x1.AuxInt 26012 if x1.Aux != s { 26013 break 26014 } 26015 if p != x1.Args[0] { 26016 break 26017 } 26018 if idx != x1.Args[1] { 26019 break 26020 } 26021 if mem != x1.Args[2] { 26022 break 26023 } 26024 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26025 break 26026 } 26027 b = mergePoint(b, x0, x1) 26028 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26029 v.reset(OpCopy) 26030 v.AddArg(v0) 26031 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26032 v1.AuxInt = j0 26033 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26034 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26035 v3.AuxInt = i0 26036 v3.Aux = s 26037 v3.AddArg(p) 26038 v3.AddArg(idx) 26039 v3.AddArg(mem) 26040 v2.AddArg(v3) 26041 v1.AddArg(v2) 26042 v0.AddArg(v1) 26043 v0.AddArg(y) 26044 return true 26045 } 26046 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 26047 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26048 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26049 for { 26050 or := v.Args[0] 26051 if or.Op != OpS390XOR { 26052 break 26053 } 26054 y := or.Args[0] 26055 s0 := or.Args[1] 26056 if s0.Op != OpS390XSLDconst { 26057 break 26058 } 26059 j0 := s0.AuxInt 26060 x0 := s0.Args[0] 26061 if x0.Op != OpS390XMOVBZloadidx { 26062 break 26063 } 26064 i0 := x0.AuxInt 26065 s := x0.Aux 26066 p := x0.Args[0] 26067 idx := x0.Args[1] 26068 mem := x0.Args[2] 26069 s1 := v.Args[1] 26070 if s1.Op != OpS390XSLDconst { 26071 break 26072 } 26073 j1 := s1.AuxInt 26074 x1 := s1.Args[0] 26075 if x1.Op != OpS390XMOVBZloadidx { 26076 break 26077 } 26078 i1 := x1.AuxInt 26079 if x1.Aux != s { 26080 break 26081 } 26082 if p != x1.Args[0] { 26083 break 26084 } 26085 if idx != x1.Args[1] { 26086 break 26087 } 26088 if mem != x1.Args[2] { 26089 break 26090 } 26091 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26092 break 26093 } 26094 b = mergePoint(b, x0, x1) 26095 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26096 v.reset(OpCopy) 26097 v.AddArg(v0) 26098 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26099 v1.AuxInt = j0 26100 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26101 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26102 v3.AuxInt = i0 26103 v3.Aux = s 26104 v3.AddArg(p) 26105 v3.AddArg(idx) 26106 v3.AddArg(mem) 26107 v2.AddArg(v3) 26108 v1.AddArg(v2) 26109 v0.AddArg(v1) 26110 v0.AddArg(y) 26111 return true 26112 } 26113 return false 26114 } 26115 func rewriteValueS390X_OpS390XOR_130(v *Value) bool { 26116 b := v.Block 26117 _ = b 26118 types := &b.Func.Config.Types 26119 _ = types 26120 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 26121 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26122 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26123 for { 26124 or := v.Args[0] 26125 if or.Op != OpS390XOR { 26126 break 26127 } 26128 y := or.Args[0] 26129 s0 := or.Args[1] 26130 if s0.Op != OpS390XSLDconst { 26131 break 26132 } 26133 j0 := s0.AuxInt 26134 x0 := s0.Args[0] 26135 if x0.Op != OpS390XMOVBZloadidx { 26136 break 26137 } 26138 i0 := x0.AuxInt 26139 s := x0.Aux 26140 idx := x0.Args[0] 26141 p := x0.Args[1] 26142 mem := x0.Args[2] 26143 s1 := v.Args[1] 26144 if s1.Op != OpS390XSLDconst { 26145 break 26146 } 26147 j1 := s1.AuxInt 26148 x1 := s1.Args[0] 26149 if x1.Op != OpS390XMOVBZloadidx { 26150 break 26151 } 26152 i1 := x1.AuxInt 26153 if x1.Aux != s { 26154 break 26155 } 26156 if p != x1.Args[0] { 26157 break 26158 } 26159 if idx != x1.Args[1] { 26160 break 26161 } 26162 if mem != x1.Args[2] { 26163 break 26164 } 26165 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26166 break 26167 } 26168 b = mergePoint(b, x0, x1) 26169 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26170 v.reset(OpCopy) 26171 v.AddArg(v0) 26172 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26173 v1.AuxInt = j0 26174 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26175 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26176 v3.AuxInt = i0 26177 v3.Aux = s 26178 v3.AddArg(p) 26179 v3.AddArg(idx) 26180 v3.AddArg(mem) 26181 v2.AddArg(v3) 26182 v1.AddArg(v2) 26183 v0.AddArg(v1) 26184 v0.AddArg(y) 26185 return true 26186 } 26187 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 26188 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26189 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26190 for { 26191 or := v.Args[0] 26192 if or.Op != OpS390XOR { 26193 break 26194 } 26195 s0 := or.Args[0] 26196 if s0.Op != OpS390XSLDconst { 26197 break 26198 } 26199 j0 := s0.AuxInt 26200 x0 := s0.Args[0] 26201 if x0.Op != OpS390XMOVBZloadidx { 26202 break 26203 } 26204 i0 := x0.AuxInt 26205 s := x0.Aux 26206 p := x0.Args[0] 26207 idx := x0.Args[1] 26208 mem := x0.Args[2] 26209 y := or.Args[1] 26210 s1 := v.Args[1] 26211 if s1.Op != OpS390XSLDconst { 26212 break 26213 } 26214 j1 := s1.AuxInt 26215 x1 := s1.Args[0] 26216 if x1.Op != OpS390XMOVBZloadidx { 26217 break 26218 } 26219 i1 := x1.AuxInt 26220 if x1.Aux != s { 26221 break 26222 } 26223 if idx != x1.Args[0] { 26224 break 26225 } 26226 if p != x1.Args[1] { 26227 break 26228 } 26229 if mem != x1.Args[2] { 26230 break 26231 } 26232 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26233 break 26234 } 26235 b = mergePoint(b, x0, x1) 26236 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26237 v.reset(OpCopy) 26238 v.AddArg(v0) 26239 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26240 v1.AuxInt = j0 26241 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26242 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26243 v3.AuxInt = i0 26244 v3.Aux = s 26245 v3.AddArg(p) 26246 v3.AddArg(idx) 26247 v3.AddArg(mem) 26248 v2.AddArg(v3) 26249 v1.AddArg(v2) 26250 v0.AddArg(v1) 26251 v0.AddArg(y) 26252 return true 26253 } 26254 // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 26255 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26256 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26257 for { 26258 or := v.Args[0] 26259 if or.Op != OpS390XOR { 26260 break 26261 } 26262 s0 := or.Args[0] 26263 if s0.Op != OpS390XSLDconst { 26264 break 26265 } 26266 j0 := s0.AuxInt 26267 x0 := s0.Args[0] 26268 if x0.Op != OpS390XMOVBZloadidx { 26269 break 26270 } 26271 i0 := x0.AuxInt 26272 s := x0.Aux 26273 idx := x0.Args[0] 26274 p := x0.Args[1] 26275 mem := x0.Args[2] 26276 y := or.Args[1] 26277 s1 := v.Args[1] 26278 if s1.Op != OpS390XSLDconst { 26279 break 26280 } 26281 j1 := s1.AuxInt 26282 x1 := s1.Args[0] 26283 if x1.Op != OpS390XMOVBZloadidx { 26284 break 26285 } 26286 i1 := x1.AuxInt 26287 if x1.Aux != s { 26288 break 26289 } 26290 if idx != x1.Args[0] { 26291 break 26292 } 26293 if p != x1.Args[1] { 26294 break 26295 } 26296 if mem != x1.Args[2] { 26297 break 26298 } 26299 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26300 break 26301 } 26302 b = mergePoint(b, x0, x1) 26303 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26304 v.reset(OpCopy) 26305 v.AddArg(v0) 26306 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26307 v1.AuxInt = j0 26308 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26309 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26310 v3.AuxInt = i0 26311 v3.Aux = s 26312 v3.AddArg(p) 26313 v3.AddArg(idx) 26314 v3.AddArg(mem) 26315 v2.AddArg(v3) 26316 v1.AddArg(v2) 26317 v0.AddArg(v1) 26318 v0.AddArg(y) 26319 return true 26320 } 26321 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 26322 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26323 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26324 for { 26325 or := v.Args[0] 26326 if or.Op != OpS390XOR { 26327 break 26328 } 26329 y := or.Args[0] 26330 s0 := or.Args[1] 26331 if s0.Op != OpS390XSLDconst { 26332 break 26333 } 26334 j0 := s0.AuxInt 26335 x0 := s0.Args[0] 26336 if x0.Op != OpS390XMOVBZloadidx { 26337 break 26338 } 26339 i0 := x0.AuxInt 26340 s := x0.Aux 26341 p := x0.Args[0] 26342 idx := x0.Args[1] 26343 mem := x0.Args[2] 26344 s1 := v.Args[1] 26345 if s1.Op != OpS390XSLDconst { 26346 break 26347 } 26348 j1 := s1.AuxInt 26349 x1 := s1.Args[0] 26350 if x1.Op != OpS390XMOVBZloadidx { 26351 break 26352 } 26353 i1 := x1.AuxInt 26354 if x1.Aux != s { 26355 break 26356 } 26357 if idx != x1.Args[0] { 26358 break 26359 } 26360 if p != x1.Args[1] { 26361 break 26362 } 26363 if mem != x1.Args[2] { 26364 break 26365 } 26366 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26367 break 26368 } 26369 b = mergePoint(b, x0, x1) 26370 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26371 v.reset(OpCopy) 26372 v.AddArg(v0) 26373 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26374 v1.AuxInt = j0 26375 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26376 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26377 v3.AuxInt = i0 26378 v3.Aux = s 26379 v3.AddArg(p) 26380 v3.AddArg(idx) 26381 v3.AddArg(mem) 26382 v2.AddArg(v3) 26383 v1.AddArg(v2) 26384 v0.AddArg(v1) 26385 v0.AddArg(y) 26386 return true 26387 } 26388 // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 26389 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 26390 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 26391 for { 26392 or := v.Args[0] 26393 if or.Op != OpS390XOR { 26394 break 26395 } 26396 y := or.Args[0] 26397 s0 := or.Args[1] 26398 if s0.Op != OpS390XSLDconst { 26399 break 26400 } 26401 j0 := s0.AuxInt 26402 x0 := s0.Args[0] 26403 if x0.Op != OpS390XMOVBZloadidx { 26404 break 26405 } 26406 i0 := x0.AuxInt 26407 s := x0.Aux 26408 idx := x0.Args[0] 26409 p := x0.Args[1] 26410 mem := x0.Args[2] 26411 s1 := v.Args[1] 26412 if s1.Op != OpS390XSLDconst { 26413 break 26414 } 26415 j1 := s1.AuxInt 26416 x1 := s1.Args[0] 26417 if x1.Op != OpS390XMOVBZloadidx { 26418 break 26419 } 26420 i1 := x1.AuxInt 26421 if x1.Aux != s { 26422 break 26423 } 26424 if idx != x1.Args[0] { 26425 break 26426 } 26427 if p != x1.Args[1] { 26428 break 26429 } 26430 if mem != x1.Args[2] { 26431 break 26432 } 26433 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 26434 break 26435 } 26436 b = mergePoint(b, x0, x1) 26437 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26438 v.reset(OpCopy) 26439 v.AddArg(v0) 26440 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26441 v1.AuxInt = j0 26442 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 26443 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 26444 v3.AuxInt = i0 26445 v3.Aux = s 26446 v3.AddArg(p) 26447 v3.AddArg(idx) 26448 v3.AddArg(mem) 26449 v2.AddArg(v3) 26450 v1.AddArg(v2) 26451 v0.AddArg(v1) 26452 v0.AddArg(y) 26453 return true 26454 } 26455 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y)) 26456 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26457 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26458 for { 26459 s1 := v.Args[0] 26460 if s1.Op != OpS390XSLDconst { 26461 break 26462 } 26463 j1 := s1.AuxInt 26464 r1 := s1.Args[0] 26465 if r1.Op != OpS390XMOVHZreg { 26466 break 26467 } 26468 x1 := r1.Args[0] 26469 if x1.Op != OpS390XMOVHBRloadidx { 26470 break 26471 } 26472 i1 := x1.AuxInt 26473 s := x1.Aux 26474 p := x1.Args[0] 26475 idx := x1.Args[1] 26476 mem := x1.Args[2] 26477 or := v.Args[1] 26478 if or.Op != OpS390XOR { 26479 break 26480 } 26481 s0 := or.Args[0] 26482 if s0.Op != OpS390XSLDconst { 26483 break 26484 } 26485 j0 := s0.AuxInt 26486 r0 := s0.Args[0] 26487 if r0.Op != OpS390XMOVHZreg { 26488 break 26489 } 26490 x0 := r0.Args[0] 26491 if x0.Op != OpS390XMOVHBRloadidx { 26492 break 26493 } 26494 i0 := x0.AuxInt 26495 if x0.Aux != s { 26496 break 26497 } 26498 if p != x0.Args[0] { 26499 break 26500 } 26501 if idx != x0.Args[1] { 26502 break 26503 } 26504 if mem != x0.Args[2] { 26505 break 26506 } 26507 y := or.Args[1] 26508 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26509 break 26510 } 26511 b = mergePoint(b, x0, x1) 26512 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26513 v.reset(OpCopy) 26514 v.AddArg(v0) 26515 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26516 v1.AuxInt = j0 26517 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26518 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26519 v3.AuxInt = i0 26520 v3.Aux = s 26521 v3.AddArg(p) 26522 v3.AddArg(idx) 26523 v3.AddArg(mem) 26524 v2.AddArg(v3) 26525 v1.AddArg(v2) 26526 v0.AddArg(v1) 26527 v0.AddArg(y) 26528 return true 26529 } 26530 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y)) 26531 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26532 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26533 for { 26534 s1 := v.Args[0] 26535 if s1.Op != OpS390XSLDconst { 26536 break 26537 } 26538 j1 := s1.AuxInt 26539 r1 := s1.Args[0] 26540 if r1.Op != OpS390XMOVHZreg { 26541 break 26542 } 26543 x1 := r1.Args[0] 26544 if x1.Op != OpS390XMOVHBRloadidx { 26545 break 26546 } 26547 i1 := x1.AuxInt 26548 s := x1.Aux 26549 idx := x1.Args[0] 26550 p := x1.Args[1] 26551 mem := x1.Args[2] 26552 or := v.Args[1] 26553 if or.Op != OpS390XOR { 26554 break 26555 } 26556 s0 := or.Args[0] 26557 if s0.Op != OpS390XSLDconst { 26558 break 26559 } 26560 j0 := s0.AuxInt 26561 r0 := s0.Args[0] 26562 if r0.Op != OpS390XMOVHZreg { 26563 break 26564 } 26565 x0 := r0.Args[0] 26566 if x0.Op != OpS390XMOVHBRloadidx { 26567 break 26568 } 26569 i0 := x0.AuxInt 26570 if x0.Aux != s { 26571 break 26572 } 26573 if p != x0.Args[0] { 26574 break 26575 } 26576 if idx != x0.Args[1] { 26577 break 26578 } 26579 if mem != x0.Args[2] { 26580 break 26581 } 26582 y := or.Args[1] 26583 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26584 break 26585 } 26586 b = mergePoint(b, x0, x1) 26587 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26588 v.reset(OpCopy) 26589 v.AddArg(v0) 26590 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26591 v1.AuxInt = j0 26592 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26593 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26594 v3.AuxInt = i0 26595 v3.Aux = s 26596 v3.AddArg(p) 26597 v3.AddArg(idx) 26598 v3.AddArg(mem) 26599 v2.AddArg(v3) 26600 v1.AddArg(v2) 26601 v0.AddArg(v1) 26602 v0.AddArg(y) 26603 return true 26604 } 26605 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y)) 26606 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26607 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26608 for { 26609 s1 := v.Args[0] 26610 if s1.Op != OpS390XSLDconst { 26611 break 26612 } 26613 j1 := s1.AuxInt 26614 r1 := s1.Args[0] 26615 if r1.Op != OpS390XMOVHZreg { 26616 break 26617 } 26618 x1 := r1.Args[0] 26619 if x1.Op != OpS390XMOVHBRloadidx { 26620 break 26621 } 26622 i1 := x1.AuxInt 26623 s := x1.Aux 26624 p := x1.Args[0] 26625 idx := x1.Args[1] 26626 mem := x1.Args[2] 26627 or := v.Args[1] 26628 if or.Op != OpS390XOR { 26629 break 26630 } 26631 s0 := or.Args[0] 26632 if s0.Op != OpS390XSLDconst { 26633 break 26634 } 26635 j0 := s0.AuxInt 26636 r0 := s0.Args[0] 26637 if r0.Op != OpS390XMOVHZreg { 26638 break 26639 } 26640 x0 := r0.Args[0] 26641 if x0.Op != OpS390XMOVHBRloadidx { 26642 break 26643 } 26644 i0 := x0.AuxInt 26645 if x0.Aux != s { 26646 break 26647 } 26648 if idx != x0.Args[0] { 26649 break 26650 } 26651 if p != x0.Args[1] { 26652 break 26653 } 26654 if mem != x0.Args[2] { 26655 break 26656 } 26657 y := or.Args[1] 26658 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26659 break 26660 } 26661 b = mergePoint(b, x0, x1) 26662 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26663 v.reset(OpCopy) 26664 v.AddArg(v0) 26665 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26666 v1.AuxInt = j0 26667 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26668 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26669 v3.AuxInt = i0 26670 v3.Aux = s 26671 v3.AddArg(p) 26672 v3.AddArg(idx) 26673 v3.AddArg(mem) 26674 v2.AddArg(v3) 26675 v1.AddArg(v2) 26676 v0.AddArg(v1) 26677 v0.AddArg(y) 26678 return true 26679 } 26680 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y)) 26681 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26682 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26683 for { 26684 s1 := v.Args[0] 26685 if s1.Op != OpS390XSLDconst { 26686 break 26687 } 26688 j1 := s1.AuxInt 26689 r1 := s1.Args[0] 26690 if r1.Op != OpS390XMOVHZreg { 26691 break 26692 } 26693 x1 := r1.Args[0] 26694 if x1.Op != OpS390XMOVHBRloadidx { 26695 break 26696 } 26697 i1 := x1.AuxInt 26698 s := x1.Aux 26699 idx := x1.Args[0] 26700 p := x1.Args[1] 26701 mem := x1.Args[2] 26702 or := v.Args[1] 26703 if or.Op != OpS390XOR { 26704 break 26705 } 26706 s0 := or.Args[0] 26707 if s0.Op != OpS390XSLDconst { 26708 break 26709 } 26710 j0 := s0.AuxInt 26711 r0 := s0.Args[0] 26712 if r0.Op != OpS390XMOVHZreg { 26713 break 26714 } 26715 x0 := r0.Args[0] 26716 if x0.Op != OpS390XMOVHBRloadidx { 26717 break 26718 } 26719 i0 := x0.AuxInt 26720 if x0.Aux != s { 26721 break 26722 } 26723 if idx != x0.Args[0] { 26724 break 26725 } 26726 if p != x0.Args[1] { 26727 break 26728 } 26729 if mem != x0.Args[2] { 26730 break 26731 } 26732 y := or.Args[1] 26733 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26734 break 26735 } 26736 b = mergePoint(b, x0, x1) 26737 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26738 v.reset(OpCopy) 26739 v.AddArg(v0) 26740 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26741 v1.AuxInt = j0 26742 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26743 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26744 v3.AuxInt = i0 26745 v3.Aux = s 26746 v3.AddArg(p) 26747 v3.AddArg(idx) 26748 v3.AddArg(mem) 26749 v2.AddArg(v3) 26750 v1.AddArg(v2) 26751 v0.AddArg(v1) 26752 v0.AddArg(y) 26753 return true 26754 } 26755 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))))) 26756 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26757 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26758 for { 26759 s1 := v.Args[0] 26760 if s1.Op != OpS390XSLDconst { 26761 break 26762 } 26763 j1 := s1.AuxInt 26764 r1 := s1.Args[0] 26765 if r1.Op != OpS390XMOVHZreg { 26766 break 26767 } 26768 x1 := r1.Args[0] 26769 if x1.Op != OpS390XMOVHBRloadidx { 26770 break 26771 } 26772 i1 := x1.AuxInt 26773 s := x1.Aux 26774 p := x1.Args[0] 26775 idx := x1.Args[1] 26776 mem := x1.Args[2] 26777 or := v.Args[1] 26778 if or.Op != OpS390XOR { 26779 break 26780 } 26781 y := or.Args[0] 26782 s0 := or.Args[1] 26783 if s0.Op != OpS390XSLDconst { 26784 break 26785 } 26786 j0 := s0.AuxInt 26787 r0 := s0.Args[0] 26788 if r0.Op != OpS390XMOVHZreg { 26789 break 26790 } 26791 x0 := r0.Args[0] 26792 if x0.Op != OpS390XMOVHBRloadidx { 26793 break 26794 } 26795 i0 := x0.AuxInt 26796 if x0.Aux != s { 26797 break 26798 } 26799 if p != x0.Args[0] { 26800 break 26801 } 26802 if idx != x0.Args[1] { 26803 break 26804 } 26805 if mem != x0.Args[2] { 26806 break 26807 } 26808 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26809 break 26810 } 26811 b = mergePoint(b, x0, x1) 26812 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26813 v.reset(OpCopy) 26814 v.AddArg(v0) 26815 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26816 v1.AuxInt = j0 26817 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26818 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26819 v3.AuxInt = i0 26820 v3.Aux = s 26821 v3.AddArg(p) 26822 v3.AddArg(idx) 26823 v3.AddArg(mem) 26824 v2.AddArg(v3) 26825 v1.AddArg(v2) 26826 v0.AddArg(v1) 26827 v0.AddArg(y) 26828 return true 26829 } 26830 return false 26831 } 26832 func rewriteValueS390X_OpS390XOR_140(v *Value) bool { 26833 b := v.Block 26834 _ = b 26835 types := &b.Func.Config.Types 26836 _ = types 26837 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))))) 26838 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26839 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26840 for { 26841 s1 := v.Args[0] 26842 if s1.Op != OpS390XSLDconst { 26843 break 26844 } 26845 j1 := s1.AuxInt 26846 r1 := s1.Args[0] 26847 if r1.Op != OpS390XMOVHZreg { 26848 break 26849 } 26850 x1 := r1.Args[0] 26851 if x1.Op != OpS390XMOVHBRloadidx { 26852 break 26853 } 26854 i1 := x1.AuxInt 26855 s := x1.Aux 26856 idx := x1.Args[0] 26857 p := x1.Args[1] 26858 mem := x1.Args[2] 26859 or := v.Args[1] 26860 if or.Op != OpS390XOR { 26861 break 26862 } 26863 y := or.Args[0] 26864 s0 := or.Args[1] 26865 if s0.Op != OpS390XSLDconst { 26866 break 26867 } 26868 j0 := s0.AuxInt 26869 r0 := s0.Args[0] 26870 if r0.Op != OpS390XMOVHZreg { 26871 break 26872 } 26873 x0 := r0.Args[0] 26874 if x0.Op != OpS390XMOVHBRloadidx { 26875 break 26876 } 26877 i0 := x0.AuxInt 26878 if x0.Aux != s { 26879 break 26880 } 26881 if p != x0.Args[0] { 26882 break 26883 } 26884 if idx != x0.Args[1] { 26885 break 26886 } 26887 if mem != x0.Args[2] { 26888 break 26889 } 26890 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26891 break 26892 } 26893 b = mergePoint(b, x0, x1) 26894 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26895 v.reset(OpCopy) 26896 v.AddArg(v0) 26897 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26898 v1.AuxInt = j0 26899 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26900 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26901 v3.AuxInt = i0 26902 v3.Aux = s 26903 v3.AddArg(p) 26904 v3.AddArg(idx) 26905 v3.AddArg(mem) 26906 v2.AddArg(v3) 26907 v1.AddArg(v2) 26908 v0.AddArg(v1) 26909 v0.AddArg(y) 26910 return true 26911 } 26912 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))))) 26913 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26914 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26915 for { 26916 s1 := v.Args[0] 26917 if s1.Op != OpS390XSLDconst { 26918 break 26919 } 26920 j1 := s1.AuxInt 26921 r1 := s1.Args[0] 26922 if r1.Op != OpS390XMOVHZreg { 26923 break 26924 } 26925 x1 := r1.Args[0] 26926 if x1.Op != OpS390XMOVHBRloadidx { 26927 break 26928 } 26929 i1 := x1.AuxInt 26930 s := x1.Aux 26931 p := x1.Args[0] 26932 idx := x1.Args[1] 26933 mem := x1.Args[2] 26934 or := v.Args[1] 26935 if or.Op != OpS390XOR { 26936 break 26937 } 26938 y := or.Args[0] 26939 s0 := or.Args[1] 26940 if s0.Op != OpS390XSLDconst { 26941 break 26942 } 26943 j0 := s0.AuxInt 26944 r0 := s0.Args[0] 26945 if r0.Op != OpS390XMOVHZreg { 26946 break 26947 } 26948 x0 := r0.Args[0] 26949 if x0.Op != OpS390XMOVHBRloadidx { 26950 break 26951 } 26952 i0 := x0.AuxInt 26953 if x0.Aux != s { 26954 break 26955 } 26956 if idx != x0.Args[0] { 26957 break 26958 } 26959 if p != x0.Args[1] { 26960 break 26961 } 26962 if mem != x0.Args[2] { 26963 break 26964 } 26965 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 26966 break 26967 } 26968 b = mergePoint(b, x0, x1) 26969 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 26970 v.reset(OpCopy) 26971 v.AddArg(v0) 26972 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 26973 v1.AuxInt = j0 26974 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 26975 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 26976 v3.AuxInt = i0 26977 v3.Aux = s 26978 v3.AddArg(p) 26979 v3.AddArg(idx) 26980 v3.AddArg(mem) 26981 v2.AddArg(v3) 26982 v1.AddArg(v2) 26983 v0.AddArg(v1) 26984 v0.AddArg(y) 26985 return true 26986 } 26987 // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))))) 26988 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 26989 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 26990 for { 26991 s1 := v.Args[0] 26992 if s1.Op != OpS390XSLDconst { 26993 break 26994 } 26995 j1 := s1.AuxInt 26996 r1 := s1.Args[0] 26997 if r1.Op != OpS390XMOVHZreg { 26998 break 26999 } 27000 x1 := r1.Args[0] 27001 if x1.Op != OpS390XMOVHBRloadidx { 27002 break 27003 } 27004 i1 := x1.AuxInt 27005 s := x1.Aux 27006 idx := x1.Args[0] 27007 p := x1.Args[1] 27008 mem := x1.Args[2] 27009 or := v.Args[1] 27010 if or.Op != OpS390XOR { 27011 break 27012 } 27013 y := or.Args[0] 27014 s0 := or.Args[1] 27015 if s0.Op != OpS390XSLDconst { 27016 break 27017 } 27018 j0 := s0.AuxInt 27019 r0 := s0.Args[0] 27020 if r0.Op != OpS390XMOVHZreg { 27021 break 27022 } 27023 x0 := r0.Args[0] 27024 if x0.Op != OpS390XMOVHBRloadidx { 27025 break 27026 } 27027 i0 := x0.AuxInt 27028 if x0.Aux != s { 27029 break 27030 } 27031 if idx != x0.Args[0] { 27032 break 27033 } 27034 if p != x0.Args[1] { 27035 break 27036 } 27037 if mem != x0.Args[2] { 27038 break 27039 } 27040 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27041 break 27042 } 27043 b = mergePoint(b, x0, x1) 27044 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27045 v.reset(OpCopy) 27046 v.AddArg(v0) 27047 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27048 v1.AuxInt = j0 27049 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27050 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27051 v3.AuxInt = i0 27052 v3.Aux = s 27053 v3.AddArg(p) 27054 v3.AddArg(idx) 27055 v3.AddArg(mem) 27056 v2.AddArg(v3) 27057 v1.AddArg(v2) 27058 v0.AddArg(v1) 27059 v0.AddArg(y) 27060 return true 27061 } 27062 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 27063 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27064 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27065 for { 27066 or := v.Args[0] 27067 if or.Op != OpS390XOR { 27068 break 27069 } 27070 s0 := or.Args[0] 27071 if s0.Op != OpS390XSLDconst { 27072 break 27073 } 27074 j0 := s0.AuxInt 27075 r0 := s0.Args[0] 27076 if r0.Op != OpS390XMOVHZreg { 27077 break 27078 } 27079 x0 := r0.Args[0] 27080 if x0.Op != OpS390XMOVHBRloadidx { 27081 break 27082 } 27083 i0 := x0.AuxInt 27084 s := x0.Aux 27085 p := x0.Args[0] 27086 idx := x0.Args[1] 27087 mem := x0.Args[2] 27088 y := or.Args[1] 27089 s1 := v.Args[1] 27090 if s1.Op != OpS390XSLDconst { 27091 break 27092 } 27093 j1 := s1.AuxInt 27094 r1 := s1.Args[0] 27095 if r1.Op != OpS390XMOVHZreg { 27096 break 27097 } 27098 x1 := r1.Args[0] 27099 if x1.Op != OpS390XMOVHBRloadidx { 27100 break 27101 } 27102 i1 := x1.AuxInt 27103 if x1.Aux != s { 27104 break 27105 } 27106 if p != x1.Args[0] { 27107 break 27108 } 27109 if idx != x1.Args[1] { 27110 break 27111 } 27112 if mem != x1.Args[2] { 27113 break 27114 } 27115 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27116 break 27117 } 27118 b = mergePoint(b, x0, x1) 27119 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27120 v.reset(OpCopy) 27121 v.AddArg(v0) 27122 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27123 v1.AuxInt = j0 27124 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27125 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27126 v3.AuxInt = i0 27127 v3.Aux = s 27128 v3.AddArg(p) 27129 v3.AddArg(idx) 27130 v3.AddArg(mem) 27131 v2.AddArg(v3) 27132 v1.AddArg(v2) 27133 v0.AddArg(v1) 27134 v0.AddArg(y) 27135 return true 27136 } 27137 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 27138 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27139 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27140 for { 27141 or := v.Args[0] 27142 if or.Op != OpS390XOR { 27143 break 27144 } 27145 s0 := or.Args[0] 27146 if s0.Op != OpS390XSLDconst { 27147 break 27148 } 27149 j0 := s0.AuxInt 27150 r0 := s0.Args[0] 27151 if r0.Op != OpS390XMOVHZreg { 27152 break 27153 } 27154 x0 := r0.Args[0] 27155 if x0.Op != OpS390XMOVHBRloadidx { 27156 break 27157 } 27158 i0 := x0.AuxInt 27159 s := x0.Aux 27160 idx := x0.Args[0] 27161 p := x0.Args[1] 27162 mem := x0.Args[2] 27163 y := or.Args[1] 27164 s1 := v.Args[1] 27165 if s1.Op != OpS390XSLDconst { 27166 break 27167 } 27168 j1 := s1.AuxInt 27169 r1 := s1.Args[0] 27170 if r1.Op != OpS390XMOVHZreg { 27171 break 27172 } 27173 x1 := r1.Args[0] 27174 if x1.Op != OpS390XMOVHBRloadidx { 27175 break 27176 } 27177 i1 := x1.AuxInt 27178 if x1.Aux != s { 27179 break 27180 } 27181 if p != x1.Args[0] { 27182 break 27183 } 27184 if idx != x1.Args[1] { 27185 break 27186 } 27187 if mem != x1.Args[2] { 27188 break 27189 } 27190 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27191 break 27192 } 27193 b = mergePoint(b, x0, x1) 27194 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27195 v.reset(OpCopy) 27196 v.AddArg(v0) 27197 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27198 v1.AuxInt = j0 27199 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27200 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27201 v3.AuxInt = i0 27202 v3.Aux = s 27203 v3.AddArg(p) 27204 v3.AddArg(idx) 27205 v3.AddArg(mem) 27206 v2.AddArg(v3) 27207 v1.AddArg(v2) 27208 v0.AddArg(v1) 27209 v0.AddArg(y) 27210 return true 27211 } 27212 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 27213 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27214 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27215 for { 27216 or := v.Args[0] 27217 if or.Op != OpS390XOR { 27218 break 27219 } 27220 y := or.Args[0] 27221 s0 := or.Args[1] 27222 if s0.Op != OpS390XSLDconst { 27223 break 27224 } 27225 j0 := s0.AuxInt 27226 r0 := s0.Args[0] 27227 if r0.Op != OpS390XMOVHZreg { 27228 break 27229 } 27230 x0 := r0.Args[0] 27231 if x0.Op != OpS390XMOVHBRloadidx { 27232 break 27233 } 27234 i0 := x0.AuxInt 27235 s := x0.Aux 27236 p := x0.Args[0] 27237 idx := x0.Args[1] 27238 mem := x0.Args[2] 27239 s1 := v.Args[1] 27240 if s1.Op != OpS390XSLDconst { 27241 break 27242 } 27243 j1 := s1.AuxInt 27244 r1 := s1.Args[0] 27245 if r1.Op != OpS390XMOVHZreg { 27246 break 27247 } 27248 x1 := r1.Args[0] 27249 if x1.Op != OpS390XMOVHBRloadidx { 27250 break 27251 } 27252 i1 := x1.AuxInt 27253 if x1.Aux != s { 27254 break 27255 } 27256 if p != x1.Args[0] { 27257 break 27258 } 27259 if idx != x1.Args[1] { 27260 break 27261 } 27262 if mem != x1.Args[2] { 27263 break 27264 } 27265 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27266 break 27267 } 27268 b = mergePoint(b, x0, x1) 27269 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27270 v.reset(OpCopy) 27271 v.AddArg(v0) 27272 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27273 v1.AuxInt = j0 27274 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27275 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27276 v3.AuxInt = i0 27277 v3.Aux = s 27278 v3.AddArg(p) 27279 v3.AddArg(idx) 27280 v3.AddArg(mem) 27281 v2.AddArg(v3) 27282 v1.AddArg(v2) 27283 v0.AddArg(v1) 27284 v0.AddArg(y) 27285 return true 27286 } 27287 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 27288 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27289 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27290 for { 27291 or := v.Args[0] 27292 if or.Op != OpS390XOR { 27293 break 27294 } 27295 y := or.Args[0] 27296 s0 := or.Args[1] 27297 if s0.Op != OpS390XSLDconst { 27298 break 27299 } 27300 j0 := s0.AuxInt 27301 r0 := s0.Args[0] 27302 if r0.Op != OpS390XMOVHZreg { 27303 break 27304 } 27305 x0 := r0.Args[0] 27306 if x0.Op != OpS390XMOVHBRloadidx { 27307 break 27308 } 27309 i0 := x0.AuxInt 27310 s := x0.Aux 27311 idx := x0.Args[0] 27312 p := x0.Args[1] 27313 mem := x0.Args[2] 27314 s1 := v.Args[1] 27315 if s1.Op != OpS390XSLDconst { 27316 break 27317 } 27318 j1 := s1.AuxInt 27319 r1 := s1.Args[0] 27320 if r1.Op != OpS390XMOVHZreg { 27321 break 27322 } 27323 x1 := r1.Args[0] 27324 if x1.Op != OpS390XMOVHBRloadidx { 27325 break 27326 } 27327 i1 := x1.AuxInt 27328 if x1.Aux != s { 27329 break 27330 } 27331 if p != x1.Args[0] { 27332 break 27333 } 27334 if idx != x1.Args[1] { 27335 break 27336 } 27337 if mem != x1.Args[2] { 27338 break 27339 } 27340 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27341 break 27342 } 27343 b = mergePoint(b, x0, x1) 27344 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27345 v.reset(OpCopy) 27346 v.AddArg(v0) 27347 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27348 v1.AuxInt = j0 27349 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27350 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27351 v3.AuxInt = i0 27352 v3.Aux = s 27353 v3.AddArg(p) 27354 v3.AddArg(idx) 27355 v3.AddArg(mem) 27356 v2.AddArg(v3) 27357 v1.AddArg(v2) 27358 v0.AddArg(v1) 27359 v0.AddArg(y) 27360 return true 27361 } 27362 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 27363 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27364 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27365 for { 27366 or := v.Args[0] 27367 if or.Op != OpS390XOR { 27368 break 27369 } 27370 s0 := or.Args[0] 27371 if s0.Op != OpS390XSLDconst { 27372 break 27373 } 27374 j0 := s0.AuxInt 27375 r0 := s0.Args[0] 27376 if r0.Op != OpS390XMOVHZreg { 27377 break 27378 } 27379 x0 := r0.Args[0] 27380 if x0.Op != OpS390XMOVHBRloadidx { 27381 break 27382 } 27383 i0 := x0.AuxInt 27384 s := x0.Aux 27385 p := x0.Args[0] 27386 idx := x0.Args[1] 27387 mem := x0.Args[2] 27388 y := or.Args[1] 27389 s1 := v.Args[1] 27390 if s1.Op != OpS390XSLDconst { 27391 break 27392 } 27393 j1 := s1.AuxInt 27394 r1 := s1.Args[0] 27395 if r1.Op != OpS390XMOVHZreg { 27396 break 27397 } 27398 x1 := r1.Args[0] 27399 if x1.Op != OpS390XMOVHBRloadidx { 27400 break 27401 } 27402 i1 := x1.AuxInt 27403 if x1.Aux != s { 27404 break 27405 } 27406 if idx != x1.Args[0] { 27407 break 27408 } 27409 if p != x1.Args[1] { 27410 break 27411 } 27412 if mem != x1.Args[2] { 27413 break 27414 } 27415 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27416 break 27417 } 27418 b = mergePoint(b, x0, x1) 27419 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27420 v.reset(OpCopy) 27421 v.AddArg(v0) 27422 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27423 v1.AuxInt = j0 27424 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27425 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27426 v3.AuxInt = i0 27427 v3.Aux = s 27428 v3.AddArg(p) 27429 v3.AddArg(idx) 27430 v3.AddArg(mem) 27431 v2.AddArg(v3) 27432 v1.AddArg(v2) 27433 v0.AddArg(v1) 27434 v0.AddArg(y) 27435 return true 27436 } 27437 // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 27438 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27439 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27440 for { 27441 or := v.Args[0] 27442 if or.Op != OpS390XOR { 27443 break 27444 } 27445 s0 := or.Args[0] 27446 if s0.Op != OpS390XSLDconst { 27447 break 27448 } 27449 j0 := s0.AuxInt 27450 r0 := s0.Args[0] 27451 if r0.Op != OpS390XMOVHZreg { 27452 break 27453 } 27454 x0 := r0.Args[0] 27455 if x0.Op != OpS390XMOVHBRloadidx { 27456 break 27457 } 27458 i0 := x0.AuxInt 27459 s := x0.Aux 27460 idx := x0.Args[0] 27461 p := x0.Args[1] 27462 mem := x0.Args[2] 27463 y := or.Args[1] 27464 s1 := v.Args[1] 27465 if s1.Op != OpS390XSLDconst { 27466 break 27467 } 27468 j1 := s1.AuxInt 27469 r1 := s1.Args[0] 27470 if r1.Op != OpS390XMOVHZreg { 27471 break 27472 } 27473 x1 := r1.Args[0] 27474 if x1.Op != OpS390XMOVHBRloadidx { 27475 break 27476 } 27477 i1 := x1.AuxInt 27478 if x1.Aux != s { 27479 break 27480 } 27481 if idx != x1.Args[0] { 27482 break 27483 } 27484 if p != x1.Args[1] { 27485 break 27486 } 27487 if mem != x1.Args[2] { 27488 break 27489 } 27490 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27491 break 27492 } 27493 b = mergePoint(b, x0, x1) 27494 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27495 v.reset(OpCopy) 27496 v.AddArg(v0) 27497 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27498 v1.AuxInt = j0 27499 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27500 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27501 v3.AuxInt = i0 27502 v3.Aux = s 27503 v3.AddArg(p) 27504 v3.AddArg(idx) 27505 v3.AddArg(mem) 27506 v2.AddArg(v3) 27507 v1.AddArg(v2) 27508 v0.AddArg(v1) 27509 v0.AddArg(y) 27510 return true 27511 } 27512 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 27513 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27514 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27515 for { 27516 or := v.Args[0] 27517 if or.Op != OpS390XOR { 27518 break 27519 } 27520 y := or.Args[0] 27521 s0 := or.Args[1] 27522 if s0.Op != OpS390XSLDconst { 27523 break 27524 } 27525 j0 := s0.AuxInt 27526 r0 := s0.Args[0] 27527 if r0.Op != OpS390XMOVHZreg { 27528 break 27529 } 27530 x0 := r0.Args[0] 27531 if x0.Op != OpS390XMOVHBRloadidx { 27532 break 27533 } 27534 i0 := x0.AuxInt 27535 s := x0.Aux 27536 p := x0.Args[0] 27537 idx := x0.Args[1] 27538 mem := x0.Args[2] 27539 s1 := v.Args[1] 27540 if s1.Op != OpS390XSLDconst { 27541 break 27542 } 27543 j1 := s1.AuxInt 27544 r1 := s1.Args[0] 27545 if r1.Op != OpS390XMOVHZreg { 27546 break 27547 } 27548 x1 := r1.Args[0] 27549 if x1.Op != OpS390XMOVHBRloadidx { 27550 break 27551 } 27552 i1 := x1.AuxInt 27553 if x1.Aux != s { 27554 break 27555 } 27556 if idx != x1.Args[0] { 27557 break 27558 } 27559 if p != x1.Args[1] { 27560 break 27561 } 27562 if mem != x1.Args[2] { 27563 break 27564 } 27565 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27566 break 27567 } 27568 b = mergePoint(b, x0, x1) 27569 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27570 v.reset(OpCopy) 27571 v.AddArg(v0) 27572 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27573 v1.AuxInt = j0 27574 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27575 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27576 v3.AuxInt = i0 27577 v3.Aux = s 27578 v3.AddArg(p) 27579 v3.AddArg(idx) 27580 v3.AddArg(mem) 27581 v2.AddArg(v3) 27582 v1.AddArg(v2) 27583 v0.AddArg(v1) 27584 v0.AddArg(y) 27585 return true 27586 } 27587 return false 27588 } 27589 func rewriteValueS390X_OpS390XOR_150(v *Value) bool { 27590 b := v.Block 27591 _ = b 27592 types := &b.Func.Config.Types 27593 _ = types 27594 // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 27595 // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) 27596 // result: @mergePoint(b,x0,x1) (OR <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) 27597 for { 27598 or := v.Args[0] 27599 if or.Op != OpS390XOR { 27600 break 27601 } 27602 y := or.Args[0] 27603 s0 := or.Args[1] 27604 if s0.Op != OpS390XSLDconst { 27605 break 27606 } 27607 j0 := s0.AuxInt 27608 r0 := s0.Args[0] 27609 if r0.Op != OpS390XMOVHZreg { 27610 break 27611 } 27612 x0 := r0.Args[0] 27613 if x0.Op != OpS390XMOVHBRloadidx { 27614 break 27615 } 27616 i0 := x0.AuxInt 27617 s := x0.Aux 27618 idx := x0.Args[0] 27619 p := x0.Args[1] 27620 mem := x0.Args[2] 27621 s1 := v.Args[1] 27622 if s1.Op != OpS390XSLDconst { 27623 break 27624 } 27625 j1 := s1.AuxInt 27626 r1 := s1.Args[0] 27627 if r1.Op != OpS390XMOVHZreg { 27628 break 27629 } 27630 x1 := r1.Args[0] 27631 if x1.Op != OpS390XMOVHBRloadidx { 27632 break 27633 } 27634 i1 := x1.AuxInt 27635 if x1.Aux != s { 27636 break 27637 } 27638 if idx != x1.Args[0] { 27639 break 27640 } 27641 if p != x1.Args[1] { 27642 break 27643 } 27644 if mem != x1.Args[2] { 27645 break 27646 } 27647 if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { 27648 break 27649 } 27650 b = mergePoint(b, x0, x1) 27651 v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) 27652 v.reset(OpCopy) 27653 v.AddArg(v0) 27654 v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) 27655 v1.AuxInt = j0 27656 v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, types.UInt64) 27657 v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 27658 v3.AuxInt = i0 27659 v3.Aux = s 27660 v3.AddArg(p) 27661 v3.AddArg(idx) 27662 v3.AddArg(mem) 27663 v2.AddArg(v3) 27664 v1.AddArg(v2) 27665 v0.AddArg(v1) 27666 v0.AddArg(y) 27667 return true 27668 } 27669 return false 27670 } 27671 func rewriteValueS390X_OpS390XORW_0(v *Value) bool { 27672 // match: (ORW x (MOVDconst [c])) 27673 // cond: 27674 // result: (ORWconst [c] x) 27675 for { 27676 x := v.Args[0] 27677 v_1 := v.Args[1] 27678 if v_1.Op != OpS390XMOVDconst { 27679 break 27680 } 27681 c := v_1.AuxInt 27682 v.reset(OpS390XORWconst) 27683 v.AuxInt = c 27684 v.AddArg(x) 27685 return true 27686 } 27687 // match: (ORW (MOVDconst [c]) x) 27688 // cond: 27689 // result: (ORWconst [c] x) 27690 for { 27691 v_0 := v.Args[0] 27692 if v_0.Op != OpS390XMOVDconst { 27693 break 27694 } 27695 c := v_0.AuxInt 27696 x := v.Args[1] 27697 v.reset(OpS390XORWconst) 27698 v.AuxInt = c 27699 v.AddArg(x) 27700 return true 27701 } 27702 // match: (ORW (SLWconst x [c]) (SRWconst x [d])) 27703 // cond: d == 32-c 27704 // result: (RLLconst [c] x) 27705 for { 27706 v_0 := v.Args[0] 27707 if v_0.Op != OpS390XSLWconst { 27708 break 27709 } 27710 c := v_0.AuxInt 27711 x := v_0.Args[0] 27712 v_1 := v.Args[1] 27713 if v_1.Op != OpS390XSRWconst { 27714 break 27715 } 27716 d := v_1.AuxInt 27717 if x != v_1.Args[0] { 27718 break 27719 } 27720 if !(d == 32-c) { 27721 break 27722 } 27723 v.reset(OpS390XRLLconst) 27724 v.AuxInt = c 27725 v.AddArg(x) 27726 return true 27727 } 27728 // match: (ORW (SRWconst x [d]) (SLWconst x [c])) 27729 // cond: d == 32-c 27730 // result: (RLLconst [c] x) 27731 for { 27732 v_0 := v.Args[0] 27733 if v_0.Op != OpS390XSRWconst { 27734 break 27735 } 27736 d := v_0.AuxInt 27737 x := v_0.Args[0] 27738 v_1 := v.Args[1] 27739 if v_1.Op != OpS390XSLWconst { 27740 break 27741 } 27742 c := v_1.AuxInt 27743 if x != v_1.Args[0] { 27744 break 27745 } 27746 if !(d == 32-c) { 27747 break 27748 } 27749 v.reset(OpS390XRLLconst) 27750 v.AuxInt = c 27751 v.AddArg(x) 27752 return true 27753 } 27754 // match: (ORW x x) 27755 // cond: 27756 // result: x 27757 for { 27758 x := v.Args[0] 27759 if x != v.Args[1] { 27760 break 27761 } 27762 v.reset(OpCopy) 27763 v.Type = x.Type 27764 v.AddArg(x) 27765 return true 27766 } 27767 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 27768 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27769 // result: (ORWload <t> [off] {sym} x ptr mem) 27770 for { 27771 t := v.Type 27772 x := v.Args[0] 27773 g := v.Args[1] 27774 if g.Op != OpS390XMOVWload { 27775 break 27776 } 27777 off := g.AuxInt 27778 sym := g.Aux 27779 ptr := g.Args[0] 27780 mem := g.Args[1] 27781 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27782 break 27783 } 27784 v.reset(OpS390XORWload) 27785 v.Type = t 27786 v.AuxInt = off 27787 v.Aux = sym 27788 v.AddArg(x) 27789 v.AddArg(ptr) 27790 v.AddArg(mem) 27791 return true 27792 } 27793 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 27794 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27795 // result: (ORWload <t> [off] {sym} x ptr mem) 27796 for { 27797 t := v.Type 27798 g := v.Args[0] 27799 if g.Op != OpS390XMOVWload { 27800 break 27801 } 27802 off := g.AuxInt 27803 sym := g.Aux 27804 ptr := g.Args[0] 27805 mem := g.Args[1] 27806 x := v.Args[1] 27807 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27808 break 27809 } 27810 v.reset(OpS390XORWload) 27811 v.Type = t 27812 v.AuxInt = off 27813 v.Aux = sym 27814 v.AddArg(x) 27815 v.AddArg(ptr) 27816 v.AddArg(mem) 27817 return true 27818 } 27819 // match: (ORW <t> g:(MOVWload [off] {sym} ptr mem) x) 27820 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27821 // result: (ORWload <t> [off] {sym} x ptr mem) 27822 for { 27823 t := v.Type 27824 g := v.Args[0] 27825 if g.Op != OpS390XMOVWload { 27826 break 27827 } 27828 off := g.AuxInt 27829 sym := g.Aux 27830 ptr := g.Args[0] 27831 mem := g.Args[1] 27832 x := v.Args[1] 27833 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27834 break 27835 } 27836 v.reset(OpS390XORWload) 27837 v.Type = t 27838 v.AuxInt = off 27839 v.Aux = sym 27840 v.AddArg(x) 27841 v.AddArg(ptr) 27842 v.AddArg(mem) 27843 return true 27844 } 27845 // match: (ORW <t> x g:(MOVWload [off] {sym} ptr mem)) 27846 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27847 // result: (ORWload <t> [off] {sym} x ptr mem) 27848 for { 27849 t := v.Type 27850 x := v.Args[0] 27851 g := v.Args[1] 27852 if g.Op != OpS390XMOVWload { 27853 break 27854 } 27855 off := g.AuxInt 27856 sym := g.Aux 27857 ptr := g.Args[0] 27858 mem := g.Args[1] 27859 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27860 break 27861 } 27862 v.reset(OpS390XORWload) 27863 v.Type = t 27864 v.AuxInt = off 27865 v.Aux = sym 27866 v.AddArg(x) 27867 v.AddArg(ptr) 27868 v.AddArg(mem) 27869 return true 27870 } 27871 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 27872 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27873 // result: (ORWload <t> [off] {sym} x ptr mem) 27874 for { 27875 t := v.Type 27876 x := v.Args[0] 27877 g := v.Args[1] 27878 if g.Op != OpS390XMOVWZload { 27879 break 27880 } 27881 off := g.AuxInt 27882 sym := g.Aux 27883 ptr := g.Args[0] 27884 mem := g.Args[1] 27885 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27886 break 27887 } 27888 v.reset(OpS390XORWload) 27889 v.Type = t 27890 v.AuxInt = off 27891 v.Aux = sym 27892 v.AddArg(x) 27893 v.AddArg(ptr) 27894 v.AddArg(mem) 27895 return true 27896 } 27897 return false 27898 } 27899 func rewriteValueS390X_OpS390XORW_10(v *Value) bool { 27900 b := v.Block 27901 _ = b 27902 types := &b.Func.Config.Types 27903 _ = types 27904 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 27905 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27906 // result: (ORWload <t> [off] {sym} x ptr mem) 27907 for { 27908 t := v.Type 27909 g := v.Args[0] 27910 if g.Op != OpS390XMOVWZload { 27911 break 27912 } 27913 off := g.AuxInt 27914 sym := g.Aux 27915 ptr := g.Args[0] 27916 mem := g.Args[1] 27917 x := v.Args[1] 27918 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27919 break 27920 } 27921 v.reset(OpS390XORWload) 27922 v.Type = t 27923 v.AuxInt = off 27924 v.Aux = sym 27925 v.AddArg(x) 27926 v.AddArg(ptr) 27927 v.AddArg(mem) 27928 return true 27929 } 27930 // match: (ORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 27931 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27932 // result: (ORWload <t> [off] {sym} x ptr mem) 27933 for { 27934 t := v.Type 27935 g := v.Args[0] 27936 if g.Op != OpS390XMOVWZload { 27937 break 27938 } 27939 off := g.AuxInt 27940 sym := g.Aux 27941 ptr := g.Args[0] 27942 mem := g.Args[1] 27943 x := v.Args[1] 27944 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27945 break 27946 } 27947 v.reset(OpS390XORWload) 27948 v.Type = t 27949 v.AuxInt = off 27950 v.Aux = sym 27951 v.AddArg(x) 27952 v.AddArg(ptr) 27953 v.AddArg(mem) 27954 return true 27955 } 27956 // match: (ORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 27957 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 27958 // result: (ORWload <t> [off] {sym} x ptr mem) 27959 for { 27960 t := v.Type 27961 x := v.Args[0] 27962 g := v.Args[1] 27963 if g.Op != OpS390XMOVWZload { 27964 break 27965 } 27966 off := g.AuxInt 27967 sym := g.Aux 27968 ptr := g.Args[0] 27969 mem := g.Args[1] 27970 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 27971 break 27972 } 27973 v.reset(OpS390XORWload) 27974 v.Type = t 27975 v.AuxInt = off 27976 v.Aux = sym 27977 v.AddArg(x) 27978 v.AddArg(ptr) 27979 v.AddArg(mem) 27980 return true 27981 } 27982 // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) 27983 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 27984 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 27985 for { 27986 x1 := v.Args[0] 27987 if x1.Op != OpS390XMOVBZload { 27988 break 27989 } 27990 i1 := x1.AuxInt 27991 s := x1.Aux 27992 p := x1.Args[0] 27993 mem := x1.Args[1] 27994 sh := v.Args[1] 27995 if sh.Op != OpS390XSLWconst { 27996 break 27997 } 27998 if sh.AuxInt != 8 { 27999 break 28000 } 28001 x0 := sh.Args[0] 28002 if x0.Op != OpS390XMOVBZload { 28003 break 28004 } 28005 i0 := x0.AuxInt 28006 if x0.Aux != s { 28007 break 28008 } 28009 if p != x0.Args[0] { 28010 break 28011 } 28012 if mem != x0.Args[1] { 28013 break 28014 } 28015 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28016 break 28017 } 28018 b = mergePoint(b, x0, x1) 28019 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28020 v.reset(OpCopy) 28021 v.AddArg(v0) 28022 v0.AuxInt = i0 28023 v0.Aux = s 28024 v0.AddArg(p) 28025 v0.AddArg(mem) 28026 return true 28027 } 28028 // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) 28029 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28030 // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) 28031 for { 28032 sh := v.Args[0] 28033 if sh.Op != OpS390XSLWconst { 28034 break 28035 } 28036 if sh.AuxInt != 8 { 28037 break 28038 } 28039 x0 := sh.Args[0] 28040 if x0.Op != OpS390XMOVBZload { 28041 break 28042 } 28043 i0 := x0.AuxInt 28044 s := x0.Aux 28045 p := x0.Args[0] 28046 mem := x0.Args[1] 28047 x1 := v.Args[1] 28048 if x1.Op != OpS390XMOVBZload { 28049 break 28050 } 28051 i1 := x1.AuxInt 28052 if x1.Aux != s { 28053 break 28054 } 28055 if p != x1.Args[0] { 28056 break 28057 } 28058 if mem != x1.Args[1] { 28059 break 28060 } 28061 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28062 break 28063 } 28064 b = mergePoint(b, x0, x1) 28065 v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28066 v.reset(OpCopy) 28067 v.AddArg(v0) 28068 v0.AuxInt = i0 28069 v0.Aux = s 28070 v0.AddArg(p) 28071 v0.AddArg(mem) 28072 return true 28073 } 28074 // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) 28075 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28076 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 28077 for { 28078 x1 := v.Args[0] 28079 if x1.Op != OpS390XMOVHZload { 28080 break 28081 } 28082 i1 := x1.AuxInt 28083 s := x1.Aux 28084 p := x1.Args[0] 28085 mem := x1.Args[1] 28086 sh := v.Args[1] 28087 if sh.Op != OpS390XSLWconst { 28088 break 28089 } 28090 if sh.AuxInt != 16 { 28091 break 28092 } 28093 x0 := sh.Args[0] 28094 if x0.Op != OpS390XMOVHZload { 28095 break 28096 } 28097 i0 := x0.AuxInt 28098 if x0.Aux != s { 28099 break 28100 } 28101 if p != x0.Args[0] { 28102 break 28103 } 28104 if mem != x0.Args[1] { 28105 break 28106 } 28107 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28108 break 28109 } 28110 b = mergePoint(b, x0, x1) 28111 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 28112 v.reset(OpCopy) 28113 v.AddArg(v0) 28114 v0.AuxInt = i0 28115 v0.Aux = s 28116 v0.AddArg(p) 28117 v0.AddArg(mem) 28118 return true 28119 } 28120 // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) 28121 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28122 // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) 28123 for { 28124 sh := v.Args[0] 28125 if sh.Op != OpS390XSLWconst { 28126 break 28127 } 28128 if sh.AuxInt != 16 { 28129 break 28130 } 28131 x0 := sh.Args[0] 28132 if x0.Op != OpS390XMOVHZload { 28133 break 28134 } 28135 i0 := x0.AuxInt 28136 s := x0.Aux 28137 p := x0.Args[0] 28138 mem := x0.Args[1] 28139 x1 := v.Args[1] 28140 if x1.Op != OpS390XMOVHZload { 28141 break 28142 } 28143 i1 := x1.AuxInt 28144 if x1.Aux != s { 28145 break 28146 } 28147 if p != x1.Args[0] { 28148 break 28149 } 28150 if mem != x1.Args[1] { 28151 break 28152 } 28153 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28154 break 28155 } 28156 b = mergePoint(b, x0, x1) 28157 v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, types.UInt32) 28158 v.reset(OpCopy) 28159 v.AddArg(v0) 28160 v0.AuxInt = i0 28161 v0.Aux = s 28162 v0.AddArg(p) 28163 v0.AddArg(mem) 28164 return true 28165 } 28166 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) 28167 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 28168 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 28169 for { 28170 s0 := v.Args[0] 28171 if s0.Op != OpS390XSLWconst { 28172 break 28173 } 28174 j0 := s0.AuxInt 28175 x0 := s0.Args[0] 28176 if x0.Op != OpS390XMOVBZload { 28177 break 28178 } 28179 i0 := x0.AuxInt 28180 s := x0.Aux 28181 p := x0.Args[0] 28182 mem := x0.Args[1] 28183 or := v.Args[1] 28184 if or.Op != OpS390XORW { 28185 break 28186 } 28187 s1 := or.Args[0] 28188 if s1.Op != OpS390XSLWconst { 28189 break 28190 } 28191 j1 := s1.AuxInt 28192 x1 := s1.Args[0] 28193 if x1.Op != OpS390XMOVBZload { 28194 break 28195 } 28196 i1 := x1.AuxInt 28197 if x1.Aux != s { 28198 break 28199 } 28200 if p != x1.Args[0] { 28201 break 28202 } 28203 if mem != x1.Args[1] { 28204 break 28205 } 28206 y := or.Args[1] 28207 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 28208 break 28209 } 28210 b = mergePoint(b, x0, x1) 28211 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 28212 v.reset(OpCopy) 28213 v.AddArg(v0) 28214 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 28215 v1.AuxInt = j1 28216 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28217 v2.AuxInt = i0 28218 v2.Aux = s 28219 v2.AddArg(p) 28220 v2.AddArg(mem) 28221 v1.AddArg(v2) 28222 v0.AddArg(v1) 28223 v0.AddArg(y) 28224 return true 28225 } 28226 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) 28227 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 28228 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 28229 for { 28230 s0 := v.Args[0] 28231 if s0.Op != OpS390XSLWconst { 28232 break 28233 } 28234 j0 := s0.AuxInt 28235 x0 := s0.Args[0] 28236 if x0.Op != OpS390XMOVBZload { 28237 break 28238 } 28239 i0 := x0.AuxInt 28240 s := x0.Aux 28241 p := x0.Args[0] 28242 mem := x0.Args[1] 28243 or := v.Args[1] 28244 if or.Op != OpS390XORW { 28245 break 28246 } 28247 y := or.Args[0] 28248 s1 := or.Args[1] 28249 if s1.Op != OpS390XSLWconst { 28250 break 28251 } 28252 j1 := s1.AuxInt 28253 x1 := s1.Args[0] 28254 if x1.Op != OpS390XMOVBZload { 28255 break 28256 } 28257 i1 := x1.AuxInt 28258 if x1.Aux != s { 28259 break 28260 } 28261 if p != x1.Args[0] { 28262 break 28263 } 28264 if mem != x1.Args[1] { 28265 break 28266 } 28267 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 28268 break 28269 } 28270 b = mergePoint(b, x0, x1) 28271 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 28272 v.reset(OpCopy) 28273 v.AddArg(v0) 28274 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 28275 v1.AuxInt = j1 28276 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28277 v2.AuxInt = i0 28278 v2.Aux = s 28279 v2.AddArg(p) 28280 v2.AddArg(mem) 28281 v1.AddArg(v2) 28282 v0.AddArg(v1) 28283 v0.AddArg(y) 28284 return true 28285 } 28286 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 28287 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 28288 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 28289 for { 28290 or := v.Args[0] 28291 if or.Op != OpS390XORW { 28292 break 28293 } 28294 s1 := or.Args[0] 28295 if s1.Op != OpS390XSLWconst { 28296 break 28297 } 28298 j1 := s1.AuxInt 28299 x1 := s1.Args[0] 28300 if x1.Op != OpS390XMOVBZload { 28301 break 28302 } 28303 i1 := x1.AuxInt 28304 s := x1.Aux 28305 p := x1.Args[0] 28306 mem := x1.Args[1] 28307 y := or.Args[1] 28308 s0 := v.Args[1] 28309 if s0.Op != OpS390XSLWconst { 28310 break 28311 } 28312 j0 := s0.AuxInt 28313 x0 := s0.Args[0] 28314 if x0.Op != OpS390XMOVBZload { 28315 break 28316 } 28317 i0 := x0.AuxInt 28318 if x0.Aux != s { 28319 break 28320 } 28321 if p != x0.Args[0] { 28322 break 28323 } 28324 if mem != x0.Args[1] { 28325 break 28326 } 28327 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 28328 break 28329 } 28330 b = mergePoint(b, x0, x1) 28331 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 28332 v.reset(OpCopy) 28333 v.AddArg(v0) 28334 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 28335 v1.AuxInt = j1 28336 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28337 v2.AuxInt = i0 28338 v2.Aux = s 28339 v2.AddArg(p) 28340 v2.AddArg(mem) 28341 v1.AddArg(v2) 28342 v0.AddArg(v1) 28343 v0.AddArg(y) 28344 return true 28345 } 28346 return false 28347 } 28348 func rewriteValueS390X_OpS390XORW_20(v *Value) bool { 28349 b := v.Block 28350 _ = b 28351 types := &b.Func.Config.Types 28352 _ = types 28353 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) 28354 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 28355 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZload [i0] {s} p mem)) y) 28356 for { 28357 or := v.Args[0] 28358 if or.Op != OpS390XORW { 28359 break 28360 } 28361 y := or.Args[0] 28362 s1 := or.Args[1] 28363 if s1.Op != OpS390XSLWconst { 28364 break 28365 } 28366 j1 := s1.AuxInt 28367 x1 := s1.Args[0] 28368 if x1.Op != OpS390XMOVBZload { 28369 break 28370 } 28371 i1 := x1.AuxInt 28372 s := x1.Aux 28373 p := x1.Args[0] 28374 mem := x1.Args[1] 28375 s0 := v.Args[1] 28376 if s0.Op != OpS390XSLWconst { 28377 break 28378 } 28379 j0 := s0.AuxInt 28380 x0 := s0.Args[0] 28381 if x0.Op != OpS390XMOVBZload { 28382 break 28383 } 28384 i0 := x0.AuxInt 28385 if x0.Aux != s { 28386 break 28387 } 28388 if p != x0.Args[0] { 28389 break 28390 } 28391 if mem != x0.Args[1] { 28392 break 28393 } 28394 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 28395 break 28396 } 28397 b = mergePoint(b, x0, x1) 28398 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 28399 v.reset(OpCopy) 28400 v.AddArg(v0) 28401 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 28402 v1.AuxInt = j1 28403 v2 := b.NewValue0(v.Pos, OpS390XMOVHZload, types.UInt16) 28404 v2.AuxInt = i0 28405 v2.Aux = s 28406 v2.AddArg(p) 28407 v2.AddArg(mem) 28408 v1.AddArg(v2) 28409 v0.AddArg(v1) 28410 v0.AddArg(y) 28411 return true 28412 } 28413 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 28414 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28415 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28416 for { 28417 x1 := v.Args[0] 28418 if x1.Op != OpS390XMOVBZloadidx { 28419 break 28420 } 28421 i1 := x1.AuxInt 28422 s := x1.Aux 28423 p := x1.Args[0] 28424 idx := x1.Args[1] 28425 mem := x1.Args[2] 28426 sh := v.Args[1] 28427 if sh.Op != OpS390XSLWconst { 28428 break 28429 } 28430 if sh.AuxInt != 8 { 28431 break 28432 } 28433 x0 := sh.Args[0] 28434 if x0.Op != OpS390XMOVBZloadidx { 28435 break 28436 } 28437 i0 := x0.AuxInt 28438 if x0.Aux != s { 28439 break 28440 } 28441 if p != x0.Args[0] { 28442 break 28443 } 28444 if idx != x0.Args[1] { 28445 break 28446 } 28447 if mem != x0.Args[2] { 28448 break 28449 } 28450 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28451 break 28452 } 28453 b = mergePoint(b, x0, x1) 28454 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28455 v.reset(OpCopy) 28456 v.AddArg(v0) 28457 v0.AuxInt = i0 28458 v0.Aux = s 28459 v0.AddArg(p) 28460 v0.AddArg(idx) 28461 v0.AddArg(mem) 28462 return true 28463 } 28464 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) 28465 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28466 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28467 for { 28468 x1 := v.Args[0] 28469 if x1.Op != OpS390XMOVBZloadidx { 28470 break 28471 } 28472 i1 := x1.AuxInt 28473 s := x1.Aux 28474 idx := x1.Args[0] 28475 p := x1.Args[1] 28476 mem := x1.Args[2] 28477 sh := v.Args[1] 28478 if sh.Op != OpS390XSLWconst { 28479 break 28480 } 28481 if sh.AuxInt != 8 { 28482 break 28483 } 28484 x0 := sh.Args[0] 28485 if x0.Op != OpS390XMOVBZloadidx { 28486 break 28487 } 28488 i0 := x0.AuxInt 28489 if x0.Aux != s { 28490 break 28491 } 28492 if p != x0.Args[0] { 28493 break 28494 } 28495 if idx != x0.Args[1] { 28496 break 28497 } 28498 if mem != x0.Args[2] { 28499 break 28500 } 28501 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28502 break 28503 } 28504 b = mergePoint(b, x0, x1) 28505 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28506 v.reset(OpCopy) 28507 v.AddArg(v0) 28508 v0.AuxInt = i0 28509 v0.Aux = s 28510 v0.AddArg(p) 28511 v0.AddArg(idx) 28512 v0.AddArg(mem) 28513 return true 28514 } 28515 // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 28516 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28517 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28518 for { 28519 x1 := v.Args[0] 28520 if x1.Op != OpS390XMOVBZloadidx { 28521 break 28522 } 28523 i1 := x1.AuxInt 28524 s := x1.Aux 28525 p := x1.Args[0] 28526 idx := x1.Args[1] 28527 mem := x1.Args[2] 28528 sh := v.Args[1] 28529 if sh.Op != OpS390XSLWconst { 28530 break 28531 } 28532 if sh.AuxInt != 8 { 28533 break 28534 } 28535 x0 := sh.Args[0] 28536 if x0.Op != OpS390XMOVBZloadidx { 28537 break 28538 } 28539 i0 := x0.AuxInt 28540 if x0.Aux != s { 28541 break 28542 } 28543 if idx != x0.Args[0] { 28544 break 28545 } 28546 if p != x0.Args[1] { 28547 break 28548 } 28549 if mem != x0.Args[2] { 28550 break 28551 } 28552 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28553 break 28554 } 28555 b = mergePoint(b, x0, x1) 28556 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28557 v.reset(OpCopy) 28558 v.AddArg(v0) 28559 v0.AuxInt = i0 28560 v0.Aux = s 28561 v0.AddArg(p) 28562 v0.AddArg(idx) 28563 v0.AddArg(mem) 28564 return true 28565 } 28566 // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) 28567 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28568 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28569 for { 28570 x1 := v.Args[0] 28571 if x1.Op != OpS390XMOVBZloadidx { 28572 break 28573 } 28574 i1 := x1.AuxInt 28575 s := x1.Aux 28576 idx := x1.Args[0] 28577 p := x1.Args[1] 28578 mem := x1.Args[2] 28579 sh := v.Args[1] 28580 if sh.Op != OpS390XSLWconst { 28581 break 28582 } 28583 if sh.AuxInt != 8 { 28584 break 28585 } 28586 x0 := sh.Args[0] 28587 if x0.Op != OpS390XMOVBZloadidx { 28588 break 28589 } 28590 i0 := x0.AuxInt 28591 if x0.Aux != s { 28592 break 28593 } 28594 if idx != x0.Args[0] { 28595 break 28596 } 28597 if p != x0.Args[1] { 28598 break 28599 } 28600 if mem != x0.Args[2] { 28601 break 28602 } 28603 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28604 break 28605 } 28606 b = mergePoint(b, x0, x1) 28607 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28608 v.reset(OpCopy) 28609 v.AddArg(v0) 28610 v0.AuxInt = i0 28611 v0.Aux = s 28612 v0.AddArg(p) 28613 v0.AddArg(idx) 28614 v0.AddArg(mem) 28615 return true 28616 } 28617 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 28618 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28619 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28620 for { 28621 sh := v.Args[0] 28622 if sh.Op != OpS390XSLWconst { 28623 break 28624 } 28625 if sh.AuxInt != 8 { 28626 break 28627 } 28628 x0 := sh.Args[0] 28629 if x0.Op != OpS390XMOVBZloadidx { 28630 break 28631 } 28632 i0 := x0.AuxInt 28633 s := x0.Aux 28634 p := x0.Args[0] 28635 idx := x0.Args[1] 28636 mem := x0.Args[2] 28637 x1 := v.Args[1] 28638 if x1.Op != OpS390XMOVBZloadidx { 28639 break 28640 } 28641 i1 := x1.AuxInt 28642 if x1.Aux != s { 28643 break 28644 } 28645 if p != x1.Args[0] { 28646 break 28647 } 28648 if idx != x1.Args[1] { 28649 break 28650 } 28651 if mem != x1.Args[2] { 28652 break 28653 } 28654 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28655 break 28656 } 28657 b = mergePoint(b, x0, x1) 28658 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28659 v.reset(OpCopy) 28660 v.AddArg(v0) 28661 v0.AuxInt = i0 28662 v0.Aux = s 28663 v0.AddArg(p) 28664 v0.AddArg(idx) 28665 v0.AddArg(mem) 28666 return true 28667 } 28668 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) 28669 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28670 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28671 for { 28672 sh := v.Args[0] 28673 if sh.Op != OpS390XSLWconst { 28674 break 28675 } 28676 if sh.AuxInt != 8 { 28677 break 28678 } 28679 x0 := sh.Args[0] 28680 if x0.Op != OpS390XMOVBZloadidx { 28681 break 28682 } 28683 i0 := x0.AuxInt 28684 s := x0.Aux 28685 idx := x0.Args[0] 28686 p := x0.Args[1] 28687 mem := x0.Args[2] 28688 x1 := v.Args[1] 28689 if x1.Op != OpS390XMOVBZloadidx { 28690 break 28691 } 28692 i1 := x1.AuxInt 28693 if x1.Aux != s { 28694 break 28695 } 28696 if p != x1.Args[0] { 28697 break 28698 } 28699 if idx != x1.Args[1] { 28700 break 28701 } 28702 if mem != x1.Args[2] { 28703 break 28704 } 28705 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28706 break 28707 } 28708 b = mergePoint(b, x0, x1) 28709 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28710 v.reset(OpCopy) 28711 v.AddArg(v0) 28712 v0.AuxInt = i0 28713 v0.Aux = s 28714 v0.AddArg(p) 28715 v0.AddArg(idx) 28716 v0.AddArg(mem) 28717 return true 28718 } 28719 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 28720 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28721 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28722 for { 28723 sh := v.Args[0] 28724 if sh.Op != OpS390XSLWconst { 28725 break 28726 } 28727 if sh.AuxInt != 8 { 28728 break 28729 } 28730 x0 := sh.Args[0] 28731 if x0.Op != OpS390XMOVBZloadidx { 28732 break 28733 } 28734 i0 := x0.AuxInt 28735 s := x0.Aux 28736 p := x0.Args[0] 28737 idx := x0.Args[1] 28738 mem := x0.Args[2] 28739 x1 := v.Args[1] 28740 if x1.Op != OpS390XMOVBZloadidx { 28741 break 28742 } 28743 i1 := x1.AuxInt 28744 if x1.Aux != s { 28745 break 28746 } 28747 if idx != x1.Args[0] { 28748 break 28749 } 28750 if p != x1.Args[1] { 28751 break 28752 } 28753 if mem != x1.Args[2] { 28754 break 28755 } 28756 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28757 break 28758 } 28759 b = mergePoint(b, x0, x1) 28760 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28761 v.reset(OpCopy) 28762 v.AddArg(v0) 28763 v0.AuxInt = i0 28764 v0.Aux = s 28765 v0.AddArg(p) 28766 v0.AddArg(idx) 28767 v0.AddArg(mem) 28768 return true 28769 } 28770 // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) 28771 // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28772 // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) 28773 for { 28774 sh := v.Args[0] 28775 if sh.Op != OpS390XSLWconst { 28776 break 28777 } 28778 if sh.AuxInt != 8 { 28779 break 28780 } 28781 x0 := sh.Args[0] 28782 if x0.Op != OpS390XMOVBZloadidx { 28783 break 28784 } 28785 i0 := x0.AuxInt 28786 s := x0.Aux 28787 idx := x0.Args[0] 28788 p := x0.Args[1] 28789 mem := x0.Args[2] 28790 x1 := v.Args[1] 28791 if x1.Op != OpS390XMOVBZloadidx { 28792 break 28793 } 28794 i1 := x1.AuxInt 28795 if x1.Aux != s { 28796 break 28797 } 28798 if idx != x1.Args[0] { 28799 break 28800 } 28801 if p != x1.Args[1] { 28802 break 28803 } 28804 if mem != x1.Args[2] { 28805 break 28806 } 28807 if !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28808 break 28809 } 28810 b = mergePoint(b, x0, x1) 28811 v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 28812 v.reset(OpCopy) 28813 v.AddArg(v0) 28814 v0.AuxInt = i0 28815 v0.Aux = s 28816 v0.AddArg(p) 28817 v0.AddArg(idx) 28818 v0.AddArg(mem) 28819 return true 28820 } 28821 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 28822 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28823 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28824 for { 28825 x1 := v.Args[0] 28826 if x1.Op != OpS390XMOVHZloadidx { 28827 break 28828 } 28829 i1 := x1.AuxInt 28830 s := x1.Aux 28831 p := x1.Args[0] 28832 idx := x1.Args[1] 28833 mem := x1.Args[2] 28834 sh := v.Args[1] 28835 if sh.Op != OpS390XSLWconst { 28836 break 28837 } 28838 if sh.AuxInt != 16 { 28839 break 28840 } 28841 x0 := sh.Args[0] 28842 if x0.Op != OpS390XMOVHZloadidx { 28843 break 28844 } 28845 i0 := x0.AuxInt 28846 if x0.Aux != s { 28847 break 28848 } 28849 if p != x0.Args[0] { 28850 break 28851 } 28852 if idx != x0.Args[1] { 28853 break 28854 } 28855 if mem != x0.Args[2] { 28856 break 28857 } 28858 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28859 break 28860 } 28861 b = mergePoint(b, x0, x1) 28862 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28863 v.reset(OpCopy) 28864 v.AddArg(v0) 28865 v0.AuxInt = i0 28866 v0.Aux = s 28867 v0.AddArg(p) 28868 v0.AddArg(idx) 28869 v0.AddArg(mem) 28870 return true 28871 } 28872 return false 28873 } 28874 func rewriteValueS390X_OpS390XORW_30(v *Value) bool { 28875 b := v.Block 28876 _ = b 28877 types := &b.Func.Config.Types 28878 _ = types 28879 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) 28880 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28881 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28882 for { 28883 x1 := v.Args[0] 28884 if x1.Op != OpS390XMOVHZloadidx { 28885 break 28886 } 28887 i1 := x1.AuxInt 28888 s := x1.Aux 28889 idx := x1.Args[0] 28890 p := x1.Args[1] 28891 mem := x1.Args[2] 28892 sh := v.Args[1] 28893 if sh.Op != OpS390XSLWconst { 28894 break 28895 } 28896 if sh.AuxInt != 16 { 28897 break 28898 } 28899 x0 := sh.Args[0] 28900 if x0.Op != OpS390XMOVHZloadidx { 28901 break 28902 } 28903 i0 := x0.AuxInt 28904 if x0.Aux != s { 28905 break 28906 } 28907 if p != x0.Args[0] { 28908 break 28909 } 28910 if idx != x0.Args[1] { 28911 break 28912 } 28913 if mem != x0.Args[2] { 28914 break 28915 } 28916 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28917 break 28918 } 28919 b = mergePoint(b, x0, x1) 28920 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28921 v.reset(OpCopy) 28922 v.AddArg(v0) 28923 v0.AuxInt = i0 28924 v0.Aux = s 28925 v0.AddArg(p) 28926 v0.AddArg(idx) 28927 v0.AddArg(mem) 28928 return true 28929 } 28930 // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 28931 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28932 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28933 for { 28934 x1 := v.Args[0] 28935 if x1.Op != OpS390XMOVHZloadidx { 28936 break 28937 } 28938 i1 := x1.AuxInt 28939 s := x1.Aux 28940 p := x1.Args[0] 28941 idx := x1.Args[1] 28942 mem := x1.Args[2] 28943 sh := v.Args[1] 28944 if sh.Op != OpS390XSLWconst { 28945 break 28946 } 28947 if sh.AuxInt != 16 { 28948 break 28949 } 28950 x0 := sh.Args[0] 28951 if x0.Op != OpS390XMOVHZloadidx { 28952 break 28953 } 28954 i0 := x0.AuxInt 28955 if x0.Aux != s { 28956 break 28957 } 28958 if idx != x0.Args[0] { 28959 break 28960 } 28961 if p != x0.Args[1] { 28962 break 28963 } 28964 if mem != x0.Args[2] { 28965 break 28966 } 28967 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 28968 break 28969 } 28970 b = mergePoint(b, x0, x1) 28971 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 28972 v.reset(OpCopy) 28973 v.AddArg(v0) 28974 v0.AuxInt = i0 28975 v0.Aux = s 28976 v0.AddArg(p) 28977 v0.AddArg(idx) 28978 v0.AddArg(mem) 28979 return true 28980 } 28981 // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) 28982 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 28983 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 28984 for { 28985 x1 := v.Args[0] 28986 if x1.Op != OpS390XMOVHZloadidx { 28987 break 28988 } 28989 i1 := x1.AuxInt 28990 s := x1.Aux 28991 idx := x1.Args[0] 28992 p := x1.Args[1] 28993 mem := x1.Args[2] 28994 sh := v.Args[1] 28995 if sh.Op != OpS390XSLWconst { 28996 break 28997 } 28998 if sh.AuxInt != 16 { 28999 break 29000 } 29001 x0 := sh.Args[0] 29002 if x0.Op != OpS390XMOVHZloadidx { 29003 break 29004 } 29005 i0 := x0.AuxInt 29006 if x0.Aux != s { 29007 break 29008 } 29009 if idx != x0.Args[0] { 29010 break 29011 } 29012 if p != x0.Args[1] { 29013 break 29014 } 29015 if mem != x0.Args[2] { 29016 break 29017 } 29018 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 29019 break 29020 } 29021 b = mergePoint(b, x0, x1) 29022 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 29023 v.reset(OpCopy) 29024 v.AddArg(v0) 29025 v0.AuxInt = i0 29026 v0.Aux = s 29027 v0.AddArg(p) 29028 v0.AddArg(idx) 29029 v0.AddArg(mem) 29030 return true 29031 } 29032 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 29033 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 29034 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 29035 for { 29036 sh := v.Args[0] 29037 if sh.Op != OpS390XSLWconst { 29038 break 29039 } 29040 if sh.AuxInt != 16 { 29041 break 29042 } 29043 x0 := sh.Args[0] 29044 if x0.Op != OpS390XMOVHZloadidx { 29045 break 29046 } 29047 i0 := x0.AuxInt 29048 s := x0.Aux 29049 p := x0.Args[0] 29050 idx := x0.Args[1] 29051 mem := x0.Args[2] 29052 x1 := v.Args[1] 29053 if x1.Op != OpS390XMOVHZloadidx { 29054 break 29055 } 29056 i1 := x1.AuxInt 29057 if x1.Aux != s { 29058 break 29059 } 29060 if p != x1.Args[0] { 29061 break 29062 } 29063 if idx != x1.Args[1] { 29064 break 29065 } 29066 if mem != x1.Args[2] { 29067 break 29068 } 29069 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 29070 break 29071 } 29072 b = mergePoint(b, x0, x1) 29073 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 29074 v.reset(OpCopy) 29075 v.AddArg(v0) 29076 v0.AuxInt = i0 29077 v0.Aux = s 29078 v0.AddArg(p) 29079 v0.AddArg(idx) 29080 v0.AddArg(mem) 29081 return true 29082 } 29083 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) 29084 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 29085 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 29086 for { 29087 sh := v.Args[0] 29088 if sh.Op != OpS390XSLWconst { 29089 break 29090 } 29091 if sh.AuxInt != 16 { 29092 break 29093 } 29094 x0 := sh.Args[0] 29095 if x0.Op != OpS390XMOVHZloadidx { 29096 break 29097 } 29098 i0 := x0.AuxInt 29099 s := x0.Aux 29100 idx := x0.Args[0] 29101 p := x0.Args[1] 29102 mem := x0.Args[2] 29103 x1 := v.Args[1] 29104 if x1.Op != OpS390XMOVHZloadidx { 29105 break 29106 } 29107 i1 := x1.AuxInt 29108 if x1.Aux != s { 29109 break 29110 } 29111 if p != x1.Args[0] { 29112 break 29113 } 29114 if idx != x1.Args[1] { 29115 break 29116 } 29117 if mem != x1.Args[2] { 29118 break 29119 } 29120 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 29121 break 29122 } 29123 b = mergePoint(b, x0, x1) 29124 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 29125 v.reset(OpCopy) 29126 v.AddArg(v0) 29127 v0.AuxInt = i0 29128 v0.Aux = s 29129 v0.AddArg(p) 29130 v0.AddArg(idx) 29131 v0.AddArg(mem) 29132 return true 29133 } 29134 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 29135 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 29136 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 29137 for { 29138 sh := v.Args[0] 29139 if sh.Op != OpS390XSLWconst { 29140 break 29141 } 29142 if sh.AuxInt != 16 { 29143 break 29144 } 29145 x0 := sh.Args[0] 29146 if x0.Op != OpS390XMOVHZloadidx { 29147 break 29148 } 29149 i0 := x0.AuxInt 29150 s := x0.Aux 29151 p := x0.Args[0] 29152 idx := x0.Args[1] 29153 mem := x0.Args[2] 29154 x1 := v.Args[1] 29155 if x1.Op != OpS390XMOVHZloadidx { 29156 break 29157 } 29158 i1 := x1.AuxInt 29159 if x1.Aux != s { 29160 break 29161 } 29162 if idx != x1.Args[0] { 29163 break 29164 } 29165 if p != x1.Args[1] { 29166 break 29167 } 29168 if mem != x1.Args[2] { 29169 break 29170 } 29171 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 29172 break 29173 } 29174 b = mergePoint(b, x0, x1) 29175 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 29176 v.reset(OpCopy) 29177 v.AddArg(v0) 29178 v0.AuxInt = i0 29179 v0.Aux = s 29180 v0.AddArg(p) 29181 v0.AddArg(idx) 29182 v0.AddArg(mem) 29183 return true 29184 } 29185 // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) 29186 // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 29187 // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) 29188 for { 29189 sh := v.Args[0] 29190 if sh.Op != OpS390XSLWconst { 29191 break 29192 } 29193 if sh.AuxInt != 16 { 29194 break 29195 } 29196 x0 := sh.Args[0] 29197 if x0.Op != OpS390XMOVHZloadidx { 29198 break 29199 } 29200 i0 := x0.AuxInt 29201 s := x0.Aux 29202 idx := x0.Args[0] 29203 p := x0.Args[1] 29204 mem := x0.Args[2] 29205 x1 := v.Args[1] 29206 if x1.Op != OpS390XMOVHZloadidx { 29207 break 29208 } 29209 i1 := x1.AuxInt 29210 if x1.Aux != s { 29211 break 29212 } 29213 if idx != x1.Args[0] { 29214 break 29215 } 29216 if p != x1.Args[1] { 29217 break 29218 } 29219 if mem != x1.Args[2] { 29220 break 29221 } 29222 if !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 29223 break 29224 } 29225 b = mergePoint(b, x0, x1) 29226 v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, types.UInt32) 29227 v.reset(OpCopy) 29228 v.AddArg(v0) 29229 v0.AuxInt = i0 29230 v0.Aux = s 29231 v0.AddArg(p) 29232 v0.AddArg(idx) 29233 v0.AddArg(mem) 29234 return true 29235 } 29236 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) 29237 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29238 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29239 for { 29240 s0 := v.Args[0] 29241 if s0.Op != OpS390XSLWconst { 29242 break 29243 } 29244 j0 := s0.AuxInt 29245 x0 := s0.Args[0] 29246 if x0.Op != OpS390XMOVBZloadidx { 29247 break 29248 } 29249 i0 := x0.AuxInt 29250 s := x0.Aux 29251 p := x0.Args[0] 29252 idx := x0.Args[1] 29253 mem := x0.Args[2] 29254 or := v.Args[1] 29255 if or.Op != OpS390XORW { 29256 break 29257 } 29258 s1 := or.Args[0] 29259 if s1.Op != OpS390XSLWconst { 29260 break 29261 } 29262 j1 := s1.AuxInt 29263 x1 := s1.Args[0] 29264 if x1.Op != OpS390XMOVBZloadidx { 29265 break 29266 } 29267 i1 := x1.AuxInt 29268 if x1.Aux != s { 29269 break 29270 } 29271 if p != x1.Args[0] { 29272 break 29273 } 29274 if idx != x1.Args[1] { 29275 break 29276 } 29277 if mem != x1.Args[2] { 29278 break 29279 } 29280 y := or.Args[1] 29281 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29282 break 29283 } 29284 b = mergePoint(b, x0, x1) 29285 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29286 v.reset(OpCopy) 29287 v.AddArg(v0) 29288 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29289 v1.AuxInt = j1 29290 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29291 v2.AuxInt = i0 29292 v2.Aux = s 29293 v2.AddArg(p) 29294 v2.AddArg(idx) 29295 v2.AddArg(mem) 29296 v1.AddArg(v2) 29297 v0.AddArg(v1) 29298 v0.AddArg(y) 29299 return true 29300 } 29301 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) 29302 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29303 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29304 for { 29305 s0 := v.Args[0] 29306 if s0.Op != OpS390XSLWconst { 29307 break 29308 } 29309 j0 := s0.AuxInt 29310 x0 := s0.Args[0] 29311 if x0.Op != OpS390XMOVBZloadidx { 29312 break 29313 } 29314 i0 := x0.AuxInt 29315 s := x0.Aux 29316 idx := x0.Args[0] 29317 p := x0.Args[1] 29318 mem := x0.Args[2] 29319 or := v.Args[1] 29320 if or.Op != OpS390XORW { 29321 break 29322 } 29323 s1 := or.Args[0] 29324 if s1.Op != OpS390XSLWconst { 29325 break 29326 } 29327 j1 := s1.AuxInt 29328 x1 := s1.Args[0] 29329 if x1.Op != OpS390XMOVBZloadidx { 29330 break 29331 } 29332 i1 := x1.AuxInt 29333 if x1.Aux != s { 29334 break 29335 } 29336 if p != x1.Args[0] { 29337 break 29338 } 29339 if idx != x1.Args[1] { 29340 break 29341 } 29342 if mem != x1.Args[2] { 29343 break 29344 } 29345 y := or.Args[1] 29346 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29347 break 29348 } 29349 b = mergePoint(b, x0, x1) 29350 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29351 v.reset(OpCopy) 29352 v.AddArg(v0) 29353 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29354 v1.AuxInt = j1 29355 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29356 v2.AuxInt = i0 29357 v2.Aux = s 29358 v2.AddArg(p) 29359 v2.AddArg(idx) 29360 v2.AddArg(mem) 29361 v1.AddArg(v2) 29362 v0.AddArg(v1) 29363 v0.AddArg(y) 29364 return true 29365 } 29366 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) 29367 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29368 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29369 for { 29370 s0 := v.Args[0] 29371 if s0.Op != OpS390XSLWconst { 29372 break 29373 } 29374 j0 := s0.AuxInt 29375 x0 := s0.Args[0] 29376 if x0.Op != OpS390XMOVBZloadidx { 29377 break 29378 } 29379 i0 := x0.AuxInt 29380 s := x0.Aux 29381 p := x0.Args[0] 29382 idx := x0.Args[1] 29383 mem := x0.Args[2] 29384 or := v.Args[1] 29385 if or.Op != OpS390XORW { 29386 break 29387 } 29388 s1 := or.Args[0] 29389 if s1.Op != OpS390XSLWconst { 29390 break 29391 } 29392 j1 := s1.AuxInt 29393 x1 := s1.Args[0] 29394 if x1.Op != OpS390XMOVBZloadidx { 29395 break 29396 } 29397 i1 := x1.AuxInt 29398 if x1.Aux != s { 29399 break 29400 } 29401 if idx != x1.Args[0] { 29402 break 29403 } 29404 if p != x1.Args[1] { 29405 break 29406 } 29407 if mem != x1.Args[2] { 29408 break 29409 } 29410 y := or.Args[1] 29411 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29412 break 29413 } 29414 b = mergePoint(b, x0, x1) 29415 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29416 v.reset(OpCopy) 29417 v.AddArg(v0) 29418 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29419 v1.AuxInt = j1 29420 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29421 v2.AuxInt = i0 29422 v2.Aux = s 29423 v2.AddArg(p) 29424 v2.AddArg(idx) 29425 v2.AddArg(mem) 29426 v1.AddArg(v2) 29427 v0.AddArg(v1) 29428 v0.AddArg(y) 29429 return true 29430 } 29431 return false 29432 } 29433 func rewriteValueS390X_OpS390XORW_40(v *Value) bool { 29434 b := v.Block 29435 _ = b 29436 types := &b.Func.Config.Types 29437 _ = types 29438 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) 29439 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29440 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29441 for { 29442 s0 := v.Args[0] 29443 if s0.Op != OpS390XSLWconst { 29444 break 29445 } 29446 j0 := s0.AuxInt 29447 x0 := s0.Args[0] 29448 if x0.Op != OpS390XMOVBZloadidx { 29449 break 29450 } 29451 i0 := x0.AuxInt 29452 s := x0.Aux 29453 idx := x0.Args[0] 29454 p := x0.Args[1] 29455 mem := x0.Args[2] 29456 or := v.Args[1] 29457 if or.Op != OpS390XORW { 29458 break 29459 } 29460 s1 := or.Args[0] 29461 if s1.Op != OpS390XSLWconst { 29462 break 29463 } 29464 j1 := s1.AuxInt 29465 x1 := s1.Args[0] 29466 if x1.Op != OpS390XMOVBZloadidx { 29467 break 29468 } 29469 i1 := x1.AuxInt 29470 if x1.Aux != s { 29471 break 29472 } 29473 if idx != x1.Args[0] { 29474 break 29475 } 29476 if p != x1.Args[1] { 29477 break 29478 } 29479 if mem != x1.Args[2] { 29480 break 29481 } 29482 y := or.Args[1] 29483 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29484 break 29485 } 29486 b = mergePoint(b, x0, x1) 29487 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29488 v.reset(OpCopy) 29489 v.AddArg(v0) 29490 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29491 v1.AuxInt = j1 29492 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29493 v2.AuxInt = i0 29494 v2.Aux = s 29495 v2.AddArg(p) 29496 v2.AddArg(idx) 29497 v2.AddArg(mem) 29498 v1.AddArg(v2) 29499 v0.AddArg(v1) 29500 v0.AddArg(y) 29501 return true 29502 } 29503 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) 29504 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29505 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29506 for { 29507 s0 := v.Args[0] 29508 if s0.Op != OpS390XSLWconst { 29509 break 29510 } 29511 j0 := s0.AuxInt 29512 x0 := s0.Args[0] 29513 if x0.Op != OpS390XMOVBZloadidx { 29514 break 29515 } 29516 i0 := x0.AuxInt 29517 s := x0.Aux 29518 p := x0.Args[0] 29519 idx := x0.Args[1] 29520 mem := x0.Args[2] 29521 or := v.Args[1] 29522 if or.Op != OpS390XORW { 29523 break 29524 } 29525 y := or.Args[0] 29526 s1 := or.Args[1] 29527 if s1.Op != OpS390XSLWconst { 29528 break 29529 } 29530 j1 := s1.AuxInt 29531 x1 := s1.Args[0] 29532 if x1.Op != OpS390XMOVBZloadidx { 29533 break 29534 } 29535 i1 := x1.AuxInt 29536 if x1.Aux != s { 29537 break 29538 } 29539 if p != x1.Args[0] { 29540 break 29541 } 29542 if idx != x1.Args[1] { 29543 break 29544 } 29545 if mem != x1.Args[2] { 29546 break 29547 } 29548 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29549 break 29550 } 29551 b = mergePoint(b, x0, x1) 29552 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29553 v.reset(OpCopy) 29554 v.AddArg(v0) 29555 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29556 v1.AuxInt = j1 29557 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29558 v2.AuxInt = i0 29559 v2.Aux = s 29560 v2.AddArg(p) 29561 v2.AddArg(idx) 29562 v2.AddArg(mem) 29563 v1.AddArg(v2) 29564 v0.AddArg(v1) 29565 v0.AddArg(y) 29566 return true 29567 } 29568 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) 29569 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29570 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29571 for { 29572 s0 := v.Args[0] 29573 if s0.Op != OpS390XSLWconst { 29574 break 29575 } 29576 j0 := s0.AuxInt 29577 x0 := s0.Args[0] 29578 if x0.Op != OpS390XMOVBZloadidx { 29579 break 29580 } 29581 i0 := x0.AuxInt 29582 s := x0.Aux 29583 idx := x0.Args[0] 29584 p := x0.Args[1] 29585 mem := x0.Args[2] 29586 or := v.Args[1] 29587 if or.Op != OpS390XORW { 29588 break 29589 } 29590 y := or.Args[0] 29591 s1 := or.Args[1] 29592 if s1.Op != OpS390XSLWconst { 29593 break 29594 } 29595 j1 := s1.AuxInt 29596 x1 := s1.Args[0] 29597 if x1.Op != OpS390XMOVBZloadidx { 29598 break 29599 } 29600 i1 := x1.AuxInt 29601 if x1.Aux != s { 29602 break 29603 } 29604 if p != x1.Args[0] { 29605 break 29606 } 29607 if idx != x1.Args[1] { 29608 break 29609 } 29610 if mem != x1.Args[2] { 29611 break 29612 } 29613 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29614 break 29615 } 29616 b = mergePoint(b, x0, x1) 29617 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29618 v.reset(OpCopy) 29619 v.AddArg(v0) 29620 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29621 v1.AuxInt = j1 29622 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29623 v2.AuxInt = i0 29624 v2.Aux = s 29625 v2.AddArg(p) 29626 v2.AddArg(idx) 29627 v2.AddArg(mem) 29628 v1.AddArg(v2) 29629 v0.AddArg(v1) 29630 v0.AddArg(y) 29631 return true 29632 } 29633 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) 29634 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29635 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29636 for { 29637 s0 := v.Args[0] 29638 if s0.Op != OpS390XSLWconst { 29639 break 29640 } 29641 j0 := s0.AuxInt 29642 x0 := s0.Args[0] 29643 if x0.Op != OpS390XMOVBZloadidx { 29644 break 29645 } 29646 i0 := x0.AuxInt 29647 s := x0.Aux 29648 p := x0.Args[0] 29649 idx := x0.Args[1] 29650 mem := x0.Args[2] 29651 or := v.Args[1] 29652 if or.Op != OpS390XORW { 29653 break 29654 } 29655 y := or.Args[0] 29656 s1 := or.Args[1] 29657 if s1.Op != OpS390XSLWconst { 29658 break 29659 } 29660 j1 := s1.AuxInt 29661 x1 := s1.Args[0] 29662 if x1.Op != OpS390XMOVBZloadidx { 29663 break 29664 } 29665 i1 := x1.AuxInt 29666 if x1.Aux != s { 29667 break 29668 } 29669 if idx != x1.Args[0] { 29670 break 29671 } 29672 if p != x1.Args[1] { 29673 break 29674 } 29675 if mem != x1.Args[2] { 29676 break 29677 } 29678 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29679 break 29680 } 29681 b = mergePoint(b, x0, x1) 29682 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29683 v.reset(OpCopy) 29684 v.AddArg(v0) 29685 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29686 v1.AuxInt = j1 29687 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29688 v2.AuxInt = i0 29689 v2.Aux = s 29690 v2.AddArg(p) 29691 v2.AddArg(idx) 29692 v2.AddArg(mem) 29693 v1.AddArg(v2) 29694 v0.AddArg(v1) 29695 v0.AddArg(y) 29696 return true 29697 } 29698 // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) 29699 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29700 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29701 for { 29702 s0 := v.Args[0] 29703 if s0.Op != OpS390XSLWconst { 29704 break 29705 } 29706 j0 := s0.AuxInt 29707 x0 := s0.Args[0] 29708 if x0.Op != OpS390XMOVBZloadidx { 29709 break 29710 } 29711 i0 := x0.AuxInt 29712 s := x0.Aux 29713 idx := x0.Args[0] 29714 p := x0.Args[1] 29715 mem := x0.Args[2] 29716 or := v.Args[1] 29717 if or.Op != OpS390XORW { 29718 break 29719 } 29720 y := or.Args[0] 29721 s1 := or.Args[1] 29722 if s1.Op != OpS390XSLWconst { 29723 break 29724 } 29725 j1 := s1.AuxInt 29726 x1 := s1.Args[0] 29727 if x1.Op != OpS390XMOVBZloadidx { 29728 break 29729 } 29730 i1 := x1.AuxInt 29731 if x1.Aux != s { 29732 break 29733 } 29734 if idx != x1.Args[0] { 29735 break 29736 } 29737 if p != x1.Args[1] { 29738 break 29739 } 29740 if mem != x1.Args[2] { 29741 break 29742 } 29743 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29744 break 29745 } 29746 b = mergePoint(b, x0, x1) 29747 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29748 v.reset(OpCopy) 29749 v.AddArg(v0) 29750 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29751 v1.AuxInt = j1 29752 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29753 v2.AuxInt = i0 29754 v2.Aux = s 29755 v2.AddArg(p) 29756 v2.AddArg(idx) 29757 v2.AddArg(mem) 29758 v1.AddArg(v2) 29759 v0.AddArg(v1) 29760 v0.AddArg(y) 29761 return true 29762 } 29763 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29764 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29765 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29766 for { 29767 or := v.Args[0] 29768 if or.Op != OpS390XORW { 29769 break 29770 } 29771 s1 := or.Args[0] 29772 if s1.Op != OpS390XSLWconst { 29773 break 29774 } 29775 j1 := s1.AuxInt 29776 x1 := s1.Args[0] 29777 if x1.Op != OpS390XMOVBZloadidx { 29778 break 29779 } 29780 i1 := x1.AuxInt 29781 s := x1.Aux 29782 p := x1.Args[0] 29783 idx := x1.Args[1] 29784 mem := x1.Args[2] 29785 y := or.Args[1] 29786 s0 := v.Args[1] 29787 if s0.Op != OpS390XSLWconst { 29788 break 29789 } 29790 j0 := s0.AuxInt 29791 x0 := s0.Args[0] 29792 if x0.Op != OpS390XMOVBZloadidx { 29793 break 29794 } 29795 i0 := x0.AuxInt 29796 if x0.Aux != s { 29797 break 29798 } 29799 if p != x0.Args[0] { 29800 break 29801 } 29802 if idx != x0.Args[1] { 29803 break 29804 } 29805 if mem != x0.Args[2] { 29806 break 29807 } 29808 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29809 break 29810 } 29811 b = mergePoint(b, x0, x1) 29812 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29813 v.reset(OpCopy) 29814 v.AddArg(v0) 29815 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29816 v1.AuxInt = j1 29817 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29818 v2.AuxInt = i0 29819 v2.Aux = s 29820 v2.AddArg(p) 29821 v2.AddArg(idx) 29822 v2.AddArg(mem) 29823 v1.AddArg(v2) 29824 v0.AddArg(v1) 29825 v0.AddArg(y) 29826 return true 29827 } 29828 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29829 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29830 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29831 for { 29832 or := v.Args[0] 29833 if or.Op != OpS390XORW { 29834 break 29835 } 29836 s1 := or.Args[0] 29837 if s1.Op != OpS390XSLWconst { 29838 break 29839 } 29840 j1 := s1.AuxInt 29841 x1 := s1.Args[0] 29842 if x1.Op != OpS390XMOVBZloadidx { 29843 break 29844 } 29845 i1 := x1.AuxInt 29846 s := x1.Aux 29847 idx := x1.Args[0] 29848 p := x1.Args[1] 29849 mem := x1.Args[2] 29850 y := or.Args[1] 29851 s0 := v.Args[1] 29852 if s0.Op != OpS390XSLWconst { 29853 break 29854 } 29855 j0 := s0.AuxInt 29856 x0 := s0.Args[0] 29857 if x0.Op != OpS390XMOVBZloadidx { 29858 break 29859 } 29860 i0 := x0.AuxInt 29861 if x0.Aux != s { 29862 break 29863 } 29864 if p != x0.Args[0] { 29865 break 29866 } 29867 if idx != x0.Args[1] { 29868 break 29869 } 29870 if mem != x0.Args[2] { 29871 break 29872 } 29873 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29874 break 29875 } 29876 b = mergePoint(b, x0, x1) 29877 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29878 v.reset(OpCopy) 29879 v.AddArg(v0) 29880 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29881 v1.AuxInt = j1 29882 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29883 v2.AuxInt = i0 29884 v2.Aux = s 29885 v2.AddArg(p) 29886 v2.AddArg(idx) 29887 v2.AddArg(mem) 29888 v1.AddArg(v2) 29889 v0.AddArg(v1) 29890 v0.AddArg(y) 29891 return true 29892 } 29893 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29894 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29895 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29896 for { 29897 or := v.Args[0] 29898 if or.Op != OpS390XORW { 29899 break 29900 } 29901 y := or.Args[0] 29902 s1 := or.Args[1] 29903 if s1.Op != OpS390XSLWconst { 29904 break 29905 } 29906 j1 := s1.AuxInt 29907 x1 := s1.Args[0] 29908 if x1.Op != OpS390XMOVBZloadidx { 29909 break 29910 } 29911 i1 := x1.AuxInt 29912 s := x1.Aux 29913 p := x1.Args[0] 29914 idx := x1.Args[1] 29915 mem := x1.Args[2] 29916 s0 := v.Args[1] 29917 if s0.Op != OpS390XSLWconst { 29918 break 29919 } 29920 j0 := s0.AuxInt 29921 x0 := s0.Args[0] 29922 if x0.Op != OpS390XMOVBZloadidx { 29923 break 29924 } 29925 i0 := x0.AuxInt 29926 if x0.Aux != s { 29927 break 29928 } 29929 if p != x0.Args[0] { 29930 break 29931 } 29932 if idx != x0.Args[1] { 29933 break 29934 } 29935 if mem != x0.Args[2] { 29936 break 29937 } 29938 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 29939 break 29940 } 29941 b = mergePoint(b, x0, x1) 29942 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 29943 v.reset(OpCopy) 29944 v.AddArg(v0) 29945 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 29946 v1.AuxInt = j1 29947 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 29948 v2.AuxInt = i0 29949 v2.Aux = s 29950 v2.AddArg(p) 29951 v2.AddArg(idx) 29952 v2.AddArg(mem) 29953 v1.AddArg(v2) 29954 v0.AddArg(v1) 29955 v0.AddArg(y) 29956 return true 29957 } 29958 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) 29959 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 29960 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 29961 for { 29962 or := v.Args[0] 29963 if or.Op != OpS390XORW { 29964 break 29965 } 29966 y := or.Args[0] 29967 s1 := or.Args[1] 29968 if s1.Op != OpS390XSLWconst { 29969 break 29970 } 29971 j1 := s1.AuxInt 29972 x1 := s1.Args[0] 29973 if x1.Op != OpS390XMOVBZloadidx { 29974 break 29975 } 29976 i1 := x1.AuxInt 29977 s := x1.Aux 29978 idx := x1.Args[0] 29979 p := x1.Args[1] 29980 mem := x1.Args[2] 29981 s0 := v.Args[1] 29982 if s0.Op != OpS390XSLWconst { 29983 break 29984 } 29985 j0 := s0.AuxInt 29986 x0 := s0.Args[0] 29987 if x0.Op != OpS390XMOVBZloadidx { 29988 break 29989 } 29990 i0 := x0.AuxInt 29991 if x0.Aux != s { 29992 break 29993 } 29994 if p != x0.Args[0] { 29995 break 29996 } 29997 if idx != x0.Args[1] { 29998 break 29999 } 30000 if mem != x0.Args[2] { 30001 break 30002 } 30003 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30004 break 30005 } 30006 b = mergePoint(b, x0, x1) 30007 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30008 v.reset(OpCopy) 30009 v.AddArg(v0) 30010 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30011 v1.AuxInt = j1 30012 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 30013 v2.AuxInt = i0 30014 v2.Aux = s 30015 v2.AddArg(p) 30016 v2.AddArg(idx) 30017 v2.AddArg(mem) 30018 v1.AddArg(v2) 30019 v0.AddArg(v1) 30020 v0.AddArg(y) 30021 return true 30022 } 30023 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 30024 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30025 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30026 for { 30027 or := v.Args[0] 30028 if or.Op != OpS390XORW { 30029 break 30030 } 30031 s1 := or.Args[0] 30032 if s1.Op != OpS390XSLWconst { 30033 break 30034 } 30035 j1 := s1.AuxInt 30036 x1 := s1.Args[0] 30037 if x1.Op != OpS390XMOVBZloadidx { 30038 break 30039 } 30040 i1 := x1.AuxInt 30041 s := x1.Aux 30042 p := x1.Args[0] 30043 idx := x1.Args[1] 30044 mem := x1.Args[2] 30045 y := or.Args[1] 30046 s0 := v.Args[1] 30047 if s0.Op != OpS390XSLWconst { 30048 break 30049 } 30050 j0 := s0.AuxInt 30051 x0 := s0.Args[0] 30052 if x0.Op != OpS390XMOVBZloadidx { 30053 break 30054 } 30055 i0 := x0.AuxInt 30056 if x0.Aux != s { 30057 break 30058 } 30059 if idx != x0.Args[0] { 30060 break 30061 } 30062 if p != x0.Args[1] { 30063 break 30064 } 30065 if mem != x0.Args[2] { 30066 break 30067 } 30068 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30069 break 30070 } 30071 b = mergePoint(b, x0, x1) 30072 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30073 v.reset(OpCopy) 30074 v.AddArg(v0) 30075 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30076 v1.AuxInt = j1 30077 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 30078 v2.AuxInt = i0 30079 v2.Aux = s 30080 v2.AddArg(p) 30081 v2.AddArg(idx) 30082 v2.AddArg(mem) 30083 v1.AddArg(v2) 30084 v0.AddArg(v1) 30085 v0.AddArg(y) 30086 return true 30087 } 30088 return false 30089 } 30090 func rewriteValueS390X_OpS390XORW_50(v *Value) bool { 30091 b := v.Block 30092 _ = b 30093 types := &b.Func.Config.Types 30094 _ = types 30095 // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 30096 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30097 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30098 for { 30099 or := v.Args[0] 30100 if or.Op != OpS390XORW { 30101 break 30102 } 30103 s1 := or.Args[0] 30104 if s1.Op != OpS390XSLWconst { 30105 break 30106 } 30107 j1 := s1.AuxInt 30108 x1 := s1.Args[0] 30109 if x1.Op != OpS390XMOVBZloadidx { 30110 break 30111 } 30112 i1 := x1.AuxInt 30113 s := x1.Aux 30114 idx := x1.Args[0] 30115 p := x1.Args[1] 30116 mem := x1.Args[2] 30117 y := or.Args[1] 30118 s0 := v.Args[1] 30119 if s0.Op != OpS390XSLWconst { 30120 break 30121 } 30122 j0 := s0.AuxInt 30123 x0 := s0.Args[0] 30124 if x0.Op != OpS390XMOVBZloadidx { 30125 break 30126 } 30127 i0 := x0.AuxInt 30128 if x0.Aux != s { 30129 break 30130 } 30131 if idx != x0.Args[0] { 30132 break 30133 } 30134 if p != x0.Args[1] { 30135 break 30136 } 30137 if mem != x0.Args[2] { 30138 break 30139 } 30140 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30141 break 30142 } 30143 b = mergePoint(b, x0, x1) 30144 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30145 v.reset(OpCopy) 30146 v.AddArg(v0) 30147 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30148 v1.AuxInt = j1 30149 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 30150 v2.AuxInt = i0 30151 v2.Aux = s 30152 v2.AddArg(p) 30153 v2.AddArg(idx) 30154 v2.AddArg(mem) 30155 v1.AddArg(v2) 30156 v0.AddArg(v1) 30157 v0.AddArg(y) 30158 return true 30159 } 30160 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 30161 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30162 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30163 for { 30164 or := v.Args[0] 30165 if or.Op != OpS390XORW { 30166 break 30167 } 30168 y := or.Args[0] 30169 s1 := or.Args[1] 30170 if s1.Op != OpS390XSLWconst { 30171 break 30172 } 30173 j1 := s1.AuxInt 30174 x1 := s1.Args[0] 30175 if x1.Op != OpS390XMOVBZloadidx { 30176 break 30177 } 30178 i1 := x1.AuxInt 30179 s := x1.Aux 30180 p := x1.Args[0] 30181 idx := x1.Args[1] 30182 mem := x1.Args[2] 30183 s0 := v.Args[1] 30184 if s0.Op != OpS390XSLWconst { 30185 break 30186 } 30187 j0 := s0.AuxInt 30188 x0 := s0.Args[0] 30189 if x0.Op != OpS390XMOVBZloadidx { 30190 break 30191 } 30192 i0 := x0.AuxInt 30193 if x0.Aux != s { 30194 break 30195 } 30196 if idx != x0.Args[0] { 30197 break 30198 } 30199 if p != x0.Args[1] { 30200 break 30201 } 30202 if mem != x0.Args[2] { 30203 break 30204 } 30205 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30206 break 30207 } 30208 b = mergePoint(b, x0, x1) 30209 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30210 v.reset(OpCopy) 30211 v.AddArg(v0) 30212 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30213 v1.AuxInt = j1 30214 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 30215 v2.AuxInt = i0 30216 v2.Aux = s 30217 v2.AddArg(p) 30218 v2.AddArg(idx) 30219 v2.AddArg(mem) 30220 v1.AddArg(v2) 30221 v0.AddArg(v1) 30222 v0.AddArg(y) 30223 return true 30224 } 30225 // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) 30226 // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30227 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) 30228 for { 30229 or := v.Args[0] 30230 if or.Op != OpS390XORW { 30231 break 30232 } 30233 y := or.Args[0] 30234 s1 := or.Args[1] 30235 if s1.Op != OpS390XSLWconst { 30236 break 30237 } 30238 j1 := s1.AuxInt 30239 x1 := s1.Args[0] 30240 if x1.Op != OpS390XMOVBZloadidx { 30241 break 30242 } 30243 i1 := x1.AuxInt 30244 s := x1.Aux 30245 idx := x1.Args[0] 30246 p := x1.Args[1] 30247 mem := x1.Args[2] 30248 s0 := v.Args[1] 30249 if s0.Op != OpS390XSLWconst { 30250 break 30251 } 30252 j0 := s0.AuxInt 30253 x0 := s0.Args[0] 30254 if x0.Op != OpS390XMOVBZloadidx { 30255 break 30256 } 30257 i0 := x0.AuxInt 30258 if x0.Aux != s { 30259 break 30260 } 30261 if idx != x0.Args[0] { 30262 break 30263 } 30264 if p != x0.Args[1] { 30265 break 30266 } 30267 if mem != x0.Args[2] { 30268 break 30269 } 30270 if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30271 break 30272 } 30273 b = mergePoint(b, x0, x1) 30274 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30275 v.reset(OpCopy) 30276 v.AddArg(v0) 30277 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30278 v1.AuxInt = j1 30279 v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, types.UInt16) 30280 v2.AuxInt = i0 30281 v2.Aux = s 30282 v2.AddArg(p) 30283 v2.AddArg(idx) 30284 v2.AddArg(mem) 30285 v1.AddArg(v2) 30286 v0.AddArg(v1) 30287 v0.AddArg(y) 30288 return true 30289 } 30290 // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) 30291 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30292 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 30293 for { 30294 x0 := v.Args[0] 30295 if x0.Op != OpS390XMOVBZload { 30296 break 30297 } 30298 i0 := x0.AuxInt 30299 s := x0.Aux 30300 p := x0.Args[0] 30301 mem := x0.Args[1] 30302 sh := v.Args[1] 30303 if sh.Op != OpS390XSLWconst { 30304 break 30305 } 30306 if sh.AuxInt != 8 { 30307 break 30308 } 30309 x1 := sh.Args[0] 30310 if x1.Op != OpS390XMOVBZload { 30311 break 30312 } 30313 i1 := x1.AuxInt 30314 if x1.Aux != s { 30315 break 30316 } 30317 if p != x1.Args[0] { 30318 break 30319 } 30320 if mem != x1.Args[1] { 30321 break 30322 } 30323 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30324 break 30325 } 30326 b = mergePoint(b, x0, x1) 30327 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30328 v.reset(OpCopy) 30329 v.AddArg(v0) 30330 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30331 v1.AuxInt = i0 30332 v1.Aux = s 30333 v1.AddArg(p) 30334 v1.AddArg(mem) 30335 v0.AddArg(v1) 30336 return true 30337 } 30338 // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) 30339 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30340 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) 30341 for { 30342 sh := v.Args[0] 30343 if sh.Op != OpS390XSLWconst { 30344 break 30345 } 30346 if sh.AuxInt != 8 { 30347 break 30348 } 30349 x1 := sh.Args[0] 30350 if x1.Op != OpS390XMOVBZload { 30351 break 30352 } 30353 i1 := x1.AuxInt 30354 s := x1.Aux 30355 p := x1.Args[0] 30356 mem := x1.Args[1] 30357 x0 := v.Args[1] 30358 if x0.Op != OpS390XMOVBZload { 30359 break 30360 } 30361 i0 := x0.AuxInt 30362 if x0.Aux != s { 30363 break 30364 } 30365 if p != x0.Args[0] { 30366 break 30367 } 30368 if mem != x0.Args[1] { 30369 break 30370 } 30371 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30372 break 30373 } 30374 b = mergePoint(b, x0, x1) 30375 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30376 v.reset(OpCopy) 30377 v.AddArg(v0) 30378 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30379 v1.AuxInt = i0 30380 v1.Aux = s 30381 v1.AddArg(p) 30382 v1.AddArg(mem) 30383 v0.AddArg(v1) 30384 return true 30385 } 30386 // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) 30387 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 30388 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 30389 for { 30390 r0 := v.Args[0] 30391 if r0.Op != OpS390XMOVHZreg { 30392 break 30393 } 30394 x0 := r0.Args[0] 30395 if x0.Op != OpS390XMOVHBRload { 30396 break 30397 } 30398 i0 := x0.AuxInt 30399 s := x0.Aux 30400 p := x0.Args[0] 30401 mem := x0.Args[1] 30402 sh := v.Args[1] 30403 if sh.Op != OpS390XSLWconst { 30404 break 30405 } 30406 if sh.AuxInt != 16 { 30407 break 30408 } 30409 r1 := sh.Args[0] 30410 if r1.Op != OpS390XMOVHZreg { 30411 break 30412 } 30413 x1 := r1.Args[0] 30414 if x1.Op != OpS390XMOVHBRload { 30415 break 30416 } 30417 i1 := x1.AuxInt 30418 if x1.Aux != s { 30419 break 30420 } 30421 if p != x1.Args[0] { 30422 break 30423 } 30424 if mem != x1.Args[1] { 30425 break 30426 } 30427 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 30428 break 30429 } 30430 b = mergePoint(b, x0, x1) 30431 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 30432 v.reset(OpCopy) 30433 v.AddArg(v0) 30434 v0.AuxInt = i0 30435 v0.Aux = s 30436 v0.AddArg(p) 30437 v0.AddArg(mem) 30438 return true 30439 } 30440 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) 30441 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 30442 // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) 30443 for { 30444 sh := v.Args[0] 30445 if sh.Op != OpS390XSLWconst { 30446 break 30447 } 30448 if sh.AuxInt != 16 { 30449 break 30450 } 30451 r1 := sh.Args[0] 30452 if r1.Op != OpS390XMOVHZreg { 30453 break 30454 } 30455 x1 := r1.Args[0] 30456 if x1.Op != OpS390XMOVHBRload { 30457 break 30458 } 30459 i1 := x1.AuxInt 30460 s := x1.Aux 30461 p := x1.Args[0] 30462 mem := x1.Args[1] 30463 r0 := v.Args[1] 30464 if r0.Op != OpS390XMOVHZreg { 30465 break 30466 } 30467 x0 := r0.Args[0] 30468 if x0.Op != OpS390XMOVHBRload { 30469 break 30470 } 30471 i0 := x0.AuxInt 30472 if x0.Aux != s { 30473 break 30474 } 30475 if p != x0.Args[0] { 30476 break 30477 } 30478 if mem != x0.Args[1] { 30479 break 30480 } 30481 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 30482 break 30483 } 30484 b = mergePoint(b, x0, x1) 30485 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRload, types.UInt32) 30486 v.reset(OpCopy) 30487 v.AddArg(v0) 30488 v0.AuxInt = i0 30489 v0.Aux = s 30490 v0.AddArg(p) 30491 v0.AddArg(mem) 30492 return true 30493 } 30494 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) 30495 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30496 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 30497 for { 30498 s1 := v.Args[0] 30499 if s1.Op != OpS390XSLWconst { 30500 break 30501 } 30502 j1 := s1.AuxInt 30503 x1 := s1.Args[0] 30504 if x1.Op != OpS390XMOVBZload { 30505 break 30506 } 30507 i1 := x1.AuxInt 30508 s := x1.Aux 30509 p := x1.Args[0] 30510 mem := x1.Args[1] 30511 or := v.Args[1] 30512 if or.Op != OpS390XORW { 30513 break 30514 } 30515 s0 := or.Args[0] 30516 if s0.Op != OpS390XSLWconst { 30517 break 30518 } 30519 j0 := s0.AuxInt 30520 x0 := s0.Args[0] 30521 if x0.Op != OpS390XMOVBZload { 30522 break 30523 } 30524 i0 := x0.AuxInt 30525 if x0.Aux != s { 30526 break 30527 } 30528 if p != x0.Args[0] { 30529 break 30530 } 30531 if mem != x0.Args[1] { 30532 break 30533 } 30534 y := or.Args[1] 30535 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30536 break 30537 } 30538 b = mergePoint(b, x0, x1) 30539 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30540 v.reset(OpCopy) 30541 v.AddArg(v0) 30542 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30543 v1.AuxInt = j0 30544 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30545 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30546 v3.AuxInt = i0 30547 v3.Aux = s 30548 v3.AddArg(p) 30549 v3.AddArg(mem) 30550 v2.AddArg(v3) 30551 v1.AddArg(v2) 30552 v0.AddArg(v1) 30553 v0.AddArg(y) 30554 return true 30555 } 30556 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) 30557 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30558 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 30559 for { 30560 s1 := v.Args[0] 30561 if s1.Op != OpS390XSLWconst { 30562 break 30563 } 30564 j1 := s1.AuxInt 30565 x1 := s1.Args[0] 30566 if x1.Op != OpS390XMOVBZload { 30567 break 30568 } 30569 i1 := x1.AuxInt 30570 s := x1.Aux 30571 p := x1.Args[0] 30572 mem := x1.Args[1] 30573 or := v.Args[1] 30574 if or.Op != OpS390XORW { 30575 break 30576 } 30577 y := or.Args[0] 30578 s0 := or.Args[1] 30579 if s0.Op != OpS390XSLWconst { 30580 break 30581 } 30582 j0 := s0.AuxInt 30583 x0 := s0.Args[0] 30584 if x0.Op != OpS390XMOVBZload { 30585 break 30586 } 30587 i0 := x0.AuxInt 30588 if x0.Aux != s { 30589 break 30590 } 30591 if p != x0.Args[0] { 30592 break 30593 } 30594 if mem != x0.Args[1] { 30595 break 30596 } 30597 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30598 break 30599 } 30600 b = mergePoint(b, x0, x1) 30601 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30602 v.reset(OpCopy) 30603 v.AddArg(v0) 30604 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30605 v1.AuxInt = j0 30606 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30607 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30608 v3.AuxInt = i0 30609 v3.Aux = s 30610 v3.AddArg(p) 30611 v3.AddArg(mem) 30612 v2.AddArg(v3) 30613 v1.AddArg(v2) 30614 v0.AddArg(v1) 30615 v0.AddArg(y) 30616 return true 30617 } 30618 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 30619 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30620 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 30621 for { 30622 or := v.Args[0] 30623 if or.Op != OpS390XORW { 30624 break 30625 } 30626 s0 := or.Args[0] 30627 if s0.Op != OpS390XSLWconst { 30628 break 30629 } 30630 j0 := s0.AuxInt 30631 x0 := s0.Args[0] 30632 if x0.Op != OpS390XMOVBZload { 30633 break 30634 } 30635 i0 := x0.AuxInt 30636 s := x0.Aux 30637 p := x0.Args[0] 30638 mem := x0.Args[1] 30639 y := or.Args[1] 30640 s1 := v.Args[1] 30641 if s1.Op != OpS390XSLWconst { 30642 break 30643 } 30644 j1 := s1.AuxInt 30645 x1 := s1.Args[0] 30646 if x1.Op != OpS390XMOVBZload { 30647 break 30648 } 30649 i1 := x1.AuxInt 30650 if x1.Aux != s { 30651 break 30652 } 30653 if p != x1.Args[0] { 30654 break 30655 } 30656 if mem != x1.Args[1] { 30657 break 30658 } 30659 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30660 break 30661 } 30662 b = mergePoint(b, x0, x1) 30663 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30664 v.reset(OpCopy) 30665 v.AddArg(v0) 30666 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30667 v1.AuxInt = j0 30668 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30669 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30670 v3.AuxInt = i0 30671 v3.Aux = s 30672 v3.AddArg(p) 30673 v3.AddArg(mem) 30674 v2.AddArg(v3) 30675 v1.AddArg(v2) 30676 v0.AddArg(v1) 30677 v0.AddArg(y) 30678 return true 30679 } 30680 return false 30681 } 30682 func rewriteValueS390X_OpS390XORW_60(v *Value) bool { 30683 b := v.Block 30684 _ = b 30685 types := &b.Func.Config.Types 30686 _ = types 30687 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) 30688 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 30689 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) 30690 for { 30691 or := v.Args[0] 30692 if or.Op != OpS390XORW { 30693 break 30694 } 30695 y := or.Args[0] 30696 s0 := or.Args[1] 30697 if s0.Op != OpS390XSLWconst { 30698 break 30699 } 30700 j0 := s0.AuxInt 30701 x0 := s0.Args[0] 30702 if x0.Op != OpS390XMOVBZload { 30703 break 30704 } 30705 i0 := x0.AuxInt 30706 s := x0.Aux 30707 p := x0.Args[0] 30708 mem := x0.Args[1] 30709 s1 := v.Args[1] 30710 if s1.Op != OpS390XSLWconst { 30711 break 30712 } 30713 j1 := s1.AuxInt 30714 x1 := s1.Args[0] 30715 if x1.Op != OpS390XMOVBZload { 30716 break 30717 } 30718 i1 := x1.AuxInt 30719 if x1.Aux != s { 30720 break 30721 } 30722 if p != x1.Args[0] { 30723 break 30724 } 30725 if mem != x1.Args[1] { 30726 break 30727 } 30728 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 30729 break 30730 } 30731 b = mergePoint(b, x0, x1) 30732 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 30733 v.reset(OpCopy) 30734 v.AddArg(v0) 30735 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 30736 v1.AuxInt = j0 30737 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30738 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRload, types.UInt16) 30739 v3.AuxInt = i0 30740 v3.Aux = s 30741 v3.AddArg(p) 30742 v3.AddArg(mem) 30743 v2.AddArg(v3) 30744 v1.AddArg(v2) 30745 v0.AddArg(v1) 30746 v0.AddArg(y) 30747 return true 30748 } 30749 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 30750 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30751 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30752 for { 30753 x0 := v.Args[0] 30754 if x0.Op != OpS390XMOVBZloadidx { 30755 break 30756 } 30757 i0 := x0.AuxInt 30758 s := x0.Aux 30759 p := x0.Args[0] 30760 idx := x0.Args[1] 30761 mem := x0.Args[2] 30762 sh := v.Args[1] 30763 if sh.Op != OpS390XSLWconst { 30764 break 30765 } 30766 if sh.AuxInt != 8 { 30767 break 30768 } 30769 x1 := sh.Args[0] 30770 if x1.Op != OpS390XMOVBZloadidx { 30771 break 30772 } 30773 i1 := x1.AuxInt 30774 if x1.Aux != s { 30775 break 30776 } 30777 if p != x1.Args[0] { 30778 break 30779 } 30780 if idx != x1.Args[1] { 30781 break 30782 } 30783 if mem != x1.Args[2] { 30784 break 30785 } 30786 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30787 break 30788 } 30789 b = mergePoint(b, x0, x1) 30790 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30791 v.reset(OpCopy) 30792 v.AddArg(v0) 30793 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30794 v1.AuxInt = i0 30795 v1.Aux = s 30796 v1.AddArg(p) 30797 v1.AddArg(idx) 30798 v1.AddArg(mem) 30799 v0.AddArg(v1) 30800 return true 30801 } 30802 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) 30803 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30804 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30805 for { 30806 x0 := v.Args[0] 30807 if x0.Op != OpS390XMOVBZloadidx { 30808 break 30809 } 30810 i0 := x0.AuxInt 30811 s := x0.Aux 30812 idx := x0.Args[0] 30813 p := x0.Args[1] 30814 mem := x0.Args[2] 30815 sh := v.Args[1] 30816 if sh.Op != OpS390XSLWconst { 30817 break 30818 } 30819 if sh.AuxInt != 8 { 30820 break 30821 } 30822 x1 := sh.Args[0] 30823 if x1.Op != OpS390XMOVBZloadidx { 30824 break 30825 } 30826 i1 := x1.AuxInt 30827 if x1.Aux != s { 30828 break 30829 } 30830 if p != x1.Args[0] { 30831 break 30832 } 30833 if idx != x1.Args[1] { 30834 break 30835 } 30836 if mem != x1.Args[2] { 30837 break 30838 } 30839 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30840 break 30841 } 30842 b = mergePoint(b, x0, x1) 30843 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30844 v.reset(OpCopy) 30845 v.AddArg(v0) 30846 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30847 v1.AuxInt = i0 30848 v1.Aux = s 30849 v1.AddArg(p) 30850 v1.AddArg(idx) 30851 v1.AddArg(mem) 30852 v0.AddArg(v1) 30853 return true 30854 } 30855 // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 30856 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30857 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30858 for { 30859 x0 := v.Args[0] 30860 if x0.Op != OpS390XMOVBZloadidx { 30861 break 30862 } 30863 i0 := x0.AuxInt 30864 s := x0.Aux 30865 p := x0.Args[0] 30866 idx := x0.Args[1] 30867 mem := x0.Args[2] 30868 sh := v.Args[1] 30869 if sh.Op != OpS390XSLWconst { 30870 break 30871 } 30872 if sh.AuxInt != 8 { 30873 break 30874 } 30875 x1 := sh.Args[0] 30876 if x1.Op != OpS390XMOVBZloadidx { 30877 break 30878 } 30879 i1 := x1.AuxInt 30880 if x1.Aux != s { 30881 break 30882 } 30883 if idx != x1.Args[0] { 30884 break 30885 } 30886 if p != x1.Args[1] { 30887 break 30888 } 30889 if mem != x1.Args[2] { 30890 break 30891 } 30892 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30893 break 30894 } 30895 b = mergePoint(b, x0, x1) 30896 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30897 v.reset(OpCopy) 30898 v.AddArg(v0) 30899 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30900 v1.AuxInt = i0 30901 v1.Aux = s 30902 v1.AddArg(p) 30903 v1.AddArg(idx) 30904 v1.AddArg(mem) 30905 v0.AddArg(v1) 30906 return true 30907 } 30908 // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) 30909 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30910 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30911 for { 30912 x0 := v.Args[0] 30913 if x0.Op != OpS390XMOVBZloadidx { 30914 break 30915 } 30916 i0 := x0.AuxInt 30917 s := x0.Aux 30918 idx := x0.Args[0] 30919 p := x0.Args[1] 30920 mem := x0.Args[2] 30921 sh := v.Args[1] 30922 if sh.Op != OpS390XSLWconst { 30923 break 30924 } 30925 if sh.AuxInt != 8 { 30926 break 30927 } 30928 x1 := sh.Args[0] 30929 if x1.Op != OpS390XMOVBZloadidx { 30930 break 30931 } 30932 i1 := x1.AuxInt 30933 if x1.Aux != s { 30934 break 30935 } 30936 if idx != x1.Args[0] { 30937 break 30938 } 30939 if p != x1.Args[1] { 30940 break 30941 } 30942 if mem != x1.Args[2] { 30943 break 30944 } 30945 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30946 break 30947 } 30948 b = mergePoint(b, x0, x1) 30949 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 30950 v.reset(OpCopy) 30951 v.AddArg(v0) 30952 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 30953 v1.AuxInt = i0 30954 v1.Aux = s 30955 v1.AddArg(p) 30956 v1.AddArg(idx) 30957 v1.AddArg(mem) 30958 v0.AddArg(v1) 30959 return true 30960 } 30961 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 30962 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 30963 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 30964 for { 30965 sh := v.Args[0] 30966 if sh.Op != OpS390XSLWconst { 30967 break 30968 } 30969 if sh.AuxInt != 8 { 30970 break 30971 } 30972 x1 := sh.Args[0] 30973 if x1.Op != OpS390XMOVBZloadidx { 30974 break 30975 } 30976 i1 := x1.AuxInt 30977 s := x1.Aux 30978 p := x1.Args[0] 30979 idx := x1.Args[1] 30980 mem := x1.Args[2] 30981 x0 := v.Args[1] 30982 if x0.Op != OpS390XMOVBZloadidx { 30983 break 30984 } 30985 i0 := x0.AuxInt 30986 if x0.Aux != s { 30987 break 30988 } 30989 if p != x0.Args[0] { 30990 break 30991 } 30992 if idx != x0.Args[1] { 30993 break 30994 } 30995 if mem != x0.Args[2] { 30996 break 30997 } 30998 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 30999 break 31000 } 31001 b = mergePoint(b, x0, x1) 31002 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31003 v.reset(OpCopy) 31004 v.AddArg(v0) 31005 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31006 v1.AuxInt = i0 31007 v1.Aux = s 31008 v1.AddArg(p) 31009 v1.AddArg(idx) 31010 v1.AddArg(mem) 31011 v0.AddArg(v1) 31012 return true 31013 } 31014 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) 31015 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 31016 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 31017 for { 31018 sh := v.Args[0] 31019 if sh.Op != OpS390XSLWconst { 31020 break 31021 } 31022 if sh.AuxInt != 8 { 31023 break 31024 } 31025 x1 := sh.Args[0] 31026 if x1.Op != OpS390XMOVBZloadidx { 31027 break 31028 } 31029 i1 := x1.AuxInt 31030 s := x1.Aux 31031 idx := x1.Args[0] 31032 p := x1.Args[1] 31033 mem := x1.Args[2] 31034 x0 := v.Args[1] 31035 if x0.Op != OpS390XMOVBZloadidx { 31036 break 31037 } 31038 i0 := x0.AuxInt 31039 if x0.Aux != s { 31040 break 31041 } 31042 if p != x0.Args[0] { 31043 break 31044 } 31045 if idx != x0.Args[1] { 31046 break 31047 } 31048 if mem != x0.Args[2] { 31049 break 31050 } 31051 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 31052 break 31053 } 31054 b = mergePoint(b, x0, x1) 31055 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31056 v.reset(OpCopy) 31057 v.AddArg(v0) 31058 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31059 v1.AuxInt = i0 31060 v1.Aux = s 31061 v1.AddArg(p) 31062 v1.AddArg(idx) 31063 v1.AddArg(mem) 31064 v0.AddArg(v1) 31065 return true 31066 } 31067 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 31068 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 31069 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 31070 for { 31071 sh := v.Args[0] 31072 if sh.Op != OpS390XSLWconst { 31073 break 31074 } 31075 if sh.AuxInt != 8 { 31076 break 31077 } 31078 x1 := sh.Args[0] 31079 if x1.Op != OpS390XMOVBZloadidx { 31080 break 31081 } 31082 i1 := x1.AuxInt 31083 s := x1.Aux 31084 p := x1.Args[0] 31085 idx := x1.Args[1] 31086 mem := x1.Args[2] 31087 x0 := v.Args[1] 31088 if x0.Op != OpS390XMOVBZloadidx { 31089 break 31090 } 31091 i0 := x0.AuxInt 31092 if x0.Aux != s { 31093 break 31094 } 31095 if idx != x0.Args[0] { 31096 break 31097 } 31098 if p != x0.Args[1] { 31099 break 31100 } 31101 if mem != x0.Args[2] { 31102 break 31103 } 31104 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 31105 break 31106 } 31107 b = mergePoint(b, x0, x1) 31108 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31109 v.reset(OpCopy) 31110 v.AddArg(v0) 31111 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31112 v1.AuxInt = i0 31113 v1.Aux = s 31114 v1.AddArg(p) 31115 v1.AddArg(idx) 31116 v1.AddArg(mem) 31117 v0.AddArg(v1) 31118 return true 31119 } 31120 // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) 31121 // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) 31122 // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) 31123 for { 31124 sh := v.Args[0] 31125 if sh.Op != OpS390XSLWconst { 31126 break 31127 } 31128 if sh.AuxInt != 8 { 31129 break 31130 } 31131 x1 := sh.Args[0] 31132 if x1.Op != OpS390XMOVBZloadidx { 31133 break 31134 } 31135 i1 := x1.AuxInt 31136 s := x1.Aux 31137 idx := x1.Args[0] 31138 p := x1.Args[1] 31139 mem := x1.Args[2] 31140 x0 := v.Args[1] 31141 if x0.Op != OpS390XMOVBZloadidx { 31142 break 31143 } 31144 i0 := x0.AuxInt 31145 if x0.Aux != s { 31146 break 31147 } 31148 if idx != x0.Args[0] { 31149 break 31150 } 31151 if p != x0.Args[1] { 31152 break 31153 } 31154 if mem != x0.Args[2] { 31155 break 31156 } 31157 if !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { 31158 break 31159 } 31160 b = mergePoint(b, x0, x1) 31161 v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31162 v.reset(OpCopy) 31163 v.AddArg(v0) 31164 v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31165 v1.AuxInt = i0 31166 v1.Aux = s 31167 v1.AddArg(p) 31168 v1.AddArg(idx) 31169 v1.AddArg(mem) 31170 v0.AddArg(v1) 31171 return true 31172 } 31173 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 31174 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31175 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31176 for { 31177 r0 := v.Args[0] 31178 if r0.Op != OpS390XMOVHZreg { 31179 break 31180 } 31181 x0 := r0.Args[0] 31182 if x0.Op != OpS390XMOVHBRloadidx { 31183 break 31184 } 31185 i0 := x0.AuxInt 31186 s := x0.Aux 31187 p := x0.Args[0] 31188 idx := x0.Args[1] 31189 mem := x0.Args[2] 31190 sh := v.Args[1] 31191 if sh.Op != OpS390XSLWconst { 31192 break 31193 } 31194 if sh.AuxInt != 16 { 31195 break 31196 } 31197 r1 := sh.Args[0] 31198 if r1.Op != OpS390XMOVHZreg { 31199 break 31200 } 31201 x1 := r1.Args[0] 31202 if x1.Op != OpS390XMOVHBRloadidx { 31203 break 31204 } 31205 i1 := x1.AuxInt 31206 if x1.Aux != s { 31207 break 31208 } 31209 if p != x1.Args[0] { 31210 break 31211 } 31212 if idx != x1.Args[1] { 31213 break 31214 } 31215 if mem != x1.Args[2] { 31216 break 31217 } 31218 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31219 break 31220 } 31221 b = mergePoint(b, x0, x1) 31222 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31223 v.reset(OpCopy) 31224 v.AddArg(v0) 31225 v0.AuxInt = i0 31226 v0.Aux = s 31227 v0.AddArg(p) 31228 v0.AddArg(idx) 31229 v0.AddArg(mem) 31230 return true 31231 } 31232 return false 31233 } 31234 func rewriteValueS390X_OpS390XORW_70(v *Value) bool { 31235 b := v.Block 31236 _ = b 31237 types := &b.Func.Config.Types 31238 _ = types 31239 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) 31240 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31241 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31242 for { 31243 r0 := v.Args[0] 31244 if r0.Op != OpS390XMOVHZreg { 31245 break 31246 } 31247 x0 := r0.Args[0] 31248 if x0.Op != OpS390XMOVHBRloadidx { 31249 break 31250 } 31251 i0 := x0.AuxInt 31252 s := x0.Aux 31253 idx := x0.Args[0] 31254 p := x0.Args[1] 31255 mem := x0.Args[2] 31256 sh := v.Args[1] 31257 if sh.Op != OpS390XSLWconst { 31258 break 31259 } 31260 if sh.AuxInt != 16 { 31261 break 31262 } 31263 r1 := sh.Args[0] 31264 if r1.Op != OpS390XMOVHZreg { 31265 break 31266 } 31267 x1 := r1.Args[0] 31268 if x1.Op != OpS390XMOVHBRloadidx { 31269 break 31270 } 31271 i1 := x1.AuxInt 31272 if x1.Aux != s { 31273 break 31274 } 31275 if p != x1.Args[0] { 31276 break 31277 } 31278 if idx != x1.Args[1] { 31279 break 31280 } 31281 if mem != x1.Args[2] { 31282 break 31283 } 31284 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31285 break 31286 } 31287 b = mergePoint(b, x0, x1) 31288 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31289 v.reset(OpCopy) 31290 v.AddArg(v0) 31291 v0.AuxInt = i0 31292 v0.Aux = s 31293 v0.AddArg(p) 31294 v0.AddArg(idx) 31295 v0.AddArg(mem) 31296 return true 31297 } 31298 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 31299 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31300 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31301 for { 31302 r0 := v.Args[0] 31303 if r0.Op != OpS390XMOVHZreg { 31304 break 31305 } 31306 x0 := r0.Args[0] 31307 if x0.Op != OpS390XMOVHBRloadidx { 31308 break 31309 } 31310 i0 := x0.AuxInt 31311 s := x0.Aux 31312 p := x0.Args[0] 31313 idx := x0.Args[1] 31314 mem := x0.Args[2] 31315 sh := v.Args[1] 31316 if sh.Op != OpS390XSLWconst { 31317 break 31318 } 31319 if sh.AuxInt != 16 { 31320 break 31321 } 31322 r1 := sh.Args[0] 31323 if r1.Op != OpS390XMOVHZreg { 31324 break 31325 } 31326 x1 := r1.Args[0] 31327 if x1.Op != OpS390XMOVHBRloadidx { 31328 break 31329 } 31330 i1 := x1.AuxInt 31331 if x1.Aux != s { 31332 break 31333 } 31334 if idx != x1.Args[0] { 31335 break 31336 } 31337 if p != x1.Args[1] { 31338 break 31339 } 31340 if mem != x1.Args[2] { 31341 break 31342 } 31343 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31344 break 31345 } 31346 b = mergePoint(b, x0, x1) 31347 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31348 v.reset(OpCopy) 31349 v.AddArg(v0) 31350 v0.AuxInt = i0 31351 v0.Aux = s 31352 v0.AddArg(p) 31353 v0.AddArg(idx) 31354 v0.AddArg(mem) 31355 return true 31356 } 31357 // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) 31358 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31359 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31360 for { 31361 r0 := v.Args[0] 31362 if r0.Op != OpS390XMOVHZreg { 31363 break 31364 } 31365 x0 := r0.Args[0] 31366 if x0.Op != OpS390XMOVHBRloadidx { 31367 break 31368 } 31369 i0 := x0.AuxInt 31370 s := x0.Aux 31371 idx := x0.Args[0] 31372 p := x0.Args[1] 31373 mem := x0.Args[2] 31374 sh := v.Args[1] 31375 if sh.Op != OpS390XSLWconst { 31376 break 31377 } 31378 if sh.AuxInt != 16 { 31379 break 31380 } 31381 r1 := sh.Args[0] 31382 if r1.Op != OpS390XMOVHZreg { 31383 break 31384 } 31385 x1 := r1.Args[0] 31386 if x1.Op != OpS390XMOVHBRloadidx { 31387 break 31388 } 31389 i1 := x1.AuxInt 31390 if x1.Aux != s { 31391 break 31392 } 31393 if idx != x1.Args[0] { 31394 break 31395 } 31396 if p != x1.Args[1] { 31397 break 31398 } 31399 if mem != x1.Args[2] { 31400 break 31401 } 31402 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31403 break 31404 } 31405 b = mergePoint(b, x0, x1) 31406 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31407 v.reset(OpCopy) 31408 v.AddArg(v0) 31409 v0.AuxInt = i0 31410 v0.Aux = s 31411 v0.AddArg(p) 31412 v0.AddArg(idx) 31413 v0.AddArg(mem) 31414 return true 31415 } 31416 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 31417 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31418 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31419 for { 31420 sh := v.Args[0] 31421 if sh.Op != OpS390XSLWconst { 31422 break 31423 } 31424 if sh.AuxInt != 16 { 31425 break 31426 } 31427 r1 := sh.Args[0] 31428 if r1.Op != OpS390XMOVHZreg { 31429 break 31430 } 31431 x1 := r1.Args[0] 31432 if x1.Op != OpS390XMOVHBRloadidx { 31433 break 31434 } 31435 i1 := x1.AuxInt 31436 s := x1.Aux 31437 p := x1.Args[0] 31438 idx := x1.Args[1] 31439 mem := x1.Args[2] 31440 r0 := v.Args[1] 31441 if r0.Op != OpS390XMOVHZreg { 31442 break 31443 } 31444 x0 := r0.Args[0] 31445 if x0.Op != OpS390XMOVHBRloadidx { 31446 break 31447 } 31448 i0 := x0.AuxInt 31449 if x0.Aux != s { 31450 break 31451 } 31452 if p != x0.Args[0] { 31453 break 31454 } 31455 if idx != x0.Args[1] { 31456 break 31457 } 31458 if mem != x0.Args[2] { 31459 break 31460 } 31461 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31462 break 31463 } 31464 b = mergePoint(b, x0, x1) 31465 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31466 v.reset(OpCopy) 31467 v.AddArg(v0) 31468 v0.AuxInt = i0 31469 v0.Aux = s 31470 v0.AddArg(p) 31471 v0.AddArg(idx) 31472 v0.AddArg(mem) 31473 return true 31474 } 31475 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) 31476 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31477 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31478 for { 31479 sh := v.Args[0] 31480 if sh.Op != OpS390XSLWconst { 31481 break 31482 } 31483 if sh.AuxInt != 16 { 31484 break 31485 } 31486 r1 := sh.Args[0] 31487 if r1.Op != OpS390XMOVHZreg { 31488 break 31489 } 31490 x1 := r1.Args[0] 31491 if x1.Op != OpS390XMOVHBRloadidx { 31492 break 31493 } 31494 i1 := x1.AuxInt 31495 s := x1.Aux 31496 idx := x1.Args[0] 31497 p := x1.Args[1] 31498 mem := x1.Args[2] 31499 r0 := v.Args[1] 31500 if r0.Op != OpS390XMOVHZreg { 31501 break 31502 } 31503 x0 := r0.Args[0] 31504 if x0.Op != OpS390XMOVHBRloadidx { 31505 break 31506 } 31507 i0 := x0.AuxInt 31508 if x0.Aux != s { 31509 break 31510 } 31511 if p != x0.Args[0] { 31512 break 31513 } 31514 if idx != x0.Args[1] { 31515 break 31516 } 31517 if mem != x0.Args[2] { 31518 break 31519 } 31520 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31521 break 31522 } 31523 b = mergePoint(b, x0, x1) 31524 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31525 v.reset(OpCopy) 31526 v.AddArg(v0) 31527 v0.AuxInt = i0 31528 v0.Aux = s 31529 v0.AddArg(p) 31530 v0.AddArg(idx) 31531 v0.AddArg(mem) 31532 return true 31533 } 31534 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 31535 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31536 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31537 for { 31538 sh := v.Args[0] 31539 if sh.Op != OpS390XSLWconst { 31540 break 31541 } 31542 if sh.AuxInt != 16 { 31543 break 31544 } 31545 r1 := sh.Args[0] 31546 if r1.Op != OpS390XMOVHZreg { 31547 break 31548 } 31549 x1 := r1.Args[0] 31550 if x1.Op != OpS390XMOVHBRloadidx { 31551 break 31552 } 31553 i1 := x1.AuxInt 31554 s := x1.Aux 31555 p := x1.Args[0] 31556 idx := x1.Args[1] 31557 mem := x1.Args[2] 31558 r0 := v.Args[1] 31559 if r0.Op != OpS390XMOVHZreg { 31560 break 31561 } 31562 x0 := r0.Args[0] 31563 if x0.Op != OpS390XMOVHBRloadidx { 31564 break 31565 } 31566 i0 := x0.AuxInt 31567 if x0.Aux != s { 31568 break 31569 } 31570 if idx != x0.Args[0] { 31571 break 31572 } 31573 if p != x0.Args[1] { 31574 break 31575 } 31576 if mem != x0.Args[2] { 31577 break 31578 } 31579 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31580 break 31581 } 31582 b = mergePoint(b, x0, x1) 31583 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31584 v.reset(OpCopy) 31585 v.AddArg(v0) 31586 v0.AuxInt = i0 31587 v0.Aux = s 31588 v0.AddArg(p) 31589 v0.AddArg(idx) 31590 v0.AddArg(mem) 31591 return true 31592 } 31593 // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) 31594 // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) 31595 // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) 31596 for { 31597 sh := v.Args[0] 31598 if sh.Op != OpS390XSLWconst { 31599 break 31600 } 31601 if sh.AuxInt != 16 { 31602 break 31603 } 31604 r1 := sh.Args[0] 31605 if r1.Op != OpS390XMOVHZreg { 31606 break 31607 } 31608 x1 := r1.Args[0] 31609 if x1.Op != OpS390XMOVHBRloadidx { 31610 break 31611 } 31612 i1 := x1.AuxInt 31613 s := x1.Aux 31614 idx := x1.Args[0] 31615 p := x1.Args[1] 31616 mem := x1.Args[2] 31617 r0 := v.Args[1] 31618 if r0.Op != OpS390XMOVHZreg { 31619 break 31620 } 31621 x0 := r0.Args[0] 31622 if x0.Op != OpS390XMOVHBRloadidx { 31623 break 31624 } 31625 i0 := x0.AuxInt 31626 if x0.Aux != s { 31627 break 31628 } 31629 if idx != x0.Args[0] { 31630 break 31631 } 31632 if p != x0.Args[1] { 31633 break 31634 } 31635 if mem != x0.Args[2] { 31636 break 31637 } 31638 if !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { 31639 break 31640 } 31641 b = mergePoint(b, x0, x1) 31642 v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, types.Int32) 31643 v.reset(OpCopy) 31644 v.AddArg(v0) 31645 v0.AuxInt = i0 31646 v0.Aux = s 31647 v0.AddArg(p) 31648 v0.AddArg(idx) 31649 v0.AddArg(mem) 31650 return true 31651 } 31652 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) 31653 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31654 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31655 for { 31656 s1 := v.Args[0] 31657 if s1.Op != OpS390XSLWconst { 31658 break 31659 } 31660 j1 := s1.AuxInt 31661 x1 := s1.Args[0] 31662 if x1.Op != OpS390XMOVBZloadidx { 31663 break 31664 } 31665 i1 := x1.AuxInt 31666 s := x1.Aux 31667 p := x1.Args[0] 31668 idx := x1.Args[1] 31669 mem := x1.Args[2] 31670 or := v.Args[1] 31671 if or.Op != OpS390XORW { 31672 break 31673 } 31674 s0 := or.Args[0] 31675 if s0.Op != OpS390XSLWconst { 31676 break 31677 } 31678 j0 := s0.AuxInt 31679 x0 := s0.Args[0] 31680 if x0.Op != OpS390XMOVBZloadidx { 31681 break 31682 } 31683 i0 := x0.AuxInt 31684 if x0.Aux != s { 31685 break 31686 } 31687 if p != x0.Args[0] { 31688 break 31689 } 31690 if idx != x0.Args[1] { 31691 break 31692 } 31693 if mem != x0.Args[2] { 31694 break 31695 } 31696 y := or.Args[1] 31697 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31698 break 31699 } 31700 b = mergePoint(b, x0, x1) 31701 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31702 v.reset(OpCopy) 31703 v.AddArg(v0) 31704 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31705 v1.AuxInt = j0 31706 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31707 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31708 v3.AuxInt = i0 31709 v3.Aux = s 31710 v3.AddArg(p) 31711 v3.AddArg(idx) 31712 v3.AddArg(mem) 31713 v2.AddArg(v3) 31714 v1.AddArg(v2) 31715 v0.AddArg(v1) 31716 v0.AddArg(y) 31717 return true 31718 } 31719 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) 31720 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31721 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31722 for { 31723 s1 := v.Args[0] 31724 if s1.Op != OpS390XSLWconst { 31725 break 31726 } 31727 j1 := s1.AuxInt 31728 x1 := s1.Args[0] 31729 if x1.Op != OpS390XMOVBZloadidx { 31730 break 31731 } 31732 i1 := x1.AuxInt 31733 s := x1.Aux 31734 idx := x1.Args[0] 31735 p := x1.Args[1] 31736 mem := x1.Args[2] 31737 or := v.Args[1] 31738 if or.Op != OpS390XORW { 31739 break 31740 } 31741 s0 := or.Args[0] 31742 if s0.Op != OpS390XSLWconst { 31743 break 31744 } 31745 j0 := s0.AuxInt 31746 x0 := s0.Args[0] 31747 if x0.Op != OpS390XMOVBZloadidx { 31748 break 31749 } 31750 i0 := x0.AuxInt 31751 if x0.Aux != s { 31752 break 31753 } 31754 if p != x0.Args[0] { 31755 break 31756 } 31757 if idx != x0.Args[1] { 31758 break 31759 } 31760 if mem != x0.Args[2] { 31761 break 31762 } 31763 y := or.Args[1] 31764 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31765 break 31766 } 31767 b = mergePoint(b, x0, x1) 31768 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31769 v.reset(OpCopy) 31770 v.AddArg(v0) 31771 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31772 v1.AuxInt = j0 31773 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31774 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31775 v3.AuxInt = i0 31776 v3.Aux = s 31777 v3.AddArg(p) 31778 v3.AddArg(idx) 31779 v3.AddArg(mem) 31780 v2.AddArg(v3) 31781 v1.AddArg(v2) 31782 v0.AddArg(v1) 31783 v0.AddArg(y) 31784 return true 31785 } 31786 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) 31787 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31788 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31789 for { 31790 s1 := v.Args[0] 31791 if s1.Op != OpS390XSLWconst { 31792 break 31793 } 31794 j1 := s1.AuxInt 31795 x1 := s1.Args[0] 31796 if x1.Op != OpS390XMOVBZloadidx { 31797 break 31798 } 31799 i1 := x1.AuxInt 31800 s := x1.Aux 31801 p := x1.Args[0] 31802 idx := x1.Args[1] 31803 mem := x1.Args[2] 31804 or := v.Args[1] 31805 if or.Op != OpS390XORW { 31806 break 31807 } 31808 s0 := or.Args[0] 31809 if s0.Op != OpS390XSLWconst { 31810 break 31811 } 31812 j0 := s0.AuxInt 31813 x0 := s0.Args[0] 31814 if x0.Op != OpS390XMOVBZloadidx { 31815 break 31816 } 31817 i0 := x0.AuxInt 31818 if x0.Aux != s { 31819 break 31820 } 31821 if idx != x0.Args[0] { 31822 break 31823 } 31824 if p != x0.Args[1] { 31825 break 31826 } 31827 if mem != x0.Args[2] { 31828 break 31829 } 31830 y := or.Args[1] 31831 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31832 break 31833 } 31834 b = mergePoint(b, x0, x1) 31835 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31836 v.reset(OpCopy) 31837 v.AddArg(v0) 31838 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31839 v1.AuxInt = j0 31840 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31841 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31842 v3.AuxInt = i0 31843 v3.Aux = s 31844 v3.AddArg(p) 31845 v3.AddArg(idx) 31846 v3.AddArg(mem) 31847 v2.AddArg(v3) 31848 v1.AddArg(v2) 31849 v0.AddArg(v1) 31850 v0.AddArg(y) 31851 return true 31852 } 31853 return false 31854 } 31855 func rewriteValueS390X_OpS390XORW_80(v *Value) bool { 31856 b := v.Block 31857 _ = b 31858 types := &b.Func.Config.Types 31859 _ = types 31860 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) 31861 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31862 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31863 for { 31864 s1 := v.Args[0] 31865 if s1.Op != OpS390XSLWconst { 31866 break 31867 } 31868 j1 := s1.AuxInt 31869 x1 := s1.Args[0] 31870 if x1.Op != OpS390XMOVBZloadidx { 31871 break 31872 } 31873 i1 := x1.AuxInt 31874 s := x1.Aux 31875 idx := x1.Args[0] 31876 p := x1.Args[1] 31877 mem := x1.Args[2] 31878 or := v.Args[1] 31879 if or.Op != OpS390XORW { 31880 break 31881 } 31882 s0 := or.Args[0] 31883 if s0.Op != OpS390XSLWconst { 31884 break 31885 } 31886 j0 := s0.AuxInt 31887 x0 := s0.Args[0] 31888 if x0.Op != OpS390XMOVBZloadidx { 31889 break 31890 } 31891 i0 := x0.AuxInt 31892 if x0.Aux != s { 31893 break 31894 } 31895 if idx != x0.Args[0] { 31896 break 31897 } 31898 if p != x0.Args[1] { 31899 break 31900 } 31901 if mem != x0.Args[2] { 31902 break 31903 } 31904 y := or.Args[1] 31905 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31906 break 31907 } 31908 b = mergePoint(b, x0, x1) 31909 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31910 v.reset(OpCopy) 31911 v.AddArg(v0) 31912 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31913 v1.AuxInt = j0 31914 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31915 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31916 v3.AuxInt = i0 31917 v3.Aux = s 31918 v3.AddArg(p) 31919 v3.AddArg(idx) 31920 v3.AddArg(mem) 31921 v2.AddArg(v3) 31922 v1.AddArg(v2) 31923 v0.AddArg(v1) 31924 v0.AddArg(y) 31925 return true 31926 } 31927 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) 31928 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31929 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31930 for { 31931 s1 := v.Args[0] 31932 if s1.Op != OpS390XSLWconst { 31933 break 31934 } 31935 j1 := s1.AuxInt 31936 x1 := s1.Args[0] 31937 if x1.Op != OpS390XMOVBZloadidx { 31938 break 31939 } 31940 i1 := x1.AuxInt 31941 s := x1.Aux 31942 p := x1.Args[0] 31943 idx := x1.Args[1] 31944 mem := x1.Args[2] 31945 or := v.Args[1] 31946 if or.Op != OpS390XORW { 31947 break 31948 } 31949 y := or.Args[0] 31950 s0 := or.Args[1] 31951 if s0.Op != OpS390XSLWconst { 31952 break 31953 } 31954 j0 := s0.AuxInt 31955 x0 := s0.Args[0] 31956 if x0.Op != OpS390XMOVBZloadidx { 31957 break 31958 } 31959 i0 := x0.AuxInt 31960 if x0.Aux != s { 31961 break 31962 } 31963 if p != x0.Args[0] { 31964 break 31965 } 31966 if idx != x0.Args[1] { 31967 break 31968 } 31969 if mem != x0.Args[2] { 31970 break 31971 } 31972 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 31973 break 31974 } 31975 b = mergePoint(b, x0, x1) 31976 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 31977 v.reset(OpCopy) 31978 v.AddArg(v0) 31979 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 31980 v1.AuxInt = j0 31981 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 31982 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 31983 v3.AuxInt = i0 31984 v3.Aux = s 31985 v3.AddArg(p) 31986 v3.AddArg(idx) 31987 v3.AddArg(mem) 31988 v2.AddArg(v3) 31989 v1.AddArg(v2) 31990 v0.AddArg(v1) 31991 v0.AddArg(y) 31992 return true 31993 } 31994 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) 31995 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 31996 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 31997 for { 31998 s1 := v.Args[0] 31999 if s1.Op != OpS390XSLWconst { 32000 break 32001 } 32002 j1 := s1.AuxInt 32003 x1 := s1.Args[0] 32004 if x1.Op != OpS390XMOVBZloadidx { 32005 break 32006 } 32007 i1 := x1.AuxInt 32008 s := x1.Aux 32009 idx := x1.Args[0] 32010 p := x1.Args[1] 32011 mem := x1.Args[2] 32012 or := v.Args[1] 32013 if or.Op != OpS390XORW { 32014 break 32015 } 32016 y := or.Args[0] 32017 s0 := or.Args[1] 32018 if s0.Op != OpS390XSLWconst { 32019 break 32020 } 32021 j0 := s0.AuxInt 32022 x0 := s0.Args[0] 32023 if x0.Op != OpS390XMOVBZloadidx { 32024 break 32025 } 32026 i0 := x0.AuxInt 32027 if x0.Aux != s { 32028 break 32029 } 32030 if p != x0.Args[0] { 32031 break 32032 } 32033 if idx != x0.Args[1] { 32034 break 32035 } 32036 if mem != x0.Args[2] { 32037 break 32038 } 32039 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32040 break 32041 } 32042 b = mergePoint(b, x0, x1) 32043 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32044 v.reset(OpCopy) 32045 v.AddArg(v0) 32046 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32047 v1.AuxInt = j0 32048 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32049 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32050 v3.AuxInt = i0 32051 v3.Aux = s 32052 v3.AddArg(p) 32053 v3.AddArg(idx) 32054 v3.AddArg(mem) 32055 v2.AddArg(v3) 32056 v1.AddArg(v2) 32057 v0.AddArg(v1) 32058 v0.AddArg(y) 32059 return true 32060 } 32061 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) 32062 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32063 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32064 for { 32065 s1 := v.Args[0] 32066 if s1.Op != OpS390XSLWconst { 32067 break 32068 } 32069 j1 := s1.AuxInt 32070 x1 := s1.Args[0] 32071 if x1.Op != OpS390XMOVBZloadidx { 32072 break 32073 } 32074 i1 := x1.AuxInt 32075 s := x1.Aux 32076 p := x1.Args[0] 32077 idx := x1.Args[1] 32078 mem := x1.Args[2] 32079 or := v.Args[1] 32080 if or.Op != OpS390XORW { 32081 break 32082 } 32083 y := or.Args[0] 32084 s0 := or.Args[1] 32085 if s0.Op != OpS390XSLWconst { 32086 break 32087 } 32088 j0 := s0.AuxInt 32089 x0 := s0.Args[0] 32090 if x0.Op != OpS390XMOVBZloadidx { 32091 break 32092 } 32093 i0 := x0.AuxInt 32094 if x0.Aux != s { 32095 break 32096 } 32097 if idx != x0.Args[0] { 32098 break 32099 } 32100 if p != x0.Args[1] { 32101 break 32102 } 32103 if mem != x0.Args[2] { 32104 break 32105 } 32106 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32107 break 32108 } 32109 b = mergePoint(b, x0, x1) 32110 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32111 v.reset(OpCopy) 32112 v.AddArg(v0) 32113 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32114 v1.AuxInt = j0 32115 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32116 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32117 v3.AuxInt = i0 32118 v3.Aux = s 32119 v3.AddArg(p) 32120 v3.AddArg(idx) 32121 v3.AddArg(mem) 32122 v2.AddArg(v3) 32123 v1.AddArg(v2) 32124 v0.AddArg(v1) 32125 v0.AddArg(y) 32126 return true 32127 } 32128 // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) 32129 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32130 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32131 for { 32132 s1 := v.Args[0] 32133 if s1.Op != OpS390XSLWconst { 32134 break 32135 } 32136 j1 := s1.AuxInt 32137 x1 := s1.Args[0] 32138 if x1.Op != OpS390XMOVBZloadidx { 32139 break 32140 } 32141 i1 := x1.AuxInt 32142 s := x1.Aux 32143 idx := x1.Args[0] 32144 p := x1.Args[1] 32145 mem := x1.Args[2] 32146 or := v.Args[1] 32147 if or.Op != OpS390XORW { 32148 break 32149 } 32150 y := or.Args[0] 32151 s0 := or.Args[1] 32152 if s0.Op != OpS390XSLWconst { 32153 break 32154 } 32155 j0 := s0.AuxInt 32156 x0 := s0.Args[0] 32157 if x0.Op != OpS390XMOVBZloadidx { 32158 break 32159 } 32160 i0 := x0.AuxInt 32161 if x0.Aux != s { 32162 break 32163 } 32164 if idx != x0.Args[0] { 32165 break 32166 } 32167 if p != x0.Args[1] { 32168 break 32169 } 32170 if mem != x0.Args[2] { 32171 break 32172 } 32173 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32174 break 32175 } 32176 b = mergePoint(b, x0, x1) 32177 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32178 v.reset(OpCopy) 32179 v.AddArg(v0) 32180 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32181 v1.AuxInt = j0 32182 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32183 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32184 v3.AuxInt = i0 32185 v3.Aux = s 32186 v3.AddArg(p) 32187 v3.AddArg(idx) 32188 v3.AddArg(mem) 32189 v2.AddArg(v3) 32190 v1.AddArg(v2) 32191 v0.AddArg(v1) 32192 v0.AddArg(y) 32193 return true 32194 } 32195 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32196 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32197 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32198 for { 32199 or := v.Args[0] 32200 if or.Op != OpS390XORW { 32201 break 32202 } 32203 s0 := or.Args[0] 32204 if s0.Op != OpS390XSLWconst { 32205 break 32206 } 32207 j0 := s0.AuxInt 32208 x0 := s0.Args[0] 32209 if x0.Op != OpS390XMOVBZloadidx { 32210 break 32211 } 32212 i0 := x0.AuxInt 32213 s := x0.Aux 32214 p := x0.Args[0] 32215 idx := x0.Args[1] 32216 mem := x0.Args[2] 32217 y := or.Args[1] 32218 s1 := v.Args[1] 32219 if s1.Op != OpS390XSLWconst { 32220 break 32221 } 32222 j1 := s1.AuxInt 32223 x1 := s1.Args[0] 32224 if x1.Op != OpS390XMOVBZloadidx { 32225 break 32226 } 32227 i1 := x1.AuxInt 32228 if x1.Aux != s { 32229 break 32230 } 32231 if p != x1.Args[0] { 32232 break 32233 } 32234 if idx != x1.Args[1] { 32235 break 32236 } 32237 if mem != x1.Args[2] { 32238 break 32239 } 32240 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32241 break 32242 } 32243 b = mergePoint(b, x0, x1) 32244 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32245 v.reset(OpCopy) 32246 v.AddArg(v0) 32247 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32248 v1.AuxInt = j0 32249 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32250 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32251 v3.AuxInt = i0 32252 v3.Aux = s 32253 v3.AddArg(p) 32254 v3.AddArg(idx) 32255 v3.AddArg(mem) 32256 v2.AddArg(v3) 32257 v1.AddArg(v2) 32258 v0.AddArg(v1) 32259 v0.AddArg(y) 32260 return true 32261 } 32262 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32263 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32264 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32265 for { 32266 or := v.Args[0] 32267 if or.Op != OpS390XORW { 32268 break 32269 } 32270 s0 := or.Args[0] 32271 if s0.Op != OpS390XSLWconst { 32272 break 32273 } 32274 j0 := s0.AuxInt 32275 x0 := s0.Args[0] 32276 if x0.Op != OpS390XMOVBZloadidx { 32277 break 32278 } 32279 i0 := x0.AuxInt 32280 s := x0.Aux 32281 idx := x0.Args[0] 32282 p := x0.Args[1] 32283 mem := x0.Args[2] 32284 y := or.Args[1] 32285 s1 := v.Args[1] 32286 if s1.Op != OpS390XSLWconst { 32287 break 32288 } 32289 j1 := s1.AuxInt 32290 x1 := s1.Args[0] 32291 if x1.Op != OpS390XMOVBZloadidx { 32292 break 32293 } 32294 i1 := x1.AuxInt 32295 if x1.Aux != s { 32296 break 32297 } 32298 if p != x1.Args[0] { 32299 break 32300 } 32301 if idx != x1.Args[1] { 32302 break 32303 } 32304 if mem != x1.Args[2] { 32305 break 32306 } 32307 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32308 break 32309 } 32310 b = mergePoint(b, x0, x1) 32311 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32312 v.reset(OpCopy) 32313 v.AddArg(v0) 32314 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32315 v1.AuxInt = j0 32316 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32317 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32318 v3.AuxInt = i0 32319 v3.Aux = s 32320 v3.AddArg(p) 32321 v3.AddArg(idx) 32322 v3.AddArg(mem) 32323 v2.AddArg(v3) 32324 v1.AddArg(v2) 32325 v0.AddArg(v1) 32326 v0.AddArg(y) 32327 return true 32328 } 32329 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32330 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32331 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32332 for { 32333 or := v.Args[0] 32334 if or.Op != OpS390XORW { 32335 break 32336 } 32337 y := or.Args[0] 32338 s0 := or.Args[1] 32339 if s0.Op != OpS390XSLWconst { 32340 break 32341 } 32342 j0 := s0.AuxInt 32343 x0 := s0.Args[0] 32344 if x0.Op != OpS390XMOVBZloadidx { 32345 break 32346 } 32347 i0 := x0.AuxInt 32348 s := x0.Aux 32349 p := x0.Args[0] 32350 idx := x0.Args[1] 32351 mem := x0.Args[2] 32352 s1 := v.Args[1] 32353 if s1.Op != OpS390XSLWconst { 32354 break 32355 } 32356 j1 := s1.AuxInt 32357 x1 := s1.Args[0] 32358 if x1.Op != OpS390XMOVBZloadidx { 32359 break 32360 } 32361 i1 := x1.AuxInt 32362 if x1.Aux != s { 32363 break 32364 } 32365 if p != x1.Args[0] { 32366 break 32367 } 32368 if idx != x1.Args[1] { 32369 break 32370 } 32371 if mem != x1.Args[2] { 32372 break 32373 } 32374 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32375 break 32376 } 32377 b = mergePoint(b, x0, x1) 32378 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32379 v.reset(OpCopy) 32380 v.AddArg(v0) 32381 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32382 v1.AuxInt = j0 32383 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32384 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32385 v3.AuxInt = i0 32386 v3.Aux = s 32387 v3.AddArg(p) 32388 v3.AddArg(idx) 32389 v3.AddArg(mem) 32390 v2.AddArg(v3) 32391 v1.AddArg(v2) 32392 v0.AddArg(v1) 32393 v0.AddArg(y) 32394 return true 32395 } 32396 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) 32397 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32398 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32399 for { 32400 or := v.Args[0] 32401 if or.Op != OpS390XORW { 32402 break 32403 } 32404 y := or.Args[0] 32405 s0 := or.Args[1] 32406 if s0.Op != OpS390XSLWconst { 32407 break 32408 } 32409 j0 := s0.AuxInt 32410 x0 := s0.Args[0] 32411 if x0.Op != OpS390XMOVBZloadidx { 32412 break 32413 } 32414 i0 := x0.AuxInt 32415 s := x0.Aux 32416 idx := x0.Args[0] 32417 p := x0.Args[1] 32418 mem := x0.Args[2] 32419 s1 := v.Args[1] 32420 if s1.Op != OpS390XSLWconst { 32421 break 32422 } 32423 j1 := s1.AuxInt 32424 x1 := s1.Args[0] 32425 if x1.Op != OpS390XMOVBZloadidx { 32426 break 32427 } 32428 i1 := x1.AuxInt 32429 if x1.Aux != s { 32430 break 32431 } 32432 if p != x1.Args[0] { 32433 break 32434 } 32435 if idx != x1.Args[1] { 32436 break 32437 } 32438 if mem != x1.Args[2] { 32439 break 32440 } 32441 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32442 break 32443 } 32444 b = mergePoint(b, x0, x1) 32445 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32446 v.reset(OpCopy) 32447 v.AddArg(v0) 32448 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32449 v1.AuxInt = j0 32450 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32451 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32452 v3.AuxInt = i0 32453 v3.Aux = s 32454 v3.AddArg(p) 32455 v3.AddArg(idx) 32456 v3.AddArg(mem) 32457 v2.AddArg(v3) 32458 v1.AddArg(v2) 32459 v0.AddArg(v1) 32460 v0.AddArg(y) 32461 return true 32462 } 32463 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32464 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32465 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32466 for { 32467 or := v.Args[0] 32468 if or.Op != OpS390XORW { 32469 break 32470 } 32471 s0 := or.Args[0] 32472 if s0.Op != OpS390XSLWconst { 32473 break 32474 } 32475 j0 := s0.AuxInt 32476 x0 := s0.Args[0] 32477 if x0.Op != OpS390XMOVBZloadidx { 32478 break 32479 } 32480 i0 := x0.AuxInt 32481 s := x0.Aux 32482 p := x0.Args[0] 32483 idx := x0.Args[1] 32484 mem := x0.Args[2] 32485 y := or.Args[1] 32486 s1 := v.Args[1] 32487 if s1.Op != OpS390XSLWconst { 32488 break 32489 } 32490 j1 := s1.AuxInt 32491 x1 := s1.Args[0] 32492 if x1.Op != OpS390XMOVBZloadidx { 32493 break 32494 } 32495 i1 := x1.AuxInt 32496 if x1.Aux != s { 32497 break 32498 } 32499 if idx != x1.Args[0] { 32500 break 32501 } 32502 if p != x1.Args[1] { 32503 break 32504 } 32505 if mem != x1.Args[2] { 32506 break 32507 } 32508 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32509 break 32510 } 32511 b = mergePoint(b, x0, x1) 32512 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32513 v.reset(OpCopy) 32514 v.AddArg(v0) 32515 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32516 v1.AuxInt = j0 32517 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32518 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32519 v3.AuxInt = i0 32520 v3.Aux = s 32521 v3.AddArg(p) 32522 v3.AddArg(idx) 32523 v3.AddArg(mem) 32524 v2.AddArg(v3) 32525 v1.AddArg(v2) 32526 v0.AddArg(v1) 32527 v0.AddArg(y) 32528 return true 32529 } 32530 return false 32531 } 32532 func rewriteValueS390X_OpS390XORW_90(v *Value) bool { 32533 b := v.Block 32534 _ = b 32535 types := &b.Func.Config.Types 32536 _ = types 32537 // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32538 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32539 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32540 for { 32541 or := v.Args[0] 32542 if or.Op != OpS390XORW { 32543 break 32544 } 32545 s0 := or.Args[0] 32546 if s0.Op != OpS390XSLWconst { 32547 break 32548 } 32549 j0 := s0.AuxInt 32550 x0 := s0.Args[0] 32551 if x0.Op != OpS390XMOVBZloadidx { 32552 break 32553 } 32554 i0 := x0.AuxInt 32555 s := x0.Aux 32556 idx := x0.Args[0] 32557 p := x0.Args[1] 32558 mem := x0.Args[2] 32559 y := or.Args[1] 32560 s1 := v.Args[1] 32561 if s1.Op != OpS390XSLWconst { 32562 break 32563 } 32564 j1 := s1.AuxInt 32565 x1 := s1.Args[0] 32566 if x1.Op != OpS390XMOVBZloadidx { 32567 break 32568 } 32569 i1 := x1.AuxInt 32570 if x1.Aux != s { 32571 break 32572 } 32573 if idx != x1.Args[0] { 32574 break 32575 } 32576 if p != x1.Args[1] { 32577 break 32578 } 32579 if mem != x1.Args[2] { 32580 break 32581 } 32582 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32583 break 32584 } 32585 b = mergePoint(b, x0, x1) 32586 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32587 v.reset(OpCopy) 32588 v.AddArg(v0) 32589 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32590 v1.AuxInt = j0 32591 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32592 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32593 v3.AuxInt = i0 32594 v3.Aux = s 32595 v3.AddArg(p) 32596 v3.AddArg(idx) 32597 v3.AddArg(mem) 32598 v2.AddArg(v3) 32599 v1.AddArg(v2) 32600 v0.AddArg(v1) 32601 v0.AddArg(y) 32602 return true 32603 } 32604 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32605 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32606 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32607 for { 32608 or := v.Args[0] 32609 if or.Op != OpS390XORW { 32610 break 32611 } 32612 y := or.Args[0] 32613 s0 := or.Args[1] 32614 if s0.Op != OpS390XSLWconst { 32615 break 32616 } 32617 j0 := s0.AuxInt 32618 x0 := s0.Args[0] 32619 if x0.Op != OpS390XMOVBZloadidx { 32620 break 32621 } 32622 i0 := x0.AuxInt 32623 s := x0.Aux 32624 p := x0.Args[0] 32625 idx := x0.Args[1] 32626 mem := x0.Args[2] 32627 s1 := v.Args[1] 32628 if s1.Op != OpS390XSLWconst { 32629 break 32630 } 32631 j1 := s1.AuxInt 32632 x1 := s1.Args[0] 32633 if x1.Op != OpS390XMOVBZloadidx { 32634 break 32635 } 32636 i1 := x1.AuxInt 32637 if x1.Aux != s { 32638 break 32639 } 32640 if idx != x1.Args[0] { 32641 break 32642 } 32643 if p != x1.Args[1] { 32644 break 32645 } 32646 if mem != x1.Args[2] { 32647 break 32648 } 32649 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32650 break 32651 } 32652 b = mergePoint(b, x0, x1) 32653 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32654 v.reset(OpCopy) 32655 v.AddArg(v0) 32656 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32657 v1.AuxInt = j0 32658 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32659 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32660 v3.AuxInt = i0 32661 v3.Aux = s 32662 v3.AddArg(p) 32663 v3.AddArg(idx) 32664 v3.AddArg(mem) 32665 v2.AddArg(v3) 32666 v1.AddArg(v2) 32667 v0.AddArg(v1) 32668 v0.AddArg(y) 32669 return true 32670 } 32671 // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) 32672 // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) 32673 // result: @mergePoint(b,x0,x1) (ORW <v.Type> (SLWconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) 32674 for { 32675 or := v.Args[0] 32676 if or.Op != OpS390XORW { 32677 break 32678 } 32679 y := or.Args[0] 32680 s0 := or.Args[1] 32681 if s0.Op != OpS390XSLWconst { 32682 break 32683 } 32684 j0 := s0.AuxInt 32685 x0 := s0.Args[0] 32686 if x0.Op != OpS390XMOVBZloadidx { 32687 break 32688 } 32689 i0 := x0.AuxInt 32690 s := x0.Aux 32691 idx := x0.Args[0] 32692 p := x0.Args[1] 32693 mem := x0.Args[2] 32694 s1 := v.Args[1] 32695 if s1.Op != OpS390XSLWconst { 32696 break 32697 } 32698 j1 := s1.AuxInt 32699 x1 := s1.Args[0] 32700 if x1.Op != OpS390XMOVBZloadidx { 32701 break 32702 } 32703 i1 := x1.AuxInt 32704 if x1.Aux != s { 32705 break 32706 } 32707 if idx != x1.Args[0] { 32708 break 32709 } 32710 if p != x1.Args[1] { 32711 break 32712 } 32713 if mem != x1.Args[2] { 32714 break 32715 } 32716 if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { 32717 break 32718 } 32719 b = mergePoint(b, x0, x1) 32720 v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) 32721 v.reset(OpCopy) 32722 v.AddArg(v0) 32723 v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) 32724 v1.AuxInt = j0 32725 v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, types.UInt64) 32726 v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, types.Int16) 32727 v3.AuxInt = i0 32728 v3.Aux = s 32729 v3.AddArg(p) 32730 v3.AddArg(idx) 32731 v3.AddArg(mem) 32732 v2.AddArg(v3) 32733 v1.AddArg(v2) 32734 v0.AddArg(v1) 32735 v0.AddArg(y) 32736 return true 32737 } 32738 return false 32739 } 32740 func rewriteValueS390X_OpS390XORWconst_0(v *Value) bool { 32741 // match: (ORWconst [c] x) 32742 // cond: int32(c)==0 32743 // result: x 32744 for { 32745 c := v.AuxInt 32746 x := v.Args[0] 32747 if !(int32(c) == 0) { 32748 break 32749 } 32750 v.reset(OpCopy) 32751 v.Type = x.Type 32752 v.AddArg(x) 32753 return true 32754 } 32755 // match: (ORWconst [c] _) 32756 // cond: int32(c)==-1 32757 // result: (MOVDconst [-1]) 32758 for { 32759 c := v.AuxInt 32760 if !(int32(c) == -1) { 32761 break 32762 } 32763 v.reset(OpS390XMOVDconst) 32764 v.AuxInt = -1 32765 return true 32766 } 32767 // match: (ORWconst [c] (MOVDconst [d])) 32768 // cond: 32769 // result: (MOVDconst [c|d]) 32770 for { 32771 c := v.AuxInt 32772 v_0 := v.Args[0] 32773 if v_0.Op != OpS390XMOVDconst { 32774 break 32775 } 32776 d := v_0.AuxInt 32777 v.reset(OpS390XMOVDconst) 32778 v.AuxInt = c | d 32779 return true 32780 } 32781 return false 32782 } 32783 func rewriteValueS390X_OpS390XORconst_0(v *Value) bool { 32784 // match: (ORconst [0] x) 32785 // cond: 32786 // result: x 32787 for { 32788 if v.AuxInt != 0 { 32789 break 32790 } 32791 x := v.Args[0] 32792 v.reset(OpCopy) 32793 v.Type = x.Type 32794 v.AddArg(x) 32795 return true 32796 } 32797 // match: (ORconst [-1] _) 32798 // cond: 32799 // result: (MOVDconst [-1]) 32800 for { 32801 if v.AuxInt != -1 { 32802 break 32803 } 32804 v.reset(OpS390XMOVDconst) 32805 v.AuxInt = -1 32806 return true 32807 } 32808 // match: (ORconst [c] (MOVDconst [d])) 32809 // cond: 32810 // result: (MOVDconst [c|d]) 32811 for { 32812 c := v.AuxInt 32813 v_0 := v.Args[0] 32814 if v_0.Op != OpS390XMOVDconst { 32815 break 32816 } 32817 d := v_0.AuxInt 32818 v.reset(OpS390XMOVDconst) 32819 v.AuxInt = c | d 32820 return true 32821 } 32822 return false 32823 } 32824 func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { 32825 // match: (SLD x (MOVDconst [c])) 32826 // cond: 32827 // result: (SLDconst [c&63] x) 32828 for { 32829 x := v.Args[0] 32830 v_1 := v.Args[1] 32831 if v_1.Op != OpS390XMOVDconst { 32832 break 32833 } 32834 c := v_1.AuxInt 32835 v.reset(OpS390XSLDconst) 32836 v.AuxInt = c & 63 32837 v.AddArg(x) 32838 return true 32839 } 32840 // match: (SLD x (ANDconst [63] y)) 32841 // cond: 32842 // result: (SLD x y) 32843 for { 32844 x := v.Args[0] 32845 v_1 := v.Args[1] 32846 if v_1.Op != OpS390XANDconst { 32847 break 32848 } 32849 if v_1.AuxInt != 63 { 32850 break 32851 } 32852 y := v_1.Args[0] 32853 v.reset(OpS390XSLD) 32854 v.AddArg(x) 32855 v.AddArg(y) 32856 return true 32857 } 32858 return false 32859 } 32860 func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { 32861 // match: (SLW x (MOVDconst [c])) 32862 // cond: 32863 // result: (SLWconst [c&63] x) 32864 for { 32865 x := v.Args[0] 32866 v_1 := v.Args[1] 32867 if v_1.Op != OpS390XMOVDconst { 32868 break 32869 } 32870 c := v_1.AuxInt 32871 v.reset(OpS390XSLWconst) 32872 v.AuxInt = c & 63 32873 v.AddArg(x) 32874 return true 32875 } 32876 // match: (SLW x (ANDWconst [63] y)) 32877 // cond: 32878 // result: (SLW x y) 32879 for { 32880 x := v.Args[0] 32881 v_1 := v.Args[1] 32882 if v_1.Op != OpS390XANDWconst { 32883 break 32884 } 32885 if v_1.AuxInt != 63 { 32886 break 32887 } 32888 y := v_1.Args[0] 32889 v.reset(OpS390XSLW) 32890 v.AddArg(x) 32891 v.AddArg(y) 32892 return true 32893 } 32894 return false 32895 } 32896 func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { 32897 // match: (SRAD x (MOVDconst [c])) 32898 // cond: 32899 // result: (SRADconst [c&63] x) 32900 for { 32901 x := v.Args[0] 32902 v_1 := v.Args[1] 32903 if v_1.Op != OpS390XMOVDconst { 32904 break 32905 } 32906 c := v_1.AuxInt 32907 v.reset(OpS390XSRADconst) 32908 v.AuxInt = c & 63 32909 v.AddArg(x) 32910 return true 32911 } 32912 // match: (SRAD x (ANDconst [63] y)) 32913 // cond: 32914 // result: (SRAD x y) 32915 for { 32916 x := v.Args[0] 32917 v_1 := v.Args[1] 32918 if v_1.Op != OpS390XANDconst { 32919 break 32920 } 32921 if v_1.AuxInt != 63 { 32922 break 32923 } 32924 y := v_1.Args[0] 32925 v.reset(OpS390XSRAD) 32926 v.AddArg(x) 32927 v.AddArg(y) 32928 return true 32929 } 32930 return false 32931 } 32932 func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool { 32933 // match: (SRADconst [c] (MOVDconst [d])) 32934 // cond: 32935 // result: (MOVDconst [d>>uint64(c)]) 32936 for { 32937 c := v.AuxInt 32938 v_0 := v.Args[0] 32939 if v_0.Op != OpS390XMOVDconst { 32940 break 32941 } 32942 d := v_0.AuxInt 32943 v.reset(OpS390XMOVDconst) 32944 v.AuxInt = d >> uint64(c) 32945 return true 32946 } 32947 return false 32948 } 32949 func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { 32950 // match: (SRAW x (MOVDconst [c])) 32951 // cond: 32952 // result: (SRAWconst [c&63] x) 32953 for { 32954 x := v.Args[0] 32955 v_1 := v.Args[1] 32956 if v_1.Op != OpS390XMOVDconst { 32957 break 32958 } 32959 c := v_1.AuxInt 32960 v.reset(OpS390XSRAWconst) 32961 v.AuxInt = c & 63 32962 v.AddArg(x) 32963 return true 32964 } 32965 // match: (SRAW x (ANDWconst [63] y)) 32966 // cond: 32967 // result: (SRAW x y) 32968 for { 32969 x := v.Args[0] 32970 v_1 := v.Args[1] 32971 if v_1.Op != OpS390XANDWconst { 32972 break 32973 } 32974 if v_1.AuxInt != 63 { 32975 break 32976 } 32977 y := v_1.Args[0] 32978 v.reset(OpS390XSRAW) 32979 v.AddArg(x) 32980 v.AddArg(y) 32981 return true 32982 } 32983 return false 32984 } 32985 func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool { 32986 // match: (SRAWconst [c] (MOVDconst [d])) 32987 // cond: 32988 // result: (MOVDconst [d>>uint64(c)]) 32989 for { 32990 c := v.AuxInt 32991 v_0 := v.Args[0] 32992 if v_0.Op != OpS390XMOVDconst { 32993 break 32994 } 32995 d := v_0.AuxInt 32996 v.reset(OpS390XMOVDconst) 32997 v.AuxInt = d >> uint64(c) 32998 return true 32999 } 33000 return false 33001 } 33002 func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { 33003 // match: (SRD x (MOVDconst [c])) 33004 // cond: 33005 // result: (SRDconst [c&63] x) 33006 for { 33007 x := v.Args[0] 33008 v_1 := v.Args[1] 33009 if v_1.Op != OpS390XMOVDconst { 33010 break 33011 } 33012 c := v_1.AuxInt 33013 v.reset(OpS390XSRDconst) 33014 v.AuxInt = c & 63 33015 v.AddArg(x) 33016 return true 33017 } 33018 // match: (SRD x (ANDconst [63] y)) 33019 // cond: 33020 // result: (SRD x y) 33021 for { 33022 x := v.Args[0] 33023 v_1 := v.Args[1] 33024 if v_1.Op != OpS390XANDconst { 33025 break 33026 } 33027 if v_1.AuxInt != 63 { 33028 break 33029 } 33030 y := v_1.Args[0] 33031 v.reset(OpS390XSRD) 33032 v.AddArg(x) 33033 v.AddArg(y) 33034 return true 33035 } 33036 return false 33037 } 33038 func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { 33039 // match: (SRW x (MOVDconst [c])) 33040 // cond: 33041 // result: (SRWconst [c&63] x) 33042 for { 33043 x := v.Args[0] 33044 v_1 := v.Args[1] 33045 if v_1.Op != OpS390XMOVDconst { 33046 break 33047 } 33048 c := v_1.AuxInt 33049 v.reset(OpS390XSRWconst) 33050 v.AuxInt = c & 63 33051 v.AddArg(x) 33052 return true 33053 } 33054 // match: (SRW x (ANDWconst [63] y)) 33055 // cond: 33056 // result: (SRW x y) 33057 for { 33058 x := v.Args[0] 33059 v_1 := v.Args[1] 33060 if v_1.Op != OpS390XANDWconst { 33061 break 33062 } 33063 if v_1.AuxInt != 63 { 33064 break 33065 } 33066 y := v_1.Args[0] 33067 v.reset(OpS390XSRW) 33068 v.AddArg(x) 33069 v.AddArg(y) 33070 return true 33071 } 33072 return false 33073 } 33074 func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { 33075 // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) 33076 // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) 33077 // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) 33078 for { 33079 i := v.AuxInt 33080 s := v.Aux 33081 p := v.Args[0] 33082 w2 := v.Args[1] 33083 w3 := v.Args[2] 33084 x := v.Args[3] 33085 if x.Op != OpS390XSTM2 { 33086 break 33087 } 33088 if x.AuxInt != i-8 { 33089 break 33090 } 33091 if x.Aux != s { 33092 break 33093 } 33094 if p != x.Args[0] { 33095 break 33096 } 33097 w0 := x.Args[1] 33098 w1 := x.Args[2] 33099 mem := x.Args[3] 33100 if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { 33101 break 33102 } 33103 v.reset(OpS390XSTM4) 33104 v.AuxInt = i - 8 33105 v.Aux = s 33106 v.AddArg(p) 33107 v.AddArg(w0) 33108 v.AddArg(w1) 33109 v.AddArg(w2) 33110 v.AddArg(w3) 33111 v.AddArg(mem) 33112 return true 33113 } 33114 // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) 33115 // cond: 33116 // result: (MOVDstore [i] {s} p x mem) 33117 for { 33118 i := v.AuxInt 33119 s := v.Aux 33120 p := v.Args[0] 33121 v_1 := v.Args[1] 33122 if v_1.Op != OpS390XSRDconst { 33123 break 33124 } 33125 if v_1.AuxInt != 32 { 33126 break 33127 } 33128 x := v_1.Args[0] 33129 if x != v.Args[2] { 33130 break 33131 } 33132 mem := v.Args[3] 33133 v.reset(OpS390XMOVDstore) 33134 v.AuxInt = i 33135 v.Aux = s 33136 v.AddArg(p) 33137 v.AddArg(x) 33138 v.AddArg(mem) 33139 return true 33140 } 33141 return false 33142 } 33143 func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { 33144 // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) 33145 // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) 33146 // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) 33147 for { 33148 i := v.AuxInt 33149 s := v.Aux 33150 p := v.Args[0] 33151 w2 := v.Args[1] 33152 w3 := v.Args[2] 33153 x := v.Args[3] 33154 if x.Op != OpS390XSTMG2 { 33155 break 33156 } 33157 if x.AuxInt != i-16 { 33158 break 33159 } 33160 if x.Aux != s { 33161 break 33162 } 33163 if p != x.Args[0] { 33164 break 33165 } 33166 w0 := x.Args[1] 33167 w1 := x.Args[2] 33168 mem := x.Args[3] 33169 if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { 33170 break 33171 } 33172 v.reset(OpS390XSTMG4) 33173 v.AuxInt = i - 16 33174 v.Aux = s 33175 v.AddArg(p) 33176 v.AddArg(w0) 33177 v.AddArg(w1) 33178 v.AddArg(w2) 33179 v.AddArg(w3) 33180 v.AddArg(mem) 33181 return true 33182 } 33183 return false 33184 } 33185 func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { 33186 b := v.Block 33187 _ = b 33188 // match: (SUB x (MOVDconst [c])) 33189 // cond: is32Bit(c) 33190 // result: (SUBconst x [c]) 33191 for { 33192 x := v.Args[0] 33193 v_1 := v.Args[1] 33194 if v_1.Op != OpS390XMOVDconst { 33195 break 33196 } 33197 c := v_1.AuxInt 33198 if !(is32Bit(c)) { 33199 break 33200 } 33201 v.reset(OpS390XSUBconst) 33202 v.AuxInt = c 33203 v.AddArg(x) 33204 return true 33205 } 33206 // match: (SUB (MOVDconst [c]) x) 33207 // cond: is32Bit(c) 33208 // result: (NEG (SUBconst <v.Type> x [c])) 33209 for { 33210 v_0 := v.Args[0] 33211 if v_0.Op != OpS390XMOVDconst { 33212 break 33213 } 33214 c := v_0.AuxInt 33215 x := v.Args[1] 33216 if !(is32Bit(c)) { 33217 break 33218 } 33219 v.reset(OpS390XNEG) 33220 v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) 33221 v0.AuxInt = c 33222 v0.AddArg(x) 33223 v.AddArg(v0) 33224 return true 33225 } 33226 // match: (SUB x x) 33227 // cond: 33228 // result: (MOVDconst [0]) 33229 for { 33230 x := v.Args[0] 33231 if x != v.Args[1] { 33232 break 33233 } 33234 v.reset(OpS390XMOVDconst) 33235 v.AuxInt = 0 33236 return true 33237 } 33238 // match: (SUB <t> x g:(MOVDload [off] {sym} ptr mem)) 33239 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33240 // result: (SUBload <t> [off] {sym} x ptr mem) 33241 for { 33242 t := v.Type 33243 x := v.Args[0] 33244 g := v.Args[1] 33245 if g.Op != OpS390XMOVDload { 33246 break 33247 } 33248 off := g.AuxInt 33249 sym := g.Aux 33250 ptr := g.Args[0] 33251 mem := g.Args[1] 33252 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33253 break 33254 } 33255 v.reset(OpS390XSUBload) 33256 v.Type = t 33257 v.AuxInt = off 33258 v.Aux = sym 33259 v.AddArg(x) 33260 v.AddArg(ptr) 33261 v.AddArg(mem) 33262 return true 33263 } 33264 return false 33265 } 33266 func rewriteValueS390X_OpS390XSUBEWcarrymask_0(v *Value) bool { 33267 // match: (SUBEWcarrymask (FlagEQ)) 33268 // cond: 33269 // result: (MOVDconst [-1]) 33270 for { 33271 v_0 := v.Args[0] 33272 if v_0.Op != OpS390XFlagEQ { 33273 break 33274 } 33275 v.reset(OpS390XMOVDconst) 33276 v.AuxInt = -1 33277 return true 33278 } 33279 // match: (SUBEWcarrymask (FlagLT)) 33280 // cond: 33281 // result: (MOVDconst [-1]) 33282 for { 33283 v_0 := v.Args[0] 33284 if v_0.Op != OpS390XFlagLT { 33285 break 33286 } 33287 v.reset(OpS390XMOVDconst) 33288 v.AuxInt = -1 33289 return true 33290 } 33291 // match: (SUBEWcarrymask (FlagGT)) 33292 // cond: 33293 // result: (MOVDconst [0]) 33294 for { 33295 v_0 := v.Args[0] 33296 if v_0.Op != OpS390XFlagGT { 33297 break 33298 } 33299 v.reset(OpS390XMOVDconst) 33300 v.AuxInt = 0 33301 return true 33302 } 33303 return false 33304 } 33305 func rewriteValueS390X_OpS390XSUBEcarrymask_0(v *Value) bool { 33306 // match: (SUBEcarrymask (FlagEQ)) 33307 // cond: 33308 // result: (MOVDconst [-1]) 33309 for { 33310 v_0 := v.Args[0] 33311 if v_0.Op != OpS390XFlagEQ { 33312 break 33313 } 33314 v.reset(OpS390XMOVDconst) 33315 v.AuxInt = -1 33316 return true 33317 } 33318 // match: (SUBEcarrymask (FlagLT)) 33319 // cond: 33320 // result: (MOVDconst [-1]) 33321 for { 33322 v_0 := v.Args[0] 33323 if v_0.Op != OpS390XFlagLT { 33324 break 33325 } 33326 v.reset(OpS390XMOVDconst) 33327 v.AuxInt = -1 33328 return true 33329 } 33330 // match: (SUBEcarrymask (FlagGT)) 33331 // cond: 33332 // result: (MOVDconst [0]) 33333 for { 33334 v_0 := v.Args[0] 33335 if v_0.Op != OpS390XFlagGT { 33336 break 33337 } 33338 v.reset(OpS390XMOVDconst) 33339 v.AuxInt = 0 33340 return true 33341 } 33342 return false 33343 } 33344 func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { 33345 b := v.Block 33346 _ = b 33347 // match: (SUBW x (MOVDconst [c])) 33348 // cond: 33349 // result: (SUBWconst x [c]) 33350 for { 33351 x := v.Args[0] 33352 v_1 := v.Args[1] 33353 if v_1.Op != OpS390XMOVDconst { 33354 break 33355 } 33356 c := v_1.AuxInt 33357 v.reset(OpS390XSUBWconst) 33358 v.AuxInt = c 33359 v.AddArg(x) 33360 return true 33361 } 33362 // match: (SUBW (MOVDconst [c]) x) 33363 // cond: 33364 // result: (NEGW (SUBWconst <v.Type> x [c])) 33365 for { 33366 v_0 := v.Args[0] 33367 if v_0.Op != OpS390XMOVDconst { 33368 break 33369 } 33370 c := v_0.AuxInt 33371 x := v.Args[1] 33372 v.reset(OpS390XNEGW) 33373 v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) 33374 v0.AuxInt = c 33375 v0.AddArg(x) 33376 v.AddArg(v0) 33377 return true 33378 } 33379 // match: (SUBW x x) 33380 // cond: 33381 // result: (MOVDconst [0]) 33382 for { 33383 x := v.Args[0] 33384 if x != v.Args[1] { 33385 break 33386 } 33387 v.reset(OpS390XMOVDconst) 33388 v.AuxInt = 0 33389 return true 33390 } 33391 // match: (SUBW <t> x g:(MOVWload [off] {sym} ptr mem)) 33392 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33393 // result: (SUBWload <t> [off] {sym} x ptr mem) 33394 for { 33395 t := v.Type 33396 x := v.Args[0] 33397 g := v.Args[1] 33398 if g.Op != OpS390XMOVWload { 33399 break 33400 } 33401 off := g.AuxInt 33402 sym := g.Aux 33403 ptr := g.Args[0] 33404 mem := g.Args[1] 33405 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33406 break 33407 } 33408 v.reset(OpS390XSUBWload) 33409 v.Type = t 33410 v.AuxInt = off 33411 v.Aux = sym 33412 v.AddArg(x) 33413 v.AddArg(ptr) 33414 v.AddArg(mem) 33415 return true 33416 } 33417 // match: (SUBW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33418 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33419 // result: (SUBWload <t> [off] {sym} x ptr mem) 33420 for { 33421 t := v.Type 33422 x := v.Args[0] 33423 g := v.Args[1] 33424 if g.Op != OpS390XMOVWZload { 33425 break 33426 } 33427 off := g.AuxInt 33428 sym := g.Aux 33429 ptr := g.Args[0] 33430 mem := g.Args[1] 33431 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33432 break 33433 } 33434 v.reset(OpS390XSUBWload) 33435 v.Type = t 33436 v.AuxInt = off 33437 v.Aux = sym 33438 v.AddArg(x) 33439 v.AddArg(ptr) 33440 v.AddArg(mem) 33441 return true 33442 } 33443 return false 33444 } 33445 func rewriteValueS390X_OpS390XSUBWconst_0(v *Value) bool { 33446 // match: (SUBWconst [c] x) 33447 // cond: int32(c) == 0 33448 // result: x 33449 for { 33450 c := v.AuxInt 33451 x := v.Args[0] 33452 if !(int32(c) == 0) { 33453 break 33454 } 33455 v.reset(OpCopy) 33456 v.Type = x.Type 33457 v.AddArg(x) 33458 return true 33459 } 33460 // match: (SUBWconst [c] x) 33461 // cond: 33462 // result: (ADDWconst [int64(int32(-c))] x) 33463 for { 33464 c := v.AuxInt 33465 x := v.Args[0] 33466 v.reset(OpS390XADDWconst) 33467 v.AuxInt = int64(int32(-c)) 33468 v.AddArg(x) 33469 return true 33470 } 33471 } 33472 func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool { 33473 // match: (SUBconst [0] x) 33474 // cond: 33475 // result: x 33476 for { 33477 if v.AuxInt != 0 { 33478 break 33479 } 33480 x := v.Args[0] 33481 v.reset(OpCopy) 33482 v.Type = x.Type 33483 v.AddArg(x) 33484 return true 33485 } 33486 // match: (SUBconst [c] x) 33487 // cond: c != -(1<<31) 33488 // result: (ADDconst [-c] x) 33489 for { 33490 c := v.AuxInt 33491 x := v.Args[0] 33492 if !(c != -(1 << 31)) { 33493 break 33494 } 33495 v.reset(OpS390XADDconst) 33496 v.AuxInt = -c 33497 v.AddArg(x) 33498 return true 33499 } 33500 // match: (SUBconst (MOVDconst [d]) [c]) 33501 // cond: 33502 // result: (MOVDconst [d-c]) 33503 for { 33504 c := v.AuxInt 33505 v_0 := v.Args[0] 33506 if v_0.Op != OpS390XMOVDconst { 33507 break 33508 } 33509 d := v_0.AuxInt 33510 v.reset(OpS390XMOVDconst) 33511 v.AuxInt = d - c 33512 return true 33513 } 33514 // match: (SUBconst (SUBconst x [d]) [c]) 33515 // cond: is32Bit(-c-d) 33516 // result: (ADDconst [-c-d] x) 33517 for { 33518 c := v.AuxInt 33519 v_0 := v.Args[0] 33520 if v_0.Op != OpS390XSUBconst { 33521 break 33522 } 33523 d := v_0.AuxInt 33524 x := v_0.Args[0] 33525 if !(is32Bit(-c - d)) { 33526 break 33527 } 33528 v.reset(OpS390XADDconst) 33529 v.AuxInt = -c - d 33530 v.AddArg(x) 33531 return true 33532 } 33533 return false 33534 } 33535 func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { 33536 // match: (XOR x (MOVDconst [c])) 33537 // cond: isU32Bit(c) 33538 // result: (XORconst [c] x) 33539 for { 33540 x := v.Args[0] 33541 v_1 := v.Args[1] 33542 if v_1.Op != OpS390XMOVDconst { 33543 break 33544 } 33545 c := v_1.AuxInt 33546 if !(isU32Bit(c)) { 33547 break 33548 } 33549 v.reset(OpS390XXORconst) 33550 v.AuxInt = c 33551 v.AddArg(x) 33552 return true 33553 } 33554 // match: (XOR (MOVDconst [c]) x) 33555 // cond: isU32Bit(c) 33556 // result: (XORconst [c] x) 33557 for { 33558 v_0 := v.Args[0] 33559 if v_0.Op != OpS390XMOVDconst { 33560 break 33561 } 33562 c := v_0.AuxInt 33563 x := v.Args[1] 33564 if !(isU32Bit(c)) { 33565 break 33566 } 33567 v.reset(OpS390XXORconst) 33568 v.AuxInt = c 33569 v.AddArg(x) 33570 return true 33571 } 33572 // match: (XOR (SLDconst x [c]) (SRDconst x [d])) 33573 // cond: d == 64-c 33574 // result: (RLLGconst [c] x) 33575 for { 33576 v_0 := v.Args[0] 33577 if v_0.Op != OpS390XSLDconst { 33578 break 33579 } 33580 c := v_0.AuxInt 33581 x := v_0.Args[0] 33582 v_1 := v.Args[1] 33583 if v_1.Op != OpS390XSRDconst { 33584 break 33585 } 33586 d := v_1.AuxInt 33587 if x != v_1.Args[0] { 33588 break 33589 } 33590 if !(d == 64-c) { 33591 break 33592 } 33593 v.reset(OpS390XRLLGconst) 33594 v.AuxInt = c 33595 v.AddArg(x) 33596 return true 33597 } 33598 // match: (XOR (SRDconst x [d]) (SLDconst x [c])) 33599 // cond: d == 64-c 33600 // result: (RLLGconst [c] x) 33601 for { 33602 v_0 := v.Args[0] 33603 if v_0.Op != OpS390XSRDconst { 33604 break 33605 } 33606 d := v_0.AuxInt 33607 x := v_0.Args[0] 33608 v_1 := v.Args[1] 33609 if v_1.Op != OpS390XSLDconst { 33610 break 33611 } 33612 c := v_1.AuxInt 33613 if x != v_1.Args[0] { 33614 break 33615 } 33616 if !(d == 64-c) { 33617 break 33618 } 33619 v.reset(OpS390XRLLGconst) 33620 v.AuxInt = c 33621 v.AddArg(x) 33622 return true 33623 } 33624 // match: (XOR (MOVDconst [c]) (MOVDconst [d])) 33625 // cond: 33626 // result: (MOVDconst [c^d]) 33627 for { 33628 v_0 := v.Args[0] 33629 if v_0.Op != OpS390XMOVDconst { 33630 break 33631 } 33632 c := v_0.AuxInt 33633 v_1 := v.Args[1] 33634 if v_1.Op != OpS390XMOVDconst { 33635 break 33636 } 33637 d := v_1.AuxInt 33638 v.reset(OpS390XMOVDconst) 33639 v.AuxInt = c ^ d 33640 return true 33641 } 33642 // match: (XOR (MOVDconst [d]) (MOVDconst [c])) 33643 // cond: 33644 // result: (MOVDconst [c^d]) 33645 for { 33646 v_0 := v.Args[0] 33647 if v_0.Op != OpS390XMOVDconst { 33648 break 33649 } 33650 d := v_0.AuxInt 33651 v_1 := v.Args[1] 33652 if v_1.Op != OpS390XMOVDconst { 33653 break 33654 } 33655 c := v_1.AuxInt 33656 v.reset(OpS390XMOVDconst) 33657 v.AuxInt = c ^ d 33658 return true 33659 } 33660 // match: (XOR x x) 33661 // cond: 33662 // result: (MOVDconst [0]) 33663 for { 33664 x := v.Args[0] 33665 if x != v.Args[1] { 33666 break 33667 } 33668 v.reset(OpS390XMOVDconst) 33669 v.AuxInt = 0 33670 return true 33671 } 33672 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 33673 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33674 // result: (XORload <t> [off] {sym} x ptr mem) 33675 for { 33676 t := v.Type 33677 x := v.Args[0] 33678 g := v.Args[1] 33679 if g.Op != OpS390XMOVDload { 33680 break 33681 } 33682 off := g.AuxInt 33683 sym := g.Aux 33684 ptr := g.Args[0] 33685 mem := g.Args[1] 33686 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33687 break 33688 } 33689 v.reset(OpS390XXORload) 33690 v.Type = t 33691 v.AuxInt = off 33692 v.Aux = sym 33693 v.AddArg(x) 33694 v.AddArg(ptr) 33695 v.AddArg(mem) 33696 return true 33697 } 33698 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 33699 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33700 // result: (XORload <t> [off] {sym} x ptr mem) 33701 for { 33702 t := v.Type 33703 g := v.Args[0] 33704 if g.Op != OpS390XMOVDload { 33705 break 33706 } 33707 off := g.AuxInt 33708 sym := g.Aux 33709 ptr := g.Args[0] 33710 mem := g.Args[1] 33711 x := v.Args[1] 33712 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33713 break 33714 } 33715 v.reset(OpS390XXORload) 33716 v.Type = t 33717 v.AuxInt = off 33718 v.Aux = sym 33719 v.AddArg(x) 33720 v.AddArg(ptr) 33721 v.AddArg(mem) 33722 return true 33723 } 33724 // match: (XOR <t> g:(MOVDload [off] {sym} ptr mem) x) 33725 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33726 // result: (XORload <t> [off] {sym} x ptr mem) 33727 for { 33728 t := v.Type 33729 g := v.Args[0] 33730 if g.Op != OpS390XMOVDload { 33731 break 33732 } 33733 off := g.AuxInt 33734 sym := g.Aux 33735 ptr := g.Args[0] 33736 mem := g.Args[1] 33737 x := v.Args[1] 33738 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33739 break 33740 } 33741 v.reset(OpS390XXORload) 33742 v.Type = t 33743 v.AuxInt = off 33744 v.Aux = sym 33745 v.AddArg(x) 33746 v.AddArg(ptr) 33747 v.AddArg(mem) 33748 return true 33749 } 33750 return false 33751 } 33752 func rewriteValueS390X_OpS390XXOR_10(v *Value) bool { 33753 // match: (XOR <t> x g:(MOVDload [off] {sym} ptr mem)) 33754 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33755 // result: (XORload <t> [off] {sym} x ptr mem) 33756 for { 33757 t := v.Type 33758 x := v.Args[0] 33759 g := v.Args[1] 33760 if g.Op != OpS390XMOVDload { 33761 break 33762 } 33763 off := g.AuxInt 33764 sym := g.Aux 33765 ptr := g.Args[0] 33766 mem := g.Args[1] 33767 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33768 break 33769 } 33770 v.reset(OpS390XXORload) 33771 v.Type = t 33772 v.AuxInt = off 33773 v.Aux = sym 33774 v.AddArg(x) 33775 v.AddArg(ptr) 33776 v.AddArg(mem) 33777 return true 33778 } 33779 return false 33780 } 33781 func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { 33782 // match: (XORW x (MOVDconst [c])) 33783 // cond: 33784 // result: (XORWconst [c] x) 33785 for { 33786 x := v.Args[0] 33787 v_1 := v.Args[1] 33788 if v_1.Op != OpS390XMOVDconst { 33789 break 33790 } 33791 c := v_1.AuxInt 33792 v.reset(OpS390XXORWconst) 33793 v.AuxInt = c 33794 v.AddArg(x) 33795 return true 33796 } 33797 // match: (XORW (MOVDconst [c]) x) 33798 // cond: 33799 // result: (XORWconst [c] x) 33800 for { 33801 v_0 := v.Args[0] 33802 if v_0.Op != OpS390XMOVDconst { 33803 break 33804 } 33805 c := v_0.AuxInt 33806 x := v.Args[1] 33807 v.reset(OpS390XXORWconst) 33808 v.AuxInt = c 33809 v.AddArg(x) 33810 return true 33811 } 33812 // match: (XORW (SLWconst x [c]) (SRWconst x [d])) 33813 // cond: d == 32-c 33814 // result: (RLLconst [c] x) 33815 for { 33816 v_0 := v.Args[0] 33817 if v_0.Op != OpS390XSLWconst { 33818 break 33819 } 33820 c := v_0.AuxInt 33821 x := v_0.Args[0] 33822 v_1 := v.Args[1] 33823 if v_1.Op != OpS390XSRWconst { 33824 break 33825 } 33826 d := v_1.AuxInt 33827 if x != v_1.Args[0] { 33828 break 33829 } 33830 if !(d == 32-c) { 33831 break 33832 } 33833 v.reset(OpS390XRLLconst) 33834 v.AuxInt = c 33835 v.AddArg(x) 33836 return true 33837 } 33838 // match: (XORW (SRWconst x [d]) (SLWconst x [c])) 33839 // cond: d == 32-c 33840 // result: (RLLconst [c] x) 33841 for { 33842 v_0 := v.Args[0] 33843 if v_0.Op != OpS390XSRWconst { 33844 break 33845 } 33846 d := v_0.AuxInt 33847 x := v_0.Args[0] 33848 v_1 := v.Args[1] 33849 if v_1.Op != OpS390XSLWconst { 33850 break 33851 } 33852 c := v_1.AuxInt 33853 if x != v_1.Args[0] { 33854 break 33855 } 33856 if !(d == 32-c) { 33857 break 33858 } 33859 v.reset(OpS390XRLLconst) 33860 v.AuxInt = c 33861 v.AddArg(x) 33862 return true 33863 } 33864 // match: (XORW x x) 33865 // cond: 33866 // result: (MOVDconst [0]) 33867 for { 33868 x := v.Args[0] 33869 if x != v.Args[1] { 33870 break 33871 } 33872 v.reset(OpS390XMOVDconst) 33873 v.AuxInt = 0 33874 return true 33875 } 33876 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 33877 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33878 // result: (XORWload <t> [off] {sym} x ptr mem) 33879 for { 33880 t := v.Type 33881 x := v.Args[0] 33882 g := v.Args[1] 33883 if g.Op != OpS390XMOVWload { 33884 break 33885 } 33886 off := g.AuxInt 33887 sym := g.Aux 33888 ptr := g.Args[0] 33889 mem := g.Args[1] 33890 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33891 break 33892 } 33893 v.reset(OpS390XXORWload) 33894 v.Type = t 33895 v.AuxInt = off 33896 v.Aux = sym 33897 v.AddArg(x) 33898 v.AddArg(ptr) 33899 v.AddArg(mem) 33900 return true 33901 } 33902 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 33903 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33904 // result: (XORWload <t> [off] {sym} x ptr mem) 33905 for { 33906 t := v.Type 33907 g := v.Args[0] 33908 if g.Op != OpS390XMOVWload { 33909 break 33910 } 33911 off := g.AuxInt 33912 sym := g.Aux 33913 ptr := g.Args[0] 33914 mem := g.Args[1] 33915 x := v.Args[1] 33916 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33917 break 33918 } 33919 v.reset(OpS390XXORWload) 33920 v.Type = t 33921 v.AuxInt = off 33922 v.Aux = sym 33923 v.AddArg(x) 33924 v.AddArg(ptr) 33925 v.AddArg(mem) 33926 return true 33927 } 33928 // match: (XORW <t> g:(MOVWload [off] {sym} ptr mem) x) 33929 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33930 // result: (XORWload <t> [off] {sym} x ptr mem) 33931 for { 33932 t := v.Type 33933 g := v.Args[0] 33934 if g.Op != OpS390XMOVWload { 33935 break 33936 } 33937 off := g.AuxInt 33938 sym := g.Aux 33939 ptr := g.Args[0] 33940 mem := g.Args[1] 33941 x := v.Args[1] 33942 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33943 break 33944 } 33945 v.reset(OpS390XXORWload) 33946 v.Type = t 33947 v.AuxInt = off 33948 v.Aux = sym 33949 v.AddArg(x) 33950 v.AddArg(ptr) 33951 v.AddArg(mem) 33952 return true 33953 } 33954 // match: (XORW <t> x g:(MOVWload [off] {sym} ptr mem)) 33955 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33956 // result: (XORWload <t> [off] {sym} x ptr mem) 33957 for { 33958 t := v.Type 33959 x := v.Args[0] 33960 g := v.Args[1] 33961 if g.Op != OpS390XMOVWload { 33962 break 33963 } 33964 off := g.AuxInt 33965 sym := g.Aux 33966 ptr := g.Args[0] 33967 mem := g.Args[1] 33968 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33969 break 33970 } 33971 v.reset(OpS390XXORWload) 33972 v.Type = t 33973 v.AuxInt = off 33974 v.Aux = sym 33975 v.AddArg(x) 33976 v.AddArg(ptr) 33977 v.AddArg(mem) 33978 return true 33979 } 33980 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 33981 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 33982 // result: (XORWload <t> [off] {sym} x ptr mem) 33983 for { 33984 t := v.Type 33985 x := v.Args[0] 33986 g := v.Args[1] 33987 if g.Op != OpS390XMOVWZload { 33988 break 33989 } 33990 off := g.AuxInt 33991 sym := g.Aux 33992 ptr := g.Args[0] 33993 mem := g.Args[1] 33994 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 33995 break 33996 } 33997 v.reset(OpS390XXORWload) 33998 v.Type = t 33999 v.AuxInt = off 34000 v.Aux = sym 34001 v.AddArg(x) 34002 v.AddArg(ptr) 34003 v.AddArg(mem) 34004 return true 34005 } 34006 return false 34007 } 34008 func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { 34009 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 34010 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 34011 // result: (XORWload <t> [off] {sym} x ptr mem) 34012 for { 34013 t := v.Type 34014 g := v.Args[0] 34015 if g.Op != OpS390XMOVWZload { 34016 break 34017 } 34018 off := g.AuxInt 34019 sym := g.Aux 34020 ptr := g.Args[0] 34021 mem := g.Args[1] 34022 x := v.Args[1] 34023 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 34024 break 34025 } 34026 v.reset(OpS390XXORWload) 34027 v.Type = t 34028 v.AuxInt = off 34029 v.Aux = sym 34030 v.AddArg(x) 34031 v.AddArg(ptr) 34032 v.AddArg(mem) 34033 return true 34034 } 34035 // match: (XORW <t> g:(MOVWZload [off] {sym} ptr mem) x) 34036 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 34037 // result: (XORWload <t> [off] {sym} x ptr mem) 34038 for { 34039 t := v.Type 34040 g := v.Args[0] 34041 if g.Op != OpS390XMOVWZload { 34042 break 34043 } 34044 off := g.AuxInt 34045 sym := g.Aux 34046 ptr := g.Args[0] 34047 mem := g.Args[1] 34048 x := v.Args[1] 34049 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 34050 break 34051 } 34052 v.reset(OpS390XXORWload) 34053 v.Type = t 34054 v.AuxInt = off 34055 v.Aux = sym 34056 v.AddArg(x) 34057 v.AddArg(ptr) 34058 v.AddArg(mem) 34059 return true 34060 } 34061 // match: (XORW <t> x g:(MOVWZload [off] {sym} ptr mem)) 34062 // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g) 34063 // result: (XORWload <t> [off] {sym} x ptr mem) 34064 for { 34065 t := v.Type 34066 x := v.Args[0] 34067 g := v.Args[1] 34068 if g.Op != OpS390XMOVWZload { 34069 break 34070 } 34071 off := g.AuxInt 34072 sym := g.Aux 34073 ptr := g.Args[0] 34074 mem := g.Args[1] 34075 if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoad(v, g, x) && clobber(g)) { 34076 break 34077 } 34078 v.reset(OpS390XXORWload) 34079 v.Type = t 34080 v.AuxInt = off 34081 v.Aux = sym 34082 v.AddArg(x) 34083 v.AddArg(ptr) 34084 v.AddArg(mem) 34085 return true 34086 } 34087 return false 34088 } 34089 func rewriteValueS390X_OpS390XXORWconst_0(v *Value) bool { 34090 // match: (XORWconst [c] x) 34091 // cond: int32(c)==0 34092 // result: x 34093 for { 34094 c := v.AuxInt 34095 x := v.Args[0] 34096 if !(int32(c) == 0) { 34097 break 34098 } 34099 v.reset(OpCopy) 34100 v.Type = x.Type 34101 v.AddArg(x) 34102 return true 34103 } 34104 // match: (XORWconst [c] (MOVDconst [d])) 34105 // cond: 34106 // result: (MOVDconst [c^d]) 34107 for { 34108 c := v.AuxInt 34109 v_0 := v.Args[0] 34110 if v_0.Op != OpS390XMOVDconst { 34111 break 34112 } 34113 d := v_0.AuxInt 34114 v.reset(OpS390XMOVDconst) 34115 v.AuxInt = c ^ d 34116 return true 34117 } 34118 return false 34119 } 34120 func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool { 34121 // match: (XORconst [0] x) 34122 // cond: 34123 // result: x 34124 for { 34125 if v.AuxInt != 0 { 34126 break 34127 } 34128 x := v.Args[0] 34129 v.reset(OpCopy) 34130 v.Type = x.Type 34131 v.AddArg(x) 34132 return true 34133 } 34134 // match: (XORconst [c] (MOVDconst [d])) 34135 // cond: 34136 // result: (MOVDconst [c^d]) 34137 for { 34138 c := v.AuxInt 34139 v_0 := v.Args[0] 34140 if v_0.Op != OpS390XMOVDconst { 34141 break 34142 } 34143 d := v_0.AuxInt 34144 v.reset(OpS390XMOVDconst) 34145 v.AuxInt = c ^ d 34146 return true 34147 } 34148 return false 34149 } 34150 func rewriteValueS390X_OpSelect0_0(v *Value) bool { 34151 b := v.Block 34152 _ = b 34153 // match: (Select0 <t> (AddTupleFirst32 tuple val)) 34154 // cond: 34155 // result: (ADDW val (Select0 <t> tuple)) 34156 for { 34157 t := v.Type 34158 v_0 := v.Args[0] 34159 if v_0.Op != OpS390XAddTupleFirst32 { 34160 break 34161 } 34162 tuple := v_0.Args[0] 34163 val := v_0.Args[1] 34164 v.reset(OpS390XADDW) 34165 v.AddArg(val) 34166 v0 := b.NewValue0(v.Pos, OpSelect0, t) 34167 v0.AddArg(tuple) 34168 v.AddArg(v0) 34169 return true 34170 } 34171 // match: (Select0 <t> (AddTupleFirst64 tuple val)) 34172 // cond: 34173 // result: (ADD val (Select0 <t> tuple)) 34174 for { 34175 t := v.Type 34176 v_0 := v.Args[0] 34177 if v_0.Op != OpS390XAddTupleFirst64 { 34178 break 34179 } 34180 tuple := v_0.Args[0] 34181 val := v_0.Args[1] 34182 v.reset(OpS390XADD) 34183 v.AddArg(val) 34184 v0 := b.NewValue0(v.Pos, OpSelect0, t) 34185 v0.AddArg(tuple) 34186 v.AddArg(v0) 34187 return true 34188 } 34189 return false 34190 } 34191 func rewriteValueS390X_OpSelect1_0(v *Value) bool { 34192 // match: (Select1 (AddTupleFirst32 tuple _)) 34193 // cond: 34194 // result: (Select1 tuple) 34195 for { 34196 v_0 := v.Args[0] 34197 if v_0.Op != OpS390XAddTupleFirst32 { 34198 break 34199 } 34200 tuple := v_0.Args[0] 34201 v.reset(OpSelect1) 34202 v.AddArg(tuple) 34203 return true 34204 } 34205 // match: (Select1 (AddTupleFirst64 tuple _)) 34206 // cond: 34207 // result: (Select1 tuple) 34208 for { 34209 v_0 := v.Args[0] 34210 if v_0.Op != OpS390XAddTupleFirst64 { 34211 break 34212 } 34213 tuple := v_0.Args[0] 34214 v.reset(OpSelect1) 34215 v.AddArg(tuple) 34216 return true 34217 } 34218 return false 34219 } 34220 func rewriteValueS390X_OpSignExt16to32_0(v *Value) bool { 34221 // match: (SignExt16to32 x) 34222 // cond: 34223 // result: (MOVHreg x) 34224 for { 34225 x := v.Args[0] 34226 v.reset(OpS390XMOVHreg) 34227 v.AddArg(x) 34228 return true 34229 } 34230 } 34231 func rewriteValueS390X_OpSignExt16to64_0(v *Value) bool { 34232 // match: (SignExt16to64 x) 34233 // cond: 34234 // result: (MOVHreg x) 34235 for { 34236 x := v.Args[0] 34237 v.reset(OpS390XMOVHreg) 34238 v.AddArg(x) 34239 return true 34240 } 34241 } 34242 func rewriteValueS390X_OpSignExt32to64_0(v *Value) bool { 34243 // match: (SignExt32to64 x) 34244 // cond: 34245 // result: (MOVWreg x) 34246 for { 34247 x := v.Args[0] 34248 v.reset(OpS390XMOVWreg) 34249 v.AddArg(x) 34250 return true 34251 } 34252 } 34253 func rewriteValueS390X_OpSignExt8to16_0(v *Value) bool { 34254 // match: (SignExt8to16 x) 34255 // cond: 34256 // result: (MOVBreg x) 34257 for { 34258 x := v.Args[0] 34259 v.reset(OpS390XMOVBreg) 34260 v.AddArg(x) 34261 return true 34262 } 34263 } 34264 func rewriteValueS390X_OpSignExt8to32_0(v *Value) bool { 34265 // match: (SignExt8to32 x) 34266 // cond: 34267 // result: (MOVBreg x) 34268 for { 34269 x := v.Args[0] 34270 v.reset(OpS390XMOVBreg) 34271 v.AddArg(x) 34272 return true 34273 } 34274 } 34275 func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool { 34276 // match: (SignExt8to64 x) 34277 // cond: 34278 // result: (MOVBreg x) 34279 for { 34280 x := v.Args[0] 34281 v.reset(OpS390XMOVBreg) 34282 v.AddArg(x) 34283 return true 34284 } 34285 } 34286 func rewriteValueS390X_OpSlicemask_0(v *Value) bool { 34287 b := v.Block 34288 _ = b 34289 // match: (Slicemask <t> x) 34290 // cond: 34291 // result: (SRADconst (NEG <t> x) [63]) 34292 for { 34293 t := v.Type 34294 x := v.Args[0] 34295 v.reset(OpS390XSRADconst) 34296 v.AuxInt = 63 34297 v0 := b.NewValue0(v.Pos, OpS390XNEG, t) 34298 v0.AddArg(x) 34299 v.AddArg(v0) 34300 return true 34301 } 34302 } 34303 func rewriteValueS390X_OpSqrt_0(v *Value) bool { 34304 // match: (Sqrt x) 34305 // cond: 34306 // result: (FSQRT x) 34307 for { 34308 x := v.Args[0] 34309 v.reset(OpS390XFSQRT) 34310 v.AddArg(x) 34311 return true 34312 } 34313 } 34314 func rewriteValueS390X_OpStaticCall_0(v *Value) bool { 34315 // match: (StaticCall [argwid] {target} mem) 34316 // cond: 34317 // result: (CALLstatic [argwid] {target} mem) 34318 for { 34319 argwid := v.AuxInt 34320 target := v.Aux 34321 mem := v.Args[0] 34322 v.reset(OpS390XCALLstatic) 34323 v.AuxInt = argwid 34324 v.Aux = target 34325 v.AddArg(mem) 34326 return true 34327 } 34328 } 34329 func rewriteValueS390X_OpStore_0(v *Value) bool { 34330 // match: (Store {t} ptr val mem) 34331 // cond: t.(Type).Size() == 8 && is64BitFloat(val.Type) 34332 // result: (FMOVDstore ptr val mem) 34333 for { 34334 t := v.Aux 34335 ptr := v.Args[0] 34336 val := v.Args[1] 34337 mem := v.Args[2] 34338 if !(t.(Type).Size() == 8 && is64BitFloat(val.Type)) { 34339 break 34340 } 34341 v.reset(OpS390XFMOVDstore) 34342 v.AddArg(ptr) 34343 v.AddArg(val) 34344 v.AddArg(mem) 34345 return true 34346 } 34347 // match: (Store {t} ptr val mem) 34348 // cond: t.(Type).Size() == 4 && is32BitFloat(val.Type) 34349 // result: (FMOVSstore ptr val mem) 34350 for { 34351 t := v.Aux 34352 ptr := v.Args[0] 34353 val := v.Args[1] 34354 mem := v.Args[2] 34355 if !(t.(Type).Size() == 4 && is32BitFloat(val.Type)) { 34356 break 34357 } 34358 v.reset(OpS390XFMOVSstore) 34359 v.AddArg(ptr) 34360 v.AddArg(val) 34361 v.AddArg(mem) 34362 return true 34363 } 34364 // match: (Store {t} ptr val mem) 34365 // cond: t.(Type).Size() == 8 34366 // result: (MOVDstore ptr val mem) 34367 for { 34368 t := v.Aux 34369 ptr := v.Args[0] 34370 val := v.Args[1] 34371 mem := v.Args[2] 34372 if !(t.(Type).Size() == 8) { 34373 break 34374 } 34375 v.reset(OpS390XMOVDstore) 34376 v.AddArg(ptr) 34377 v.AddArg(val) 34378 v.AddArg(mem) 34379 return true 34380 } 34381 // match: (Store {t} ptr val mem) 34382 // cond: t.(Type).Size() == 4 34383 // result: (MOVWstore ptr val mem) 34384 for { 34385 t := v.Aux 34386 ptr := v.Args[0] 34387 val := v.Args[1] 34388 mem := v.Args[2] 34389 if !(t.(Type).Size() == 4) { 34390 break 34391 } 34392 v.reset(OpS390XMOVWstore) 34393 v.AddArg(ptr) 34394 v.AddArg(val) 34395 v.AddArg(mem) 34396 return true 34397 } 34398 // match: (Store {t} ptr val mem) 34399 // cond: t.(Type).Size() == 2 34400 // result: (MOVHstore ptr val mem) 34401 for { 34402 t := v.Aux 34403 ptr := v.Args[0] 34404 val := v.Args[1] 34405 mem := v.Args[2] 34406 if !(t.(Type).Size() == 2) { 34407 break 34408 } 34409 v.reset(OpS390XMOVHstore) 34410 v.AddArg(ptr) 34411 v.AddArg(val) 34412 v.AddArg(mem) 34413 return true 34414 } 34415 // match: (Store {t} ptr val mem) 34416 // cond: t.(Type).Size() == 1 34417 // result: (MOVBstore ptr val mem) 34418 for { 34419 t := v.Aux 34420 ptr := v.Args[0] 34421 val := v.Args[1] 34422 mem := v.Args[2] 34423 if !(t.(Type).Size() == 1) { 34424 break 34425 } 34426 v.reset(OpS390XMOVBstore) 34427 v.AddArg(ptr) 34428 v.AddArg(val) 34429 v.AddArg(mem) 34430 return true 34431 } 34432 return false 34433 } 34434 func rewriteValueS390X_OpSub16_0(v *Value) bool { 34435 // match: (Sub16 x y) 34436 // cond: 34437 // result: (SUBW x y) 34438 for { 34439 x := v.Args[0] 34440 y := v.Args[1] 34441 v.reset(OpS390XSUBW) 34442 v.AddArg(x) 34443 v.AddArg(y) 34444 return true 34445 } 34446 } 34447 func rewriteValueS390X_OpSub32_0(v *Value) bool { 34448 // match: (Sub32 x y) 34449 // cond: 34450 // result: (SUBW x y) 34451 for { 34452 x := v.Args[0] 34453 y := v.Args[1] 34454 v.reset(OpS390XSUBW) 34455 v.AddArg(x) 34456 v.AddArg(y) 34457 return true 34458 } 34459 } 34460 func rewriteValueS390X_OpSub32F_0(v *Value) bool { 34461 // match: (Sub32F x y) 34462 // cond: 34463 // result: (FSUBS x y) 34464 for { 34465 x := v.Args[0] 34466 y := v.Args[1] 34467 v.reset(OpS390XFSUBS) 34468 v.AddArg(x) 34469 v.AddArg(y) 34470 return true 34471 } 34472 } 34473 func rewriteValueS390X_OpSub64_0(v *Value) bool { 34474 // match: (Sub64 x y) 34475 // cond: 34476 // result: (SUB x y) 34477 for { 34478 x := v.Args[0] 34479 y := v.Args[1] 34480 v.reset(OpS390XSUB) 34481 v.AddArg(x) 34482 v.AddArg(y) 34483 return true 34484 } 34485 } 34486 func rewriteValueS390X_OpSub64F_0(v *Value) bool { 34487 // match: (Sub64F x y) 34488 // cond: 34489 // result: (FSUB x y) 34490 for { 34491 x := v.Args[0] 34492 y := v.Args[1] 34493 v.reset(OpS390XFSUB) 34494 v.AddArg(x) 34495 v.AddArg(y) 34496 return true 34497 } 34498 } 34499 func rewriteValueS390X_OpSub8_0(v *Value) bool { 34500 // match: (Sub8 x y) 34501 // cond: 34502 // result: (SUBW x y) 34503 for { 34504 x := v.Args[0] 34505 y := v.Args[1] 34506 v.reset(OpS390XSUBW) 34507 v.AddArg(x) 34508 v.AddArg(y) 34509 return true 34510 } 34511 } 34512 func rewriteValueS390X_OpSubPtr_0(v *Value) bool { 34513 // match: (SubPtr x y) 34514 // cond: 34515 // result: (SUB x y) 34516 for { 34517 x := v.Args[0] 34518 y := v.Args[1] 34519 v.reset(OpS390XSUB) 34520 v.AddArg(x) 34521 v.AddArg(y) 34522 return true 34523 } 34524 } 34525 func rewriteValueS390X_OpTrunc16to8_0(v *Value) bool { 34526 // match: (Trunc16to8 x) 34527 // cond: 34528 // result: x 34529 for { 34530 x := v.Args[0] 34531 v.reset(OpCopy) 34532 v.Type = x.Type 34533 v.AddArg(x) 34534 return true 34535 } 34536 } 34537 func rewriteValueS390X_OpTrunc32to16_0(v *Value) bool { 34538 // match: (Trunc32to16 x) 34539 // cond: 34540 // result: x 34541 for { 34542 x := v.Args[0] 34543 v.reset(OpCopy) 34544 v.Type = x.Type 34545 v.AddArg(x) 34546 return true 34547 } 34548 } 34549 func rewriteValueS390X_OpTrunc32to8_0(v *Value) bool { 34550 // match: (Trunc32to8 x) 34551 // cond: 34552 // result: x 34553 for { 34554 x := v.Args[0] 34555 v.reset(OpCopy) 34556 v.Type = x.Type 34557 v.AddArg(x) 34558 return true 34559 } 34560 } 34561 func rewriteValueS390X_OpTrunc64to16_0(v *Value) bool { 34562 // match: (Trunc64to16 x) 34563 // cond: 34564 // result: x 34565 for { 34566 x := v.Args[0] 34567 v.reset(OpCopy) 34568 v.Type = x.Type 34569 v.AddArg(x) 34570 return true 34571 } 34572 } 34573 func rewriteValueS390X_OpTrunc64to32_0(v *Value) bool { 34574 // match: (Trunc64to32 x) 34575 // cond: 34576 // result: x 34577 for { 34578 x := v.Args[0] 34579 v.reset(OpCopy) 34580 v.Type = x.Type 34581 v.AddArg(x) 34582 return true 34583 } 34584 } 34585 func rewriteValueS390X_OpTrunc64to8_0(v *Value) bool { 34586 // match: (Trunc64to8 x) 34587 // cond: 34588 // result: x 34589 for { 34590 x := v.Args[0] 34591 v.reset(OpCopy) 34592 v.Type = x.Type 34593 v.AddArg(x) 34594 return true 34595 } 34596 } 34597 func rewriteValueS390X_OpXor16_0(v *Value) bool { 34598 // match: (Xor16 x y) 34599 // cond: 34600 // result: (XORW x y) 34601 for { 34602 x := v.Args[0] 34603 y := v.Args[1] 34604 v.reset(OpS390XXORW) 34605 v.AddArg(x) 34606 v.AddArg(y) 34607 return true 34608 } 34609 } 34610 func rewriteValueS390X_OpXor32_0(v *Value) bool { 34611 // match: (Xor32 x y) 34612 // cond: 34613 // result: (XORW x y) 34614 for { 34615 x := v.Args[0] 34616 y := v.Args[1] 34617 v.reset(OpS390XXORW) 34618 v.AddArg(x) 34619 v.AddArg(y) 34620 return true 34621 } 34622 } 34623 func rewriteValueS390X_OpXor64_0(v *Value) bool { 34624 // match: (Xor64 x y) 34625 // cond: 34626 // result: (XOR x y) 34627 for { 34628 x := v.Args[0] 34629 y := v.Args[1] 34630 v.reset(OpS390XXOR) 34631 v.AddArg(x) 34632 v.AddArg(y) 34633 return true 34634 } 34635 } 34636 func rewriteValueS390X_OpXor8_0(v *Value) bool { 34637 // match: (Xor8 x y) 34638 // cond: 34639 // result: (XORW x y) 34640 for { 34641 x := v.Args[0] 34642 y := v.Args[1] 34643 v.reset(OpS390XXORW) 34644 v.AddArg(x) 34645 v.AddArg(y) 34646 return true 34647 } 34648 } 34649 func rewriteValueS390X_OpZero_0(v *Value) bool { 34650 b := v.Block 34651 _ = b 34652 // match: (Zero [0] _ mem) 34653 // cond: 34654 // result: mem 34655 for { 34656 if v.AuxInt != 0 { 34657 break 34658 } 34659 mem := v.Args[1] 34660 v.reset(OpCopy) 34661 v.Type = mem.Type 34662 v.AddArg(mem) 34663 return true 34664 } 34665 // match: (Zero [1] destptr mem) 34666 // cond: 34667 // result: (MOVBstoreconst [0] destptr mem) 34668 for { 34669 if v.AuxInt != 1 { 34670 break 34671 } 34672 destptr := v.Args[0] 34673 mem := v.Args[1] 34674 v.reset(OpS390XMOVBstoreconst) 34675 v.AuxInt = 0 34676 v.AddArg(destptr) 34677 v.AddArg(mem) 34678 return true 34679 } 34680 // match: (Zero [2] destptr mem) 34681 // cond: 34682 // result: (MOVHstoreconst [0] destptr mem) 34683 for { 34684 if v.AuxInt != 2 { 34685 break 34686 } 34687 destptr := v.Args[0] 34688 mem := v.Args[1] 34689 v.reset(OpS390XMOVHstoreconst) 34690 v.AuxInt = 0 34691 v.AddArg(destptr) 34692 v.AddArg(mem) 34693 return true 34694 } 34695 // match: (Zero [4] destptr mem) 34696 // cond: 34697 // result: (MOVWstoreconst [0] destptr mem) 34698 for { 34699 if v.AuxInt != 4 { 34700 break 34701 } 34702 destptr := v.Args[0] 34703 mem := v.Args[1] 34704 v.reset(OpS390XMOVWstoreconst) 34705 v.AuxInt = 0 34706 v.AddArg(destptr) 34707 v.AddArg(mem) 34708 return true 34709 } 34710 // match: (Zero [8] destptr mem) 34711 // cond: 34712 // result: (MOVDstoreconst [0] destptr mem) 34713 for { 34714 if v.AuxInt != 8 { 34715 break 34716 } 34717 destptr := v.Args[0] 34718 mem := v.Args[1] 34719 v.reset(OpS390XMOVDstoreconst) 34720 v.AuxInt = 0 34721 v.AddArg(destptr) 34722 v.AddArg(mem) 34723 return true 34724 } 34725 // match: (Zero [3] destptr mem) 34726 // cond: 34727 // result: (MOVBstoreconst [makeValAndOff(0,2)] destptr (MOVHstoreconst [0] destptr mem)) 34728 for { 34729 if v.AuxInt != 3 { 34730 break 34731 } 34732 destptr := v.Args[0] 34733 mem := v.Args[1] 34734 v.reset(OpS390XMOVBstoreconst) 34735 v.AuxInt = makeValAndOff(0, 2) 34736 v.AddArg(destptr) 34737 v0 := b.NewValue0(v.Pos, OpS390XMOVHstoreconst, TypeMem) 34738 v0.AuxInt = 0 34739 v0.AddArg(destptr) 34740 v0.AddArg(mem) 34741 v.AddArg(v0) 34742 return true 34743 } 34744 // match: (Zero [5] destptr mem) 34745 // cond: 34746 // result: (MOVBstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 34747 for { 34748 if v.AuxInt != 5 { 34749 break 34750 } 34751 destptr := v.Args[0] 34752 mem := v.Args[1] 34753 v.reset(OpS390XMOVBstoreconst) 34754 v.AuxInt = makeValAndOff(0, 4) 34755 v.AddArg(destptr) 34756 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, TypeMem) 34757 v0.AuxInt = 0 34758 v0.AddArg(destptr) 34759 v0.AddArg(mem) 34760 v.AddArg(v0) 34761 return true 34762 } 34763 // match: (Zero [6] destptr mem) 34764 // cond: 34765 // result: (MOVHstoreconst [makeValAndOff(0,4)] destptr (MOVWstoreconst [0] destptr mem)) 34766 for { 34767 if v.AuxInt != 6 { 34768 break 34769 } 34770 destptr := v.Args[0] 34771 mem := v.Args[1] 34772 v.reset(OpS390XMOVHstoreconst) 34773 v.AuxInt = makeValAndOff(0, 4) 34774 v.AddArg(destptr) 34775 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, TypeMem) 34776 v0.AuxInt = 0 34777 v0.AddArg(destptr) 34778 v0.AddArg(mem) 34779 v.AddArg(v0) 34780 return true 34781 } 34782 // match: (Zero [7] destptr mem) 34783 // cond: 34784 // result: (MOVWstoreconst [makeValAndOff(0,3)] destptr (MOVWstoreconst [0] destptr mem)) 34785 for { 34786 if v.AuxInt != 7 { 34787 break 34788 } 34789 destptr := v.Args[0] 34790 mem := v.Args[1] 34791 v.reset(OpS390XMOVWstoreconst) 34792 v.AuxInt = makeValAndOff(0, 3) 34793 v.AddArg(destptr) 34794 v0 := b.NewValue0(v.Pos, OpS390XMOVWstoreconst, TypeMem) 34795 v0.AuxInt = 0 34796 v0.AddArg(destptr) 34797 v0.AddArg(mem) 34798 v.AddArg(v0) 34799 return true 34800 } 34801 // match: (Zero [s] destptr mem) 34802 // cond: s > 0 && s <= 1024 34803 // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) 34804 for { 34805 s := v.AuxInt 34806 destptr := v.Args[0] 34807 mem := v.Args[1] 34808 if !(s > 0 && s <= 1024) { 34809 break 34810 } 34811 v.reset(OpS390XCLEAR) 34812 v.AuxInt = makeValAndOff(s, 0) 34813 v.AddArg(destptr) 34814 v.AddArg(mem) 34815 return true 34816 } 34817 return false 34818 } 34819 func rewriteValueS390X_OpZero_10(v *Value) bool { 34820 b := v.Block 34821 _ = b 34822 // match: (Zero [s] destptr mem) 34823 // cond: s > 1024 34824 // result: (LoweredZero [s%256] destptr (ADDconst <destptr.Type> destptr [(s/256)*256]) mem) 34825 for { 34826 s := v.AuxInt 34827 destptr := v.Args[0] 34828 mem := v.Args[1] 34829 if !(s > 1024) { 34830 break 34831 } 34832 v.reset(OpS390XLoweredZero) 34833 v.AuxInt = s % 256 34834 v.AddArg(destptr) 34835 v0 := b.NewValue0(v.Pos, OpS390XADDconst, destptr.Type) 34836 v0.AuxInt = (s / 256) * 256 34837 v0.AddArg(destptr) 34838 v.AddArg(v0) 34839 v.AddArg(mem) 34840 return true 34841 } 34842 return false 34843 } 34844 func rewriteValueS390X_OpZeroExt16to32_0(v *Value) bool { 34845 // match: (ZeroExt16to32 x) 34846 // cond: 34847 // result: (MOVHZreg x) 34848 for { 34849 x := v.Args[0] 34850 v.reset(OpS390XMOVHZreg) 34851 v.AddArg(x) 34852 return true 34853 } 34854 } 34855 func rewriteValueS390X_OpZeroExt16to64_0(v *Value) bool { 34856 // match: (ZeroExt16to64 x) 34857 // cond: 34858 // result: (MOVHZreg x) 34859 for { 34860 x := v.Args[0] 34861 v.reset(OpS390XMOVHZreg) 34862 v.AddArg(x) 34863 return true 34864 } 34865 } 34866 func rewriteValueS390X_OpZeroExt32to64_0(v *Value) bool { 34867 // match: (ZeroExt32to64 x) 34868 // cond: 34869 // result: (MOVWZreg x) 34870 for { 34871 x := v.Args[0] 34872 v.reset(OpS390XMOVWZreg) 34873 v.AddArg(x) 34874 return true 34875 } 34876 } 34877 func rewriteValueS390X_OpZeroExt8to16_0(v *Value) bool { 34878 // match: (ZeroExt8to16 x) 34879 // cond: 34880 // result: (MOVBZreg x) 34881 for { 34882 x := v.Args[0] 34883 v.reset(OpS390XMOVBZreg) 34884 v.AddArg(x) 34885 return true 34886 } 34887 } 34888 func rewriteValueS390X_OpZeroExt8to32_0(v *Value) bool { 34889 // match: (ZeroExt8to32 x) 34890 // cond: 34891 // result: (MOVBZreg x) 34892 for { 34893 x := v.Args[0] 34894 v.reset(OpS390XMOVBZreg) 34895 v.AddArg(x) 34896 return true 34897 } 34898 } 34899 func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool { 34900 // match: (ZeroExt8to64 x) 34901 // cond: 34902 // result: (MOVBZreg x) 34903 for { 34904 x := v.Args[0] 34905 v.reset(OpS390XMOVBZreg) 34906 v.AddArg(x) 34907 return true 34908 } 34909 } 34910 func rewriteBlockS390X(b *Block) bool { 34911 config := b.Func.Config 34912 _ = config 34913 fe := b.Func.fe 34914 _ = fe 34915 types := &config.Types 34916 _ = types 34917 switch b.Kind { 34918 case BlockS390XEQ: 34919 // match: (EQ (InvertFlags cmp) yes no) 34920 // cond: 34921 // result: (EQ cmp yes no) 34922 for { 34923 v := b.Control 34924 if v.Op != OpS390XInvertFlags { 34925 break 34926 } 34927 cmp := v.Args[0] 34928 b.Kind = BlockS390XEQ 34929 b.SetControl(cmp) 34930 return true 34931 } 34932 // match: (EQ (FlagEQ) yes no) 34933 // cond: 34934 // result: (First nil yes no) 34935 for { 34936 v := b.Control 34937 if v.Op != OpS390XFlagEQ { 34938 break 34939 } 34940 b.Kind = BlockFirst 34941 b.SetControl(nil) 34942 return true 34943 } 34944 // match: (EQ (FlagLT) yes no) 34945 // cond: 34946 // result: (First nil no yes) 34947 for { 34948 v := b.Control 34949 if v.Op != OpS390XFlagLT { 34950 break 34951 } 34952 b.Kind = BlockFirst 34953 b.SetControl(nil) 34954 b.swapSuccessors() 34955 return true 34956 } 34957 // match: (EQ (FlagGT) yes no) 34958 // cond: 34959 // result: (First nil no yes) 34960 for { 34961 v := b.Control 34962 if v.Op != OpS390XFlagGT { 34963 break 34964 } 34965 b.Kind = BlockFirst 34966 b.SetControl(nil) 34967 b.swapSuccessors() 34968 return true 34969 } 34970 case BlockS390XGE: 34971 // match: (GE (InvertFlags cmp) yes no) 34972 // cond: 34973 // result: (LE cmp yes no) 34974 for { 34975 v := b.Control 34976 if v.Op != OpS390XInvertFlags { 34977 break 34978 } 34979 cmp := v.Args[0] 34980 b.Kind = BlockS390XLE 34981 b.SetControl(cmp) 34982 return true 34983 } 34984 // match: (GE (FlagEQ) yes no) 34985 // cond: 34986 // result: (First nil yes no) 34987 for { 34988 v := b.Control 34989 if v.Op != OpS390XFlagEQ { 34990 break 34991 } 34992 b.Kind = BlockFirst 34993 b.SetControl(nil) 34994 return true 34995 } 34996 // match: (GE (FlagLT) yes no) 34997 // cond: 34998 // result: (First nil no yes) 34999 for { 35000 v := b.Control 35001 if v.Op != OpS390XFlagLT { 35002 break 35003 } 35004 b.Kind = BlockFirst 35005 b.SetControl(nil) 35006 b.swapSuccessors() 35007 return true 35008 } 35009 // match: (GE (FlagGT) yes no) 35010 // cond: 35011 // result: (First nil yes no) 35012 for { 35013 v := b.Control 35014 if v.Op != OpS390XFlagGT { 35015 break 35016 } 35017 b.Kind = BlockFirst 35018 b.SetControl(nil) 35019 return true 35020 } 35021 case BlockS390XGT: 35022 // match: (GT (InvertFlags cmp) yes no) 35023 // cond: 35024 // result: (LT cmp yes no) 35025 for { 35026 v := b.Control 35027 if v.Op != OpS390XInvertFlags { 35028 break 35029 } 35030 cmp := v.Args[0] 35031 b.Kind = BlockS390XLT 35032 b.SetControl(cmp) 35033 return true 35034 } 35035 // match: (GT (FlagEQ) yes no) 35036 // cond: 35037 // result: (First nil no yes) 35038 for { 35039 v := b.Control 35040 if v.Op != OpS390XFlagEQ { 35041 break 35042 } 35043 b.Kind = BlockFirst 35044 b.SetControl(nil) 35045 b.swapSuccessors() 35046 return true 35047 } 35048 // match: (GT (FlagLT) yes no) 35049 // cond: 35050 // result: (First nil no yes) 35051 for { 35052 v := b.Control 35053 if v.Op != OpS390XFlagLT { 35054 break 35055 } 35056 b.Kind = BlockFirst 35057 b.SetControl(nil) 35058 b.swapSuccessors() 35059 return true 35060 } 35061 // match: (GT (FlagGT) yes no) 35062 // cond: 35063 // result: (First nil yes no) 35064 for { 35065 v := b.Control 35066 if v.Op != OpS390XFlagGT { 35067 break 35068 } 35069 b.Kind = BlockFirst 35070 b.SetControl(nil) 35071 return true 35072 } 35073 case BlockIf: 35074 // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35075 // cond: 35076 // result: (LT cmp yes no) 35077 for { 35078 v := b.Control 35079 if v.Op != OpS390XMOVDLT { 35080 break 35081 } 35082 v_0 := v.Args[0] 35083 if v_0.Op != OpS390XMOVDconst { 35084 break 35085 } 35086 if v_0.AuxInt != 0 { 35087 break 35088 } 35089 v_1 := v.Args[1] 35090 if v_1.Op != OpS390XMOVDconst { 35091 break 35092 } 35093 if v_1.AuxInt != 1 { 35094 break 35095 } 35096 cmp := v.Args[2] 35097 b.Kind = BlockS390XLT 35098 b.SetControl(cmp) 35099 return true 35100 } 35101 // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35102 // cond: 35103 // result: (LE cmp yes no) 35104 for { 35105 v := b.Control 35106 if v.Op != OpS390XMOVDLE { 35107 break 35108 } 35109 v_0 := v.Args[0] 35110 if v_0.Op != OpS390XMOVDconst { 35111 break 35112 } 35113 if v_0.AuxInt != 0 { 35114 break 35115 } 35116 v_1 := v.Args[1] 35117 if v_1.Op != OpS390XMOVDconst { 35118 break 35119 } 35120 if v_1.AuxInt != 1 { 35121 break 35122 } 35123 cmp := v.Args[2] 35124 b.Kind = BlockS390XLE 35125 b.SetControl(cmp) 35126 return true 35127 } 35128 // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35129 // cond: 35130 // result: (GT cmp yes no) 35131 for { 35132 v := b.Control 35133 if v.Op != OpS390XMOVDGT { 35134 break 35135 } 35136 v_0 := v.Args[0] 35137 if v_0.Op != OpS390XMOVDconst { 35138 break 35139 } 35140 if v_0.AuxInt != 0 { 35141 break 35142 } 35143 v_1 := v.Args[1] 35144 if v_1.Op != OpS390XMOVDconst { 35145 break 35146 } 35147 if v_1.AuxInt != 1 { 35148 break 35149 } 35150 cmp := v.Args[2] 35151 b.Kind = BlockS390XGT 35152 b.SetControl(cmp) 35153 return true 35154 } 35155 // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35156 // cond: 35157 // result: (GE cmp yes no) 35158 for { 35159 v := b.Control 35160 if v.Op != OpS390XMOVDGE { 35161 break 35162 } 35163 v_0 := v.Args[0] 35164 if v_0.Op != OpS390XMOVDconst { 35165 break 35166 } 35167 if v_0.AuxInt != 0 { 35168 break 35169 } 35170 v_1 := v.Args[1] 35171 if v_1.Op != OpS390XMOVDconst { 35172 break 35173 } 35174 if v_1.AuxInt != 1 { 35175 break 35176 } 35177 cmp := v.Args[2] 35178 b.Kind = BlockS390XGE 35179 b.SetControl(cmp) 35180 return true 35181 } 35182 // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35183 // cond: 35184 // result: (EQ cmp yes no) 35185 for { 35186 v := b.Control 35187 if v.Op != OpS390XMOVDEQ { 35188 break 35189 } 35190 v_0 := v.Args[0] 35191 if v_0.Op != OpS390XMOVDconst { 35192 break 35193 } 35194 if v_0.AuxInt != 0 { 35195 break 35196 } 35197 v_1 := v.Args[1] 35198 if v_1.Op != OpS390XMOVDconst { 35199 break 35200 } 35201 if v_1.AuxInt != 1 { 35202 break 35203 } 35204 cmp := v.Args[2] 35205 b.Kind = BlockS390XEQ 35206 b.SetControl(cmp) 35207 return true 35208 } 35209 // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35210 // cond: 35211 // result: (NE cmp yes no) 35212 for { 35213 v := b.Control 35214 if v.Op != OpS390XMOVDNE { 35215 break 35216 } 35217 v_0 := v.Args[0] 35218 if v_0.Op != OpS390XMOVDconst { 35219 break 35220 } 35221 if v_0.AuxInt != 0 { 35222 break 35223 } 35224 v_1 := v.Args[1] 35225 if v_1.Op != OpS390XMOVDconst { 35226 break 35227 } 35228 if v_1.AuxInt != 1 { 35229 break 35230 } 35231 cmp := v.Args[2] 35232 b.Kind = BlockS390XNE 35233 b.SetControl(cmp) 35234 return true 35235 } 35236 // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35237 // cond: 35238 // result: (GTF cmp yes no) 35239 for { 35240 v := b.Control 35241 if v.Op != OpS390XMOVDGTnoinv { 35242 break 35243 } 35244 v_0 := v.Args[0] 35245 if v_0.Op != OpS390XMOVDconst { 35246 break 35247 } 35248 if v_0.AuxInt != 0 { 35249 break 35250 } 35251 v_1 := v.Args[1] 35252 if v_1.Op != OpS390XMOVDconst { 35253 break 35254 } 35255 if v_1.AuxInt != 1 { 35256 break 35257 } 35258 cmp := v.Args[2] 35259 b.Kind = BlockS390XGTF 35260 b.SetControl(cmp) 35261 return true 35262 } 35263 // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) 35264 // cond: 35265 // result: (GEF cmp yes no) 35266 for { 35267 v := b.Control 35268 if v.Op != OpS390XMOVDGEnoinv { 35269 break 35270 } 35271 v_0 := v.Args[0] 35272 if v_0.Op != OpS390XMOVDconst { 35273 break 35274 } 35275 if v_0.AuxInt != 0 { 35276 break 35277 } 35278 v_1 := v.Args[1] 35279 if v_1.Op != OpS390XMOVDconst { 35280 break 35281 } 35282 if v_1.AuxInt != 1 { 35283 break 35284 } 35285 cmp := v.Args[2] 35286 b.Kind = BlockS390XGEF 35287 b.SetControl(cmp) 35288 return true 35289 } 35290 // match: (If cond yes no) 35291 // cond: 35292 // result: (NE (CMPWconst [0] (MOVBZreg <types.Bool> cond)) yes no) 35293 for { 35294 v := b.Control 35295 _ = v 35296 cond := b.Control 35297 b.Kind = BlockS390XNE 35298 v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, TypeFlags) 35299 v0.AuxInt = 0 35300 v1 := b.NewValue0(v.Pos, OpS390XMOVBZreg, types.Bool) 35301 v1.AddArg(cond) 35302 v0.AddArg(v1) 35303 b.SetControl(v0) 35304 return true 35305 } 35306 case BlockS390XLE: 35307 // match: (LE (InvertFlags cmp) yes no) 35308 // cond: 35309 // result: (GE cmp yes no) 35310 for { 35311 v := b.Control 35312 if v.Op != OpS390XInvertFlags { 35313 break 35314 } 35315 cmp := v.Args[0] 35316 b.Kind = BlockS390XGE 35317 b.SetControl(cmp) 35318 return true 35319 } 35320 // match: (LE (FlagEQ) yes no) 35321 // cond: 35322 // result: (First nil yes no) 35323 for { 35324 v := b.Control 35325 if v.Op != OpS390XFlagEQ { 35326 break 35327 } 35328 b.Kind = BlockFirst 35329 b.SetControl(nil) 35330 return true 35331 } 35332 // match: (LE (FlagLT) yes no) 35333 // cond: 35334 // result: (First nil yes no) 35335 for { 35336 v := b.Control 35337 if v.Op != OpS390XFlagLT { 35338 break 35339 } 35340 b.Kind = BlockFirst 35341 b.SetControl(nil) 35342 return true 35343 } 35344 // match: (LE (FlagGT) yes no) 35345 // cond: 35346 // result: (First nil no yes) 35347 for { 35348 v := b.Control 35349 if v.Op != OpS390XFlagGT { 35350 break 35351 } 35352 b.Kind = BlockFirst 35353 b.SetControl(nil) 35354 b.swapSuccessors() 35355 return true 35356 } 35357 case BlockS390XLT: 35358 // match: (LT (InvertFlags cmp) yes no) 35359 // cond: 35360 // result: (GT cmp yes no) 35361 for { 35362 v := b.Control 35363 if v.Op != OpS390XInvertFlags { 35364 break 35365 } 35366 cmp := v.Args[0] 35367 b.Kind = BlockS390XGT 35368 b.SetControl(cmp) 35369 return true 35370 } 35371 // match: (LT (FlagEQ) yes no) 35372 // cond: 35373 // result: (First nil no yes) 35374 for { 35375 v := b.Control 35376 if v.Op != OpS390XFlagEQ { 35377 break 35378 } 35379 b.Kind = BlockFirst 35380 b.SetControl(nil) 35381 b.swapSuccessors() 35382 return true 35383 } 35384 // match: (LT (FlagLT) yes no) 35385 // cond: 35386 // result: (First nil yes no) 35387 for { 35388 v := b.Control 35389 if v.Op != OpS390XFlagLT { 35390 break 35391 } 35392 b.Kind = BlockFirst 35393 b.SetControl(nil) 35394 return true 35395 } 35396 // match: (LT (FlagGT) yes no) 35397 // cond: 35398 // result: (First nil no yes) 35399 for { 35400 v := b.Control 35401 if v.Op != OpS390XFlagGT { 35402 break 35403 } 35404 b.Kind = BlockFirst 35405 b.SetControl(nil) 35406 b.swapSuccessors() 35407 return true 35408 } 35409 case BlockS390XNE: 35410 // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35411 // cond: 35412 // result: (LT cmp yes no) 35413 for { 35414 v := b.Control 35415 if v.Op != OpS390XCMPWconst { 35416 break 35417 } 35418 if v.AuxInt != 0 { 35419 break 35420 } 35421 v_0 := v.Args[0] 35422 if v_0.Op != OpS390XMOVDLT { 35423 break 35424 } 35425 v_0_0 := v_0.Args[0] 35426 if v_0_0.Op != OpS390XMOVDconst { 35427 break 35428 } 35429 if v_0_0.AuxInt != 0 { 35430 break 35431 } 35432 v_0_1 := v_0.Args[1] 35433 if v_0_1.Op != OpS390XMOVDconst { 35434 break 35435 } 35436 if v_0_1.AuxInt != 1 { 35437 break 35438 } 35439 cmp := v_0.Args[2] 35440 b.Kind = BlockS390XLT 35441 b.SetControl(cmp) 35442 return true 35443 } 35444 // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35445 // cond: 35446 // result: (LE cmp yes no) 35447 for { 35448 v := b.Control 35449 if v.Op != OpS390XCMPWconst { 35450 break 35451 } 35452 if v.AuxInt != 0 { 35453 break 35454 } 35455 v_0 := v.Args[0] 35456 if v_0.Op != OpS390XMOVDLE { 35457 break 35458 } 35459 v_0_0 := v_0.Args[0] 35460 if v_0_0.Op != OpS390XMOVDconst { 35461 break 35462 } 35463 if v_0_0.AuxInt != 0 { 35464 break 35465 } 35466 v_0_1 := v_0.Args[1] 35467 if v_0_1.Op != OpS390XMOVDconst { 35468 break 35469 } 35470 if v_0_1.AuxInt != 1 { 35471 break 35472 } 35473 cmp := v_0.Args[2] 35474 b.Kind = BlockS390XLE 35475 b.SetControl(cmp) 35476 return true 35477 } 35478 // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35479 // cond: 35480 // result: (GT cmp yes no) 35481 for { 35482 v := b.Control 35483 if v.Op != OpS390XCMPWconst { 35484 break 35485 } 35486 if v.AuxInt != 0 { 35487 break 35488 } 35489 v_0 := v.Args[0] 35490 if v_0.Op != OpS390XMOVDGT { 35491 break 35492 } 35493 v_0_0 := v_0.Args[0] 35494 if v_0_0.Op != OpS390XMOVDconst { 35495 break 35496 } 35497 if v_0_0.AuxInt != 0 { 35498 break 35499 } 35500 v_0_1 := v_0.Args[1] 35501 if v_0_1.Op != OpS390XMOVDconst { 35502 break 35503 } 35504 if v_0_1.AuxInt != 1 { 35505 break 35506 } 35507 cmp := v_0.Args[2] 35508 b.Kind = BlockS390XGT 35509 b.SetControl(cmp) 35510 return true 35511 } 35512 // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35513 // cond: 35514 // result: (GE cmp yes no) 35515 for { 35516 v := b.Control 35517 if v.Op != OpS390XCMPWconst { 35518 break 35519 } 35520 if v.AuxInt != 0 { 35521 break 35522 } 35523 v_0 := v.Args[0] 35524 if v_0.Op != OpS390XMOVDGE { 35525 break 35526 } 35527 v_0_0 := v_0.Args[0] 35528 if v_0_0.Op != OpS390XMOVDconst { 35529 break 35530 } 35531 if v_0_0.AuxInt != 0 { 35532 break 35533 } 35534 v_0_1 := v_0.Args[1] 35535 if v_0_1.Op != OpS390XMOVDconst { 35536 break 35537 } 35538 if v_0_1.AuxInt != 1 { 35539 break 35540 } 35541 cmp := v_0.Args[2] 35542 b.Kind = BlockS390XGE 35543 b.SetControl(cmp) 35544 return true 35545 } 35546 // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35547 // cond: 35548 // result: (EQ cmp yes no) 35549 for { 35550 v := b.Control 35551 if v.Op != OpS390XCMPWconst { 35552 break 35553 } 35554 if v.AuxInt != 0 { 35555 break 35556 } 35557 v_0 := v.Args[0] 35558 if v_0.Op != OpS390XMOVDEQ { 35559 break 35560 } 35561 v_0_0 := v_0.Args[0] 35562 if v_0_0.Op != OpS390XMOVDconst { 35563 break 35564 } 35565 if v_0_0.AuxInt != 0 { 35566 break 35567 } 35568 v_0_1 := v_0.Args[1] 35569 if v_0_1.Op != OpS390XMOVDconst { 35570 break 35571 } 35572 if v_0_1.AuxInt != 1 { 35573 break 35574 } 35575 cmp := v_0.Args[2] 35576 b.Kind = BlockS390XEQ 35577 b.SetControl(cmp) 35578 return true 35579 } 35580 // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35581 // cond: 35582 // result: (NE cmp yes no) 35583 for { 35584 v := b.Control 35585 if v.Op != OpS390XCMPWconst { 35586 break 35587 } 35588 if v.AuxInt != 0 { 35589 break 35590 } 35591 v_0 := v.Args[0] 35592 if v_0.Op != OpS390XMOVDNE { 35593 break 35594 } 35595 v_0_0 := v_0.Args[0] 35596 if v_0_0.Op != OpS390XMOVDconst { 35597 break 35598 } 35599 if v_0_0.AuxInt != 0 { 35600 break 35601 } 35602 v_0_1 := v_0.Args[1] 35603 if v_0_1.Op != OpS390XMOVDconst { 35604 break 35605 } 35606 if v_0_1.AuxInt != 1 { 35607 break 35608 } 35609 cmp := v_0.Args[2] 35610 b.Kind = BlockS390XNE 35611 b.SetControl(cmp) 35612 return true 35613 } 35614 // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35615 // cond: 35616 // result: (GTF cmp yes no) 35617 for { 35618 v := b.Control 35619 if v.Op != OpS390XCMPWconst { 35620 break 35621 } 35622 if v.AuxInt != 0 { 35623 break 35624 } 35625 v_0 := v.Args[0] 35626 if v_0.Op != OpS390XMOVDGTnoinv { 35627 break 35628 } 35629 v_0_0 := v_0.Args[0] 35630 if v_0_0.Op != OpS390XMOVDconst { 35631 break 35632 } 35633 if v_0_0.AuxInt != 0 { 35634 break 35635 } 35636 v_0_1 := v_0.Args[1] 35637 if v_0_1.Op != OpS390XMOVDconst { 35638 break 35639 } 35640 if v_0_1.AuxInt != 1 { 35641 break 35642 } 35643 cmp := v_0.Args[2] 35644 b.Kind = BlockS390XGTF 35645 b.SetControl(cmp) 35646 return true 35647 } 35648 // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) 35649 // cond: 35650 // result: (GEF cmp yes no) 35651 for { 35652 v := b.Control 35653 if v.Op != OpS390XCMPWconst { 35654 break 35655 } 35656 if v.AuxInt != 0 { 35657 break 35658 } 35659 v_0 := v.Args[0] 35660 if v_0.Op != OpS390XMOVDGEnoinv { 35661 break 35662 } 35663 v_0_0 := v_0.Args[0] 35664 if v_0_0.Op != OpS390XMOVDconst { 35665 break 35666 } 35667 if v_0_0.AuxInt != 0 { 35668 break 35669 } 35670 v_0_1 := v_0.Args[1] 35671 if v_0_1.Op != OpS390XMOVDconst { 35672 break 35673 } 35674 if v_0_1.AuxInt != 1 { 35675 break 35676 } 35677 cmp := v_0.Args[2] 35678 b.Kind = BlockS390XGEF 35679 b.SetControl(cmp) 35680 return true 35681 } 35682 // match: (NE (InvertFlags cmp) yes no) 35683 // cond: 35684 // result: (NE cmp yes no) 35685 for { 35686 v := b.Control 35687 if v.Op != OpS390XInvertFlags { 35688 break 35689 } 35690 cmp := v.Args[0] 35691 b.Kind = BlockS390XNE 35692 b.SetControl(cmp) 35693 return true 35694 } 35695 // match: (NE (FlagEQ) yes no) 35696 // cond: 35697 // result: (First nil no yes) 35698 for { 35699 v := b.Control 35700 if v.Op != OpS390XFlagEQ { 35701 break 35702 } 35703 b.Kind = BlockFirst 35704 b.SetControl(nil) 35705 b.swapSuccessors() 35706 return true 35707 } 35708 // match: (NE (FlagLT) yes no) 35709 // cond: 35710 // result: (First nil yes no) 35711 for { 35712 v := b.Control 35713 if v.Op != OpS390XFlagLT { 35714 break 35715 } 35716 b.Kind = BlockFirst 35717 b.SetControl(nil) 35718 return true 35719 } 35720 // match: (NE (FlagGT) yes no) 35721 // cond: 35722 // result: (First nil yes no) 35723 for { 35724 v := b.Control 35725 if v.Op != OpS390XFlagGT { 35726 break 35727 } 35728 b.Kind = BlockFirst 35729 b.SetControl(nil) 35730 return true 35731 } 35732 } 35733 return false 35734 }